信息发布→ 登录 注册 退出

教你用java完美封装微信模板消息的发送动态

发布时间:2026-01-11

点击量:
目录
  • 导入maven依赖
  • 模板实例
  • 实体类代码
    • Remark
    • Miniprogram //小程序相关数据,无小程序可以不填,或者填充空串
    • Keyword,中间keyword部分
    • First 首个数据
    • JsonRootBean ,整合实体类所有数据
  • 发送模板消息用到的工具类
    • 发送消息工具类
  • 发送模板案例
    • 效果

      导入maven依赖

      <dependency>
                  <groupId>org.dom4j</groupId>
                  <artifactId>dom4j</artifactId>
                  <version>2.1.1</version>
              </dependency>
              <!-- https://mvnrepository.com/artifact/jaxen/jaxen -->
              <dependency>
                  <groupId>jaxen</groupId>
                  <artifactId>jaxen</artifactId>
                  <version>1.2.0</version>
              </dependency>
      
              <dependency>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
              </dependency>
      
              <!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
              <dependency>
                  <groupId>com.thoughtworks.xstream</groupId>
                  <artifactId>xstream</artifactId>
                  <version>1.4.15</version>
              </dependency>
      
              <dependency>
                  <groupId>com.alibaba</groupId>
                  <artifactId>fastjson</artifactId>
                  <version>1.2.75</version>
              </dependency>
      

      通过查看微信模板消息文档发现

      发送模板消息需要的json数据

      {
                 "touser":"OPENID",
                 "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
                 "url":"http://weixin.qq.com/download",  
                 "miniprogram":{
                   "appid":"xiaochengxuappid12345",
                   "pagepath":"index?foo=bar"
                 },          
                 "data":{
                         "first": {
                             "value":"恭喜你购买成功!",
                             "color":"#173177"
                         },
                         "keyword1":{
                             "value":"巧克力",
                             "color":"#173177"
                         },
                         "keyword2": {
                             "value":"39.8元",
                             "color":"#173177"
                         },
                         "keyword3": {
                             "value":"2014年9月22日",
                             "color":"#173177"
                         },
                         "remark":{
                             "value":"欢迎再次购买!",
                             "color":"#173177"
                         }
                 }
             }
      

      模板实例

      包含多种数据类型,并且以json数据格式请求接口便可以发送模板消息,发送成功效果。

      我们看到first中的value对应的第一部分需要填充{{first.DATA}}占位符的数据,color对应字体的颜色keyword可能包含一个或者多个,所以我们需要动态创建,根据模板中的消息提供。remark填充最后一条数据

      我们先创建六个实体类,对应模板消息用到的数据类型。

      实体类代码

      Remark

      存储remark中的数据与颜色

      package cn.xjt.wx.MessageEntity;
      
      
      import lombok.AllArgsConstructor;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class Remark {
      
          private String value;
          private String color;
      }
      

      Miniprogram //小程序相关数据,无小程序可以不填,或者填充空串

      package cn.xjt.wx.MessageEntity;
      
      
      import lombok.AllArgsConstructor;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class Miniprogram {
      
          private String appid;
          private String pagepath;
      
      }
      

      Keyword,中间keyword部分

      package cn.xjt.wx.MessageEntity;
      
      
      import lombok.AllArgsConstructor;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class Keyword {
      
          private String value;
          private String color;
      }
      

      First 首个数据

      package cn.xjt.wx.MessageEntity;
      
      import lombok.AllArgsConstructor;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      import java.util.Date;
      
      /**
       * @author xu
       * @Description
       * @createTime 2025年04月02日 17:02:00
       */
      
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class First {
      
          private String value;
          private String color;
      
      }
      

      data 包含first、keyword、remark

      由于keyword不固定,所以我在实体类创建多个提供使用,根据需要,构造需要个数

      package cn.xjt.wx.MessageEntity;
      
      import lombok.AllArgsConstructor;
      import lombok.NoArgsConstructor;
      
      import java.util.List;
      
      @lombok.Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class data {
      
          private First first;
      
          private Keyword keyword1;
          private Keyword keyword2;
          private Keyword keyword3;
          private Keyword keyword4;
          private Keyword keyword5;
          private Remark remark;
      
      
          public data(First first,Remark remark,Keyword ... keyword){
              this.first=first;
              int count=1;
              for (Keyword keyword1 : keyword) {
                  if (count==1){
                      this.keyword1=keyword1;
                  }else if (count==2){
                      this.keyword2=keyword1;
                  }else if (count==3){
                      this.keyword3=keyword1;
                  }else if (count==4){
                      this.keyword4=keyword1;
                  }else if (count==5){
                      this.keyword5=keyword1;
                  }
                  count++;
              }
              this.remark=remark;
          }
      
      }
      

      JsonRootBean ,整合实体类所有数据

      package cn.xjt.wx.MessageEntity;
      
      import lombok.AllArgsConstructor;
      import lombok.NoArgsConstructor;
      import lombok.Data;
      
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class JsonRootBean {
      
          private String touser;
          private String template_id;
          private String url;
          private Miniprogram miniprogram;
          private data data;
      
      }
      

      实体类创建完成,所以当我们需要发送模板消息的时候,我们只需要一个JsonRootBean对象,就可以完成发送。

      由于我在data实体类中的keyword只有五个,所以适用的模板消息中keyword最多只能有5个,跟一根据需要,酌情添加

      发送模板消息用到的工具类

      发送消息工具类

      private static String grantType="client_credential";  
      
      private static String appid="你的微信公众号appid";
      
      private static String secret="你的开发者密码appsercet";
      
       public static Map<String,String> sendMessage2(String AccessToken, JsonRootBean jsonRootBean){
              JSONObject json = (JSONObject) JSON.parseObject(JSON.toJSONString(jsonRootBean));       //把JsonRootBean转成JSONObject对象
              String info = HttpUtil.sendPostJson(json, "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + AccessToken);
              Map<String,String> map = (Map) JSON.parse(info);
              System.out.println(map);
              return map;
          }
      

      (携带json格式数据发送post请求工具类),请前往我的另一篇HttpUtil工具类获取

      HttpUtil发送post携带Json数据工具类传送门

      获取access_token (注意access_token有效期为两小时,过期后需重新获取)

      public static Map<String,String> getAccessToken(){
              String s = HttpUtil.sendGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=" + grantType + "&appid=" + appid + "&secret=" + secret);
              Map<String,String> map = (Map) JSON.parse(s);
              System.out.println(map);
              return map;
          }
      

      发送模板案例

      Miniprogram miniprogram = new Miniprogram("", "");
      		First first = new First("你在虚拟*系统有一笔消息待处理", "");
      		Keyword[] keywords = new Keyword[5];
      		Keyword keyword1 = new Keyword("测试名称", "#173177");
      		Keyword keyword2 = new Keyword("考试评价", "#173177");
      		Keyword keyword3 = new Keyword(LocalDateTime.now().toString(), "#173177");
      		Keyword keyword4 = new Keyword("考试成绩评分", "#173177");
      
      		keywords[0] = keyword1;
      		keywords[1] = keyword2;
      		keywords[2] = keyword3;
      		keywords[3] = keyword4;
      		
      		Remark remark = new Remark("请及时前往处理", "");
      //		data data = new data(first, remark, keyword1, keyword2, keyword3, keyword4);
      		data data = new data(first, remark, keywords);
      		JsonRootBean jsonRootBean = new JsonRootBean("发个用户的openid", "你在微信公众号绑定的模板消息id", "单击模板会跳转的链接(https://www.baidu.com/实例)", miniprogram, data);
      		WeiXinUtil.sendMessage2(WeiXinUtil.getAccessToken().get("access_token"), jsonRootBean);
      

      效果


      发送成功了!!

      通过前端发送接受一个map数据类型的参数,发送模板消息,方法体👇👇

      /**
           * 动态接受参数发送消息
           * @param param
           */
          public static Map<String,String> sendMessagetop(Map<String,Object> param){
              Map<String,String> res = new HashMap<>();
              String accessToken = WeiXinUtil.getAccessToken();		//通过工具类方法获取accesstoken
              Miniprogram miniprogram=null;
              String firstColor=null;
              String remarkColor=null;
              if (param.get("appid")!=null && param.get("pagepath")!=null){
                  miniprogram = new Miniprogram(param.get("appid").toString(), param.get("pagepath").toString());		//如果appid和pagepath都不为空,才进行初始化
              }
              String firstValue = param.get("firstValue").toString();		//获取firstvalue
              if (param.get("firstColor")!=null){
                  firstColor = param.get("firstColor").toString();		//如果颜色不为空,则获取
              }
              First first = new First(firstValue, firstColor);
              Integer keywordCount = Integer.valueOf(param.get("keywordCount").toString());		//得到有几个keyword
              Keyword[] keywords = new Keyword[5];
              for (int i=0;i<keywordCount;i++){		//动态创建kewword
                  Map kw = (Map) param.get(i+"");
                  String color = null;
                  if (kw.get("color")!=null){				//得到key对象里面的value与color
                      color=kw.get("color").toString();		//如果color不为空,则获取
                  }
                  keywords[i]=new Keyword(kw.get("value").toString(), color);
              }
              String remarkValue = param.get("remarkValue").toString();
              if (param.get("remarkColor")!=null){
                  remarkColor = param.get("remarkColor").toString();
              }
              Remark remark = new Remark(remarkValue, remarkColor);
              data data = new data(first, remark, keywords);		
              Map<String, Object> allOpenId = WeiXinUtil.getAllOpenId();		//获取关注公众号的所有openid
              Map datas = (Map) allOpenId.get("data");
              List<String> openid = (List) datas.get("openid");//得到openid数组
              for (String o : openid) {		//遍历依次发送模板消息
                  System.out.println(o);
                  JsonRootBean jsonRootBean = new JsonRootBean(o, TEMPLATE_ID, URL, miniprogram, data);
                  Map<String, String> result = WeiXinUtil.sendMessage2(accessToken, jsonRootBean);
                  res.put("errmsg", result.get("errmsg"));
              }
              return res;
          }
      

      以上是给所有关注了该公众号的用户都发送消息

      在线客服
      服务热线

      服务热线

      4008888355

      微信咨询
      二维码
      返回顶部
      ×二维码

      截屏,微信识别二维码

      打开微信

      微信号已复制,请打开微信添加咨询详情!