微信公眾平臺(tái) 發(fā)送模板消息(Java接口開發(fā))
前言:最近一直再弄微信掃碼推送圖文消息和模板消息發(fā)送,感覺學(xué)習(xí)到了不少東西。今天先總結(jié)一下微信公眾平臺(tái)模板消息的發(fā)送。因?yàn)檫@個(gè)自己弄了很久,開始很多地方不明白,所以今天好好總結(jié)一下。
微信公眾平臺(tái)技術(shù)文檔:模板消息接口
一、概述
模板消息僅用于公眾號(hào)向用戶發(fā)送重要的服務(wù)通知,只能用于符合其要求的服務(wù)場(chǎng)景中,如信用卡刷卡通知,商品購(gòu)買成功通知等。不支持廣告等營(yíng)銷類消息以及其它所有可能對(duì)用戶造成騷擾的消息。
關(guān)于使用規(guī)則,請(qǐng)注意:
1、所有服務(wù)號(hào)都可以在功能->添加功能插件處看到申請(qǐng)模板消息功能的入口,但只有認(rèn)證后的服務(wù)號(hào)才可以申請(qǐng)模板消息的使用權(quán)限并獲得該權(quán)限;
2、需要選擇公眾賬號(hào)服務(wù)所處的2個(gè)行業(yè),每月可更改1次所選行業(yè);
3、在所選擇行業(yè)的模板庫(kù)中選用已有的模板進(jìn)行調(diào)用;
4、每個(gè)賬號(hào)可以同時(shí)使用25個(gè)模板。
5、當(dāng)前每個(gè)賬號(hào)的模板消息的日調(diào)用上限為10萬(wàn)次,單個(gè)模板沒(méi)有特殊限制?!?014年11月18日將接口調(diào)用頻率從默認(rèn)的日1萬(wàn)次提升為日10萬(wàn)次,可在MP登錄后的開發(fā)者中心查看】。當(dāng)賬號(hào)粉絲數(shù)超過(guò)10W/100W/1000W時(shí),模板消息的日調(diào)用上限會(huì)相應(yīng)提升,以公眾號(hào)MP后臺(tái)開發(fā)者中心頁(yè)面中標(biāo)明的數(shù)字為準(zhǔn)。
關(guān)于接口文檔,請(qǐng)注意:
1、模板消息調(diào)用時(shí)主要需要模板ID和模板中各參數(shù)的賦值內(nèi)容;
2、模板中參數(shù)內(nèi)容必須以”.DATA”結(jié)尾,否則視為保留字;
3、模板保留符號(hào)”{{ }}”。
看微信公眾平臺(tái)接口文檔最開始我的內(nèi)心是崩潰的,因?yàn)槟夸浟斜硪婚_始就是設(shè)置所屬行業(yè),獲取所屬行業(yè)信息等。后來(lái)整理思路,我們主要負(fù)責(zé)的功能的實(shí)現(xiàn),就不去考慮那么多其他的內(nèi)容,直接弄模板消息的發(fā)送。但是發(fā)送模板之前有一個(gè)很重要的步驟,就是模板ID(template_id)。微信公眾平臺(tái)發(fā)送模板消息有嚴(yán)格的要求,參考模板消息運(yùn)營(yíng)規(guī)范。
二、模板消息的設(shè)計(jì)
這里是依靠微信公眾平臺(tái)測(cè)試公眾號(hào)的模板消息接口來(lái)設(shè)計(jì)消息模板,通過(guò)行業(yè)類型來(lái)獲取模板的同學(xué)還是參考微信公眾平臺(tái)的官方文檔來(lái)學(xué)習(xí)。
1 新增模板消息
微信的測(cè)試公眾號(hào)為我們提供了測(cè)試的消息模板,最多可添加10個(gè)(感覺夠用,畢竟只是測(cè)試),新增測(cè)試模板。
(1)添加模板標(biāo)題和模板內(nèi)容
模板標(biāo)題比較好理解,模板內(nèi)容需要設(shè)計(jì)參數(shù),參數(shù)需以{{開頭,以.DATA}}結(jié)尾。
例如:{{first.DATA}}
first就是我們接口傳的參數(shù)。
{{first.DATA}} 商品:{{keynote1.DATA}} 價(jià)格:{{keynote2.DATA}} 日期:{{keynote3.DATA}} {{remark.DATA}}
新增之后就可以看到模板記錄,就有我們需要的模板ID了。有了模板ID我們就可以按照接下來(lái)的微信公眾平臺(tái)發(fā)送模板消息接口來(lái)實(shí)現(xiàn)我們的功能。
三、發(fā)送模板消息
1 接口調(diào)用請(qǐng)求說(shuō)明
http請(qǐng)求方式: POST
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
2 POST數(shù)據(jù)說(shuō)明
POST數(shù)據(jù)示例如下:
{ "touser":"OPENID", "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY", "url":"http://weixin.qq.com/download", "miniprogram":{ "appid":"xiaochengxuappid12345", "pagepath":"index?foo=bar" }, "data":{ "first": { "value":"恭喜你購(gòu)買成功!", "color":"#173177" }, "keynote1":{ "value":"巧克力", "color":"#173177" }, "keynote2": { "value":"39.8元", "color":"#173177" }, "keynote3": { "value":"2014年9月22日", "color":"#173177" }, "remark":{ "value":"歡迎再次購(gòu)買!", "color":"#173177" } } }
3 參數(shù)說(shuō)明
參數(shù) | 是否必填 | 說(shuō)明、 |
---|---|---|
touser | 是 | 接收者openid |
template_id | 是 | 模板ID |
url | 否 | 模板跳轉(zhuǎn)鏈接 |
miniprogram | 否 | 跳小程序所需數(shù)據(jù),不需跳小程序可不用傳該數(shù)據(jù) |
appid | 是 | 所需跳轉(zhuǎn)到的小程序appid(該小程序appid必須與發(fā)模板消息的公眾號(hào)是綁定關(guān)聯(lián)關(guān)系) |
pagepath | 是 | 所需跳轉(zhuǎn)到小程序的具體頁(yè)面路徑,支持帶參數(shù),(示例index?foo=bar) |
data | 是 | 模板數(shù)據(jù) |
注:url和miniprogram都是非必填字段,若都不傳則模板無(wú)跳轉(zhuǎn);若都傳,會(huì)優(yōu)先跳轉(zhuǎn)至小程序。開發(fā)者可根據(jù)實(shí)際需要選擇其中一種跳轉(zhuǎn)方式即可。當(dāng)用戶的微信客戶端版本不支持跳小程序時(shí),將會(huì)跳轉(zhuǎn)至url。
4 java接口開發(fā)
(1)封裝請(qǐng)求參數(shù)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)發(fā)送模板消息方法
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; } }
說(shuō)明:簡(jiǎn)單理解模板消息發(fā)送,首先是獲取accessToken,(如何獲取請(qǐng)參考:微信公眾平臺(tái) 獲取access_token)。其次是模板消息的參數(shù)封裝,最后就是http的post請(qǐng)求。我的http請(qǐng)求是使用Spring的restTemplate進(jìn)行請(qǐng)求,就不用我單獨(dú)寫一個(gè)http請(qǐng)求方法,如果沒(méi)有使用可以寫一個(gè)http請(qǐng)求的工具類。
(3)封裝響應(yīng)參數(shù)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(); } }
模板消息發(fā)送效果:
四、事件推送
在模版消息發(fā)送任務(wù)完成后,微信服務(wù)器會(huì)將是否送達(dá)成功作為通知,發(fā)送到開發(fā)者中心中填寫的服務(wù)器配置地址中。
1 送達(dá)成功時(shí)
(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)參數(shù)說(shuō)明
參數(shù) | 說(shuō)明 |
---|---|
ToUserName | 公眾號(hào)微信號(hào) |
FromUserName | 接收模板消息的用戶的openid |
CreateTime | 創(chuàng)建時(shí)間 |
MsgType | 消息類型是事件 |
Event | 事件為模板消息發(fā)送結(jié)束 |
MsgID | 消息id |
Status | 發(fā)送狀態(tài)為成功 |
2 送達(dá)由于用戶拒收(用戶設(shè)置拒絕接收公眾號(hào)消息)而失敗時(shí)
(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)參數(shù)說(shuō)明
參數(shù) | 說(shuō)明 |
---|---|
ToUserName | 公眾號(hào)微信號(hào) |
FromUserName | 接收模板消息的用戶的openid |
CreateTime | 創(chuàng)建時(shí)間 |
MsgType | 消息類型是事件 |
Event | 事件為模板消息發(fā)送結(jié)束 |
MsgID | 消息id |
Status | 發(fā)送狀態(tài)為用戶拒絕接收 |
3 送達(dá)由于其他原因失敗時(shí)
(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)參數(shù)說(shuō)明
參數(shù) | 說(shuō)明 |
---|---|
ToUserName | 公眾號(hào)微信號(hào) |
FromUserName | 接收模板消息的用戶的openid |
CreateTime | 創(chuàng)建時(shí)間 |
MsgType | 消息類型是事件 |
Event | 事件為模板消息發(fā)送結(jié)束 |
MsgID | 消息id |
Status | 發(fā)送狀態(tài)為發(fā)送失?。ǚ怯脩艟芙^) |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript/jquery獲取地址欄url參數(shù)的方法
本篇文章主要是對(duì)javascript/jquery獲取地址欄url參數(shù)的方法進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-03-03通過(guò)實(shí)例解析javascript Date對(duì)象屬性及方法
這篇文章主要介紹了通過(guò)實(shí)例解析javascript Date對(duì)象屬性及方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11layUI使用layer.open,在content打開數(shù)據(jù)表格,獲取值并返回的方法
今天小編就為大家分享一篇layUI使用layer.open,在content打開數(shù)據(jù)表格,獲取值并返回的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09微信小程序拍賣商品詳情頁(yè)設(shè)計(jì)與交互實(shí)現(xiàn)代碼(含倒計(jì)時(shí)、實(shí)時(shí)更新出價(jià))
這篇文章主要介紹了微信小程序拍賣商品詳情頁(yè)設(shè)計(jì)與交互實(shí)現(xiàn)代碼(含倒計(jì)時(shí)、實(shí)時(shí)更新出價(jià)),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08JS Array.slice 截取數(shù)組的實(shí)現(xiàn)方法
這篇文章主要介紹了JS Array.slice 截取數(shù)組的實(shí)現(xiàn)方法,因?yàn)槲覀冃枰刂埔幌麻L(zhǎng)度,需要的朋友可以參考下2016-01-01JavaScript CSS 通用循環(huán)滾動(dòng)條
核心是 position:relative;,才能讓其內(nèi)部的 ul 以絕對(duì)定位,通過(guò)改變 top 值實(shí)現(xiàn)向上移位置。2009-10-10詳解layui?laydate選擇時(shí)間的回調(diào)方法
這篇文章主要介紹了layui?laydate選擇時(shí)間的回調(diào)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01開發(fā)中常用的25個(gè)JavaScript單行代碼(小結(jié))
這篇文章主要介紹了開發(fā)中常用的25個(gè)JavaScript單行代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06