很不错,写的很好,拿来和大家分享。


模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。对于一般的服务号而言,模板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. }

我是工具类