1. 程式人生 > >微信公眾平臺 傳送模板訊息

微信公眾平臺 傳送模板訊息

前言:最近一直再弄微信掃碼推送圖文訊息和模板訊息傳送,感覺學習到了不少東西。今天先總結一下微信公眾平臺模板訊息的傳送。因為這個自己弄了很久,開始很多地方不明白,所以今天好好總結一下。

微信公眾平臺技術文件模板訊息介面

一、概述

模板訊息僅用於公眾號向用戶傳送重要的服務通知,只能用於符合其要求的服務場景中,如信用卡刷卡通知,商品購買成功通知等。不支援廣告等營銷類訊息以及其它所有可能對使用者造成騷擾的訊息。

關於使用規則,請注意:

1、所有服務號都可以在功能->新增功能外掛處看到申請模板訊息功能的入口,但只有認證後的服務號才可以申請模板訊息的使用許可權並獲得該許可權;
2、需要選擇公眾賬號服務所處的2個行業,每月可更改1次所選行業;
3、在所選擇行業的模板庫中選用已有的模板進行呼叫;
4、每個賬號可以同時使用25個模板。
5、當前每個賬號的模板訊息的日呼叫上限為10萬次,單個模板沒有特殊限制。【2014年11月18日將介面呼叫頻率從預設的日1萬次提升為日10萬次,可在MP登入後的開發者中心檢視】。當賬號粉絲數超過10W/100W/1000W時,模板訊息的日呼叫上限會相應提升,以公眾號MP後臺開發者中心頁面中標明的數字為準。

關於介面文件,請注意:

1、模板訊息呼叫時主要需要模板ID和模板中各引數的賦值內容;
2、模板中引數內容必須以”.DATA”結尾,否則視為保留字;
3、模板保留符號”{{ }}”。

看微信公眾平臺介面文件最開始我的內心是崩潰的,因為目錄列表一開始就是設定所屬行業,獲取所屬行業資訊等。後來整理思路,我們主要負責的功能的實現,就不去考慮那麼多其他的內容,直接弄模板訊息的傳送。但是傳送模板之前有一個很重要的步驟,就是模板ID(template_id)。微信公眾平臺傳送模板訊息有嚴格的要求,參考模板訊息運營規範

二、模板訊息的設計

這裡是依靠微信公眾平臺測試公眾號的模板訊息介面來設計訊息模板,通過行業型別來獲取模板的同學還是參考微信公眾平臺的官方文件來學習。

1 新增模板訊息

這裡寫圖片描述

微信的測試公眾號為我們提供了測試的訊息模板,最多可新增10個(感覺夠用,畢竟只是測試),新增測試模板。
這裡寫圖片描述

(1)新增模板標題和模板內容
這裡寫圖片描述
模板標題比較好理解,模板內容需要設計引數,引數需以{{開頭,以.DATA}}結尾。
例如:{{first.DATA}}
first就是我們介面傳的引數。

{{first.DATA}} 
商品:{{keynote1.DATA}} 
價格:{{keynote2.DATA}} 
日期:{{keynote3.DATA}}{{remark.DATA}}

新增之後就可以看到模板記錄,就有我們需要的模板ID了。有了模板ID我們就可以按照接下來的微信公眾平臺傳送模板訊息介面來實現我們的功能。
這裡寫圖片描述

三、傳送模板訊息

1 介面呼叫請求說明

http請求方式: POST

https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

2 POST資料說明

POST資料示例如下:

     {
           "touser":"OPENID",
           "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
           "url":"http://weixin.qq.com/download",  
           "miniprogram":{
             "appid":"xiaochengxuappid12345",
             "pagepath":"index?foo=bar"
           },          
           "data":{
                   "first": {
                       "value":"恭喜你購買成功!",
                       "color":"#173177"
                   },
                   "keynote1":{
                       "value":"巧克力",
                       "color":"#173177"
                   },
                   "keynote2": {
                       "value":"39.8元",
                       "color":"#173177"
                   },
                   "keynote3": {
                       "value":"2014年9月22日",
                       "color":"#173177"
                   },
                   "remark":{
                       "value":"歡迎再次購買!",
                       "color":"#173177"
                   }
           }
       }

3 引數說明

引數 是否必填 說明、
touser 接收者openid
template_id 模板ID
url 模板跳轉連結
miniprogram 跳小程式所需資料,不需跳小程式可不用傳該資料
appid 所需跳轉到的小程式appid(該小程式appid必須與發模板訊息的公眾號是繫結關聯關係)
pagepath 所需跳轉到小程式的具體頁面路徑,支援帶引數,(示例index?foo=bar)
data 模板資料


注:url和miniprogram都是非必填欄位,若都不傳則模板無跳轉;若都傳,會優先跳轉至小程式。開發者可根據實際需要選擇其中一種跳轉方式即可。當用戶的微信客戶端版本不支援跳小程式時,將會跳轉至url。

4 java介面開發

(1)封裝請求引數Demo

public class TemplateData {  

    private String value;  
    private String color;  

    public String getValue() {  
        return value;  
    }  

