对于新版本消息订阅 ,与之前有些区别,之前的写法就不列举了。有兴趣的可以从网上浏览。
一、 封装消息的类
/**
* 设置具体需要发的消息的 类
*/
@Data
public class TemplateData {
private String value;
}
二、封装入参的类
/**
* 封装入参的类 注意:根据官方文档提示,这些属性 必须为此写法,否则会报错
*/
@Data
public static class WxMssVo {
/**
* 接口调用凭证
*/
private String access_token;
/**
* 接收者(用户)的 openid
*/
private String touser;
/**
* 所需下发的模板消息的id
*/
private String template_id;
/**
* 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
*/
private String page;
/**
* 模板内容,不填则下发空模板
*/
private Map<String, TemplateData> data;
}
三、获取access_token
/**
* 此方法用于获取 access_token
* access_token 用于拼接 发送消息url
*
* @return access_token
*/
private String getAccessToken() {
//首先从缓存中取
Object o = redisTemplate.opsForValue().get(“自定义缓存key”);
if (o != null)
return o.toString();
//缓存没有调用接口查询最新
//获取access_token
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
"&appid=" + "小程序Id" + "&secret=" + "小程序秘钥";
RestTemplate restTemplate = new RestTemplate();
String json = restTemplate.getForObject(url, String.class);
JSONObject myJson = JSONObject.parseObject(json);
String access_token = myJson.get("access_token").toString();
// 微信服务器有效时间
String expires_in = myJson.get("expires_in").toString();
redisTemplate.opsForValue().set(自定义缓存key”, access_token, Long.parseLong(expires_in), TimeUnit.SECONDS);
return access_token;
}
四、发送消息
/**
* 发送具体的消息 调用此方法 需要传入 在公众平台选用好的消息模版
*
* 并且 需要前端调用微信 授权接口后 才能有权限发送订阅消息
* @param templateId
* @return
*/
public String sendMessage(String templateId) {
String accessToken = getAccessToken();
String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken;
WxMssVo wxMssVo = new WxMssVo();
wxMssVo.setTouser("openid");
wxMssVo.setTemplate_id(templateId);
Map<String, TemplateData> dataVoMap = new HashMap<>();
TemplateData key1 = new TemplateData();
TemplateData key2 = new TemplateData();
TemplateData key3 = new TemplateData();
key1.setValue("张一一");
key2.setValue("乒乓球");
key3.setValue("报名成功");
//这里的key 为选用的模版的对应的key 可在选用的模版的详情中查看 切必须为这些,否则会报 参数错误提示
dataVoMap.put("name11", key1);
dataVoMap.put("thing5", key2);
dataVoMap.put("thing7", key3);
wxMssVo.setData(dataVoMap);
HttpHeaders headers = new HttpHeaders();
//设置编码 不设置转码 可能会出现 乱码问题
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
// 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
if (restTemplate == null) {
restTemplate = new RestTemplate();
}
String string = JSONObject.toJSONString(wxMssVo);
HttpEntity<String> requestEntity = new HttpEntity<String>(string, headers);
ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(url, requestEntity, String.class);
return stringResponseEntity.getBody();
}
这里的 name11 thing5 thing7 对应文中 map key
效果图
注意:代码中注释 很重要 请认真阅读 有什么不理解的欢迎提问。