123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- <?php
- namespace app\store\service\wxapp;
- use app\store\model\Wxapp as WxappModel;
- use app\store\model\Setting as SettingModel;
- use app\common\library\helper;
- use app\common\service\Basics;
- use app\common\library\wechat\WxSubMsg;
- use app\common\exception\BaseException;
- /**
- * 小程序订阅消息服务类
- * Class SubMsg
- * @package app\store\service\wxapp
- */
- class SubMsg extends Basics
- {
- /* @var $WxSubMsg WxSubMsg 小程序订阅消息api类 */
- private $WxSubMsg;
- /**
- * 构造方法
- * SubMsg constructor.
- * @param null $wxappId
- * @throws \app\common\exception\BaseException
- * @throws \think\Exception
- * @throws \think\exception\DbException
- */
- public function __construct($wxappId = null)
- {
- // 小程序订阅消息api类
- $wxConfig = WxappModel::getWxappCache($wxappId);
- $this->WxSubMsg = new WxSubMsg($wxConfig['app_id'], $wxConfig['app_secret']);
- }
- /**
- * 一键添加订阅消息
- * @return bool
- * @throws BaseException
- * @throws \think\exception\DbException
- */
- public function shuttle()
- {
- // 拉取我的模板列表
- $myList = $this->getMyTemplateList();
- // 筛选出未添加的模板
- $addedList = $this->getNotAddedTemplates($myList);
- // 批量添加订阅消息模板
- $newList = $this->onBatchAdd($addedList);
- // 全部模板列表
- $tplList = array_merge($newList, $myList);
- // 保存全部模板id
- return $this->saveAll($tplList);
- }
- /**
- * 保存全部模板id
- * @param $tplList
- * @return bool
- * @throws \think\exception\DbException
- */
- private function saveAll($tplList)
- {
- // 整理模板id
- $data = SettingModel::getItem('submsg');
- foreach ($data as &$group) {
- foreach ($group as &$item) {
- if (!isset($item['title'])) continue;
- $tpl = helper::arraySearch($tplList, 'title', $item['title']);
- $tpl != false && $item['template_id'] = $tpl['priTmplId'];
- }
- }
- // 保存数据
- return (new SettingModel)->edit('submsg', $data);
- }
- /**
- * 批量添加订阅消息模板
- * [并且记录返回的priTmplId]
- * @param $newList
- * @return array
- * @throws BaseException
- */
- private function onBatchAdd($newList)
- {
- foreach ($newList as &$item) {
- // 请求微信api, 添加模板记录
- $response = $this->WxSubMsg->addTemplate($item['tid'], $item['kidList'], $item['sceneDesc']);
- if ($response === false) {
- throw new BaseException(['msg' => "添加模板[{$item['sceneDesc']}]失败:" . $this->WxSubMsg->getError()]);
- }
- // 记录template_id
- $item['priTmplId'] = $response['priTmplId'];
- }
- return $newList;
- }
- /**
- * 筛选出未添加的模板
- * @param $myList
- * @return array
- */
- private function getNotAddedTemplates($myList)
- {
- // 所有订阅消息模板列表
- $templateLists = $this->getTemplates();
- if (empty($myList)) return $templateLists;
- // 整理未添加的
- $data = [];
- foreach ($templateLists as $item) {
- if (helper::arraySearch($myList, 'title', $item['title']) === false) {
- $data[] = $item;
- }
- }
- return $data;
- }
- /**
- * 所有订阅消息模板列表
- * @return array
- */
- private function getTemplates()
- {
- return [
- // 支付成功通知
- [
- 'tid' => 9344,
- 'title' => '新订单提醒',
- 'kidList' => [1, 2, 4, 3],
- 'sceneDesc' => '新订单提醒',
- ],
- // 订单发货通知
- [
- 'tid' => 855,
- 'title' => '订单发货通知',
- 'kidList' => [1, 2, 12, 11, 17],
- 'sceneDesc' => '订单发货通知',
- ],
- // 售后状态通知
- [
- 'tid' => 5049,
- 'title' => '售后状态通知',
- 'kidList' => [1, 6, 2, 3, 4],
- 'sceneDesc' => '售后状态通知',
- ],
- // 拼团进度通知
- [
- 'tid' => 5008,
- 'title' => '拼团进度通知',
- 'kidList' => [1, 5, 7, 3, 6],
- 'sceneDesc' => '拼团进度通知',
- ],
- // 分销商入驻审核通知
- [
- 'tid' => 4050,
- 'title' => '代理商入驻审核通知',
- 'kidList' => [1, 2, 3, 4],
- 'sceneDesc' => '分销商入驻审核通知',
- ],
- // 提现成功通知
- [
- 'tid' => 2001,
- 'title' => '提现成功通知',
- 'kidList' => [1, 3, 4],
- 'sceneDesc' => '提现成功通知',
- ],
- // 提现失败通知
- [
- 'tid' => 3173,
- 'title' => '提现失败通知',
- 'kidList' => [1, 3, 4],
- 'sceneDesc' => '提现失败通知',
- ],
- ];
- }
- /**
- * 拉取我的模板列表
- * @return mixed
- * @throws BaseException
- */
- private function getMyTemplateList()
- {
- $response = $this->WxSubMsg->getTemplateList();
- if ($response === false) {
- throw new BaseException(['msg' => '拉取模板列表失败:' . $this->WxSubMsg->getError()]);
- }
- return $response['data'];
- }
- }
|