模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。对于一般的服务号而言,模板ID行业之类会事先配置好,所以用代码控制的只有发送了。
准备工作:已通过认证的服务号或者测试公众号
一、使用规则
所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口
需要选择公众账号服务所处的2个行业,每月可更改1次所选行业
在所选择行业的模板库中选用已有的模板进行调用
每个账号可以同时使用25个模板
当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制,以公众号MP后台开发者中心页面中标明的数字为准
二、接口文档规范
模板消息调用时主要需要模板ID和模板中各参数的赋值内容
模板中参数内容必须以”.DATA”结尾,否则视为保留字
模板保留符号”{{ }}”
测试公众号可以随意定义,正式的必须用模板库中的
三、 封装模板消息
以下是我使用的模板消息示例
{{first.DATA}}
旅行活动名称:{{keyword1.DATA}}
订单金额:{{keyword2.DATA}}
旅行时间:{{keyword3.DATA}}
参与人数:{{keyword4.DATA}}
{{remark.DATA}}
POST数据示例如下:
{ "touser":"OPENID", "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY", "url":"", "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" } } }
java代码:
import java.util.TreeMap;
import com.phil.common. annotation .NotRequire;
/**
* 模板消息
*
*/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数据
/**
* 参数
* @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;
}
}
四、发送模板消息
// 发送模板消息 public static final String SEND_TEMPLATE_MESSAGE = ""; /** * 发送模板消息 * * @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(SystemConfig.POST_METHOD, WechatConfig.SEND_TEMPLATE_MESSAGE, params, data); templateMsgResult = JsonUtil.fromJsonString(result, TemplateMsgResult.class); //log..... return templateMsgResult; } package com.phil.wechat.msg.model.template.resp; /** * 模板消息 返回的结果 * */public class TemplateMsgResult extends ResultState { private static final long serialVersionUID = 3198012785950215862L; private String msgid; // 消息id(发送模板消息) } package com.phil.wechat.base.result; /** * 微信API返回状态 * * @author phil * @date 2017年7月2日 * */public class ResultState extends AbstractResult { private static final long serialVersionUID = 1692432930341768342L; private int errcode; // 状态 private String errmsg; //信息 }
五、根据业务调用方法
一般注册成功、支付成功、支付失败等等情况下会用到,以下只是个示例controller
import java.util.TreeMap; import org. slf4j .Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * @author phil * @date 2017年9月19日 * */@Controller @RequestMapping("/wechat") public class WechatMsgController extends BaseController { private Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private WechatMsgService wechatMsgService; public TemplateMsgResult sendTemplate(){ 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("#/song?id=27867140"); wechatTemplateMsg.setData(params); String data = JsonUtil.toJsonString(wechatTemplateMsg); templateMsgResult = wechatMsgService.sendTemplate("获取的accessToken", data); return templateMsgResult; }