ChangeMenuZhiChi.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Elton
  5. * Date: 2019/7/31
  6. * Time: 11:19
  7. */
  8. namespace app\admin\command;
  9. use app\common\library\WeChatObject;
  10. use think\console\Command;
  11. use think\console\Input;
  12. use think\console\input\Argument;
  13. use think\console\Output;
  14. use think\Log;
  15. use think\Request;
  16. use think\response\Json;
  17. class ChangeMenuZhiChi extends Command
  18. {
  19. /**
  20. * 配置指令
  21. */
  22. protected function configure()
  23. {
  24. $this->setName('ChangeMenuZhiChi')
  25. ->addArgument('channel_id', Argument::OPTIONAL, '需要更新的渠道OR配号代理商ID,不传值则处理所有')
  26. ->addArgument('nums', Argument::OPTIONAL, 'Limit条数限制')
  27. ->setDescription('更新微信菜单(智齿客服)');
  28. }
  29. /**
  30. * 执行命令:
  31. * php think ChangeMenuZhiChi # 更新所有微信菜单
  32. * php think ChangeMenuZhiChi 48 1 # 仅更新渠道商ID为48的微信菜单
  33. * php think ChangeMenuZhiChi 48 100 # 更新渠道商ID 大于或等于48的微信菜单,更新100条
  34. *
  35. * @param Input $input
  36. * @param Output $output
  37. * @return int|null|void
  38. */
  39. protected function execute(Input $input, Output $output)
  40. {
  41. //cli模式下无法获取到当前的项目模块,手动指定一下
  42. Request::instance()->module('admin');
  43. $channel_map = null;
  44. $channel_map['wx_menu'] = ['neq', ''];
  45. $output->writeln("开始执行刷新菜单:" . date('Y-m-d H:i:s', time()));
  46. $channel_id = $input->getArgument('channel_id');
  47. if(empty($channel_id) || !is_numeric($channel_id)){
  48. $channel_id = '';
  49. }
  50. if($channel_id){
  51. $channel_map['admin_id'] = ['>=',$channel_id];
  52. }
  53. $nums = is_numeric($input->getArgument('nums')) ? $input->getArgument('nums') : 0;
  54. $output->writeln("参数channel_id:".$channel_id);
  55. $output->writeln("参数nums:".$nums);
  56. if($nums){
  57. $adminConfig = model('AdminConfig')->where($channel_map)->field('admin_id,appid,ophost_id,refresh_token,wx_menu')->limit($nums)->select();
  58. } else{
  59. $adminConfig = model('AdminConfig')->where($channel_map)->field('admin_id,appid,ophost_id,refresh_token,wx_menu')->select();
  60. }
  61. //1.查找到所有配置了微信菜单的渠道商OR配号代理商
  62. if(!$adminConfig){
  63. $output->error('ChangeMenuWx->Error:没有找到可用数据');
  64. return;
  65. }
  66. $output->info('ChangeMenuWx->SQL:'.model('AdminConfig')->getLastSql());
  67. Log::info('ChangeMenuWx->SQL:'.model('AdminConfig')->getLastSql());
  68. try{
  69. foreach ($adminConfig as $channel)
  70. {
  71. // 获取公众号配置信息
  72. $ophost = model('Ophost')->getInfoById($channel['ophost_id']);
  73. $url_pre = $channel['appid'].'.'.$ophost['host'];
  74. //将新的菜单结构推送给微信
  75. $nMenu = $this->rePackageMenu($url_pre, $channel['wx_menu']);
  76. $admin = model('AdminConfig')->getAdminInfoAll($channel['admin_id']);
  77. if(empty($admin['refresh_token'])){
  78. Log::info('ChangeMenuWx->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} refresh_token Empty!!");
  79. continue;
  80. }
  81. $wechat = new WeChatObject($admin);
  82. $officialAccount = $wechat->getOfficialAccount();
  83. try {
  84. $ret = $officialAccount->menu->create($nMenu);
  85. } catch (\Exception $exception) {
  86. Log::error('ChangeMenuWx->WeChat->Menu:' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail");
  87. Log::error('Because:' . $exception->getMessage());
  88. }
  89. if(isset($ret)){
  90. Log::info('ChangeMenuWx->WeChat->Menu: ret: '.print_r(json_encode($ret), true));
  91. if ($ret['errcode'] == 0) {
  92. $output->info('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Success");
  93. Log::info('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Success");
  94. //4.维护admin_config表中的wx_menu字段
  95. $update = model('AdminConfig')->update(['wx_menu' => $nMenu], ["admin_id" => $channel['admin_id']]);
  96. if ($update) {
  97. $output->info('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Success");
  98. Log::info('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Success");
  99. } else {
  100. $output->info('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Fail");
  101. Log::error('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Fail");
  102. }
  103. } else {
  104. $output->info('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $ret['errmsg']);
  105. Log::error('ChangeMenuWx->WeChat->Menu: ' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $ret['errmsg']);
  106. }
  107. }
  108. // 暂停50毫秒
  109. usleep(50000);
  110. }
  111. }catch (\Exception $exception){
  112. $output->writeln('ChangeMenuWx->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $exception->getMessage());
  113. Log::error('ChangeMenuWx->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $exception->getMessage());
  114. }
  115. $output->writeln("刷新菜单完成:" . date('Y-m-d H:i:s', time()));
  116. }
  117. /**
  118. * 重新组装微信菜单数据
  119. * @param $url_pre
  120. * @param array $oldMenu
  121. * @return array
  122. */
  123. public function rePackageMenu($url_pre, array $oldMenu)
  124. {
  125. $tmpMenu = [];
  126. foreach ($oldMenu as $item)
  127. {
  128. if(!isset($item['sub_button'])){
  129. array_push($tmpMenu, $item);
  130. }else{
  131. foreach ($item['sub_button'] as $key => $subitem) {
  132. if($subitem['name'] == '联系客服'){
  133. unset($subitem['key']);
  134. $subitem['url'] = 'http://'.$url_pre.'/index/user/visitzhichi';
  135. $subitem['type'] = 'view';
  136. $item['sub_button'][$key] = $subitem;
  137. }
  138. }
  139. array_push($tmpMenu, $item);
  140. }
  141. }
  142. return $tmpMenu;
  143. }
  144. }