教你用java完美封装微信模板消息的发送动态
目录
- 导入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 2021年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工具类获取
获取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; }
以上是给所有关注了该公众号的用户都发送消息
到此这篇关于教你用java完美封装微信模板消息的发送动态的文章就介绍到这了,更多相关java封装微信消息的发送内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
赞 (0)