模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。对于一般的服务号而言,模板ID行业之类会事先配置好,所以用代码控制的只有发送了。
准备工作:已通过认证的服务号或者测试公众号
测试公众号可以随意定义,正式的必须用模板库中的
以下是我使用的模板消息示例
{{first.DATA}}
旅行活动名称:{{keyword1.DATA}}
订单金额:{{keyword2.DATA}}
旅行时间:{{keyword3.DATA}}
参与人数:{{keyword4.DATA}}
{{remark.DATA}}
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> data; //data数据
/**
* 参数
* @param value
* @param color 可不填
* @return
*/
public static TreeMap item(String value, String color) {
TreeMap params = new TreeMap();
params.put("value", value);
params.put("color", color);
return params;
}
}
// 发送模板消息
public static final String SEND_TEMPLATE_MESSAGE = "https://api.weixin.qq.com/cgi-bin/message/template/send";
/**
* 发送模板消息
*
* @param accessToken
* @param data
* @return 状态
*/
@Override
public TemplateMsgResult sendTemplate(String accessToken, String data) {
TemplateMsgResult templateMsgResult = null;
TreeMap params = new TreeMap();
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;
import com.phil.wechat.base.result.ResultState;
/**
* 模板消息 返回的结果
* @author phil
* @date 2017年6月30日
*
*/
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
package com.phil.wechat.msg.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;
import com.phil.modules.util.JsonUtil;
import com.phil.wechat.base.controller.BaseController;
import com.phil.wechat.msg.model.template.req.WechatTemplateMsg;
import com.phil.wechat.msg.model.template.resp.TemplateMsgResult;
import com.phil.wechat.msg.service.WechatMsgService;
/**
* @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> params = new TreeMap>();
//根据具体模板参数组装
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.toJsonString(wechatTemplateMsg);
templateMsgResult = wechatMsgService.sendTemplate("获取的accessToken", data);
return templateMsgResult;
}
}
我是工具类
感谢支持