微信消息推送
微信公眾平臺和小程序雖然都是騰訊開發(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_tokenaccess_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; } -
-
開始推送
- 接口地址:(ACCESS_TOKEN 需換成上文獲取到的 access_token)
https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN - HTTP請求方式:POST
- 參數(shù)說明:
- 接口地址:(ACCESS_TOKEN 需換成上文獲取到的 access_token)
-
| 參數(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萬) |
效果圖如下:

事件隊列發(fā)送消息
針對消息推送,當一條消息需要給很多人推送時或者同時給很多人推送消息時,為了保證服務器不會奔潰和用戶請求等待時間,需要使用異步隊列來推送消息,目前只有微信公眾號這邊的消息推送做了異步事件消息隊列。
具體實現(xiàn)原理參照:Laravel 隊列、laravel 事件監(jiān)聽
-
隊列配置
-
配置
將.env隊列驅(qū)動配置為利用數(shù)據(jù)庫的異步處理
QUEUE_DRIVER=database 生成隊列數(shù)據(jù)庫表與失敗隊列數(shù)據(jù)庫表
php artisan queue:table php artisan queue:failed-table php artisan migrate-
開啟隊列監(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)聽
-
手動注冊監(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)聽類
-
定義事件
在事件觸發(fā)的時候,首先進入事件類,事件類接收到傳來的參數(shù),監(jiān)聽器再根據(jù)傳來的參數(shù)做相應的處理操作,所以事件這邊基本就是參數(shù)的定義和接收傳遞分發(fā)功能。
我們使用構造器接收必要的參數(shù),并將其設置為當前事件屬性。
-
定義監(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'));


