微信消息推送

微信消息推送

微信公眾平臺和小程序雖然都是騰訊開發(fā),但是其是倆個獨立的平臺,包括賬號也是獨立存在,所以小程序和公眾平臺不可以使用同一個賬號注冊使用。

因是倆個平臺,所以微信公眾平臺的用戶openId和小程序用戶openId不同,當然消息推送實現(xiàn)方式也不同

如果本地測試接口,需要在公眾平臺后臺配置ip白名單,否則請求不成功

公眾號消息推送

  • 模版消息通知位置:公眾號詳情聊天頁面

  • 推送前提:模版id、參數(shù)、接收人openId、接收人必須關注公眾號。

  • 模板跳轉能力:點擊查看詳情可以跳轉到指定的任意http鏈接

  • 1.小程序后臺配置模版消息

    • 進入模版頁面,點擊右上角”從模版庫添加“,搜索符合需求的模版消息并且配置勾選需要的參數(shù)


      ADEFB6A4-2897-4B05-9FB9-7BA5D395535F.png
    • 添加成功之后,模版列表頁面復制該模版id,為后續(xù)接口調(diào)用模版消息使用
  • 2.請求接口

    請注意,URL置空,則在發(fā)送后,點擊模版消息會進入一個空白頁面(ios),或無法點擊(android)。

    POST請求

    https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
    請求包為一個json:

     {
         "touser":"OPENID",
         "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
         "url":"http://weixin.qq.com/download",
         "topcolor":"#FF0000",
         "data":{
             "User": {
                 "value":"黃先生",
                 "color":"#173177"
              },
             "Date":{
                 "value":"06月07日 19時24分",
                 "color":"#173177"
             },
             "CardNumber":{
                 "value":"0426",
                 "color":"#173177"
             },
             "Type":{
                 "value":"消費",
                 "color":"#173177"
             },
             "Money":{
                 "value":"人民幣260.00元",
                 "color":"#173177"
             },
             "DeadTime":{
                 "value":"06月07日19時24分",
                 "color":"#173177"
             },
             "Left":{
                 "value":"6504.09",
                 "color":"#173177"
             }
         }
     }
    

    發(fā)送效果圖:

    image

    返回碼說明

    在調(diào)用模版消息接口后,會返回JSON數(shù)據(jù)包。正常時的返回JSON數(shù)據(jù)包示例:

      {
          "errcode":0,
          "errmsg":"ok",
          "msgid":200228332
      }
    

    錯誤時的返回JSON數(shù)據(jù),形式類似,錯誤返回碼說明:

返回碼 說明
-1 系統(tǒng)繁忙
0 請求成功
40001 驗證失敗
40002 不合法的憑證類型
40003 不合法的OpenID
40004 不合法的媒體文件類型
40005 不合法的文件類型
40006 不合法的文件大小
40007 不合法的媒體文件id
40008 不合法的消息類型
40009 不合法的圖片文件大小
40010 不合法的語音文件大小
40011 不合法的視頻文件大小
40012 不合法的縮略圖文件大小
40013 不合法的APPID
41001 缺少access_token參數(shù)
41002 缺少appid參數(shù)
41003 缺少refresh_token參數(shù)
41004 缺少secret參數(shù)
41005 缺少多媒體文件數(shù)據(jù)
41006 access_token超時
42001 需要GET請求
43002 需要POST請求
43003 需要HTTPS請求
44001 多媒體文件為空
44002 POST的數(shù)據(jù)包為空
44003 圖文消息內(nèi)容為空
45001 多媒體文件大小超過限制
45002 消息內(nèi)容超過限制
45003 標題字段超過限制
45004 描述字段超過限制
45005 鏈接字段超過限制
45006 圖片鏈接字段超過限制
45007 語音播放時間超過限制
45008 圖文消息超過限制
45009 接口調(diào)用超過限制
46001 不存在媒體數(shù)據(jù)
47001 解析JSON/XML內(nèi)容錯誤

小程序消息推送

  • 模版消息通知位置:服務通知
  • 推送前提:用戶有過支付行為或者提交表單操作,會生成對應的form_id,一次生成一個form_id,每次都不一樣,一個form_id只可以用一次。
    (1次提交表單可下發(fā)1條,多次提交下發(fā)條數(shù)獨立,相互不影響)
  • 模板跳轉能力:點擊查看詳情僅能跳轉下發(fā)模板的該帳號的小程序各個頁面


    4250933-76d4c5ed3f994df3.png

    1.小程序后臺配置模版消息

    • 進入模版頁面,點擊右上角添加按鈕,搜索符合需求的模版消息并且配置勾選需要的參數(shù)

    • 添加成功之后,模版列表頁面復制該模版id,為后續(xù)接口調(diào)用模版消息使用
      2.獲取access_token

    • access_token 的有效期目前為2個小時,需定時刷新,重復獲取將導致上次獲取的 access_token 失效。

    • 接口地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

    • HTTP請求方式:GET

    • 請求參數(shù)說明

