Kaynağa Gözat

【程序目录】同步小程序订阅消息和公众号模版消息优化

吴昊天 3 yıl önce
ebeveyn
işleme
b172a13ec7

+ 7 - 51
crmeb/app/adminapi/controller/v1/application/routine/RoutineTemplate.php

@@ -10,6 +10,7 @@
 // +----------------------------------------------------------------------
 namespace app\adminapi\controller\v1\application\routine;
 
+use app\jobs\notice\SyncMessageJob;
 use app\services\other\QrcodeServices;
 use app\services\message\TemplateMessageServices;
 use app\services\system\attachment\SystemAttachmentServices;
@@ -54,61 +55,16 @@ class RoutineTemplate extends AuthController
             throw new AdminException(400236);
         }
         $all = $this->services->getTemplateList(['status' => 1, 'type' => 0]);
-        $errData = [];
-        $errCode = [-1, 40001, 40002, 40013, 40125, 41002, 41004, 43104, 45009, 200011, 200012, 200014];
+        $list = MiniProgramService::getSubscribeTemplateList();
+        foreach ($list->data as $v) {
+            MiniProgramService::delSubscribeTemplate($v['priTmplId']);
+        }
         if ($all['list']) {
-            $time = time();
             foreach ($all['list'] as $template) {
-                if ($template['tempkey']) {
-                    if (!isset($template['kid'])) {
-                        return app('json')->fail('数据库模版表(template_message)缺少字段:kid');
-                    }
-                    if (isset($template['kid']) && $template['kid']) {
-                        continue;
-                    }
-                    $works = [];
-                    try {
-                        $works = MiniProgramService::getSubscribeTemplateKeyWords($template['tempkey']);
-                    } catch (\Throwable $e) {
-                        $wechatErr = $e->getMessage();
-                        if (is_string($wechatErr)) throw new AdminException($wechatErr);
-                        if (in_array($wechatErr->getCode(), $errCode)) {
-                            throw new AdminException($wechatErr->getCode());
-                        }
-                        $errData[1] = '获取关键词列表失败:' . $wechatErr->getMessage();
-                    }
-                    $kid = [];
-                    if ($works) {
-                        $works = array_combine(array_column($works, 'name'), $works);
-                        $content = is_array($template['content']) ? $template['content'] : explode("\n", $template['content']);
-                        foreach ($content as $c) {
-                            $name = explode('{{', $c)[0] ?? '';
-                            if ($name && isset($works[$name])) {
-                                $kid[] = $works[$name]['kid'];
-                            }
-                        }
-                    }
-                    if ($kid && isset($template['kid']) && !$template['kid']) {
-                        $tempid = '';
-                        try {
-                            $tempid = MiniProgramService::addSubscribeTemplate($template['tempkey'], $kid, $template['name']);
-                        } catch (\Throwable $e) {
-                            $wechatErr = $e->getMessage();
-                            if (is_string($wechatErr)) throw new AdminException($wechatErr);
-                            if (in_array($wechatErr->getCode(), $errCode)) {
-                                throw new AdminException($wechatErr->getCode());
-                            }
-                            $errData[2] = '添加订阅消息模版失败:' . $wechatErr->getMessage();
-                        }
-                        if ($tempid != $template['tempid']) {
-                            $this->services->update($template['id'], ['tempid' => $tempid, 'kid' => json_encode($kid), 'add_time' => $time], 'id');
-                        }
-                    }
-                }
+                SyncMessageJob::dispatchDo('SyncSubscribe', [$template]);
             }
         }
