setName('ChangeMenuSign') ->addOption("adminid","a",Option::VALUE_REQUIRED,'要单独处理的adminid 支持英文逗号分隔的多个') ->addOption("delay","d",Option::VALUE_REQUIRED,'休眠时间,单位秒') ->setDescription('替换微信菜单内的签到链接为签到交互'); } protected function execute(Input $input, Output $output){ $channel_map = []; //cli模式下无法获取到当前的项目模块,手动指定一下 Request::instance()->module('admin'); $admin_id = $input->getOption('adminid'); //获取休眠时间 $sleep = $input->getOption('delay'); $output->info('ChangeMenuSign -----------------------------------> Start'); if (!empty($admin_id)) { $channel_map['admin_id'] = ['in', $admin_id]; } if(!$adminConfig = model('AdminConfig')->where($channel_map)->field('admin_id,appid,refresh_token,wx_menu')->select()){ $output->error('ChangeMenuSign->Error:渠道OR配号代理商为空'); return; } $output->info('ChangeMenuSign->SQL:'.model('AdminConfig')->getLastSql()); Log::info('ChangeMenuSign->SQL:'.model('AdminConfig')->getLastSql()); foreach($adminConfig as $channel){ //微信菜单为空时跳过 if(empty($channel['wx_menu'])){ $output->info('ChangeMenuSign->Source->Menu:'.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Menu Is NULL"); continue; } Log::info('ChangeMenuSign->Source->Menu:'.var_export($channel['wx_menu'],true)); $menu = $channel['wx_menu']; $hasSign = false; foreach($menu as $key => &$val){ if(isset($val['key']) && $val['key'] == '签到'){ $hasSign = true; } if(isset($val['url'])){ if(stripos($val['url'],'/index/user/sign') !== false){ $hasSign = true; $val = [ 'key' => '签到', 'name' => '每日签到', 'type' => 'click' ]; } } if(isset($val['sub_button']) && !empty($val['sub_button'])){ foreach($val['sub_button'] as $sub_k => &$sub_v){ if(isset($sub_v['url'])){ if(stripos($sub_v['url'],'/index/user/sign') !== false){ $hasSign = true; $sub_v = [ 'key' => '签到', 'name' => '每日签到', 'type' => 'click' ]; } } } if ($key == 2 && !$hasSign && count($val['sub_button']) < 5) { array_unshift($val['sub_button'],[ 'key' => '签到', 'name' => '每日签到', 'type' => 'click' ]); } } } $channel['wx_menu'] = $menu; Log::info('ChangeMenuSign->Replace->Menu:'.var_export($channel['wx_menu'],true)); try { //更新菜单 $admin = model('AdminConfig')->getAdminInfoAll($channel['admin_id']); if(empty($admin['refresh_token'])){ Log::info('ChangeMenuSign->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(); // $officialAccount->menu->delete(); //删除全部菜单 主要是掌中云个性化菜单 $ret = $officialAccount->menu->create($channel['wx_menu']); if ($ret['errcode'] == 0) { $output->info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Success"); Log::info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Success"); //更新数据 $update = model('AdminConfig')->update(['wx_menu' => $channel['wx_menu']], ["admin_id" => $channel['admin_id']]); if ($update) { $output->info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Success"); Log::info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Success"); } else { $output->info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Fail"); Log::error('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Fail"); } } else { $output->info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $ret['errmsg']); Log::error('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $ret['errmsg']); } //休眠 if (!empty($sleep) && is_numeric($sleep)) { sleep($sleep); } }catch (\Exception $exception){ Log::error('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:".$exception->getLine().' ' . $exception->getMessage()); } } $output->info('ChangeMenuSign -----------------------------------> End'); } }