教你用java完美封裝微信模板消息的發(fā)送動(dòng)態(tài)
導(dǎo)入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>
通過(guò)查看微信模板消息文檔發(fā)現(xiàn)
發(fā)送模板消息需要的json數(shù)據(jù)
{
"touser":"OPENID",
"template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
"url":"http://weixin.qq.com/download",
"miniprogram":{
"appid":"xiaochengxuappid12345",
"pagepath":"index?foo=bar"
},
"data":{
"first": {
"value":"恭喜你購(gòu)買成功!",
"color":"#173177"
},
"keyword1":{
"value":"巧克力",
"color":"#173177"
},
"keyword2": {
"value":"39.8元",
"color":"#173177"
},
"keyword3": {
"value":"2014年9月22日",
"color":"#173177"
},
"remark":{
"value":"歡迎再次購(gòu)買!",
"color":"#173177"
}
}
}
模板實(shí)例

包含多種數(shù)據(jù)類型,并且以json數(shù)據(jù)格式請(qǐng)求接口便可以發(fā)送模板消息,發(fā)送成功效果。

我們看到first中的value對(duì)應(yīng)的第一部分需要填充{{first.DATA}}占位符的數(shù)據(jù),color對(duì)應(yīng)字體的顏色keyword可能包含一個(gè)或者多個(gè),所以我們需要?jiǎng)討B(tài)創(chuàng)建,根據(jù)模板中的消息提供。remark填充最后一條數(shù)據(jù)
我們先創(chuàng)建六個(gè)實(shí)體類,對(duì)應(yīng)模板消息用到的數(shù)據(jù)類型。
實(shí)體類代碼
Remark
存儲(chǔ)remark中的數(shù)據(jù)與顏色
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 //小程序相關(guān)數(shù)據(jù),無(wú)小程序可以不填,或者填充空串
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 首個(gè)數(shù)據(jù)
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不固定,所以我在實(shí)體類創(chuàng)建多個(gè)提供使用,根據(jù)需要,構(gòu)造需要個(gè)數(shù)
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 ,整合實(shí)體類所有數(shù)據(jù)
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;
}
實(shí)體類創(chuàng)建完成,所以當(dāng)我們需要發(fā)送模板消息的時(shí)候,我們只需要一個(gè)JsonRootBean對(duì)象,就可以完成發(fā)送。
由于我在data實(shí)體類中的keyword只有五個(gè),所以適用的模板消息中keyword最多只能有5個(gè),跟一根據(jù)需要,酌情添加
發(fā)送模板消息用到的工具類
發(fā)送消息工具類
private static String grantType="client_credential";
private static String appid="你的微信公眾號(hào)appid";
private static String secret="你的開(kāi)發(fā)者密碼appsercet";
public static Map<String,String> sendMessage2(String AccessToken, JsonRootBean jsonRootBean){
JSONObject json = (JSONObject) JSON.parseObject(JSON.toJSONString(jsonRootBean)); //把JsonRootBean轉(zhuǎn)成JSONObject對(duì)象
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格式數(shù)據(jù)發(fā)送post請(qǐng)求工具類),請(qǐng)前往我的另一篇HttpUtil工具類獲取
HttpUtil發(fā)送post攜帶Json數(shù)據(jù)工具類傳送門
獲取access_token (注意access_token有效期為兩小時(shí),過(guò)期后需重新獲取)
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;
}
發(fā)送模板案例
Miniprogram miniprogram = new Miniprogram("", "");
First first = new First("你在虛擬仿真系統(tǒng)有一筆消息待處理", "");
Keyword[] keywords = new Keyword[5];
Keyword keyword1 = new Keyword("測(cè)試名稱", "#173177");
Keyword keyword2 = new Keyword("考試評(píng)價(jià)", "#173177");
Keyword keyword3 = new Keyword(LocalDateTime.now().toString(), "#173177");
Keyword keyword4 = new Keyword("考試成績(jī)?cè)u(píng)分", "#173177");
keywords[0] = keyword1;
keywords[1] = keyword2;
keywords[2] = keyword3;
keywords[3] = keyword4;
Remark remark = new Remark("請(qǐng)及時(shí)前往處理", "");
// data data = new data(first, remark, keyword1, keyword2, keyword3, keyword4);
data data = new data(first, remark, keywords);
JsonRootBean jsonRootBean = new JsonRootBean("發(fā)個(gè)用戶的openid", "你在微信公眾號(hào)綁定的模板消息id", "單擊模板會(huì)跳轉(zhuǎn)的鏈接(https://www.baidu.com/實(shí)例)", miniprogram, data);
WeiXinUtil.sendMessage2(WeiXinUtil.getAccessToken().get("access_token"), jsonRootBean);
效果

