WechatTemplateMessageService.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace crmeb\services;
  12. use app\common\repositories\store\order\StoreGroupOrderRepository;
  13. use app\common\repositories\store\order\StoreOrderRepository;
  14. use app\common\repositories\store\order\StoreOrderStatusRepository;
  15. use app\common\repositories\store\order\StoreRefundOrderRepository;
  16. use app\common\repositories\store\product\ProductGroupBuyingRepository;
  17. use app\common\repositories\store\product\ProductGroupUserRepository;
  18. use app\common\repositories\store\service\StoreServiceRepository;
  19. use app\common\repositories\user\UserBillRepository;
  20. use app\common\repositories\user\UserExtractRepository;
  21. use app\common\repositories\user\UserRechargeRepository;
  22. use app\common\repositories\wechat\WechatUserRepository;
  23. use crmeb\listens\pay\UserRechargeSuccessListen;
  24. use crmeb\services\template\Template;
  25. use app\common\repositories\user\UserRepository;
  26. use think\facade\Route;
  27. class WechatTemplateMessageService
  28. {
  29. /**
  30. * TODO
  31. * @param array $data
  32. * @param string|null $link
  33. * @param string|null $color
  34. * @return bool
  35. * @author Qinii
  36. * @day 2020-06-29
  37. */
  38. public function sendTemplate(array $data)
  39. {
  40. $res = $this->templateMessage($data['tempCode'],$data['id']);
  41. if(!$res || !is_array($res))return true;
  42. foreach($res as $item){
  43. if(is_array($item['uid'])){
  44. foreach ($item['uid'] as $value){
  45. $openid = $this->getUserOpenID($value['uid']);
  46. if ($openid) {
  47. $this->send($openid,$item['tempCode'],$item['data'],'wechat',$item['link'],$item['color']);
  48. }
  49. }
  50. }else{
  51. $openid = $this->getUserOpenID($item['uid']);
  52. if (!$openid) return true;
  53. $this->send($openid,$item['tempCode'],$item['data'],'wechat',$item['link'],$item['color']);
  54. }
  55. }
  56. }
  57. /**
  58. * TODO
  59. * @param $data
  60. * @param string|null $link
  61. * @param string|null $color
  62. * @return bool
  63. * @author Qinii
  64. * @day 2020-07-01
  65. */
  66. public function subscribeSendTemplate($data)
  67. {
  68. $res = $this->subscribeTemplateMessage($data['tempCode'],$data['id']);
  69. if(!$res || !is_array($res))return true;
  70. $openid = $this->getUserOpenID($res['uid'],'min');
  71. if (!$openid) return true;
  72. $this->send($openid,$res['tempCode'],$res['data'],'subscribe',$res['link'],$res['color']);
  73. }
  74. /**
  75. * TODO
  76. * @param $uid
  77. * @return mixed
  78. * @author Qinii
  79. * @day 2020-06-29
  80. */
  81. public function getUserOpenID($uid,$type = 'wechat')
  82. {
  83. $user = app()->make(UserRepository::class)->get($uid);
  84. $make = app()->make(WechatUserRepository::class);
  85. if($type == 'wechat') {
  86. return $make->idByOpenId((int)$user['wechat_user_id']);
  87. }else{
  88. return $make->idByRoutineId((int)$user['wechat_user_id']);
  89. }
  90. }
  91. /**
  92. * TODO
  93. * @param $openid
  94. * @param $tempCode
  95. * @param $data
  96. * @param $type
  97. * @param $link
  98. * @param $color
  99. * @return bool|mixed
  100. * @author Qinii
  101. * @day 2020-07-01
  102. */
  103. public function send($openid,$tempCode,$data,$type,$link,$color)
  104. {
  105. try{
  106. $template = new Template($type);
  107. $template->to($openid)->color($color);
  108. if ($link) $template->url($link);
  109. return $template->send($tempCode, $data);
  110. } catch (\Exception $e) {
  111. return false;
  112. }
  113. }
  114. /**
  115. * TODO 公众号
  116. * @param string $tempCode
  117. * @param $id
  118. * @return array|bool
  119. * @author Qinii
  120. * @day 2020-07-01
  121. */
  122. public function templateMessage(string $tempCode, int $id)
  123. {
  124. $bill_make = app()->make(UserBillRepository::class);
  125. $order_make = app()->make(StoreOrderRepository::class);
  126. $refund_make = app()->make(StoreRefundOrderRepository::class);
  127. $order_status_make = app()->make(StoreOrderStatusRepository::class);
  128. switch ($tempCode)
  129. {
  130. case 'ORDER_CREATE': //订单生成通知
  131. $res = $order_make->selectWhere(['group_order_id' => $id]);
  132. if(!$res) return false;
  133. foreach ($res as $item){
  134. $order = $order_make->getWith($item['order_id'],'orderProduct');
  135. $data[] = [
  136. 'tempCode' => 'ORDER_CREATE',
  137. 'uid' => app()->make(StoreServiceRepository::class)->getNoticeServiceInfo($item->mer_id),
  138. 'data' => [
  139. 'first' => '您有新的生成订单请注意查看',
  140. 'keyword1' => $item->create_time,
  141. 'keyword2' => '「'.$order['orderProduct'][0]['cart_info']['product']['store_name'].'」等',
  142. 'keyword3' => $item->order_sn,
  143. 'remark' => '查看详情'
  144. ],
  145. 'link' => rtrim(systemConfig('site_url'),'/').'/pages/admin/orderList/index?types=1',
  146. 'color' => null
  147. ];
  148. }
  149. break;
  150. case 'ORDER_PAY_SUCCESS': //支付成功
  151. $group_order = app()->make(StoreGroupOrderRepository::class)->get($id);
  152. if(!$group_order) return false;
  153. $data[] = [
  154. 'tempCode' => 'ORDER_PAY_SUCCESS',
  155. 'uid' => $group_order->uid,
  156. 'data' => [
  157. 'first' => '您的订单已支付',
  158. 'keyword1' => $group_order->group_order_sn,
  159. 'keyword2' => $group_order->pay_price,
  160. 'remark' => '我们会经快发货,请耐心等待'
  161. ],
  162. 'link' => rtrim(systemConfig('site_url'),'/').'/pages/users/order_list/index?status=1',
  163. 'color' => null
  164. ];
  165. $res = $order_make->selectWhere(['group_order_id' => $id]);
  166. if(!$res) return false;
  167. foreach ($res as $item){
  168. $data[] = [
  169. 'tempCode' => 'ORDER_PAY_SUCCESS',
  170. 'uid' => app()->make(StoreServiceRepository::class)->getNoticeServiceInfo($item->mer_id),
  171. 'data' => [
  172. 'first' => '您有新的支付订单请注意查看。',
  173. 'keyword1' => $item->order_sn,
  174. 'keyword2' => $item->pay_price,
  175. 'remark' => '请尽快发货。'
  176. ],
  177. 'link' => rtrim(systemConfig('site_url'),'/').'/pages/admin/orderList/index?types=2',
  178. 'color' => null
  179. ];
  180. }
  181. break;
  182. case 'ORDER_POSTAGE_SUCCESS'://订单发货提醒(快递)
  183. $res = $order_make->get($id);
  184. if(!$res) return false;
  185. $data[] = [
  186. 'tempCode' => 'ORDER_POSTAGE_SUCCESS',
  187. 'uid' => $res->uid ,
  188. 'data' => [
  189. 'first' => '亲,宝贝已经启程了,好想快点来到你身边',
  190. 'keyword1' => $res['order_sn'],
  191. 'keyword2' => $res['delivery_name'],
  192. 'keyword3' => $res['delivery_id'],
  193. 'remark' => '请耐心等待收货哦。'
  194. ],
  195. 'link' => rtrim(systemConfig('site_url'),'/').'/pages/order_details/index?order_id='.$id,
  196. 'color' => null
  197. ];
  198. break;
  199. case 'ORDER_DELIVER_SUCCESS'://订单发货提醒(送货)
  200. $res = $order_make->getWith($id,'orderProduct');
  201. if(!$res) return false;
  202. $data[] = [
  203. 'tempCode' => 'ORDER_DELIVER_SUCCESS',
  204. 'uid' => $res->uid ,
  205. 'data' => [
  206. 'first' => '亲,宝贝已经启程了,好想快点来到你身边',
  207. 'keyword1' => '「'.$res['orderProduct'][0]['cart_info']['product']['store_name'].'」等',
  208. 'keyword2' => $res['create_time'],
  209. 'keyword3' => $res['user_address'],
  210. 'keyword4' => $res['delivery_name'],
  211. 'keyword5' => $res['delivery_id'],
  212. 'remark' => '请耐心等待收货哦。'
  213. ],
  214. 'link' => rtrim(systemConfig('site_url'),'/').'/pages/order_details/index?order_id='.$id,
  215. 'color' => null
  216. ];
  217. break;
  218. case 'ORDER_TAKE_SUCCESS': //订单收货通知
  219. $res = $order_make->getWith($id,'orderProduct');
  220. if(!$res) return false;
  221. $status = $order_status_make->getWhere(['order_id' => $id,'change_type' => 'take']);
  222. $data[] = [
  223. 'tempCode' => 'ORDER_TAKE_SUCCESS',
  224. 'uid' => $res->uid,
  225. 'data' => [
  226. 'first' => '亲,宝贝已经签收',
  227. 'keyword1' => $res['order_sn'],
  228. 'keyword2' => '已收货',
  229. 'keyword3' => $status['change_time'],
  230. 'keyword4' => '「'.$res['orderProduct'][0]['cart_info']['product']['store_name'].'」等',
  231. 'remark' => '请确认。'
  232. ],
  233. 'link' => rtrim(systemConfig('site_url'),'/').'/pages/order_details/index?order_id='.$id,
  234. 'color' => null
  235. ];
  236. break;
  237. case 'USER_BALANCE_CHANGE'://帐户资金变动提醒
  238. $res = $bill_make->get($id);
  239. if(!$res) return false;
  240. $data[] = [
  241. 'tempCode' => 'USER_BALANCE_CHANGE',
  242. 'uid' => $res->uid,
  243. 'data' => [
  244. 'first' => '资金变动提醒',
  245. 'keyword1' => '账户余额变动',
  246. 'keyword2' => $res['number'],
  247. 'keyword3' => $res['create_time'],
  248. 'keyword4' => $res['balance'],
  249. 'remark' => '请确认'
  250. ],
  251. 'link' => rtrim(systemConfig('site_url'),'/').'/pages/users/user_money/index',
  252. 'color' => null
  253. ];
  254. break;
  255. case 'ORDER_REFUND_STATUS'://退款申请通知
  256. $res = $refund_make->get($id);
  257. if(!$res) return false;
  258. $data[] = [
  259. 'tempCode' => 'ORDER_REFUND_STATUS',
  260. 'uid' => app()->make(StoreServiceRepository::class)->getNoticeServiceInfo($res->mer_id),
  261. 'data' => [
  262. 'first' => '您有新的退款申请',
  263. 'keyword1' => $res['refund_order_sn'],
  264. 'keyword2' => $res['refund_price'],
  265. 'keyword3' => $res['refund_message'],
  266. 'remark' => '请及时处理'
  267. ],
  268. 'link' => null,
  269. 'color' => null
  270. ];
  271. break;
  272. case 'ORDER_REFUND_END'://退货确认提醒
  273. $res = $refund_make->getWith($id,['order']);
  274. if(!$res) return false;
  275. $order = $order_make->getWith($res['order_id'],'orderProduct');
  276. $data[] = [
  277. 'tempCode' => 'ORDER_REFUND_END',
  278. 'uid' => $res->uid,
  279. 'data' => [
  280. 'first' => '亲,您有一个订单已退款',
  281. 'keyword1' => $res['refund_order_sn'],
  282. 'keyword2' => $res['order']['order_sn'],
  283. 'keyword3' => $res['refund_price'],
  284. 'keyword4' => '「'.$order['orderProduct'][0]['cart_info']['product']['store_name'].'」等',
  285. 'remark' => $order['activity_type'] == 4 ? '拼团失败,系统自动退款' : '请查看详情'
  286. ],
  287. 'link' => rtrim(systemConfig('site_url'),'/').'/pages/users/refund/detail?id='.$id,
  288. 'color' => null
  289. ];
  290. break;
  291. case 'ORDER_REFUND_NOTICE'://退款进度提醒
  292. $status = [-1=>'审核未通过' ,1 => '商家已同意退货,请尽快将商品退回,并填写快递单号',];
  293. $res = $refund_make->getWith($id,['order']);
  294. if(!$res || !in_array($res['status'],[-1,1])) return false;
  295. $order = $order_make->getWith($res['order_id'],'orderProduct');
  296. $data[] = [
  297. 'tempCode' => 'ORDER_REFUND_NOTICE',
  298. 'uid' => $res->uid,
  299. 'data' => [
  300. 'first' => '退款进度提醒',
  301. 'keyword1' => $res['refund_order_sn'],
  302. 'keyword2' => $status[$res['status']],
  303. 'keyword3' => '「'.$order['orderProduct'][0]['cart_info']['product']['store_name'].'」等',
  304. 'keyword4' => $res['refund_price'],
  305. 'remark' => ''
  306. ],
  307. 'link' => rtrim(systemConfig('site_url'),'/').'/pages/users/refund/detail?id='.$id,
  308. 'color' => null
  309. ];
  310. break;
  311. case 'GROUP_BUYING_SUCCESS':
  312. /*
  313. {{first.DATA}}
  314. 商品名称:{{keyword1.DATA}}
  315. 订单号:{{keyword2.DATA}}
  316. 支付金额:{{keyword3.DATA}}
  317. 支付时间:{{keyword4.DATA}}
  318. {{remark.DATA}}
  319. */
  320. $res = app()->make(ProductGroupBuyingRepository::class)->get($id);
  321. if(!$res) return false;
  322. $buying_make = app()->make(ProductGroupUserRepository::class);
  323. $ret = $buying_make->getSearch(['group_buying_id' => $id])->where('uid','>',0)->select();
  324. foreach ($ret as $item){
  325. $data[] = [
  326. 'tempCode' => 'GROUP_BUYING_SUCCESS',
  327. 'uid' => $item->uid,
  328. 'data' => [
  329. 'first' => '恭喜您拼团成功!',
  330. 'keyword1' => '「'.$res->productGroup->product['store_name'].'」',
  331. 'keyword2' => $item->orderInfo['order_sn'],
  332. 'keyword3' => $item->orderInfo['pay_price'],
  333. 'keyword4' => $item->orderInfo['pay_time'],
  334. 'remark' => ''
  335. ],
  336. 'link' => rtrim(systemConfig('site_url'),'/').'/pages/order_details/index?order_id='.$item['order_id'],
  337. 'color' => null
  338. ];
  339. }
  340. break;
  341. default:
  342. return false;
  343. break;
  344. }
  345. return $data;
  346. }
  347. /**
  348. * TODO 小程序模板
  349. * @param string $tempCode
  350. * @param $id
  351. * @return array|bool
  352. * @author Qinii
  353. * @day 2020-07-01
  354. */
  355. public function subscribeTemplateMessage(string $tempCode, $id)
  356. {
  357. $user_make = app()->make(UserRechargeRepository::class);
  358. $order_make = app()->make(StoreOrderRepository::class);
  359. $refund_make = app()->make(StoreRefundOrderRepository::class);
  360. $order_group_make = app()->make(StoreGroupOrderRepository::class);
  361. $extract_make = app()->make(UserExtractRepository::class);
  362. switch($tempCode)
  363. {
  364. case 'ORDER_PAY_SUCCESS': //订单支付成功
  365. $res = $order_group_make->get($id);
  366. if(!$res) return false;
  367. $data = [
  368. 'tempCode' => 'ORDER_PAY_SUCCESS',
  369. 'uid' => $res->uid,
  370. 'data' => [
  371. 'character_string1' => $res->group_order_sn,
  372. 'amount2' => $res->pay_price,
  373. 'date3' => $res->pay_time,
  374. 'amount5' => $res->total_price,
  375. ],
  376. 'link' => 'pages/users/order_list/index?status=1',
  377. 'color' => null
  378. ];
  379. break;
  380. case 'ORDER_DELIVER_SUCCESS': //订单发货提醒(送货)
  381. $res = $order_make->getWith($id,'orderProduct');
  382. if(!$res) return false;
  383. $name = substr($res['orderProduct'][0]['cart_info']['product']['store_name'],0,10);
  384. $data = [
  385. 'tempCode' => 'ORDER_DELIVER_SUCCESS',
  386. 'uid' => $res->uid,
  387. 'data' => [
  388. 'thing8' => '「'.$name.'」等',
  389. 'character_string1' => $res->order_sn,
  390. 'name4' => $res->delivery_name,
  391. 'phone_number10' => $res->delivery_id,
  392. ],
  393. 'link' => 'pages/order_details/index?order_id='.$id,
  394. 'color' => null
  395. ];
  396. break;
  397. case 'ORDER_POSTAGE_SUCCESS': //订单发货提醒(快递)
  398. $res = $order_make->getWith($id,'orderProduct');
  399. if(!$res) return false;
  400. $name = substr($res['orderProduct'][0]['cart_info']['product']['store_name'],0,10);
  401. $data = [
  402. 'tempCode' => 'ORDER_POSTAGE_SUCCESS',
  403. 'uid' => $res->uid,
  404. /**
  405. 快递单号{{character_string2.DATA}}
  406. 快递公司{{thing1.DATA}}
  407. 发货时间{{time3.DATA}}
  408. 订单商品{{thing5.DATA}}
  409. */
  410. 'data' => [
  411. 'character_string2' => $res->delivery_id,
  412. 'thing1' => $res->delivery_name,
  413. 'time3' => date('Y-m-d H:i:s',time()),
  414. 'thing5' => '「'.$name.'」等',
  415. ],
  416. 'link' => 'pages/order_details/index?order_id='.$id,
  417. 'color' => null
  418. ];
  419. break;
  420. case 'ORDER_REFUND_NOTICE': //退款通知
  421. $status = [-1=>'审核未通过' ,1 => '商家已同意退货,请尽快将商品退回',3 => '退款成功'];
  422. $res = $refund_make->getWith($id,['order']);
  423. if(!$res || !in_array($res['status'],[-1,1,3])) return false;
  424. $order = $order_make->getWith($res['order_id'],'orderProduct');
  425. $name = substr($order['orderProduct'][0]['cart_info']['product']['store_name'],0,10);
  426. $data = [
  427. 'tempCode' => 'ORDER_REFUND_NOTICE',
  428. 'uid' => $res->uid,
  429. 'data' => [
  430. 'thing1' => $status[$res->status],
  431. 'thing2' => '「'.$name.'」等',
  432. 'character_string6' => $res->refund_order_sn,
  433. 'amount3' => $res->refund_price,
  434. 'thing13' => $res->fail_message ?? '',
  435. ],
  436. 'link' => 'pages/users/refund/detail?id='.$id,
  437. 'color' => null
  438. ];
  439. break;
  440. case 'RECHARGE_SUCCESS': //充值成功
  441. $res = $user_make->get($id);
  442. if(!$res) return false;
  443. $data = [
  444. 'tempCode' => 'RECHARGE_SUCCESS',
  445. 'uid' => $res->uid,
  446. 'data' => [
  447. 'character_string1' => $res->order_id,
  448. 'amount3' => $res->price,
  449. 'amount6' => $res->give_price,
  450. 'date5' => $res->pay_time,
  451. ],
  452. 'link' => 'pages/users/user_money/index',
  453. 'color' => null
  454. ];
  455. break;
  456. case 'USER_EXTRACT': //提现结果通知
  457. $res = $extract_make->get($id);
  458. if(!$res) return false;
  459. $data = [
  460. 'tempCode' => 'USER_EXTRACT',
  461. 'uid' => $res->uid,
  462. 'data' => [
  463. 'thing1' => $res->status == -1 ? '未通过' : '已通过',
  464. 'amount2' => empty($res->bank_code)?(empty($res->alipay_code)?$res->wechat:$res->alipay_code):$res->bank_code,
  465. 'thing3' => $res->give_price,
  466. 'date4' => $res->create_time,
  467. ],
  468. 'link' => 'pages/users/user_spread_user/index',
  469. 'color' => null
  470. ];
  471. break;
  472. default:
  473. return false;
  474. break;
  475. }
  476. return $data;
  477. }
  478. }