模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。对于一般的服务号而言,模板ID行业之类会事先配置好,所以用代码控制的只有发送了。
准备工作:已通过认证的服务号或者测试公众号
一、使用规则
- 所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口
- 需要选择公众账号服务所处的2个行业,每月可更改1次所选行业
- 在所选择行业的模板库中选用已有的模板进行调用
- 每个账号可以同时使用25个模板
- 当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制,以公众号MP后台开发者中心页面中标明的数字为准
二、接口文档规范
- 模板消息调用时主要需要模板ID和模板中各参数的赋值内容
- 模板中参数内容必须以".DATA"结尾,否则视为保留字
- 模板保留符号"{{ }}"
测试公众号可以随意定义,正式的必须用模板库中的
三、 封装模板消息
以下是我使用的模板消息示例
- {{first.DATA}}
- 旅行活动名称:{{keyword1.DATA}}
- 订单金额:{{keyword2.DATA}}
- 旅行时间:{{keyword3.DATA}}
- 参与人数:{{keyword4.DATA}}
- {{remark.DATA}}
发送模板消息的接口:https://api.weixin.qq.com/cgi-bin/message/template/send (?access_token=ACCESS_TOKEN)
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"
- }
- }
- }
- package com.phil.wechatmsg.model.template.req;
- import java.util.TreeMap;
- import com.phil.common.annotation.NotRequire;
- /**
- * 模板消息
- * @author phil
- * @date 2017年7月2日
- *
- */
- public class WechatTemplateMsg {
- private String touser; //接收者openid
- private String template_id; //模板ID
- @NotRequire//只是个标识
- private String url; //模板跳转链接
- // "miniprogram":{ 未加入
- // "appid":"xiaochengxuappid12345",
- // "pagepath":"index?foo=bar"
- // },
- private TreeMap<String, TreeMap<String, String>> data; //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 TreeMap<String, TreeMap<String, String>> getData() {
- return data;
- }
- public void setData(TreeMap<String, TreeMap<String, String>> data) {
- this.data = data;
- }
- /**
- * 参数
- * @param value
- * @param color 可不填
- * @return
- */
- public static TreeMap<String, String> item(String value, String color) {
- TreeMap<String, String> params = new TreeMap<String, String>();
- params.put("value", value);
- params.put("color", color);
- return params;
- }
- }
四、发送模板消息
- /**
- *
- */
- package com.phil.wechatmsg.service.impl;
- import java.util.TreeMap;
- import org.springframework.stereotype.Service;
- import com.phil.common.config.WechatConfig;
- import com.phil.common.util.HttpReqUtil;
- import com.phil.common.util.JsonUtil;
- import com.phil.wechatmsg.model.template.resp.TemplateMsgResult;
- import com.phil.wechatmsg.service.WechatTemplateMsgService;
- /**
- * 模板消息接口实现类
- * @author phil
- * @date 2017年7月31日
- *
- */
- @Service
- public class WechatTemplateMsgServiceImpl implements WechatTemplateMsgService {
- /**
- * 发送模板消息
- * @param accessToken
- * @param data
- * @return 状态
- */
- @Override
- public TemplateMsgResult sendTemplate(String accessToken, String data) {
- TemplateMsgResult templateMsgResult = null;
- TreeMap<String,String> params = new TreeMap<String,String>();
- params.put("access_token", accessToken);
- String result = HttpReqUtil.HttpsDefaultExecute(HttpReqUtil.POST_METHOD, WechatConfig.SEND_TEMPLATE_MESSAGE, params, data);
- templateMsgResult = JsonUtil.fromJson(result, TemplateMsgResult.class);
- return templateMsgResult;
- }
- }
- package com.phil.wechatmsg.model.template.resp;
- import com.phil.common.result.ResultState;
- /**
- * 模板消息 返回的结果
- * @author phil
- * @date 2017年6月30日
- *
- */
- public class TemplateMsgResult extends ResultState {
- /**
- *
- */
- private static final long serialVersionUID = 3198012785950215862L;
- private String msgid; // 消息id(发送模板消息)
- public String getMsgid() {
- return msgid;
- }
- public void setMsgid(String msgid) {
- this.msgid = msgid;
- }
- }
- package com.phil.common.result;
- import java.io.Serializable;
- /**
- * 微信API返回状态
- *
- * @author phil
- * @date 2017年7月2日
- *
- */
- public class ResultState implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1692432930341768342L;
- private int errcode; // 状态
- private String errmsg; //信息
- 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;
- }
- }
工具类不再提供
五、根据业务调用方法
一般注册成功、支付成功、支付失败等等情况下会用到,以下只是个示例controller
- package com.phil.wechatmsg.controller;
- import java.util.TreeMap;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.log4j.Logger;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import com.phil.common.util.JsonUtil;
- import com.phil.wechatmsg.model.template.req.WechatTemplateMsg;
- import com.phil.wechatmsg.model.template.resp.TemplateMsgResult;
- import com.phil.wechatmsg.service.WechatTemplateMsgService;
- /**
- * 模板消息示例,只是个示例
- * @author phil
- * @date 2017年8月1日
- *
- */
- @Controller
- public class WechatTemplateMsgController {
- public static final Logger logger = Logger.getLogger(WechatTemplateMsgController.class);
- @Autowired
- private WechatTemplateMsgService wechatTemplateMsgService;
- public TemplateMsgResult sendTemplate(HttpServletRequest request, HttpServletResponse response){
- TemplateMsgResult templateMsgResult = null;
- TreeMap<String,TreeMap<String,String>> params = new TreeMap<String,TreeMap<String,String>>();
- //根据具体模板参数组装
- params.put("first",WechatTemplateMsg.item("您的户外旅行活动订单已经支付完成,可在我的个人中心中查看", "#000000"));
- params.put("keyword1",WechatTemplateMsg.item("8.1发现尼泊尔—人文与自然的旅行圣地", "#000000"));
- params.put("keyword2",WechatTemplateMsg.item("5000元", "#000000"));
- params.put("keyword3",WechatTemplateMsg.item("2017.1.2", "#000000"));
- params.put("keyword4",WechatTemplateMsg.item("5", "#000000"));
- params.put("remark",WechatTemplateMsg.item("请届时携带好身份证件准时到达集合地点,若临时退改将产生相应损失,敬请谅解,谢谢!", "#000000"));
- WechatTemplateMsg wechatTemplateMsg = new WechatTemplateMsg();
- wechatTemplateMsg.setTemplate_id("Ub2oYYFPf8ofmA17H31Zqu9Z_HLycZ7MC-Dx_Se1Nkw");
- wechatTemplateMsg.setTouser("241235134");
- wechatTemplateMsg.setUrl("http://music.163.com/#/song?id=27867140");
- wechatTemplateMsg.setData(params);
- String data = JsonUtil.toJson(wechatTemplateMsg);
- templateMsgResult = wechatTemplateMsgService.sendTemplate("accessToken", data);
- return templateMsgResult;
- }
- }