前言:
上一篇内容讲到了配置access_token,现在主要就是去怎么去配置模板消息以及代码的实现了。
配置:
首先还是以测试公众号为例如下:
如上可以利用身边的手机进行关注该公众号,同时也都会获取到每个用户的openid,
然后就是需要自己去创建你需要发送的模板消息的模板了。其中,在文档里面会有一个示例叫你如何去创建,以及某些数据应该使用什么类型。以下我都给你们举例:
以及具体的类型,都可以根据官方文档去查看浏览: 基础消息能力 / 模板消息接口 (qq.com)
若是正式上线则需要去获取到权限,然后去配置模板,但是限制较多,测试的环境则无太多限制,可以根据自己的需求去创建模板,自己在做项目的时候可以使用到。
创建的地方如上图的个人界面当中。创建完成后则会有一个模板id,在代码当中会使用到该模板的id。
然后我们就进行代码的开发:
@PostMapping("/test")
public ResultBean<String> getRepairs(@RequestBody String json) {
System.out.println(json);
Map<String, String> params = parseQueryString(json);
// 打印所有参数
Map<String,String> maps=new HashMap<>();
for (Map.Entry<String, String> entry : params.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
maps.put(entry.getKey(),entry.getValue());
}
String post = null;
try {
String url = String.format("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s", TokenUtils.getAccessToken());
Map<String, Object> map = new LinkedHashMap<>();
String page = "index";
String Phone = maps.get("phone");
String Name = maps.get("person");
String companyName = maps.get("eName");
String content = maps.get("content");
String starTime = maps.get("presentTime");
String targetFormat = "yyyy年MM月dd日 HH:mm";
String formattedDate="";
// 创建SimpleDateFormat对象,用于解析原始日期字符串
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 创建SimpleDateFormat对象,用于格式化日期为所需的格式
SimpleDateFormat outputFormat = new SimpleDateFormat(targetFormat);
try {
// 解析原始日期字符串
Date date = inputFormat.parse(starTime);
// 将日期格式化为所需的格式
formattedDate = outputFormat.format(date);
// 打印结果
System.out.println(formattedDate);
} catch (ParseException e) {
e.printStackTrace();
}
String template_id = wxConfig.getTemplate_id();
map.put("template_id", template_id);
map.put("page", page);
Map<String, Object> stringMap = new LinkedHashMap<>();
Map<String, String> vs01 = new LinkedHashMap<>();
Map<String, String> vs02 = new LinkedHashMap<>();
Map<String, String> vs03 = new LinkedHashMap<>();
Map<String, String> vs04 = new LinkedHashMap<>();
Map<String, String> vs05 = new LinkedHashMap<>();
vs01.put("value", Phone);
vs02.put("value", formattedDate);
vs03.put("value", Name);
vs05.put("value", content);
vs04.put("value", companyName);
stringMap.put("thing01", vs03);
stringMap.put("thing02", vs01);
stringMap.put("thing03", vs04);
stringMap.put("thing04", vs05);
stringMap.put("time01", vs02);
map.put("data", stringMap);
// todo 此处可以添加获取所有关注过公众号用户的openid
//以下则是处理获取到的openid
String withoutBrackets = result.substring(1, result.length() - 1);
// 按逗号分割字符串
String[] items = withoutBrackets.split(", ");
// 将分割后的字符串数组转换为List<String>
List<String> openIdList = new ArrayList<>(Arrays.asList(items));
for (int i=0;i<openIdList.size();i++){
if (openIdList.get(i)!=null||!openIdList.get(i).equals("")){
map.put("touser", openIdList.get(i));
JSONObject object = new JSONObject(map);
String parm = object.toString();
//此处则是进行调用公众号的接口
post = HttpRestUtils.post(url, parm);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return new ResultBean<>(post);
}
以上代码:首先根据自己的需求去获取参数数据,然后将对应的数据放入相应模板的参数当中;
当然我们将自己的数据传递给公众号时需要按照它的格式要求来传递,所以要对自己的代码进行封装,我以上的代码则就是封装后的代码,可能代码有点混乱需要自己打断点去进行测试,如下:
{ "touser":"OPENID", "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY", "url":"http://weixin.qq.com/download", "miniprogram":{ "appid":"xiaochengxuappid12345", "pagepath":"index?foo=bar" }, "client_msg_id":"MSG_000001", "data":{ "keyword1":{ "value":"巧克力" }, "keyword2": { "value":"39.8元" }, "keyword3": { "value":"2014年9月22日" } } }
注: data里面的参数名称应该和你创建模板时的参数名称相同
以下是参数的说明:
具体的效果如下图:
以上模板消息推送的功能就完成了!!!
若是想了解怎么获取用户的openid可以关注我!!!或私信我!!!