很不错,写的很好,拿来和大家分享。
模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。对于一般的服务号而言,模板ID行业之类会事先配置好,所以用代码控制的只有发送了。
准备工作:已通过认证的服务号或者测试公众号
一、使用规则
- 所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口
- 需要选择公众账号服务所处的2个行业,每月可更改1次所选行业
- 在所选择行业的模板库中选用已有的模板进行调用
- 每个账号可以同时使用25个模板
- 当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制,以公众号MP后台开发者中心页面中标明的数字为准
二、接口文档规范
- 模板消息调用时主要需要模板ID和模板中各参数的赋值内容
- 模板中参数内容必须以".DATA"结尾,否则视为保留字
- 模板保留符号"{{ }}"
测试公众号可以随意定义,正式的必须用模板库中的
三、 封装模板消息
以下是我使用的模板消息示例
1. {{first.DATA}}
2. 旅行活动名称:{{keyword1.DATA}}
3. 订单金额:{{keyword2.DATA}}
4. 旅行时间:{{keyword3.DATA}}
5. 参与人数:{{keyword4.DATA}}
6. {{remark.DATA}}
POST数据示例如下:
1. {
2. "touser":"OPENID",
3. "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
4. "url":"http://weixin.qq.com/download",
5. "miniprogram":{
6. "appid":"xiaochengxuappid12345",
7. foo=bar"
8. },
9. "data":{
10. "first": {
11. "value":"恭喜你购买成功!",
12. "color":"#173177"
13. },
14. "keynote1":{
15. "value":"巧克力",
16. "color":"#173177"
17. },
18. "keynote2": {
19. "value":"39.8元",
20. "color":"#173177"
21. },
22. "keynote3": {
23. "value":"2014年9月22日",
24. "color":"#173177"
25. },
26. "remark":{
27. "value":"欢迎再次购买!",
28. "color":"#173177"
29. }
30. }
31. }
1. package com.phil.wechatmsg.model.template.req;
2.
3. import java.util.TreeMap;
4.
5. import com.phil.common.annotation.NotRequire;
6.
7. /**
8. * 模板消息
9. * @author phil
10. * @date 2017年7月2日
11. *
12. */
13. public class WechatTemplateMsg {
14. private String touser; //接收者openid
15. private String template_id; //模板ID
16. @NotRequire//只是个标识
17. private String url; //模板跳转链接
18. // "miniprogram":{ 未加入
19. // "appid":"xiaochengxuappid12345",
20. // "pagepath":"index?foo=bar"
21. // },
22. private TreeMap<String, TreeMap<String, String>> data; //data数据
23. /**
24. * 参数
25. * @param value
26. * @param color 可不填
27. * @return
28. */
29. public static TreeMap<String, String> item(String value, String color) {
30. new TreeMap<String, String>();
31. "value", value);
32. "color", color);
33. return params;
34. }
35. }
四、发送模板消息
1. // 发送模板消息
2. public static final String SEND_TEMPLATE_MESSAGE = "https://api.weixin.qq.com/cgi-bin/message/template/send";
1. /**
2. * 发送模板消息
3. *
4. * @param accessToken
5. * @param data
6. * @return 状态
7. */
8. @Override
9. public TemplateMsgResult sendTemplate(String accessToken, String data) {
10. null;
11. new TreeMap<String, String>();
12. "access_token", accessToken);
13. String result = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_TEMPLATE_MESSAGE,
14. params, data);
15. class);
16. //log.....
17. return templateMsgResult;
18. }
1. package com.phil.wechat.msg.model.template.resp;
2.
3. import com.phil.wechat.base.result.ResultState;
4.
5. /**
6. * 模板消息 返回的结果
7. * @author phil
8. * @date 2017年6月30日
9. *
10. */
11. public class TemplateMsgResult extends ResultState {
12.
13. private static final long serialVersionUID = 3198012785950215862L;
14. private String msgid; // 消息id(发送模板消息)
15. }
1. package com.phil.wechat.base.result;
2.
3. /**
4. * 微信API返回状态
5. *
6. * @author phil
7. * @date 2017年7月2日
8. *
9. */
10. public class ResultState extends AbstractResult {
11.
12. private static final long serialVersionUID = 1692432930341768342L;
13. private int errcode; // 状态
14. private String errmsg; //信息
15. }
五、根据业务调用方法
一般注册成功、支付成功、支付失败等等情况下会用到,以下只是个示例controller
1. package com.phil.wechat.msg.controller;
2.
3. import java.util.TreeMap;
4.
5. import org.slf4j.Logger;
6. import org.slf4j.LoggerFactory;
7. import org.springframework.beans.factory.annotation.Autowired;
8. import org.springframework.stereotype.Controller;
9. import org.springframework.web.bind.annotation.RequestMapping;
10.
11. import com.phil.modules.util.JsonUtil;
12. import com.phil.wechat.base.controller.BaseController;
13. import com.phil.wechat.msg.model.template.req.WechatTemplateMsg;
14. import com.phil.wechat.msg.model.template.resp.TemplateMsgResult;
15. import com.phil.wechat.msg.service.WechatMsgService;
16.
17. /**
18. * @author phil
19. * @date 2017年9月19日
20. *
21. */
22. @Controller
23. @RequestMapping("/wechat")
24. public class WechatMsgController extends BaseController {
25.
26. private Logger logger = LoggerFactory.getLogger(this.getClass());
27.
28. @Autowired
29. private WechatMsgService wechatMsgService;
30.
31. public TemplateMsgResult sendTemplate(){
32. null;
33. new TreeMap<String,TreeMap<String,String>>();
34. //根据具体模板参数组装
35. "first",WechatTemplateMsg.item("您的户外旅行活动订单已经支付完成,可在我的个人中心中查看", "#000000"));
36. "keyword1",WechatTemplateMsg.item("8.1发现尼泊尔—人文与自然的旅行圣地", "#000000"));
37. "keyword2",WechatTemplateMsg.item("5000元", "#000000"));
38. "keyword3",WechatTemplateMsg.item("2017.1.2", "#000000"));
39. "keyword4",WechatTemplateMsg.item("5", "#000000"));
40. "remark",WechatTemplateMsg.item("请届时携带好身份证件准时到达集合地点,若临时退改将产生相应损失,敬请谅解,谢谢!", "#000000"));
41. new WechatTemplateMsg();
42. "Ub2oYYFPf8ofmA17H31Zqu9Z_HLycZ7MC-Dx_Se1Nkw");
43. "241235134");
44. "http://music.163.com/#/song?id=27867140");
45. wechatTemplateMsg.setData(params);
46. String data = JsonUtil.toJsonString(wechatTemplateMsg);
47. "accessToken", data);
48. return templateMsgResult;
49. }
50.
51. }