WxResponseService.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Elton
  5. * Date: 2019/12/10
  6. * Time: 下午3:38
  7. */
  8. namespace app\main\service;
  9. use app\common\library\WeChatObject;
  10. use app\common\utility\DiyQRCode;
  11. /**
  12. * Class WxResponseService
  13. * @package app\main\service
  14. */
  15. class WxResponseService extends BaseService
  16. {
  17. /**
  18. * @var WxResponseService
  19. */
  20. protected static $self = NULL;
  21. /**
  22. * @return WxResponseService
  23. */
  24. public static function instance()
  25. {
  26. if (self::$self == NULL) {
  27. self::$self = new self();
  28. }
  29. return self::$self;
  30. }
  31. public function reStructWxMenu($admin_id, $oldophost = '', $new_ophost = ''){
  32. //获取微信菜单
  33. $admininfo = model('AdminConfig')->getAdminInfoAll($admin_id);
  34. LogService::info('Wxqrcodemenu: Method->reStructWxMenu:Channel_id:' . $admin_id);
  35. if($admininfo['wx_menu'] && $oldophost && $new_ophost){
  36. if(is_array($admininfo['wx_menu'])){
  37. $admininfo['wx_menu'] = json_encode($admininfo['wx_menu'], JSON_UNESCAPED_UNICODE);
  38. if (strpos($admininfo['wx_menu'], $oldophost)){
  39. $admininfo['wx_menu'] = str_replace($oldophost, $new_ophost, $admininfo['wx_menu']);
  40. }
  41. }
  42. $admininfo['wx_menu'] = json_decode($admininfo['wx_menu'], true);
  43. }
  44. LogService::info('Wxqrcodemenu: Method->reStructWxMenu:重构微信菜单:遍历微信菜单, 如果是url ,根据url 生成图片 ,上传资源');
  45. //重构微信菜单:遍历微信菜单, 如果是url ,根据url 生成图片 ,上传资源 ,
  46. if ($admininfo['wx_menu']) {
  47. $n_wxmenu = [];
  48. foreach ($admininfo['wx_menu'] as $key => $menu) {
  49. $n_wxmenu[$key] = $menu;
  50. if (!empty($menu['sub_button'])) {
  51. foreach ($menu['sub_button'] as $sub_key => $sub_menu) {
  52. $n_wxmenu[$key]['sub_button'][$sub_key] = $sub_menu;
  53. if($sub_menu['type'] == 'view'){
  54. $eventkey = $this->wxuploadimg($sub_menu['name'], $admin_id, $sub_menu['url']);
  55. $n_wxmenu[$key]['sub_button'][$sub_key]['name'] = $sub_menu['name'];
  56. $n_wxmenu[$key]['sub_button'][$sub_key]['key'] = $eventkey;
  57. $n_wxmenu[$key]['sub_button'][$sub_key]['type'] = 'click';
  58. unset($n_wxmenu[$key]['sub_button'][$sub_key]['url']);
  59. }
  60. }
  61. } else {
  62. if ($menu['type'] == 'view') {
  63. $eventkey = $this->wxuploadimg($menu['name'], $admin_id, $menu['url']);
  64. $n_wxmenu[$key]['name'] = $menu['name'];
  65. $n_wxmenu[$key]['key'] = $eventkey;
  66. $n_wxmenu[$key]['type'] = 'click';
  67. unset($n_wxmenu[$key]['url']);
  68. }
  69. }
  70. }
  71. $adminwxmenu = [
  72. 'admin_id' => $admin_id,
  73. 'wx_qrcode_menu' => json_encode($n_wxmenu)
  74. ];
  75. LogService::info('Wxqrcodemenu: Method->reStructWxMenu:保存');
  76. if(model('AdminWxmenu')->where('admin_id', 'eq', $admin_id)->find()){
  77. model('AdminWxmenu')->update($adminwxmenu, ['admin_id' => $admin_id]);
  78. }else {
  79. model('AdminWxmenu')->save($adminwxmenu);
  80. }
  81. }
  82. }
  83. /**
  84. * @param $admin_id
  85. * @param $img_url
  86. * @return mixed
  87. */
  88. public function wxuploadimg($title, $admin_id, $img_url)
  89. {
  90. $qrcode_url = DiyQRCode::createQRCodeByUrl($img_url);
  91. $admininfo = model('AdminConfig')->getAdminInfoAll($admin_id);
  92. $wechat = new WeChatObject($admininfo);
  93. $officialAccount = $wechat->getOfficialAccount();
  94. $upload_url = str_replace(config('site.cdnurl'), '', ROOT_PATH . 'public' . $qrcode_url);
  95. $result = $officialAccount->material->uploadImage($upload_url);
  96. if (!isset($result['media_id'])) {
  97. LogService::error('Method:wxuploadimg:图片素材上传微信失败');
  98. } else {
  99. $eventkey = $admin_id . '_' . uniqid();
  100. $wechatResonseData = [
  101. 'admin_id' => $admin_id,
  102. 'title' => $title,
  103. 'eventkey' => $eventkey,
  104. 'type' => 'image',
  105. 'content' => json_encode($result),
  106. 'status' => 'normal',
  107. 'createtime' => time(),
  108. 'updatetime' => time()
  109. ];
  110. model('WechatResponse')->insert($wechatResonseData);
  111. return $eventkey;
  112. }
  113. }
  114. /**
  115. * 同步微信二维码菜单
  116. */
  117. public function syncQrcodeMenu($admin_id, $ids = NULL)
  118. {
  119. $hasError = false;
  120. $model = model('AdminWxmenu');
  121. $row = $model->get(['admin_id' => $admin_id]);
  122. if (!$row) {
  123. LogService::error('Method:syncQrcodeMenu:syncQrcodeMenu Fail, param admin_id is not exist');
  124. }
  125. $menu = json_decode($row->wx_qrcode_menu, true);
  126. /**
  127. * 校验menu数据格式
  128. */
  129. foreach ($menu as $k => $v)
  130. {
  131. $hasError = false;
  132. $model = model('AdminWxmenu');
  133. $row = $model->get(['admin_id' => $admin_id]);
  134. $menu = json_decode($row->wx_qrcode_menu, true);
  135. /**
  136. * 校验menu数据格式
  137. */
  138. foreach ($menu as $k => $v)
  139. {
  140. if (isset($v['sub_button']))
  141. {
  142. foreach ($v['sub_button'] as $m => $n)
  143. {
  144. if (isset($n['key']) && !$n['key'])
  145. {
  146. $hasError = true;
  147. break 2;
  148. }
  149. }
  150. }
  151. else if (isset($v['key']) && !$v['key'])
  152. {
  153. $hasError = true;
  154. break;
  155. }
  156. }
  157. }
  158. if (!$hasError) {
  159. $response = [];
  160. try {
  161. $adminConfig = model('AdminConfig')->getAdminInfoAll($admin_id);
  162. $wechat = new WeChatObject($adminConfig);
  163. $officialAccount = $wechat->getOfficialAccount();
  164. $officialAccount->menu->delete(); //删除全部菜单 主要是掌中云个性化菜单
  165. $ret = $officialAccount->menu->create($menu);
  166. $response = $ret;
  167. } catch (\Exception $e) {
  168. LogService::error($e->getMessage());
  169. }
  170. if ($response && $response['errcode'] == 0) {
  171. LogService::info('syncQrcodeMenu 同步二维码菜单成功');
  172. } else {
  173. LogService::error($response['errmsg']);
  174. }
  175. } else {
  176. LogService::error('菜单参数配置不完整,请检查是否有空菜单!');
  177. }
  178. }
  179. /**
  180. * 同步微信二维码菜单
  181. */
  182. public function syncQrcodeMenu2($admin_id, $ids = NULL)
  183. {
  184. $hasError = false;
  185. $model = model('AdminWxmenu');
  186. $row = $model->get(['admin_id' => $admin_id]);
  187. if (!$row) {
  188. $this->error('syncQrcodeMenu Fail, param admin_id is not exist');
  189. }
  190. $menu = json_decode($row->wx_qrcode_menu, true);
  191. /**
  192. * 校验menu数据格式
  193. */
  194. foreach ($menu as $k => $v)
  195. {
  196. $hasError = false;
  197. $model = model('AdminWxmenu');
  198. $row = $model->get(['admin_id' => $admin_id]);
  199. $menu = json_decode($row->wx_qrcode_menu, true);
  200. /**
  201. * 校验menu数据格式
  202. */
  203. foreach ($menu as $k => $v)
  204. {
  205. if (isset($v['sub_button']))
  206. {
  207. foreach ($v['sub_button'] as $m => $n)
  208. {
  209. if (isset($n['key']) && !$n['key'])
  210. {
  211. $hasError = true;
  212. break 2;
  213. }
  214. }
  215. }
  216. else if (isset($v['key']) && !$v['key'])
  217. {
  218. $hasError = true;
  219. break;
  220. }
  221. }
  222. }
  223. if (!$hasError) {
  224. $response = [];
  225. try{
  226. $adminConfig = model('AdminConfig')->getAdminInfoAll($admin_id);
  227. $wechat = new WeChatObject($adminConfig);
  228. $officialAccount = $wechat->getOfficialAccount();
  229. $officialAccount->menu->delete(); //删除全部菜单 主要是掌中云个性化菜单
  230. $ret = $officialAccount->menu->create($menu);
  231. $response = $ret;
  232. }catch (\Exception $e){
  233. $this->error($e->getMessage());
  234. }
  235. if($response && $response['errcode'] == 0){
  236. LogService::info('syncQrcodeMenu 同步二维码菜单成功');
  237. $this->success();
  238. }else{
  239. $this->error($response['errmsg']);
  240. }
  241. }
  242. else
  243. {
  244. $this->error('菜单参数配置不完整,请检查是否有空菜单!');
  245. }
  246. }
  247. }