ChangeMenuSign.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. /*
  3. * 替换微信菜单内的签到链接为签到交互
  4. */
  5. namespace app\admin\command;
  6. use app\common\library\Redis;
  7. use app\common\library\WeChatObject;
  8. use EasyWeChat\Factory;
  9. use Symfony\Component\Cache\Simple\RedisCache;
  10. use think\Config;
  11. use think\console\Command;
  12. use think\console\Input;
  13. use think\console\input\Option;
  14. use think\console\Output;
  15. use app\common\model\AdminConfig;
  16. use app\common\model\Config as dbconfig;
  17. use think\Log;
  18. use think\Exception;
  19. use think\Request;
  20. class ChangeMenuSign extends Command
  21. {
  22. protected $message = '';
  23. protected function configure()
  24. {
  25. $this->setName('ChangeMenuSign')
  26. ->addOption("adminid","a",Option::VALUE_REQUIRED,'要单独处理的adminid 支持英文逗号分隔的多个')
  27. ->addOption("delay","d",Option::VALUE_REQUIRED,'休眠时间,单位秒')
  28. ->setDescription('替换微信菜单内的签到链接为签到交互');
  29. }
  30. protected function execute(Input $input, Output $output){
  31. $channel_map = [];
  32. //cli模式下无法获取到当前的项目模块,手动指定一下
  33. Request::instance()->module('admin');
  34. $admin_id = $input->getOption('adminid');
  35. //获取休眠时间
  36. $sleep = $input->getOption('delay');
  37. $output->info('ChangeMenuSign -----------------------------------> Start');
  38. if (!empty($admin_id)) {
  39. $channel_map['admin_id'] = ['in', $admin_id];
  40. }
  41. if(!$adminConfig = model('AdminConfig')->where($channel_map)->field('admin_id,appid,refresh_token,wx_menu')->select()){
  42. $output->error('ChangeMenuSign->Error:渠道OR配号代理商为空');
  43. return;
  44. }
  45. $output->info('ChangeMenuSign->SQL:'.model('AdminConfig')->getLastSql());
  46. Log::info('ChangeMenuSign->SQL:'.model('AdminConfig')->getLastSql());
  47. foreach($adminConfig as $channel){
  48. //微信菜单为空时跳过
  49. if(empty($channel['wx_menu'])){
  50. $output->info('ChangeMenuSign->Source->Menu:'.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Menu Is NULL");
  51. continue;
  52. }
  53. Log::info('ChangeMenuSign->Source->Menu:'.var_export($channel['wx_menu'],true));
  54. $menu = $channel['wx_menu'];
  55. $hasSign = false;
  56. foreach($menu as $key => &$val){
  57. if(isset($val['key']) && $val['key'] == '签到'){
  58. $hasSign = true;
  59. }
  60. if(isset($val['url'])){
  61. if(stripos($val['url'],'/index/user/sign') !== false){
  62. $hasSign = true;
  63. $val = [
  64. 'key' => '签到',
  65. 'name' => '每日签到',
  66. 'type' => 'click'
  67. ];
  68. }
  69. }
  70. if(isset($val['sub_button']) && !empty($val['sub_button'])){
  71. foreach($val['sub_button'] as $sub_k => &$sub_v){
  72. if(isset($sub_v['url'])){
  73. if(stripos($sub_v['url'],'/index/user/sign') !== false){
  74. $hasSign = true;
  75. $sub_v = [
  76. 'key' => '签到',
  77. 'name' => '每日签到',
  78. 'type' => 'click'
  79. ];
  80. }
  81. }
  82. }
  83. if ($key == 2 && !$hasSign && count($val['sub_button']) < 5) {
  84. array_unshift($val['sub_button'],[
  85. 'key' => '签到',
  86. 'name' => '每日签到',
  87. 'type' => 'click'
  88. ]);
  89. }
  90. }
  91. }
  92. $channel['wx_menu'] = $menu;
  93. Log::info('ChangeMenuSign->Replace->Menu:'.var_export($channel['wx_menu'],true));
  94. try {
  95. //更新菜单
  96. $admin = model('AdminConfig')->getAdminInfoAll($channel['admin_id']);
  97. if(empty($admin['refresh_token'])){
  98. Log::info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} refresh_token Empty!!");
  99. continue;
  100. }
  101. $wechat = new WeChatObject($admin);
  102. $officialAccount = $wechat->getOfficialAccount();
  103. // $officialAccount->menu->delete(); //删除全部菜单 主要是掌中云个性化菜单
  104. $ret = $officialAccount->menu->create($channel['wx_menu']);
  105. if ($ret['errcode'] == 0) {
  106. $output->info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Success");
  107. Log::info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Success");
  108. //更新数据
  109. $update = model('AdminConfig')->update(['wx_menu' => $channel['wx_menu']], ["admin_id" => $channel['admin_id']]);
  110. if ($update) {
  111. $output->info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Success");
  112. Log::info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Success");
  113. } else {
  114. $output->info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Fail");
  115. Log::error('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Fail");
  116. }
  117. } else {
  118. $output->info('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $ret['errmsg']);
  119. Log::error('ChangeMenuSign->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $ret['errmsg']);
  120. }
  121. //休眠
  122. if (!empty($sleep) && is_numeric($sleep)) {
  123. sleep($sleep);
  124. }
  125. }catch (\Exception $exception){
  126. 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());
  127. }
  128. }
  129. $output->info('ChangeMenuSign -----------------------------------> End');
  130. }
  131. }