參數(shù) 必填 說明
grant_type 獲取 access_token 填寫 client_credential
appid 第三方用戶唯一憑證
secret 第三方用戶唯一憑證密鑰,即appsecret

返回參數(shù)說明

正常情況下,微信會返回下述 JSON 數(shù)據(jù)包給開發(fā)者:

        {"access_token": "ACCESS_TOKEN", "expires_in": 7200}

access_token:獲取到的憑證

expires_in:憑證有效時間,單位:秒

錯誤時微信會返回錯誤碼等信息,JSON 數(shù)據(jù)包示例如下(該示例為 AppID 無效錯誤):

        {"errcode": 40013, "errmsg": "invalid appid"}

3.消息推送

  • 這里需要獲取到接收人的openId

  • form_id生成方式

    • 頁面的 form 組件,屬性report-submit為true時,可以聲明為需發(fā)模板消息,此時點擊按鈕提交表單可以獲取formId,用于發(fā)送模板消息?;蛘弋斢脩敉瓿芍Ц缎袨?,可以獲取prepay_id用于發(fā)送模板消息。

      • form例子

          <form bindsubmit="formSubmit" report-submit="true">
              <input name="input" class="input" placeholder="please input here" />
               <button formType="submit">Submit</button> <button formType="reset">Reset</button> 
          </form>
        
      • js獲取form_id

      formSubmit: function (e) {
           var form_id = e.detail.formId;
      }
      
    • 開始推送

參數(shù) 必填 說明
touser 接收者(用戶)的 openid
template_id 所需下發(fā)的模板消息的id
page 點擊模板卡片后的跳轉頁面,僅限本小程序內(nèi)的頁面。支持帶參數(shù),(示例index?foo=bar)。該字段不填則模板無跳轉。
form_id 表單提交場景下,為 submit 事件帶上的 formId;支付場景下,為本次支付的 prepay_id
data 模板內(nèi)容,不填則下發(fā)空模板
color 模板內(nèi)容字體的顏色,不填默認黑色
emphasis_keyword 模板需要放大的關鍵詞,不填則默認無放大

示例:

        {
          "touser": "OPENID",  
          "template_id": "TEMPLATE_ID", 
          "page": "index",          
          "form_id": "FORMID",         
          "data": {
              "keyword1": {
                  "value": "339208499", 
                  "color": "#173177"
              }, 
              "keyword2": {
                  "value": "2015年01月05日 12:30", 
                  "color": "#173177"
              }, 
              "keyword3": {
                  "value": "粵海喜來登酒店", 
                  "color": "#173177"
              } , 
              "keyword4": {
                  "value": "廣州市天河區(qū)天河路208號", 
                  "color": "#173177"
              } 
          },
          "emphasis_keyword": "keyword1.DATA" 
        }

返回碼說明:
在調(diào)用模板消息接口后,會返回JSON數(shù)據(jù)包。
正常時的返回JSON數(shù)據(jù)包示例:

    ```
    {
      "errcode": 0,
      "errmsg": "ok"
    }
    ```

錯誤時會返回錯誤碼信息,說明如下:

返回碼 說明
40037 template_id不正確
41028 form_id不正確,或者過期
41029 form_id已被使用
41030 page不正確
45009 接口調(diào)用超過限額(目前默認每個帳號日調(diào)用限額為100萬)

效果圖如下:

CE6E7116C5C453F28FBFDC9F11412B7D.png

事件隊列發(fā)送消息

針對消息推送,當一條消息需要給很多人推送時或者同時給很多人推送消息時,為了保證服務器不會奔潰和用戶請求等待時間,需要使用異步隊列來推送消息,目前只有微信公眾號這邊的消息推送做了異步事件消息隊列。

