1. 官方文档
- 要
认证后的服务号
才可以申请模板消息的使用权限,否则只能使用测试号
- 设置
所属行业接口
要注意,设置成功之后要一个月之后才能再次设置
- 测试号设置模板
-
位置
-
模板格式
-
测试模板的模板ID
仅用于测试
,不能用来给正式帐号发送模板消息 -
为方便测试,测试模板可任意指定内容,但实际上
正式帐号的模板消息,只能从模板库中获得
-
需为正式帐号申请新增符合要求的模板,需使用正式号登录公众平台,按指引申请
-
模板内容可设置参数
(模板标题不可)
,供接口调用时使用,参数需以{{
开头,以.DATA}}
结尾 -
栗子
{{first.DATA}} 商品名称:{{keyword1.DATA}} 消费金额:{{keyword2.DATA}} 购买时间:{{keyword3.DATA} {{remark.DATA}}
- 在这里设置的
模板标题
就是发送的消息的标题
- 在这里设置的
-
-
2. 实现
-
WxTemplateMsgBean
import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.annotation.JsonProperty; import com.small.nine.wxmp.common.JsonService; import com.small.nine.wxmp.utils.wx.JsonUtils; import lombok.Data; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * 微信模板消息 * * @author sheng_zs@126.com * @date 2021-08-13 18:08 */ @Data public class WxTemplateMsgBean implements JsonService { private static final long serialVersionUID = -1471581872778193296L; /** * 接收者openid */ @JsonProperty("touser") private String toUser; /** * 模板ID */ @JsonProperty("template_id") private String templateId; /** * 模板跳转链接(海外帐号没有跳转能力) */ private String url; /** * 跳小程序所需数据,不需跳小程序可不用传该数据 */ @JsonProperty("miniprogram") private MiniProgram miniProgram; /** * 模板数据 */ private Map<String, TemplateData> data; /** * 初始化,设置 小程序 请调 {setProgram} 方法,添加数据请调 {addTemplateData} 方法 * * @param toUser 接收者openid * @param templateId 模板ID * @param url 模板跳转链接(海外帐号没有跳转能力) * @return {@link WxTemplateMsgBean} */ public static WxTemplateMsgBean getInstance(String toUser, String templateId, String url) { WxTemplateMsgBean msgBean = new WxTemplateMsgBean(); msgBean.setToUser(toUser); msgBean.setTemplateId(templateId); msgBean.setUrl(url); return msgBean; } /** * 设置小程序 * * @param appId 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏) * @param pagePath 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),要求该小程序已发布,暂不支持小游戏 * @return {@link WxTemplateMsgBean} */ public WxTemplateMsgBean setProgram(String appId, String pagePath) { MiniProgram miniProgram = new MiniProgram(); miniProgram.setAppId(appId); miniProgram.setPagePath(pagePath); this.setMiniProgram(miniProgram); return this; } /** * 添加模板数据 * * @param key 模板数据的 key * @param value 模板数据的 value * @param color 模板数据 value 的颜色 * @return {@link WxTemplateMsgBean} */ public WxTemplateMsgBean addTemplateData(String key, String value, String color) { if (StrUtil.isBlank(key)) { throw new IllegalArgumentException("模板消息的 key 不能为空!"); } TemplateData templateData = new TemplateData(); templateData.setValue(value); templateData.setColor(color); if (Objects.isNull(this.getData())) { this.setData(new HashMap<>()); } this.data.put(key, templateData); return this; } @Override public String toJson() { return JsonUtils.writeValueAsString(this); } /** * 跳小程序所需数据,不需跳小程序可不用传该数据 */ @Data static class MiniProgram implements Serializable { private static final long serialVersionUID = 3580966559808247662L; /** * 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏) */ @JsonProperty("appid") private String appId; /** * 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),要求该小程序已发布,暂不支持小游戏 */ @JsonProperty("pagepath") private String pagePath; } /** * 模板数据 */ @Data static class TemplateData implements Serializable { private static final long serialVersionUID = 5867853545869255342L; /** * 模板内容 */ private String value; /** * 模板内容字体颜色,不填默认为黑色 */ private String color; } }
-
serviceImpl
@Override public Map<String, Object> sendTemplateMsg() { // 模板 id final String templateId = "uRiti-qpU2bZSLRQk3a2zXUCZMK30MjjYQtaPkEXJYI"; final String url = String.format(WxConstant.URL_TEMPLATE_SEND_POST, getAccessToken()); String result = HttpUtil.post(url, WxTemplateMsgBean.getInstance("oqUo364fyXxJvfMM7NIwfljyeB44", templateId, "www.baidu.com") .addTemplateData("first", "恭喜购买成功!", "#173177") .addTemplateData("keyword1", "巧克力", "#173177") .addTemplateData("keyword2", "99.99 元", "#173177") .addTemplateData("keyword3", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), "#173177") .addTemplateData("remark", "欢迎再次品尝!", "#173177") .toJson()); return JsonUtils.readValueAsMap(result); }