09. 微信公众号发送模板消息

1. 官方文档
  1. 认证后的服务号才可以申请模板消息的使用权限,否则只能使用测试号
  2. 设置所属行业接口要注意,设置成功之后要一个月之后才能再次设置
  3. 测试号设置模板
    1. 位置

    2. 模板格式

      1. 测试模板的模板ID仅用于测试,不能用来给正式帐号发送模板消息

      2. 为方便测试,测试模板可任意指定内容,但实际上正式帐号的模板消息,只能从模板库中获得

      3. 需为正式帐号申请新增符合要求的模板,需使用正式号登录公众平台,按指引申请

      4. 模板内容可设置参数(模板标题不可),供接口调用时使用,参数需以{{开头,以.DATA}}结尾

      5. 栗子
        在这里插入图片描述

        {{first.DATA}}
        商品名称:{{keyword1.DATA}} 
        消费金额:{{keyword2.DATA}} 
        购买时间:{{keyword3.DATA}
        {{remark.DATA}}
        
        • 在这里设置的模板标题就是发送的消息的标题
          在这里插入图片描述
2. 实现
  1. 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;
        }
    }
    
  2. 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);
    }    
    
3. 源码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值