WechatTemplateService.php 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. <?php
  2. /**
  3. * Created by sublime.
  4. * User: wosinC
  5. * Date: 2017/12/2
  6. * Time: 上午11:39
  7. */
  8. namespace App\Modules\OfficialAccount\Services;
  9. use App\Modules\OfficialAccount\Models\ForceSubscribeUsers;
  10. use App\Modules\OfficialAccount\Models\WechatTemplates;
  11. use App\Modules\OfficialAccount\Models\OfficialAccount;
  12. use App\Modules\OfficialAccount\Models\WechatTemplateMsgs;
  13. use App\Modules\OfficialAccount\Models\CustomSendMsgs;
  14. use App\Modules\OfficialAccount\Models\WechatPublicTemplates;
  15. use App\Modules\OfficialAccount\Services\ForceSubscribeService;
  16. use App\Modules\OfficialAccount\Models\BatchCustomSendMsgs;
  17. use App\Libs\OSS;
  18. use Redis;
  19. use App\Jobs\SendTemplate;
  20. use GuzzleHttp\Client;
  21. use App\Jobs\TemplateMsgSendJob;
  22. class WechatTemplateService
  23. {
  24. //-----------模板消息---------------
  25. /**
  26. * 通过Appid和common_template_id获取模板
  27. */
  28. static function wechatTemplateByAppidAndCommonTemplateId($wechatTemplatePrams)
  29. {
  30. return WechatTemplates::wechatTemplateByAppidAndTemplateId($wechatTemplatePrams['appid'],$wechatTemplatePrams['common_template_id']);
  31. }
  32. /**
  33. * wechatTemplateMsgById 通过id获取模板
  34. */
  35. static function wechatTemplateMsgById($wechatTemplatePrams)
  36. {
  37. return WechatTemplateMsgs::wechatTemplateMsgsById($wechatTemplatePrams['id']);
  38. }
  39. /**
  40. * 获取推送模板消息列表
  41. */
  42. static function wechatTemplateMsgBydistributionChannelId($wechatTemplatePrams)
  43. {
  44. return WechatTemplateMsgs::wechatTemplateMsgsBydistributionChannelId($wechatTemplatePrams['distribution_channel_id']);
  45. }
  46. /**
  47. * 发送模板消息
  48. */
  49. static function add_template_task($wechatTemplateMsgs,$templateMsgs){
  50. try {
  51. $appid = $wechatTemplateMsgs['appid'];
  52. $template_id = $wechatTemplateMsgs['template_id'];
  53. $name = $wechatTemplateMsgs['name'];
  54. $send_time = $wechatTemplateMsgs['send_time'];
  55. $template_content = $wechatTemplateMsgs['template_content'];
  56. \Log::info('================== template_content');
  57. \Log::info($template_content);
  58. $redirect_url = $wechatTemplateMsgs['redirect_url'];
  59. $distribution_channel_id = $wechatTemplateMsgs['distribution_channel_id'];
  60. $remark = $wechatTemplateMsgs['remark'];
  61. $task_id = $wechatTemplateMsgs['id'];
  62. \Log::info('-----------------模板消息参数--------------');
  63. \Log::info($appid);
  64. \Log::info($wechatTemplateMsgs['distribution_channel_id']);
  65. \Log::info($wechatTemplateMsgs['subscribe_time']);
  66. \Log::info($wechatTemplateMsgs['sex']);
  67. \Log::info($wechatTemplateMsgs['balance']);
  68. \Log::info($wechatTemplateMsgs['category_id']);
  69. \Log::info($wechatTemplateMsgs['order_type']);
  70. //1,通过筛选得到条件符合的强关用户
  71. $skip = 0;
  72. while ( $skip <= 2500000) {
  73. \Log::info('-------------模板消息-----分页取强关用户,目前页数----------'.$skip);
  74. $users = ForceSubscribeService::forceUserCountByTemplatePrams($appid,$wechatTemplateMsgs['distribution_channel_id'],$wechatTemplateMsgs['subscribe_time'],$wechatTemplateMsgs['sex'],$wechatTemplateMsgs['balance'],$wechatTemplateMsgs['category_id'],$wechatTemplateMsgs['order_type'],$skip);
  75. \Log::info('-----------------实际发送模板消息用户数量-------------'.count($users));
  76. if(count($users)>0){
  77. for ($i=0; $i < count($users); $i++) {
  78. //2,循环用户发送模板消息
  79. //发送到最后一条时,将
  80. if ($i == count($users)-1) {
  81. $data = array();
  82. $data['statusstr'] = (time());
  83. $data['openid'] = $users[$i]['openid'];
  84. $data['appid'] = $appid;
  85. $data['template_id'] = $template_id;
  86. $templateSendContents = array();
  87. //3,处理前台传过来的json数据,格式化后转成指定格式的数组在json_encode
  88. // $templateContentArray = json_decode(str_replace(".DATA","",$template_content),true);
  89. // for ($j=0; $j < count($templateContentArray); $j++) {
  90. // $templateSendContents[] = $templateContentArray[$j];
  91. // }
  92. //4,通过RebitMQ发送模板消息
  93. // $data['template_content'] = $templateSendContents;
  94. $data['template_content'] =str_replace(".DATA","",$template_content);
  95. $data['type'] = 'last_task';// last_task,one_task
  96. $data['url'] = $redirect_url;
  97. $data['task_id'] = $task_id;
  98. $data['send_time'] = $send_time;
  99. $send_data=array(
  100. 'send_time'=>$send_time,
  101. 'data' => $data
  102. );
  103. $now_time = strtotime($send_time)-time();
  104. \Log::info('------------------!!!发送模板消息时间!!!----------');
  105. \Log::info($send_time);
  106. \Log::info($now_time);
  107. $delay = $now_time;
  108. try {
  109. \Log::info('------------------发送最后一条模板消息----------'.$task_id);
  110. $job = (new SendTemplate($send_data))->onConnection('rabbitmq')->delay($delay)->onQueue('send_template_list');
  111. dispatch($job);
  112. } catch (\Exception $e) {
  113. \Log::info($e->getMessage());
  114. }
  115. }else{
  116. $data = array();
  117. $data['statusstr'] = (time());
  118. $data['openid'] = $users[$i]['openid'];
  119. $data['appid'] = $appid;
  120. $data['template_id'] = $template_id;
  121. // $templateSendContents = array();
  122. // $templateContentArray = json_decode(str_replace(".DATA","",$template_content),true);
  123. // for ($j=0; $j < count($templateContentArray); $j++) {
  124. // $templateSendContents[] = $templateContentArray[$j];
  125. // }
  126. \Log::info('========================[[[[send template message]]]]====================');
  127. \Log::info(str_replace(".DATA","",$template_content));
  128. // $data['template_content'] = $templateSendContents;
  129. $data['template_content'] =str_replace(".DATA","",$template_content);
  130. $data['type'] = 'one_task';// last_task,one_task
  131. $data['url'] = $redirect_url;
  132. $data['task_id'] = $task_id;
  133. $data['send_time'] = $send_time;
  134. $send_data=array(
  135. 'send_time'=>$send_time,
  136. 'data' => $data
  137. );
  138. $now_time = strtotime($send_time)-time();
  139. \Log::info('------------------!!!发送模板消息时间!!!----------');
  140. \Log::info($send_time);
  141. \Log::info($now_time);
  142. $delay = $now_time;
  143. // v('delay:'.$delay);die();
  144. \Log::info('========================发送模板消息2222222===================='.$task_id);
  145. \Log::info($data['openid']);
  146. try {
  147. $job = (new SendTemplate($send_data))->onConnection('rabbitmq')->delay($delay)->onQueue('send_template_list');
  148. dispatch($job);
  149. } catch (\Exception $e) {
  150. \Log::info($e->getMessage());
  151. }
  152. }
  153. }
  154. }else{
  155. \Log::info('========================发送模板消息_没找到用户===================='.$task_id);
  156. break;
  157. }
  158. $skip += count($users);
  159. }
  160. $templateMsgs['user_num'] = $skip;
  161. $templateMsgs->save();
  162. $officialAccountArray = $templateMsgs->toArray();
  163. Redis::hset('send_wechat_msg:task_id:'.$templateMsgs['id'], 'wechat_msg', json_encode($officialAccountArray));
  164. // Redis::hset('send_wechat_msg:task_id:'.$templateMsgs['id'], 'wechat_msg', '[{id:'.$templateMsgs['id'].'},{appid:'.$templateMsgs['appid'].'},{common_template_id:'.$templateMsgs['common_template_id'].'},{name:'.$templateMsgs['name'].'},{send_time:'.$templateMsgs['send_time'].'},{template_content:'.$templateMsgs['template_content'].'},{redirect_url:'.$templateMsgs['redirect_url'].'},{distribution_channel_id:'.$templateMsgs['distribution_channel_id'].'},{remark:'.$templateMsgs['remark'].'},{subscribe_time:'.$templateMsgs['subscribe_time'].'},{sex:'.$templateMsgs['sex'].'},{balance:'.$templateMsgs['balance'].'},{order_type:'.$templateMsgs['order_type'].'},{category_id:'.$templateMsgs['category_id'].'}]');
  165. } catch (\Exception $e) {
  166. \Log::info('========================循环用户发送模板消息报错====================');
  167. \Log::info($e->getMessage());
  168. }
  169. }
  170. /**
  171. * 发送模板消息
  172. */
  173. static function addWechatTemplateMsg($wechatTemplatePrams)
  174. {
  175. try {
  176. $appids = $wechatTemplatePrams['appid'];
  177. \Log::info('addWechatTemplateMsg:appid======'.$appids);
  178. // $wechatTemplatePrams['template_id'] = $wechatTemplatePrams['template_id'];
  179. // $wechatTemplatePrams['appid'] = $appidArray[$i];
  180. // $templateMsgs = WechatTemplateMsgs::create($wechatTemplatePrams);
  181. $appidArray = explode(',', $appids);
  182. for ($i=0; $i < count($appidArray); $i++) {
  183. $wechatTemplates = WechatTemplates::wechatTemplateByAppidAndTemplateId($appidArray[$i],$wechatTemplatePrams['common_template_id']);
  184. if(empty($wechatTemplates)) {
  185. \Log::info('addWechatTemplateMsg:======未找到模板');
  186. // return 2;
  187. }else{
  188. $isSendTemplate = WechatTemplateMsgs::isSendTemplateAtSameTime($wechatTemplatePrams['distribution_channel_id'],$wechatTemplatePrams['appid'],$wechatTemplatePrams['send_time'],$wechatTemplates['template_id']);
  189. if (!empty($isSendTemplate)) {
  190. \Log::info('addWechatTemplateMsg已经发送过该模板消息');
  191. \Log::info($isSendTemplate['id']);
  192. \Log::info($isSendTemplate['template_id']);
  193. \Log::info($isSendTemplate['status']);
  194. \Log::info($isSendTemplate['del_flag']);
  195. return 3;
  196. }
  197. $wechatTemplatePrams['template_id'] = $wechatTemplates['template_id'];
  198. $wechatTemplatePrams['appid'] = $appidArray[$i];
  199. $wechatTemplatePrams['status'] = '1';
  200. $wechatTemplatePrams['del_flag'] = 0;
  201. $wechatTemplatePrams['user_num'] = 0;
  202. \Log::info('save_wechat_template:======');
  203. \Log::info($wechatTemplatePrams);
  204. $templateMsgs = WechatTemplateMsgs::create($wechatTemplatePrams);
  205. $officialAccountArray = $templateMsgs->toArray();
  206. Redis::hset('send_wechat_msg:task_id:'.$templateMsgs['id'], 'wechat_msg', json_encode($officialAccountArray));
  207. // Redis::hset('send_wechat_msg:task_id:'.$templateMsgs['id'], 'wechat_msg', '[{id:'.$wechatTemplatePrams['id'].'},{appid:'.$wechatTemplatePrams['appid'].'},{common_template_id:'.$wechatTemplatePrams['common_template_id'].'},{name:'.$wechatTemplatePrams['name'].'},{send_time:'.$wechatTemplatePrams['send_time'].'},{template_content:'.$wechatTemplatePrams['template_content'].'},{redirect_url:'.$wechatTemplatePrams['redirect_url'].'},{distribution_channel_id:'.$wechatTemplatePrams['distribution_channel_id'].'},{remark:'.$wechatTemplatePrams['remark'].'},{subscribe_time:'.$wechatTemplatePrams['subscribe_time'].'},{sex:'.$wechatTemplatePrams['sex'].'},{balance:'.$wechatTemplatePrams['balance'].'},{order_type:'.$wechatTemplatePrams['order_type'].'},{category_id:'.$wechatTemplatePrams['category_id'].'}]');
  208. $wechatTemplatePrams['id'] = $templateMsgs['id'];
  209. \Log::info('send_template66666666666:======'.$wechatTemplatePrams['template_id']."\n");
  210. // WechatTemplateService::add_template_task($wechatTemplatePrams,$templateMsgs);
  211. // /**
  212. // * 通过Job方式发送模板消息-----queue
  213. // */
  214. // $job = (new TemplateMsgSendJob($wechatTemplatePrams))->delay(20);
  215. // dispatch($job);
  216. }
  217. }
  218. return 1;
  219. } catch (\Exception $e) {
  220. \Log::info("正式发送模板消息-更新日志:");
  221. \Log::info($e->getMessage());
  222. return 0;
  223. }
  224. }
  225. /**
  226. * 单个用户测试发送模板消息
  227. */
  228. static function testAddWechatTemplateMsg($wechatTemplatePrams)
  229. {
  230. \Log::info('testAddWechatTemplateMsg_start:');
  231. \Log::info($wechatTemplatePrams);
  232. // 测试链接加上域名
  233. $wechatTemplatePrams['redirect_url'] = TemplateCustomSendService::checkAddDomain($wechatTemplatePrams['distribution_channel_id'],$wechatTemplatePrams['redirect_url']);
  234. try {
  235. //1,获取指定的用户
  236. $appids = $wechatTemplatePrams['appid'];
  237. $appidArray = explode(',', $appids);
  238. for ($i=0; $i < count($appidArray); $i++) {
  239. $wechatTemplates = WechatTemplates::wechatTemplateByAppidAndTemplateId($appidArray[$i],$wechatTemplatePrams['common_template_id']);
  240. if(empty($wechatTemplates)) {
  241. \Log::info('testAddWechatTemplateMsg_empty_wechat_template:'.$wechatTemplatePrams['distribution_channel_id']);
  242. return 2;
  243. }else{
  244. \Log::info('testAddWechatTemplateMsg_in:'.$wechatTemplatePrams['distribution_channel_id']);
  245. $forceSubscribeUserPram['uid'] = $wechatTemplatePrams['uid'];
  246. $forceSubscribeUserPram['appid'] = $appidArray[$i];
  247. $forceSubscribeUserPram['distribution_channel_id'] = $wechatTemplatePrams['distribution_channel_id'];
  248. $force_user = array();
  249. $temp_force_user = ForceSubscribeService::forceSubscribeUsersByUidAndAppidAndChannelId($forceSubscribeUserPram);
  250. \Log::info('temp_force_user');\Log::info($temp_force_user);
  251. if(count($temp_force_user) == 0){
  252. \Log::info('testAddWechatTemplateMsg_has_no_user:'.$wechatTemplatePrams['uid']);
  253. $direct_user = array('openid'=>$wechatTemplatePrams['uid']);
  254. $force_user[] = $direct_user;
  255. }else{
  256. $force_user = $temp_force_user;
  257. }
  258. \Log::info('force_user');\Log::info($force_user);
  259. if (count($force_user)>0) {
  260. for ($j=0; $j < count($force_user); $j++) {
  261. //2,测试循环用户发送客服消息
  262. $data = array();
  263. $data['openid'] = $force_user[$j]['openid'];
  264. $data['appid'] = $appidArray[$i];
  265. $data['template_id'] = $wechatTemplates['template_id'];
  266. \Log::info('testAddWechatTemplateMsg_openid:'.$data['openid']);
  267. // 此处用户昵称统一从接口拿,兼容openid
  268. $nickname = '';
  269. try{
  270. $userinfo = ForceSubscribeService::getUserInfo($data['appid'], $data['openid']);
  271. $nickname = isset($userinfo['nickname'])?$userinfo['nickname']:'';
  272. }catch(\Exception $e){
  273. \Log::info('testAddWechatTemplateMsg_getuserinfo_ept:openid:'.$data['openid'].' ept:'.$e->getMessage());
  274. }
  275. \Log::info('change_placeholder openid:'.$data['openid']);
  276. // 占位符替换
  277. $place_holder_params = array();
  278. $place_holder_params['nickname'] = $nickname;
  279. $wechatTemplatePrams['template_content'] = ForceSubscribeService::change_placeholder($wechatTemplatePrams['template_content'],$place_holder_params);
  280. $data['template_content'] = str_replace(".DATA","",$wechatTemplatePrams['template_content']);
  281. $data['url'] = $wechatTemplatePrams['redirect_url'];
  282. $data['type'] = 'last_task';
  283. $data['task_id'] = 3;
  284. $data['send_time'] = date("Y-m-d H:i:s");
  285. $send_data=array(
  286. 'send_time'=>date("Y-m-d H:i:s"),
  287. 'data' => $data
  288. );
  289. $delay = 0;
  290. \Log::info('========================[[[[test send template message]]]]====================');
  291. \Log::info(str_replace(".DATA","",$wechatTemplatePrams['template_content']));
  292. $job = (new SendTemplate($send_data))->onConnection('rabbitmq')->delay($delay)->onQueue('send_template_list');
  293. dispatch($job);
  294. }
  295. }
  296. \Log::info('testAddWechatTemplateMsg_end:'.$wechatTemplatePrams['distribution_channel_id']);
  297. }
  298. }
  299. return 1;
  300. } catch (\Exception $e) {
  301. \Log::info("测试发送模板消息-更新日志:");
  302. \Log::info($e->getMessage());
  303. return 0;
  304. }
  305. }
  306. /**
  307. * 增加模板
  308. */
  309. static function addWechatTemplate($wechatTemplatePrams)
  310. {
  311. try {
  312. $wechatTemplates = WechatTemplates::wechatTemplateByAppidAndTemplateId($wechatTemplatePrams['appid'],$wechatTemplatePrams['common_template_id']);
  313. if(empty($wechatTemplates)) {
  314. $wechatTemplates['appid'] = $wechatTemplatePrams['appid'];
  315. $wechatTemplates['common_template_id'] = $wechatTemplatePrams['common_template_id'];
  316. $wechatTemplates['template_id'] = $wechatTemplatePrams['template_id'];
  317. WechatTemplates::create($wechatTemplates);
  318. return 1;
  319. }else{
  320. return 2;
  321. }
  322. } catch (\Exception $e) {
  323. // \Log("增加模板消息-更新日志:".$e);
  324. return 0;
  325. }
  326. }
  327. /**
  328. * 更新模板的template_id
  329. */
  330. static function updateWechatTemplateId($wechatTemplatePrams)
  331. {
  332. try {
  333. $wechatTemplates = WechatTemplates::wechatTemplateByAppidAndTemplateId($wechatTemplatePrams['appid'],$wechatTemplatePrams['common_template_id']);
  334. if(!empty($wechatTemplates)) {
  335. \Log::info('updateWechatTemplate:old_template_id:'.$wechatTemplates['template_id'].' new_template_id:'.$wechatTemplatePrams['template_id']);
  336. // 更新映射模板
  337. WechatTemplates::updateWechatTemplateId($wechatTemplatePrams['appid'],$wechatTemplatePrams['common_template_id'],$wechatTemplatePrams['template_id']);
  338. WechatTemplateMsgs::updateWechatTemplateMsgsByTemplateId($wechatTemplatePrams['template_id'],$wechatTemplates['template_id']);
  339. return 1;
  340. }else{
  341. \Log::info('updateWechatTemplate_false: new_template_id:'.$wechatTemplatePrams['template_id']);
  342. return 2;
  343. }
  344. } catch (\Exception $e) {
  345. \Log::info('updateWechatTemplateId,ept::'.$e->getMessage());
  346. return 0;
  347. }
  348. return 1;
  349. }
  350. /**
  351. * 删除模板消息
  352. */
  353. static function delWechatTemplateMsg($wechatTemplatePrams)
  354. {
  355. try {
  356. $task_id = $wechatTemplatePrams['id'];
  357. $wechatTemplateMsgs = WechatTemplateMsgs::wechatTemplateMsgsById($wechatTemplatePrams['id']);
  358. if(!empty($wechatTemplateMsgs)) {
  359. if($wechatTemplateMsgs['status'] == '8'){
  360. \Log::info('该模板已经在发送状态,不允许编辑'.$wechatTemplatePrams['id']);
  361. return 4;
  362. }
  363. $wechatTemplateMsgs['status'] = '4';
  364. $wechatTemplateMsgs['del_flag'] = 1;
  365. $wechatTemplateMsgs->save();
  366. $officialAccountArray = $wechatTemplateMsgs->toArray();
  367. Redis::hset('send_wechat_msg:task_id:'.$wechatTemplateMsgs['id'], 'wechat_msg', json_encode($officialAccountArray));
  368. // Redis::hset('send_wechat_msg:task_id:'.$wechatTemplateMsgs['id'], 'wechat_msg', '[{id:'.$wechatTemplateMsgs['id'].'},{appid:'.$wechatTemplateMsgs['appid'].'},{common_template_id:'.$wechatTemplateMsgs['common_template_id'].'},{name:'.$wechatTemplateMsgs['name'].'},{send_time:'.$wechatTemplateMsgs['send_time'].'},{template_content:'.$wechatTemplateMsgs['template_content'].'},{redirect_url:'.$wechatTemplateMsgs['redirect_url'].'},{distribution_channel_id:'.$wechatTemplateMsgs['distribution_channel_id'].'},{remark:'.$wechatTemplateMsgs['remark'].'},{subscribe_time:'.$wechatTemplateMsgs['subscribe_time'].'},{sex:'.$wechatTemplateMsgs['sex'].'},{balance:'.$wechatTemplateMsgs['balance'].'},{order_type:'.$wechatTemplateMsgs['order_type'].'},{category_id:'.$wechatTemplateMsgs['category_id'].'}]');
  369. // $templateMsgsArray = $wechatTemplateMsgs->toArray();
  370. // Redis::hmset('send_wechat_msg:task_id:'.$wechatTemplateMsgs['id'],$templateMsgsArray);
  371. return 1;
  372. }else{
  373. return 2;
  374. }
  375. } catch (\Exception $e) {
  376. // \Log("模板消息状态-更新日志:".$e);
  377. return 0;
  378. }
  379. }
  380. /**
  381. * 更新模板消息或者客服消息状态(灵杰 wechat 调用)
  382. */
  383. static function updateWechatTemplateStatus($wechatTemplatePrams)
  384. {
  385. try {
  386. \Log::info('==========================更新 模板消息/客服消息推送状态'.$wechatTemplatePrams['id']);
  387. $task_id = $wechatTemplatePrams['id'];
  388. $taskidArray = explode('_', $task_id);
  389. if (count($taskidArray)>1) {
  390. if ($taskidArray[0] == 'custom') {
  391. \Log::info('updateWechatTemplateStatus:'.$task_id.' status:'.$wechatTemplatePrams['status']);
  392. $customSendMsgs = CustomSendMsgs::customSendMsgsByTaskid($task_id);
  393. if(!empty($customSendMsgs)) {
  394. $customSendMsgs['status'] = $wechatTemplatePrams['status'];
  395. $customSendMsgs->save();
  396. $officialAccountArray = $customSendMsgs->toArray();
  397. Redis::hset('send_wechat_msg:task_id:'.$customSendMsgs['task_id'], 'wechat_msg', json_encode($officialAccountArray));
  398. // 如果是智能托管有批次号,更新下批次状态
  399. if($customSendMsgs['trusteeship'] == 1 && $wechatTemplatePrams['status'] == 3){
  400. \Log::info('try_update_batch_custom_send_msgs_status:'.$customSendMsgs['id']);
  401. $batchCustomMsg = BatchCustomSendMsgs::batchCustomMsgById($customSendMsgs['batch_no']);
  402. if(isset($batchCustomMsg->status) && $batchCustomMsg->status !=3 ){
  403. \Log::info('update_batch_custom_send_msgs_status:'.$customSendMsgs['id'].' batch_no:'.$customSendMsgs['batch_no']);
  404. BatchCustomSendMsgs::updateBatchCustomSendMsgStatusById($customSendMsgs['batch_no'],3,0);
  405. }else{
  406. \Log::info('already_update_batch_custom_send_msgs_status:'.$customSendMsgs['id'].' batch_no:'.$customSendMsgs['batch_no']);
  407. }
  408. }else{
  409. \Log::info('not_update_batch_custom_send_msgs_status:'.$customSendMsgs['id']);
  410. }
  411. return 1;
  412. }else{
  413. \Log::info('==========================客服消息 数据未找到'.$task_id);
  414. return 2;
  415. }
  416. }
  417. }else{
  418. \Log::info('==========================模板消息推送'.$task_id);
  419. $wechatTemplateMsgs = WechatTemplateMsgs::wechatTemplateMsgsById($wechatTemplatePrams['id']);
  420. if(!empty($wechatTemplateMsgs)) {
  421. $wechatTemplateMsgs['status'] = $wechatTemplatePrams['status'];
  422. $wechatTemplateMsgs->save();
  423. $officialAccountArray = $wechatTemplateMsgs->toArray();
  424. Redis::hset('send_wechat_msg:task_id:'.$wechatTemplateMsgs['id'], 'wechat_msg', json_encode($officialAccountArray));
  425. // Redis::hset('send_wechat_msg:task_id:'.$wechatTemplateMsgs['id'], 'wechat_msg', '[{id:'.$wechatTemplateMsgs['id'].'},{appid:'.$wechatTemplateMsgs['appid'].'},{common_template_id:'.$wechatTemplateMsgs['common_template_id'].'},{name:'.$wechatTemplateMsgs['name'].'},{send_time:'.$wechatTemplateMsgs['send_time'].'},{template_content:'.$wechatTemplateMsgs['template_content'].'},{redirect_url:'.$wechatTemplateMsgs['redirect_url'].'},{distribution_channel_id:'.$wechatTemplateMsgs['distribution_channel_id'].'},{remark:'.$wechatTemplateMsgs['remark'].'},{subscribe_time:'.$wechatTemplateMsgs['subscribe_time'].'},{sex:'.$wechatTemplateMsgs['sex'].'},{balance:'.$wechatTemplateMsgs['balance'].'},{order_type:'.$wechatTemplateMsgs['order_type'].'},{category_id:'.$wechatTemplateMsgs['category_id'].'}]');
  426. return 1;
  427. }else{
  428. \Log::info('==========================模板消息 数据未找到'.$task_id);
  429. return 2;
  430. }
  431. }
  432. } catch (\Exception $e) {
  433. \Log::info($e->getMessage());
  434. return 0;
  435. }
  436. }
  437. /**
  438. * 更新模板消息状态(南哥)
  439. */
  440. static function wechatTemplateStatusChange($wechatTemplatePrams)
  441. {
  442. try {
  443. \Log::info('==========================修改 模板消息发送状态'.$wechatTemplatePrams['id']);
  444. $task_id = $wechatTemplatePrams['id'];
  445. $wechatTemplateMsgs = WechatTemplateMsgs::wechatTemplateMsgsById($wechatTemplatePrams['id']);
  446. if(!empty($wechatTemplateMsgs)) {
  447. if($wechatTemplateMsgs['status'] == '8'){
  448. \Log::info('该模板已经在发送状态,不允许编辑'.$wechatTemplatePrams['id']);
  449. return 4;
  450. }
  451. $wechatTemplateMsgs['status'] = $wechatTemplatePrams['status'];
  452. $wechatTemplateMsgs->save();
  453. $officialAccountArray = $wechatTemplateMsgs->toArray();
  454. Redis::hset('send_wechat_msg:task_id:'.$wechatTemplateMsgs['id'], 'wechat_msg', json_encode($officialAccountArray));
  455. // Redis::hset('send_wechat_msg:task_id:'.$wechatTemplateMsgs['id'], 'wechat_msg', '[{id:'.$wechatTemplateMsgs['id'].'},{appid:'.$wechatTemplateMsgs['appid'].'},{common_template_id:'.$wechatTemplateMsgs['common_template_id'].'},{name:'.$wechatTemplateMsgs['name'].'},{send_time:'.$wechatTemplateMsgs['send_time'].'},{template_content:'.$wechatTemplateMsgs['template_content'].'},{redirect_url:'.$wechatTemplateMsgs['redirect_url'].'},{distribution_channel_id:'.$wechatTemplateMsgs['distribution_channel_id'].'},{remark:'.$wechatTemplateMsgs['remark'].'},{subscribe_time:'.$wechatTemplateMsgs['subscribe_time'].'},{sex:'.$wechatTemplateMsgs['sex'].'},{balance:'.$wechatTemplateMsgs['balance'].'},{order_type:'.$wechatTemplateMsgs['order_type'].'},{category_id:'.$wechatTemplateMsgs['category_id'].'}]');
  456. return 1;
  457. }else{
  458. \Log::info('==========================模板消息 数据未找到'.$task_id);
  459. return 2;
  460. }
  461. } catch (\Exception $e) {
  462. \Log($e);
  463. return 0;
  464. }
  465. }
  466. //判断1小时内是否有相同的模板消息插入过
  467. static function isSendTemplateAtSameTime($wechatTemplatePrams){
  468. return WechatTemplateMsgs::isSendTemplateAtSameTime($wechatTemplatePrams['distribution_channel_id'],$wechatTemplatePrams['appid'],$wechatTemplatePrams['send_time'],$wechatTemplatePrams['template_id']);
  469. }
  470. /**
  471. * 更新模板消息内容
  472. */
  473. static function updateWechatTemplateMsgById($wechatTemplatePrams)
  474. {
  475. try {
  476. $wechatTemplateMsgs = WechatTemplateMsgs::wechatTemplateMsgsById($wechatTemplatePrams['id']);
  477. if(!empty($wechatTemplateMsgs)) {
  478. if($wechatTemplateMsgs['status'] == '8'){
  479. \Log::info('该模板已经在发送状态,不允许编辑'.$wechatTemplatePrams['id']);
  480. return 4;
  481. }
  482. //先停止原来的模板,然后删除
  483. $wechatTemplateMsgs['status'] = '4';
  484. $wechatTemplateMsgs['del_flag'] = 1;
  485. $wechatTemplateMsgs->save();
  486. $officialAccountArray = $wechatTemplateMsgs->toArray();
  487. Redis::hset('send_wechat_msg:task_id:'.$wechatTemplateMsgs['id'], 'wechat_msg', json_encode($officialAccountArray));
  488. // Redis::hset('send_wechat_msg:task_id:'.$wechatTemplateMsgs['id'], 'wechat_msg', '[{id:'.$wechatTemplateMsgs['id'].'},{appid:'.$wechatTemplateMsgs['appid'].'},{common_template_id:'.$wechatTemplateMsgs['common_template_id'].'},{name:'.$wechatTemplateMsgs['name'].'},{send_time:'.$wechatTemplateMsgs['send_time'].'},{template_content:'.$wechatTemplateMsgs['template_content'].'},{redirect_url:'.$wechatTemplateMsgs['redirect_url'].'},{distribution_channel_id:'.$wechatTemplateMsgs['distribution_channel_id'].'},{remark:'.$wechatTemplateMsgs['remark'].'},{subscribe_time:'.$wechatTemplateMsgs['subscribe_time'].'},{sex:'.$wechatTemplateMsgs['sex'].'},{balance:'.$wechatTemplateMsgs['balance'].'},{order_type:'.$wechatTemplateMsgs['order_type'].'},{category_id:'.$wechatTemplateMsgs['category_id'].'}]');
  489. //创建新的模板
  490. $appids = $wechatTemplatePrams['appid'];
  491. $appidArray = explode(',', $appids);
  492. for ($i=0; $i < count($appidArray); $i++) {
  493. $wechatTemplates = WechatTemplates::wechatTemplateByAppidAndTemplateId($appidArray[$i],$wechatTemplatePrams['common_template_id']);
  494. if(empty($wechatTemplates)) {
  495. }else{
  496. $wechatTemplatePrams['template_id'] = $wechatTemplates['template_id'];
  497. $wechatTemplatePrams['appid'] = $appidArray[$i];
  498. // $users = ForceSubscribeService::forceUserCountByTemplatePrams($appidArray[$i],$wechatTemplatePrams['distribution_channel_id'],$wechatTemplatePrams['subscribe_time'],$wechatTemplatePrams['sex'],$wechatTemplatePrams['balance'],$wechatTemplatePrams['category_id'],$wechatTemplatePrams['order_type']);
  499. $isSendTemplate = WechatTemplateMsgs::isSendTemplateAtSameTime($wechatTemplatePrams['distribution_channel_id'],$wechatTemplatePrams['appid'],$wechatTemplatePrams['send_time'],$wechatTemplates['template_id']);
  500. if (!empty($isSendTemplate)) {
  501. \Log::info('已经发送过该模板消息');
  502. \Log::info($isSendTemplate['id']);
  503. \Log::info($isSendTemplate['template_id']);
  504. \Log::info($isSendTemplate['status']);
  505. \Log::info($isSendTemplate['del_flag']);
  506. return 3;
  507. }
  508. $skip = 0;
  509. $userCount = 0;
  510. $wechatTemplatePrams['status'] = '1';
  511. $wechatTemplatePrams['user_num'] = 0;
  512. $wechatTemplatePrams['del_flag'] = 0;
  513. $templateMsgs = WechatTemplateMsgs::create($wechatTemplatePrams);
  514. $wechatTemplatePrams['id'] = $templateMsgs['id'];
  515. // $templateMsgsArray = $templateMsgs->toArray();
  516. // Redis::hmset('send_wechat_msg:task_id:'.$templateMsgs['id'],$templateMsgsArray);
  517. $officialAccountArray = $templateMsgs->toArray();
  518. Redis::hset('send_wechat_msg:task_id:'.$templateMsgs['id'], 'wechat_msg', json_encode($officialAccountArray));
  519. // Redis::hset('send_wechat_msg:task_id:'.$templateMsgs['id'], 'wechat_msg', '[{id:'.$wechatTemplatePrams['id'].'},{appid:'.$wechatTemplatePrams['appid'].'},{common_template_id:'.$wechatTemplatePrams['common_template_id'].'},{name:'.$wechatTemplatePrams['name'].'},{send_time:'.$wechatTemplatePrams['send_time'].'},{template_content:'.$wechatTemplatePrams['template_content'].'},{redirect_url:'.$wechatTemplatePrams['redirect_url'].'},{distribution_channel_id:'.$wechatTemplatePrams['distribution_channel_id'].'},{remark:'.$wechatTemplatePrams['remark'].'},{subscribe_time:'.$wechatTemplatePrams['subscribe_time'].'},{sex:'.$wechatTemplatePrams['sex'].'},{balance:'.$wechatTemplatePrams['balance'].'},{order_type:'.$wechatTemplatePrams['order_type'].'},{category_id:'.$wechatTemplatePrams['category_id'].'}]');
  520. // WechatTemplateService::add_template_task($wechatTemplatePrams,$templateMsgs);
  521. // /**
  522. // * 通过Job方式发送模板消息-----queue
  523. // */
  524. // $job = (new TemplateMsgSendJob($wechatTemplatePrams))->delay(20);
  525. // dispatch($job);
  526. }
  527. }
  528. return 1;
  529. }else{
  530. return 2;
  531. }
  532. } catch (\Exception $e) {
  533. // \Log("模板消息-更新日志:".$e);
  534. return 0;
  535. }
  536. }
  537. /**
  538. * 获取微信公告模板
  539. */
  540. static function wechatPublicTemplateList()
  541. {
  542. return WechatPublicTemplates::wechatPublicTemplateList();
  543. }
  544. /**
  545. * 搜索
  546. */
  547. static function searchWechatTemplateMsgs($param,$is_all=false)
  548. {
  549. return WechatTemplateMsgs::searchWechatTemplateMsgs($param,$is_all);
  550. }
  551. /**
  552. * 检测模板状态
  553. * 1、正常使用
  554. * 2、检测异常,已修复请重试
  555. * 3、模板被封,请等待解封
  556. * 4、模板分类错误,请修改分类至(IT科技->IT软件与服务、文体娱乐->文化|传媒),然后重新授权后再重试
  557. */
  558. static function checkTemplateStatus($appids,$common_template_id)
  559. {
  560. $result = ['code'=>1,'msg'=>''];
  561. if(!empty($appids)){
  562. foreach($appids as $appid){
  563. try {
  564. $timestamp = time();
  565. $params = array('gzh_app_id' => $appid,'common_template_id'=>$common_template_id, "timestamp" => $timestamp);
  566. $sign = get_sign($params);
  567. $resJson = self::getUserClient()->request("POST", "check_template_status",
  568. ['query' => ['gzh_app_id' => $appid,'common_template_id'=>$common_template_id, 'timestamp' => $timestamp, 'sign' => $sign], 'connect_timeout' => 10]
  569. )->getBody()->getContents();
  570. $resJson = object_to_array(json_decode($resJson));
  571. \Log::info('check_template_status_end,appid:'.$appid.' common_template_id:'.$common_template_id);
  572. \Log::info($resJson);
  573. $result = [
  574. 'code'=>$resJson['code'],
  575. 'msg'=>$resJson['msg']
  576. ];
  577. } catch (\Exception $e) {
  578. $result = [
  579. 'code'=>0,
  580. 'msg'=>'测试请求异常,请稍后重试'
  581. ];
  582. \Log::info('checkTemplateStatus_ept:'.$e->getMessage());
  583. }
  584. }
  585. }
  586. \Log::info('check_template_status_end:'.json_encode($result));
  587. return $result;
  588. }
  589. static function getUserClient()
  590. {
  591. return new Client(['base_uri' => env('MEDIA_API_BASE_URI')]);
  592. }
  593. }