    public void setValue(String value) {  
        this.value = value;  
    }  

    public String getColor() {  
        return color;  
    }  

    public void setColor(String color) {  
        this.color = color;  
    }  
}
public class WechatTemplate {  

    private String touser;  

    private String template_id;  

    private String url;  

    private Map<String, TemplateData> data;  

    public String getTouser() {  
        return touser;  
    }  

    public void setTouser(String touser) {  
        this.touser = touser;  
    }  

    public String getTemplate_id() {  
        return template_id;  
    }  

    public void setTemplate_id(String template_id) {  
        this.template_id = template_id;  
    }  

    public String getUrl() {  
        return url;  
    }  

    public void setUrl(String url) {  
        this.url = url;  
    }  

    public Map<String, TemplateData> getData() {  
        return data;  
    }  

    public void setData(Map<String, TemplateData> data) {  
        this.data = data;  
    }  
}  

(2)傳送模板訊息方法

public class TemplateMessageServiceImpl implements TemplateMessageService{

    private RestTemplate restTemplate ; 

    private String serviceHost = "https://api.weixin.qq.com";

    public TemplateMessageServiceImpl() {
        restTemplate = RestTemplateFactory.makeRestTemplate();
    }

    @Override
    public WeixinResponse sendTemplateMessage(String accessToken, WeixinTemplate weixinTemplate) {
        WeixinResponse weixinResponse = null;
        String url = new StringBuffer(serviceHost).append("/cgi-bin/message/template/send?access_token=")
                .append(accessToken).toString();
        weixinResponse = restTemplate.postForObject(url, weixinTemplate, WeixinResponse.class,new HashMap<String,String>());
        return weixinResponse;
    }

}

說明:簡單理解模板訊息傳送,首先是獲取accessToken,(如何獲取請參考:微信公眾平臺 獲取access_token)。其次是模板訊息的引數封裝,最後就是http的post請求。我的http請求是使用Spring的restTemplate進行請求,就不用我單獨寫一個http請求方法,如果沒有使用可以寫一個http請求的工具類。

(3)封裝響應引數Demo

package com.plateno.weixin.message.model;

public class WeixinResponse {
    private String msgid;
    private int errcode;
    private String errmsg;

    public String getMsgid() {
        return msgid;
    }
    public void setMsgid(String msgid) {
        this.msgid = msgid;
    }
    public int getErrcode() {
        return errcode;
    }
    public void setErrcode(int errcode) {
        this.errcode = errcode;
    }
    public String getErrmsg() {
        return errmsg;
    }
    public void setErrmsg(String errmsg) {
        this.errmsg = errmsg;
    }

    @Override
    public String toString() {
        StringBuffer buf = new StringBuffer("WeixinResponse[msgid=");
        buf.append(msgid)
        .append(",errcode=").append(errcode)
        .append(",errmsg=").append(errmsg)
        .append("]");
        return buf.toString();
    }

}

模板訊息傳送效果:
這裡寫圖片描述

四、事件推送

在模版訊息傳送任務完成後,微信伺服器會將是否送達成功作為通知,傳送到開發者中心中填寫的伺服器配置地址中。

1 送達成功時

(1)推送的XML如下

           <xml>
           <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
           <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
           <CreateTime>1395658920</CreateTime>
           <MsgType><![CDATA[event]]></MsgType>
           <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
           <MsgID>200163836</MsgID>
           <Status><![CDATA[success]]></Status>
           </xml>

(2)引數說明

引數 說明
ToUserName 公眾號微訊號
FromUserName 接收模板訊息的使用者的openid
CreateTime 建立時間
MsgType 訊息型別是事件
Event 事件為模板訊息傳送結束
MsgID 訊息id
Status 傳送狀態為成功

2 送達由於使用者拒收(使用者設定拒絕接收公眾號訊息)而失敗時

(1)推送的XML如下

           <xml>
           <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
           <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
           <CreateTime>1395658984</CreateTime>
           <MsgType><![CDATA[event]]></MsgType>
           <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
           <MsgID>200163840</MsgID>
           <Status><![CDATA[failed:user block]]></Status>
           </xml>

(2)引數說明

引數 說明
ToUserName 公眾號微訊號
FromUserName 接收模板訊息的使用者的openid
CreateTime 建立時間
MsgType 訊息型別是事件
Event 事件為模板訊息傳送結束
MsgID 訊息id
Status 傳送狀態為使用者拒絕接收

3 送達由於其他原因失敗時

(1)推送的XML如下

           <xml>
           <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
           <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
           <CreateTime>1395658984</CreateTime>
           <MsgType><![CDATA[event]]></MsgType>
           <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
           <MsgID>200163840</MsgID>
           <Status><![CDATA[failed: system failed]]></Status>
           </xml>

(2)引數說明

引數 說明
ToUserName 公眾號微訊號
FromUserName 接收模板訊息的使用者的openid
CreateTime 建立時間
MsgType 訊息型別是事件
Event 事件為模板訊息傳送結束
MsgID 訊息id
Status 傳送狀態為傳送失敗(非使用者拒絕)