1. 程式人生 > >微信公眾號"傳送一次性訂閱訊息"介面的使用

微信公眾號"傳送一次性訂閱訊息"介面的使用

最近,微信新增了傳送一次性訂閱訊息的介面,便使用php做了一個測試案例,希望可以給大家幫助。微信傳送一次性訂閱訊息的規範 :https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1500374289_66bvB

傳送一次性訂閱訊息有兩個步驟:

 第一步:需要使用者同意授權,獲取一次給使用者推送一條訂閱模板訊息的機會

 第二步:通過API推送訂閱模板訊息給到授權微信使用者

接下來,我就附上我的程式碼,然後給大家講解一下

    /**
     * 獲取授權傳送一次性訂閱介面介面
     */
    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");
        }
    }
我們看到上面有兩個方法,getSubscribemsg()這個方法主要是獲取使用者授權,獲得一次傳送一次性訂閱訊息的機會,它的主要功能就是轉發到使用者授權url,主要有幾個引數

引數說明

引數
是否必須 說明
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引數上傳。希望可以給各位一些

幫助。如果各位發現其中有什麼問題,希望可以指出,謝謝!