123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- <?php
- /**
- * Created by PhpStorm.
- * User: Elton
- * Date: 2019/7/31
- * Time: 11:19
- */
- namespace app\admin\command;
- use app\common\library\WeChatObject;
- use think\console\Command;
- use think\console\Input;
- use think\console\input\Argument;
- use think\console\Output;
- use think\Log;
- use think\Request;
- use think\response\Json;
- class ChangeMenuZhiChi extends Command
- {
- /**
- * 配置指令
- */
- protected function configure()
- {
- $this->setName('ChangeMenuZhiChi')
- ->addArgument('channel_id', Argument::OPTIONAL, '需要更新的渠道OR配号代理商ID,不传值则处理所有')
- ->addArgument('nums', Argument::OPTIONAL, 'Limit条数限制')
- ->setDescription('更新微信菜单(智齿客服)');
- }
- /**
- * 执行命令:
- * php think ChangeMenuZhiChi # 更新所有微信菜单
- * php think ChangeMenuZhiChi 48 1 # 仅更新渠道商ID为48的微信菜单
- * php think ChangeMenuZhiChi 48 100 # 更新渠道商ID 大于或等于48的微信菜单,更新100条
- *
- * @param Input $input
- * @param Output $output
- * @return int|null|void
- */
- protected function execute(Input $input, Output $output)
- {
- //cli模式下无法获取到当前的项目模块,手动指定一下
- Request::instance()->module('admin');
- $channel_map = null;
- $channel_map['wx_menu'] = ['neq', ''];
- $output->writeln("开始执行刷新菜单:" . date('Y-m-d H:i:s', time()));
- $channel_id = $input->getArgument('channel_id');
- if(empty($channel_id) || !is_numeric($channel_id)){
- $channel_id = '';
- }
- if($channel_id){
- $channel_map['admin_id'] = ['>=',$channel_id];
- }
- $nums = is_numeric($input->getArgument('nums')) ? $input->getArgument('nums') : 0;
- $output->writeln("参数channel_id:".$channel_id);
- $output->writeln("参数nums:".$nums);
- if($nums){
- $adminConfig = model('AdminConfig')->where($channel_map)->field('admin_id,appid,ophost_id,refresh_token,wx_menu')->limit($nums)->select();
- } else{
- $adminConfig = model('AdminConfig')->where($channel_map)->field('admin_id,appid,ophost_id,refresh_token,wx_menu')->select();
- }
- //1.查找到所有配置了微信菜单的渠道商OR配号代理商
- if(!$adminConfig){
- $output->error('ChangeMenuWx->Error:没有找到可用数据');
- return;
- }
- $output->info('ChangeMenuWx->SQL:'.model('AdminConfig')->getLastSql());
- Log::info('ChangeMenuWx->SQL:'.model('AdminConfig')->getLastSql());
- try{
- foreach ($adminConfig as $channel)
- {
- // 获取公众号配置信息
- $ophost = model('Ophost')->getInfoById($channel['ophost_id']);
- $url_pre = $channel['appid'].'.'.$ophost['host'];
- //将新的菜单结构推送给微信
- $nMenu = $this->rePackageMenu($url_pre, $channel['wx_menu']);
- $admin = model('AdminConfig')->getAdminInfoAll($channel['admin_id']);
- if(empty($admin['refresh_token'])){
- Log::info('ChangeMenuWx->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} refresh_token Empty!!");
- continue;
- }
- $wechat = new WeChatObject($admin);
- $officialAccount = $wechat->getOfficialAccount();
- try {
- $ret = $officialAccount->menu->create($nMenu);
- } catch (\Exception $exception) {
- Log::error('ChangeMenuWx->WeChat->Menu:' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail");
- Log::error('Because:' . $exception->getMessage());
- }
- if(isset($ret)){
- Log::info('ChangeMenuWx->WeChat->Menu: ret: '.print_r(json_encode($ret), true));
- if ($ret['errcode'] == 0) {
- $output->info('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Success");
- Log::info('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Success");
- //4.维护admin_config表中的wx_menu字段
- $update = model('AdminConfig')->update(['wx_menu' => $nMenu], ["admin_id" => $channel['admin_id']]);
- if ($update) {
- $output->info('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Success");
- Log::info('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Success");
- } else {
- $output->info('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Fail");
- Log::error('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Fail");
- }
- } else {
- $output->info('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $ret['errmsg']);
- Log::error('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $ret['errmsg']);
- }
- }
- // 暂停50毫秒
- usleep(50000);
- }
- }catch (\Exception $exception){
- $output->writeln('ChangeMenuWx->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $exception->getMessage());
- Log::error('ChangeMenuWx->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $exception->getMessage());
- }
- $output->writeln("刷新菜单完成:" . date('Y-m-d H:i:s', time()));
- }
- /**
- * 重新组装微信菜单数据
- * @param $url_pre
- * @param array $oldMenu
- * @return array
- */
- public function rePackageMenu($url_pre, array $oldMenu)
- {
- $tmpMenu = [];
- foreach ($oldMenu as $item)
- {
- if(!isset($item['sub_button'])){
- array_push($tmpMenu, $item);
- }else{
- foreach ($item['sub_button'] as $key => $subitem) {
- if($subitem['name'] == '联系客服'){
- unset($subitem['key']);
- $subitem['url'] = 'http://'.$url_pre.'/index/user/visitzhichi';
- $subitem['type'] = 'view';
- $item['sub_button'][$key] = $subitem;
- }
- }
- array_push($tmpMenu, $item);
- }
- }
- return $tmpMenu;
- }
- }
|