具體實現(xiàn)原理參照:Laravel 隊列laravel 事件監(jiān)聽

  • 隊列配置

    1. 配置

      將.env隊列驅(qū)動配置為利用數(shù)據(jù)庫的異步處理

       QUEUE_DRIVER=database
      
    2. 生成隊列數(shù)據(jù)庫表與失敗隊列數(shù)據(jù)庫表

        php artisan queue:table
        
        php artisan queue:failed-table
        
        php artisan migrate   
    
    1. 開啟隊列監(jiān)聽進程

       php artisan queue:listen  
      

      或者 開啟后臺監(jiān)聽(不影響自己輸入其他命令)

       php artisan queue:listen &  
      

      也能用work 后面參數(shù)是休息時間和嘗試次數(shù)

       php artisan queue:work connection --daemon --sleep=3 --tries=3  
      
  • 創(chuàng)建事件監(jiān)聽

    1. 手動注冊監(jiān)聽事件

      在文件“/Users/guoqing/work/LouWang/app/Providers/EventServiceProvider.php”的“$listen”數(shù)組中添加監(jiān)聽事件路徑

      eg:

      protected $listen = [
          'App\Events\MessageRemind' => [// 事件
              'App\Listeners\SendSmsWeChatRemind',// 監(jiān)聽器
          ],
      ];
      

      當然這個時候這個事件監(jiān)聽類還沒創(chuàng)建,執(zhí)行如下命令生成事件和監(jiān)聽器

       php artisan event:generate
      

      這個時候“/app/Events/”目錄下生成了MessageRemind.php事件類,"/app/Listeners/“下生成了SendSmsWeChatRemind.php監(jiān)聽類

    2. 定義事件

      在事件觸發(fā)的時候,首先進入事件類,事件類接收到傳來的參數(shù),監(jiān)聽器再根據(jù)傳來的參數(shù)做相應的處理操作,所以事件這邊基本就是參數(shù)的定義和接收傳遞分發(fā)功能。

      我們使用構造器接收必要的參數(shù),并將其設置為當前事件屬性。

    3. 定義監(jiān)聽器

      監(jiān)聽器handle方法注入事件
      eg:

       public function handle(MessageRemind $event)// 注入事件
       {
            // 獲取傳來的參數(shù)
           $remindUsers = $event->remindUsers;
           $rel_guid = $event->rel_guid;
           $type = $event->type;
           $weChatTemplate = $event->weChatTemplate;
           $smsContent = $event->smsContent;
           $weChatData = $event->weChatData;
          
           // 根據(jù)參數(shù)相應處理,這里做開始發(fā)送消息
      }
      

      這里有一點注意,我們怎么將處理事件操作加入到隊列中異步操作呢

      在開始使用監(jiān)聽器隊列之前,請確保在你的服務器或本地開發(fā)環(huán)境中能夠配置并啟動 隊列 監(jiān)聽器。

      要指定監(jiān)聽器啟動隊列,只需將 ShouldQueue 接口添加到監(jiān)聽器類。由 Artisan 命令 event:generate 生成的監(jiān)聽器已經(jīng)將此接口導入到當前命名空間中,因此你可以直接使用它:

      <?php
      namespace App\Listeners;
      
      use App\Events\MessageRemind;
      use Illuminate\Queue\InteractsWithQueue;
      use Illuminate\Contracts\Queue\ShouldQueue;
      
      class SendSmsWeChatRemind implements ShouldQueue
      {
      }
      
    當這個監(jiān)聽器被事件調(diào)用時,事件調(diào)度器會自動使用 Laravel 的 隊列系統(tǒng)。如果在隊列中執(zhí)行監(jiān)聽器時沒有拋出異常,任務會在執(zhí)行完成后自動從隊列中刪除。
    
  • 手動觸發(fā)監(jiān)聽

    調(diào)用事件的時候就簡單了,只需new event 傳入必須的參數(shù)即可,而且不會影響后續(xù)程序的進行

    eg:

    event(new MessageRemind($managers, config('status.remind_log_type_find_house_help'), null, $smsContent, $weChatData, 'findHouseHelp'));
    
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 水與一座城市甚至整個國家的關系都極為密切,文明大多始于水源處,人們在岸邊取水、捕魚、洗衣、盥洗,久了就成一個聚落。...
    季子弘閱讀 355評論 0 1
  • 桃花五瓣瓣瓣香,春風點蕊蕊蕊黃。 十六嘌呤兒女江,不怪楊過誤郭襄。
    良柳如煙閱讀 382評論 0 3
  • 【傘】 小花最喜歡雨天,因為她有一把不尋常的傘。 傘面繪著一圈海草,腰肢細軟,交纏蜿蜒。水藍的底色柔和清涼,仿佛散...
    夏半閱讀 1,961評論 0 2
  • 走在大街上,看到兒時的小人書,吃過的小零食,玩過的小玩具。你一定會停住腳步,多看兩眼,再加上銷售人員的幾句煽情的話...
    Miss墨菲閱讀 1,304評論 1 9

友情鏈接更多精彩內(nèi)容