-        $msg = $errData ? implode('\n', $errData) : '同步成功';
-        return app('json')->success($msg);
+        return app('json')->success(100038);
     }
 
     /**

+ 7 - 15
crmeb/app/adminapi/controller/v1/application/wechat/WechatTemplate.php

@@ -11,6 +11,7 @@
 namespace app\adminapi\controller\v1\application\wechat;
 
 use app\adminapi\controller\AuthController;
+use app\jobs\notice\SyncMessageJob;
 use crmeb\exceptions\AdminException;
 use app\services\message\TemplateMessageServices;
 use crmeb\services\app\WechatService;
@@ -47,23 +48,14 @@ class WechatTemplate extends AuthController
         if (!sys_config('wechat_appid') || !sys_config('wechat_appsecret')) {
             throw new AdminException(400248);
         }
-        $tempall = $this->services->getTemplateList(['status' => 1, 'type' => 1]);
-        //获取微信平台已经添加的模版
-        $list = WechatService::getPrivateTemplates();//获取所有模版
-        foreach ($list->template_list as $v)
-        {
-            //删除已有模版
+        $all = $this->services->getTemplateList(['status' => 1, 'type' => 1]);
+        $list = WechatService::getPrivateTemplates();
+        foreach ($list->template_list as $v) {
             WechatService::deleleTemplate($v['template_id']);
         }
-
-        foreach ($tempall['list'] as $temp)
-        {
-            //添加模版消息
-            $res = WechatService::addTemplateId($temp['tempkey']);
-            if(!$res->errcode && $res->template_id){
-                $this->services->update($temp['id'],['tempid'=>$res->template_id]);
-            }
+        foreach ($all['list'] as $template) {
+            SyncMessageJob::dispatchDo('SyncWechat', [$template]);
         }
-        return app('json')->success(400249);
+        return app('json')->success(100038);
     }
 }

+ 112 - 0
crmeb/app/jobs/notice/SyncMessageJob.php

@@ -0,0 +1,112 @@
+<?php
+
+namespace app\jobs\notice;
+
+use app\services\message\TemplateMessageServices;
+use crmeb\basic\BaseJobs;
+use crmeb\exceptions\AdminException;
+use crmeb\services\app\MiniProgramService;
+use crmeb\services\app\WechatService;
+use crmeb\traits\QueueTrait;
+use think\facade\Log;
+
+class SyncMessageJob extends BaseJobs
+{
+    use QueueTrait;
+
+    /**
+     * 同步小程序订阅消息
+     * @param $template
+     * @return bool
+     */
+    public function syncSubscribe($template)
+    {
+        $errCode = [-1, 40001, 40002, 40013, 40125, 41002, 41004, 43104, 45009, 200011, 200012, 200014];
+        /** @var TemplateMessageServices $templateMessageServices */
+        $templateMessageServices = app()->make(TemplateMessageServices::class);
+        if ($template['tempkey']) {
+            if ($template['tempid']) {
+                try {
+                    MiniProgramService::delSubscribeTemplate($template['tempid']);
+                } catch (\Throwable $e) {
+                    $wechatErr = $e->getMessage();
+                    if (is_string($wechatErr)) {
+                        Log::error('删除旧订阅消息模版失败:' . $wechatErr);
+                        return true;
+                    }
+                    if (in_array($wechatErr->getCode(), $errCode)) {
+                        Log::error('删除旧订阅消息模版失败:' . $wechatErr->getCode());
+                        return true;
+                    }
+                    Log::error('删除旧订阅消息模版失败:' . $wechatErr->getMessage());
+                    return true;
+                }
+            }
+            try {
+                $works = MiniProgramService::getSubscribeTemplateKeyWords($template['tempkey']);
+            } catch (\Throwable $e) {
+                $wechatErr = $e->getMessage();
+                if (is_string($wechatErr)) {
+                    Log::error('获取关键词列表失败:' . $wechatErr);
+                    return true;
+                }
+                if (in_array($wechatErr->getCode(), $errCode)) {
+                    Log::error('获取关键词列表失败:' . $wechatErr->getCode());
+                    return true;
+                }
+                Log::error('获取关键词列表失败:' . $wechatErr->getMessage());
+                return true;
+            }
+            $kid = [];
+            if ($works) {
+                $works = array_combine(array_column($works, 'name'), $works);
+                $content = is_array($template['content']) ? $template['content'] : explode("\n", $template['content']);
+                foreach ($content as $c) {
+                    $name = explode('{{', $c)[0] ?? '';
+                    if ($name && isset($works[$name])) {
+                        $kid[] = $works[$name]['kid'];
+                    }
+                }
+            }
+            if ($kid) {
+                try {
+                    $tempid = MiniProgramService::addSubscribeTemplate($template['tempkey'], $kid, $template['name']);
+                } catch (\Throwable $e) {
+                    $wechatErr = $e->getMessage();
+                    if (is_string($wechatErr)) {
+                        Log::error('添加订阅消息模版失败:' . $wechatErr);
+                        return true;
+                    }
+                    if (in_array($wechatErr->getCode(), $errCode)) {
+                        Log::error('添加订阅消息模版失败:' . $wechatErr->getCode());
+                        return true;
+                    }
+                    Log::error('添加订阅消息模版失败:' . $wechatErr->getMessage());
+                    return true;
+                }
+                $templateMessageServices->update($template['id'], ['tempid' => $tempid, 'kid' => json_encode($kid), 'add_time' => time()], 'id');
+                return true;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 同步公众号模版消息
+     * @param $template
+     */
+    public function syncWechat($template)
+    {
+        /** @var TemplateMessageServices $templateMessageServices */
+        $templateMessageServices = app()->make(TemplateMessageServices::class);
+        try {
+            $res = WechatService::addTemplateId($template['tempkey']);
+        } catch (\Throwable $e) {
+            Log::error('同步模版消息失败:' . $e->getMessage());
+            return true;
+        }
+        if(!$res->errcode && $res->template_id){
+            $templateMessageServices->update($template['id'],['tempid'=>$res->template_id]);
+        }
+    }
+}

+ 40 - 2
crmeb/crmeb/services/app/MiniProgramService.php

@@ -16,6 +16,7 @@ use crmeb\services\SystemConfigService;
 use app\services\pay\PayNotifyServices;
 use crmeb\services\easywechat\Application;
 use EasyWeChat\Payment\Order;
+use think\facade\Log;
 use think\facade\Route as Url;
 use crmeb\utils\Hook;
 use think\facade\Cache;
@@ -252,13 +253,37 @@ class MiniProgramService
             if (isset($res['errcode']) && $res['errcode'] == 0 && isset($res['priTmplId'])) {
                 return $res['priTmplId'];
             } else {
-                throw new AdminException($res['errmsg']);
+                Log::error('添加订阅消息模版失败:' . $res['errmsg']);
             }
         } catch (\Throwable $e) {
-            throw new AdminException($e);
+            Log::error('添加订阅消息模版失败:' . $e->getMessage());
         }
+        return true;
     }
 
+    /**
+     * 删除订阅消息模版
+     * @param string $tid
+     * @param array $kidList
+     * @param string $sceneDesc
+     * @return mixed
+     */
+    public static function delSubscribeTemplate(string $priTmplId)
+    {
+        try {
+            $res = self::SubscribenoticeService()->delTemplate($priTmplId);
+            if (isset($res['errcode']) && $res['errcode'] == 0) {
+                return true;
+            } else {
+                Log::error('删除订阅消息模版失败:' . $res['errmsg']);
+            }
+        } catch (\Throwable $e) {
+            Log::error('删除订阅消息模版失败:' . $e->getMessage());
+        }
+        return true;
+    }
+
+
     /**
      * 获取模版标题的关键词列表
      * @param string $tid
@@ -278,6 +303,19 @@ class MiniProgramService
         }
     }
 
+    /**
+     * 获取订阅消息列表
+     * @return mixed
+     */
+    public static function getSubscribeTemplateList()
+    {
+        try {
+            return self::SubscribenoticeService()->getTemplateList();
+        } catch (\Exception $e) {
+            throw new AdminException($e->getMessage());
+        }
+    }
+
     /**
      * 支付
      * @return \EasyWeChat\Payment\Payment