ChangeMenuKefu.php 6.9 KB

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