微信公眾號"傳送一次性訂閱訊息"介面的使用
最近,微信新增了傳送一次性訂閱訊息的介面,便使用php做了一個測試案例,希望可以給大家幫助。微信傳送一次性訂閱訊息的規範 :https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1500374289_66bvB
傳送一次性訂閱訊息有兩個步驟:
第一步:需要使用者同意授權,獲取一次給使用者推送一條訂閱模板訊息的機會
第二步:通過API推送訂閱模板訊息給到授權微信使用者
接下來,我就附上我的程式碼,然後給大家講解一下
我們看到上面有兩個方法,getSubscribemsg()這個方法主要是獲取使用者授權,獲得一次傳送一次性訂閱訊息的機會,它的主要功能就是轉發到使用者授權url,主要有幾個引數/** * 獲取授權傳送一次性訂閱介面介面 */ public function getSubscribemsg() { redirect("https://mp.weixin.qq.com/mp/subscribemsg?action=get_confirm&appid=wxee6a581d613debee&scene=1000&template_id=ZydnrAeuYY4kPcImQTe3J81TDLUsSioKBQYvAwG4OwI&redirect_url=http%3a%2f%2fsslkg.xnit.net%2findex.php%2fhome%2fCom%2fsubscribemsg&reserved=test#wechat_redirect"); } /** * 傳送一次性訂閱介面 */ public function subscribemsg() { $action = $_GET['action']; if ($action == "confirm") { $openid = $_GET['openid']; $template_id = $_GET['template_id']; $scene = $_GET['scene']; $access_token = $this->get_access_tokenjs(); $url = "https://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token={$access_token}"; $postdata = "{" . "\"touser\": \"" . $openid . "\"," . "\"template_id\":\"" . $template_id . "\"," . "\"url\": \"https://www.baidu.com\"," . "\"scene\": \"".$scene."\"," . "\"title\": \"t\"," . "\"data\": {" . "\"content\": {" . "\"value\": \"訂閱訊息測試\"," . "\"color\": \"blue\"" . "}" . "}" . "}"; $ch1 = curl_init(); $timeout = 3000; curl_setopt($ch1, CURLOPT_URL, $url); curl_setopt($ch1, CURLOPT_POST, 1); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch1, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch1, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch1, CURLOPT_POSTFIELDS, $postdata); $result = curl_exec($ch1); curl_close($ch1); $result = json_decode($result, true); $errcode = $result['errmsg']; $this->error($errcode, "/Houses/houselist"); } }
引數說明
引數 |
是否必須 | 說明 |
action | 是 | 直接填get_confirm即可 |
appid |
是 |
公眾號的唯一標識 |
scene | 是 | 重定向後會帶上scene引數,開發者可以填0-10000的整形值,用來標識訂閱場景值 |
template_id | 是 | 訂閱訊息模板ID,登入公眾平臺後臺,在介面許可權列表處可檢視訂閱模板ID |
redirect_url | 是 | 授權後重定向的回撥地址,請使用UrlEncode對連結進行處理。注:要求redirect_url的域名要跟登記的業務域名一致,且業務域名不能帶路徑。業務域名需登入公眾號,在設定-公眾號設定-功能設定裡面對業務域名設定。 |
reserved | 否 | 用於保持請求和回撥的狀態,授權請後原樣帶回給第三方。該引數可用於防止csrf攻擊(跨站請求偽造攻擊),建議第三方帶上該引數,可設定為簡單的隨機數加session進行校驗,開發者可以填寫a-zA-Z0-9的引數值,最多128位元組 |
#wechat_redirect | 是 | 無論直接開啟還是做頁面302重定向時,必須帶此引數 |
redirect_url引數對應第二個方法的訪問路徑,這個路徑需要經過urlencoding編碼
使用者同意或取消授權後會返回相關資訊
如果使用者點選同意或取消授權,頁面將跳轉至:
redirect_url/?openid=OPENID&template_id=TEMPLATE_ID&action=ACTION&scene=SCENE
引數說明
引數 | 說明 |
openid | 使用者唯一標識,只在使用者確認授權時才會帶上 |
template_id | 訂閱訊息模板ID |
action | 使用者點選動作,”confirm”代表使用者確認授權,”cancel”代表使用者取消授權 |
scene | 訂閱場景值 |
reserved | 請求帶入原樣返回 |
subscribemsg()方法就是根據返回資料去傳送一次性訂閱資訊,我們在subscribemsg()方法裡獲取以上返回的資料,然後拼成json格式的資料,傳送資料到下面的介面。
介面請求說明
http請求方式: post
https://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token=ACCESS_TOKEN
post資料示例
{
“touser”:”OPENID”,
“template_id”:”TEMPLATE_ID”,
“url”:”URL”,
“scene”:”SCENE”,
“title”:”TITLE”,
“data”:{
“content”:{
“value”:”VALUE”,
“color”:”COLOR”
}
}
}
引數說明
引數 | 是否必須 | 說明 |
touser | 是 | 填接收訊息的使用者openid |
template_id | 是 | 訂閱訊息模板ID |
url | 否 | 點選訊息跳轉的連結,需要有ICP備案 |
scene | 是 | 訂閱場景值 |
title | 是 | 訊息標題,15字以內 |
data | 是 | 訊息正文,value為訊息內容文字(200字以內),沒有固定格式,可用\n換行,color為整段訊息內容的字型顏色(目前僅支援整段訊息為一種顏色) |
返回說明
在呼叫介面後,會返回JSON資料包。正常時的返回JSON資料包示例:
{
“errcode”:0,
“errmsg”:”ok”
}
這裡我要說一下我在做這個的時候遇到的一些問題:1. errmsg 返回的資訊是data format error hint,這個問題主要是資料格式不正確,在這裡,我需要插一句,我在做這個的時候,發現微信介面說明裡
說的”value為訊息內容文字(200字以內),沒有固定格式,可用\n換行“,我發現如果在value引數裡寫上\n,就會報錯,所以,我不知道是還未提供,
還是哪裡出了問題,如果各位知道了,希望告知一聲。
2. errmsg 返回的資訊是user refuse to accept the msg hint: [5aw330620ge21],一次性訂閱介面並不是說會員訂閱一次後就能不斷的推送訊息,
而是說會員訂閱一次後你只能推送一條,如果想再次推送,需要再一次訂閱,這點要先搞明白,如果你想嘗試一次訂閱多次推送。
我在測試過程中也遇到了這個問題,後面發現是因為我沒有給scene賦值,所以,獲取到返回資料之後,一定要把scene引數上傳。希望可以給各位一些
幫助。如果各位發現其中有什麼問題,希望可以指出,謝謝!