模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。
1、模板消息调用时主要需要模板ID和模板中各参数的赋值内容; 2、模板中参数内容必须以".DATA"结尾,否则视为保留字; 3、模板保留符号"{{ }}"。Java项目里的实现方法:
1、模板消息的模板内容组成有两种方式
前台页面组装好传递到后台(eg:body):
$.ajax({ type: "POST",//提交类型 url: "${pageContext.request.contextPath}/SendMs/sendTemplateMessages", data: { body:JSON.stringify({ touser: '接收消息用户的openId', template_id: '模板消息的模板Id', data: { 'first': { 'value': '您的订单通知>_<', 'color': '#173177' }, 'keyword1': { 'value': '1001001010', 'color': '#173177' }, 'keyword2': { 'value': '蛋炒饭不加蛋', 'color': '#173177' }, 'keyword3': { 'value': '10¥', 'color': '#173177' }, 'remark': { 'value': '感谢您的光顾,祝您生活愉快!*_*', 'color': '#173177' } } }) }, dataType:"json", success: function(m){ } });前台没有传模板消息,则后台自己组装 (eg:wechatTemplateStr):
注:JSONArray将类转换成模板消息字符串,转换之后会有一个中括号,需要用replace方法将中括号去掉才是模板消息的正确格式,不然调微信的发送模板消息接口会报格式不正确错误。(切记)
//前台没有传模板消息内容,则后台自己组装 eg:wechatTemplateStr WechatTemplate wechatTemplate = new WechatTemplate(); wechatTemplate.setTemplate_id(AlipayController.template_id); wechatTemplate.setTouser("oifR00Qa_h9TawBbnXa3S54mEpew"); Map<String,TemplateData> mapdata = new HashMap<>(); // 封装模板数据 TemplateData first = new TemplateData(); first.setValue(AlipayController.templateHead); first.setColor("#173177"); mapdata.put("first", first); TemplateData keyword1 = new TemplateData(); keyword1.setValue(orderNumber); keyword1.setColor("#173177"); mapdata.put("keyword1", keyword1); TemplateData keyword2 = new TemplateData(); keyword2.setValue(commodityDetails); keyword2.setColor("#173177"); mapdata.put("keyword2", keyword2); TemplateData keyword3 = new TemplateData(); keyword3.setValue(orderAmount); keyword3.setColor("#173177"); mapdata.put("keyword3", keyword3); TemplateData remark = new TemplateData(); remark.setValue(AlipayController.remark); remark.setColor("#173177"); mapdata.put("remark", remark); wechatTemplate.setData(mapdata); //通过JSONArray将模板类转换为字符串 JSONArray wechatTemplatearray = JSONArray.fromObject(wechatTemplate); String wechatTemplateStr = wechatTemplatearray.toString().replace("[", " "); wechatTemplateStr = wechatTemplateStr.toString().replace("]", " ");2、后台调用微信公众号接口发送模板消息
import net.sf.json.JSONArray; import com.alibaba.fastjson.JSONObject; public static String template_id = "模板消息的模板Id"; public static String templateHead = "您的订单通知>_<"; public static String remark = "感谢您的光顾,祝您生活愉快!*_*"; @ResponseBody @RequestMapping(value = "sendTemplateMessages") public String sendTemplateMessages(String body,String openId,String orderNumber,String commodityDetails,String orderAmount) { try { //获取公众号access_token(GET请求) URL url = new URL("https://api.weixin.qq.com/cgi-bin/token?appid=&secret=&grant_type=client_credential"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 在连接之前设置属性 // Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型 conn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); // 设置打开与此URLConnection引用的资源的通信链接时使用的指定超时值(以毫秒为单位) conn.setConnectTimeout(10000); // 将读取超时设置为指定的超时时间,以毫秒为单位。 // conn.setReadTimeout(60000); conn.setRequestMethod("GET"); // Post 请求不能使用缓存 conn.setUseCaches(false); // 建立连接 conn.connect(); // 获取响应 BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; String result = ""; while ((line = reader.readLine()) != null) { result += line; } reader.close(); conn.disconnect(); JSONObject jsStr = JSONObject.parseObject(result); //Json对象转换成java对象,获取到公众号access_token WeChatToken weChatToken = (WeChatToken) JSONObject.toJavaObject(jsStr,WeChatToken.class); //发送模板消息(POST请求) URL msurl = new URL("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + weChatToken.access_token); HttpURLConnection msconn = (HttpURLConnection) msurl.openConnection(); // 在连接之前设置属性 // Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型 msconn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); // 设置打开与此URLConnection引用的资源的通信链接时使用的指定超时值(以毫秒为单位) msconn.setConnectTimeout(30000); // 将读取超时设置为指定的超时时间,以毫秒为单位。 // conn.setReadTimeout(60000); // 发送POST请求必须设置如下两行 msconn.setDoOutput(true); msconn.setDoInput(true); msconn.setRequestMethod("POST"); // Post 请求不能使用缓存 msconn.setUseCaches(false); // 建立连接 msconn.connect(); OutputStream outputStream = msconn.getOutputStream(); //前台如果传来消息模板则直接使用,如果未传则自己创建消息模板 //注意编码格式,防止中文乱码 //前台组装好模板消息,则直接使用 eg:body //outputStream.write(body.getBytes("UTF-8")); //前台没有传模板消息,则后台自己组装 eg:wechatTemplateStr WechatTemplate wechatTemplate = new WechatTemplate(); wechatTemplate.setTemplate_id(AlipayController.template_id); wechatTemplate.setTouser(openId); Map<String,TemplateData> mapdata = new HashMap<>(); // 封装模板数据 TemplateData first = new TemplateData(); first.setValue(AlipayController.templateHead); first.setColor("#173177"); mapdata.put("first", first); TemplateData keyword1 = new TemplateData(); keyword1.setValue(orderNumber); keyword1.setColor("#173177"); mapdata.put("keyword1", keyword1); TemplateData keyword2 = new TemplateData(); keyword2.setValue(commodityDetails); keyword2.setColor("#173177"); mapdata.put("keyword2", keyword2); TemplateData keyword3 = new TemplateData(); keyword3.setValue(orderAmount); keyword3.setColor("#173177"); mapdata.put("keyword3", keyword3); TemplateData remark = new TemplateData(); remark.setValue(AlipayController.remark); remark.setColor("#173177"); mapdata.put("remark", remark); wechatTemplate.setData(mapdata); //通过JSONArray将模板类转换为字符串 JSONArray wechatTemplatearray = JSONArray.fromObject(wechatTemplate); String wechatTemplateStr = wechatTemplatearray.toString().replace("[", " "); wechatTemplateStr = wechatTemplateStr.toString().replace("]", " "); outputStream.write(wechatTemplateStr.getBytes("UTF-8")); outputStream.close(); // 获取响应 BufferedReader msreader = new BufferedReader(new InputStreamReader(msconn.getInputStream())); String msline; String msresult = ""; while ((msline = msreader.readLine()) != null) { msresult += msline; } msreader.close(); msconn.disconnect(); return msresult; } catch (MalformedURLException e) { e.printStackTrace(); } catch (SocketTimeoutException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return "send false"; }3、组装模板消息需要用到的几个类
import java.util.Map; 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; } } 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 WeChatToken { public String access_token ; public int expires_in; }以上所说就可以完成公众号给微信用户发送模板消息,希望能帮助到您。(*^▽^*)