發(fā)送成功了!!
通過(guò)前端發(fā)送接受一個(gè)map數(shù)據(jù)類型的參數(shù),發(fā)送模板消息,方法體👇👇
/**
* 動(dòng)態(tài)接受參數(shù)發(fā)送消息
* @param param
*/
public static Map<String,String> sendMessagetop(Map<String,Object> param){
Map<String,String> res = new HashMap<>();
String accessToken = WeiXinUtil.getAccessToken(); //通過(guò)工具類方法獲取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都不為空,才進(jìn)行初始化
}
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()); //得到有幾個(gè)keyword
Keyword[] keywords = new Keyword[5];
for (int i=0;i<keywordCount;i++){ //動(dòng)態(tài)創(chuàng)建kewword
Map kw = (Map) param.get(i+"");
String color = null;
if (kw.get("color")!=null){ //得到key對(duì)象里面的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(); //獲取關(guān)注公眾號(hào)的所有openid
Map datas = (Map) allOpenId.get("data");
List<String> openid = (List) datas.get("openid");//得到openid數(shù)組
for (String o : openid) { //遍歷依次發(fā)送模板消息
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;
}
以上是給所有關(guān)注了該公眾號(hào)的用戶都發(fā)送消息
到此這篇關(guān)于教你用java完美封裝微信模板消息的發(fā)送動(dòng)態(tài)的文章就介紹到這了,更多相關(guān)java封裝微信消息的發(fā)送內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java中封裝JDBC工具類的實(shí)例分析
- Java JDBC自定義封裝工具類的步驟和完整代碼
- Java Mail郵件發(fā)送如何實(shí)現(xiàn)簡(jiǎn)單封裝
- 基于selenium-java封裝chrome、firefox、phantomjs實(shí)現(xiàn)爬蟲
- 使用java反射將結(jié)果集封裝成為對(duì)象和對(duì)象集合操作
- Java 封裝基礎(chǔ)知識(shí)
- Java面向?qū)ο蟪绦蛟O(shè)計(jì):類的定義,靜態(tài)變量,成員變量,構(gòu)造函數(shù),封裝與私有,this概念與用法詳解
- Java封裝數(shù)組之改進(jìn)為泛型數(shù)組操作詳解
相關(guān)文章
使用IDEA將Java/Kotliin工程導(dǎo)出Jar包的正確姿勢(shì)
這篇文章主要介紹了使用IDEA將Java/Kotliin工程導(dǎo)出Jar包的正確姿勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
java讀寫excel文件實(shí)現(xiàn)POI解析Excel的方法
在日常工作中,我們常常會(huì)進(jìn)行Excel文件讀寫操作,這篇文章主要介紹了java讀寫excel文件實(shí)現(xiàn)POI解析Excel的方法,實(shí)例分析了java讀寫excel的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10
Spring中@Transactional注解關(guān)鍵屬性和用法小結(jié)
在Spring框架中,@Transactional 是一個(gè)注解,用于聲明事務(wù)性的方法,它提供了一種聲明式的事務(wù)管理方式,避免了在代碼中直接編寫事務(wù)管理相關(guān)的代碼,本文給大家介紹@Transactional 注解的一些關(guān)鍵屬性和用法,感興趣的朋友一起看看吧2023-12-12
spring?boot?2.x靜態(tài)資源會(huì)被攔截器攔截的原因分析及解決
這篇文章主要介紹了spring?boot?2.x靜態(tài)資源會(huì)被攔截器攔截的原因分析及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
快速解決List集合add元素,添加多個(gè)對(duì)象出現(xiàn)重復(fù)的問(wèn)題
這篇文章主要介紹了快速解決List集合add元素,添加多個(gè)對(duì)象出現(xiàn)重復(fù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08

