setName('ChangeMenuKefu') ->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['url']); $subitem['key'] = 'manager_contact'; $subitem['type'] = 'click'; $item['sub_button'][$key] = $subitem; } } array_push($tmpMenu, $item); } } return $tmpMenu; } }