前提:
我们需要有公众号开发账号。没有可以前往官网注册,或领取测试账号调试使用
官方地址
模板消息文档地址
测试号
正式开发
1、导入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;
}
我们只需要提供一个接受map类型参数的接口提供前端使用就可以发送微信模板消息了!!
@PostMapping("/sendMessage")
public void sendMessage(@RequestBody Map param){
WeiXinUtil.sendMessage(param);
}
以上是给所有关注了该公众号的用户都发送消息
获取指定用户的openid需要网页授权。再通过openid发送消息。(待更新…)
绑定微信用户并给指定用户发送模板消息。请移步我的另一篇原创文章
如有疑问,欢迎大家评论交流!!!❤️❤️❤️❤️❤️