一、准备工作;
需要微信小程序的appid、secretid,在小程序的开发平台上配置相应模板。传入对应的小程序用户openid。
参考微信官方开发文档:subscribeMessage.send | 微信开放文档 (qq.com)
注意:小程序的消息模板已经被废弃了,现在是长期订阅/一次订阅消息,如果需要小程序往公众号发消息模板请参考官方文档:uniformMessage.send | 微信开放文档 (qq.com)
ps: 订阅消息需要在小程序中触发用户授权。
二、流程;
与公众号推送流程是一样的。
三、实现;
1、获取access_token;
/**
* 获取微信小程序的accessToken
*
* @return
*/
public String getWxAccessToken() {
/*1、设置请求参数,wxAppID 是微信的appid值,wxAppSecret是微信小程序的secret的值*/
RestTemplate restTemplate = new RestTemplate();
String params = "appid=" + wxAppID + "&secret=" + wxAppSecret;
/*2、获取access_token和expires_in*/
ResponseEntity<String> responseEntity = restTemplate.getForEntity(
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&" + params, String.class);
String body = responseEntity.getBody();
JSONObject object = JSON.parseObject(body);
String wxAccessToken = object.getString("access_token");
String wxExpiresIn = object.getString("expires_in");// 过期时长(两小时)
// 优化,使用redis在快过期的时候进行重新调用
return wxAccessToken;
}
2、配置参数并推送。
/**
* 微信小程序消息参数
*/
@Data
public class WxAppTemplate {
//进行推送所需参数
private String touser;//接收者(用户)的 openid
private String template_id;//所需下发的订阅模板id
private String page;//点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
private String miniprogram_state;//跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
private String lang;//进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
private Map<String, TemplateData> data;//要推送的模板内容,,形式如 { "key1": { "value": any }, "key2": { "value": any } }
}
public class TemplateData {
private String value;//消息内容
private String color;//消息颜色
//构造方法(空参)
public TemplateData() {
}
//构造方法(有参)
public TemplateData(String value,String color) {
this.value = value;
this.color = color;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
/**
* 微信小程序消息推送
*
* @param
* @return
*/
@Override
public String redEnvelopeMessagePush(MessagePushDto messagePushDto) {
/*1、调用推送消息微信api*/
RestTemplate restTemplate = new RestTemplate();
String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getWxAccessToken();
/*2、设置推送参数*/
WxAppTemplate wxTe = new WxAppTemplate();
wxTe.setTouser(messagePushDto.getOpenId());//用户的openid(接收人,这里应该传进来的)
wxTe.setTemplate_id("xxxxx");//订阅消息模板id, 配置模板的id
wxTe.setPage("xxxxx");//点击模板卡片后的跳转页面
wxTe.setMiniprogram_state("developer"); //跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
wxTe.setLang("zh_CN"); //进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
Map<String, TemplateData> map = new HashMap<>();
map.put("name1", new TemplateData("xxxxx", "#173177"));
map.put("thing2", new TemplateData("xxxxx", "#173177"));
wxTe.setData(map);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxTe, String.class);
String body = responseEntity.getBody();
JSONObject jsonObject = JSONObject.parseObject(body);
return jsonObject.getString("errcode").toString();
}
/**
* @description 消息推送
*/
@Data
public class MessagePushDto {
private String openId;
}
完成。