当前位置:   article > 正文

java实现微信小程序订阅通知_微信 服务通知 java 如何发送 2023年9月之后

微信 服务通知 java 如何发送 2023年9月之后

最近遇到一个需求,需要推送微信小程序订阅消息,下面分享一下实现步骤以及过程中踩到的坑。 

首先是发送订阅消息的api和所需要的一些参数

POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN 
  1. access_token: 接口调用凭证,具体获取方式可参照获取接口调用凭据 | 微信开放文档
  2. template_id:订阅模版id,需要在发开者页面进行配置
  3. touser:接收者的open_id,获取方式可参考上一篇分享Java实现微信小程序登录_java微信小程序登录_DearMrWhite的博客-CSDN博客
  4. data:模版内容(此处会有一些坑,下面会具体讲解)
  5. miniprogram_state:调整小程序类型,developer为开发版;trial为体验版;formal为正式版;默认为正式版

接下来是具体实现:

  1. /**
  2. * 发送订阅请求
  3. */
  4. public boolean sendSubscriptionMessage(String accessToken, String openId, String programState) {
  5. return sendSubscribeMessage(accessToken, openId, programState, formatData());
  6. }
  7. /**
  8. * 拼接请求参数data
  9. */
  10. private JSONObject formatData() {
  11. JSONObject data = new JSONObject();
  12. data.put("thing4", createJsonObj("测试thing4"));
  13. data.put("thing2", createJsonObj("测试thing2"));
  14. data.put("date5", createJsonObj("2023年09月18日 14:00"));
  15. data.put("thing6", createJsonObj("测试thing6"));
  16. data.put("name1", createJsonObj("测试姓名"));
  17. return data;
  18. }
  19. private JSONObject createJsonObj(String value) {
  20. JSONObject obj = new JSONObject();
  21. obj.put("value", value);
  22. return obj;
  23. }
  24. /**
  25. * 发送订阅请求
  26. */
  27. private boolean sendSubscribeMessage(String accessToken, String toUser, String programState, JSONObject data) {
  28. String subscribeUrl = buildWeChatSubscribeUrl(accessToken);
  29. HttpEntity<String> entity = setSubscribeRequestEntity(toUser, programState, data);
  30. ResponseEntity<String> response;
  31. try {
  32. response = restTemplate.postForEntity(subscribeUrl, entity, String.class);
  33. } catch (RestClientException e) {
  34. log.error("微信订阅消息推送失败:", e);
  35. return false;
  36. }
  37. Integer responseCode = JSONObject.parseObject(response.getBody()).getInteger("errcode");
  38. if (responseCode != 0) {
  39. log.error("微信订阅消息推送失败, 错误代码:{}, 消息体:{}", responseCode, entity);
  40. return false;
  41. }
  42. return true;
  43. }
  44. /**
  45. * 构建消息推送的url
  46. */
  47. private String buildWeChatSubscribeUrl(String accessToken) {
  48. return UriComponentsBuilder.fromHttpUrl(wxConfig.getSubscribeApiUrl())
  49. .queryParam("access_token", accessToken)
  50. .toUriString();
  51. }
  52. /**
  53. * 设置消息订阅请求参数
  54. */
  55. private HttpEntity<String> setSubscribeRequestEntity(String toUser, String programState, JSONObject data) {
  56. JSONObject body = new JSONObject();
  57. body.put("touser", toUser);
  58. body.put("template_id", wxConfig.getSubscribeTemplateId());
  59. body.put("data", data);
  60. body.put("miniprogram_state", programState);
  61. HttpHeaders header = new HttpHeaders();
  62. header.add("Content-Type", "application/json;charset=UTF-8");
  63. return new HttpEntity<>(body.toString(), header);
  64. }

第一个需要特别注意的是在封装请求参数data的时候,一定要注意模版字段类型和对应的数据格式要求。比如,name字段的要求是10个以内纯汉字或20个以内纯字母或符号。因为我当时需要推送的内容是小程序端页面表格填写的,但是名称字段没有做格式限制,导致这个字段在测试的时候输入了数字内容,发送通知的时候就会报错。所以一定要仔细阅读微信开发者文档,并结合自身项目的实际需求来开发。

第二个是切勿“滥用”access_token,这里的“滥用”是指获取access_token的入口不唯一。小程序的access_token有效期为7200秒,所以可以考虑将其放入缓存并定期刷新,而不是哪里需要哪里重新获取,这样很有可能导致第一次获取的access_token,因为不知道哪个地方又获取了一次,导致access_token失效。

好了,今天的分享就到这里啦,祝大家编码愉快~

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号