实现步骤:
说明:
实现效果:
具体实现:
1.申请消息模板
首先登入微信公众平台,选择自己的小程序,进入到小程序页面。
如图操作:
2.订阅对应模板消息
找到申请的模板,复制模板ID,小程序调用wx.requestSubscribeMessage接口订阅模板消息。
如图操作:
3.获取用户登入code
小程序调用wx.login接口获取用户code。
如图操作:
使用获取到的code调用后端用户授权接口获取用户openid。
官方接口文档:
auth.code2Session | 微信开放文档 (qq.com)
如图操作:
public UserAuthRes userAuth(String code) {
Map<String, Object> requestParams = new HashMap<>();
requestParams.put("appid", "wx4a6ad6d7e5e6xxxx"); //小程序appid
requestParams.put("secret", "eb05b4885d3fbe18d46b1822fca7xxxx"); //小程序secret
requestParams.put("js_code", code); //用户登入code
requestParams.put("grant_type", "authorization_code"); //授权类型这里填写authorization_code
UserAuthRes userAuthRes = restTemplate.getForObject("https://api.weixin.qq.com/sns/jscode2session?" +
"appid={appid}&secret={secret}&js_code={js_code}&grant_type={grant_type}", UserAuthRes.class, requestParams);
if (null != userAuthRes) {
log.info("授权用户信息:{}", userAuthRes);
//Todo 可以记录用户信息到MysqL/redis(openid、session_key、unionid)备注:session_key 有效期为三天
return userAuthRes;
} else {
throw new RuntimeException("用户授权失败");
}
}
返回值结构:
public class UserAuthRes {
private String openid; //用户唯一标识openid
private String session_key; //用户会话密钥session_key
private String unionid; //用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回
private String errcode; //错误码
private String errmsg; //错误信息
}
5.获取access_token
后端调用接口传入appid、secret、grant_type获取access_token。
官方接口文档:
获取接口调用凭据 | 微信开放文档 (qq.com)
如图操作:
public String getUserAccesstoken() {
Map<String, Object> requestParams = new HashMap<>();
requestParams.put("appid", "wx4a6ad6d7e5e6xxxx"); //小程序appid
requestParams.put("secret", "eb05b4885d3fbe18d46b1822fca7xxxx"); //小程序secret
requestParams.put("grant_type", "client_credential"); //授权类型这里填写client_credential
JSONObject result = restTemplate.getForObject("https://api.weixin.qq.com/cgi-bin/token?grant_type={grant_type}&appid={appid}&secret={secret}", JSONObject.class, requestParams);
if (null == result) {
throw new RuntimeException("获取access token失败");
}
String accesstoken = result.get("access_token").toString();
if (StringUtils.isNoneBlank(accesstoken)) {
log.info("获取access token成功:{}", accesstoken);
return accesstoken;
} else {
throw new RuntimeException("获取access token失败");
}
}
6.进行消息推送
打开要要推送的模板详情,查看模板占位符、后端调用接口传入touser、template_id、data,进行消息推送。注意请求参数data里的属性名一定要与模板占位符保持一致!
官方文档:
subscribeMessage.send | 微信开放文档 (qq.com)
如图操作:
后端接口:
private void sendMessage() {
MessageTemplateEntity messageTemplateEntity = new MessageTemplateEntity();
String time = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date());
messageTemplateEntity.setMessageData(new MessageValueEntity("项目名称"), new MessageValueEntity(time), new MessageValueEntity("这是描述"));
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("touser", "wx4a6ad6d7e5e6xxxx"); //用户openid
paramsMap.put("template_id", "h7eKu5vOSbbOBoxg9psqYZ-NiRyiiPi9wMuWqExxxx"); //推送消息模板id
paramsMap.put("data", messageTemplateEntity); //消息体:{{"thing1":"项目名称"},{"time2":"2022-08-23"},{"thing3":"这是描述"}}
HttpHeaders headers = new HttpHeaders(); //构建请求头
headers.setContentType(MediaType.APPLICATION_JSON); //设置内容类型为json
httpentity<Map<String, Object>> request = new httpentity<>(paramsMap, headers); //构建http请求实体
//发送请求路径拼接获取到的access_token
SendMessageVo sendMessageVo = restTemplate.postForObject("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" +
"60_mrPc2IpScFl8b8a9fhsPVw4nbMxxxx...", request, SendMessageVo.class);
if (null == sendMessageVo) {
throw new RuntimeException("推送消息失败");
}
if (sendMessageVo.getErrcode() != 0) {
log.error("推送消息失败,原因:{}", sendMessageVo.getErrmsg());
throw new RuntimeException("推送消息失败");
}
log.info("推送消息成功");
}
MessageTemplateEntity实体类结构:
@Data
public class MessageTemplateEntity {
private MessageValueEntity thing1;
private MessageValueEntity time2;
private MessageValueEntity thing3;
public void setMessageData(MessageValueEntity thing1, MessageValueEntity time2, MessageValueEntity thing3) {
this.thing1 = thing1;
this.time2 = time2;
this.thing3 = thing3;
}
}
MessageValueEntity实体类结构:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MessageValueEntity {
private String value;
}
注意事项:
(1)本篇消息推送教学为一次性订阅消息,也就是订阅一次可以推送一次消息,不订阅推送消息会失败,长期订阅消息如有需要,请去小程序官方申请长期消息模板。
(2)推送消息data属性值格式一定要严格按照官方给的格式,不然会报错,47003错误码说明有某个字段为null或者格式不正确。如果不清楚可以去官方文档查看对应格式。
官方文档:
subscribeMessage.send | 微信开放文档
关于我们:
创作不易,如有问题、疑难杂症,欢迎评论区交流病情(包治百病)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。