WechatTemplateMessageService.php 19 KB

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