当前位置:   article > 正文

微信小程序服务通知

小程序服务通知

 官方接口链接

发送订阅消息 | 微信开放文档

一、流程

 1、准备号小程序

2、小程序在订阅消息端创建消息模板拿到TemplateID

3、 前端需要配置消息ID,订阅服务通知

4、后端调接口发送通知到用户openId

二、使用

1、小程序创建消息模板

在微信小程序添加订阅消息模板

小程序后台链接:小程序

1、注意消息模板的ID,前端和后端都需要

2、点击详情下面有对应的字段内容,后端需要返回对应字段JSON格式数据

2、 小程序后台配置

        封装成工具类使用

        直接调用sendTemplateMsg()方法即可。

需要参数

        a、用户的openId、

        b、消息模板ID

        c、消息主体的JSON字段数据

注意:注意JSON格式,参照官网

如果JSON格式不对:(时间格式不能包含字母或无关符号)

result:{"errcode":47003,"errmsg":"argument invalid! data.character_string22.value rid: 66012b9d-00baed03-2e813aea"

1、构建工具类

  1. /**
  2. * 微信消息通知
  3. */
  4. public class WxMessageConfig {
  5. private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
  6. /**
  7. * 发送模板消息 注意格式
  8. */
  9. public static boolean sendTemplateMsg(String openId, String templateId,WxMessageDto wxMessageDto) {
  10. String access_token = getAccessToken();
  11. Map<String, Object> paramMap = wxMessageMap(wxMessageDto);
  12. paramMap.put("touser", openId);
  13. // 模版
  14. paramMap.put("template_id", templateId);
  15. // 跳转小程序(不加微信界面没有跳转那一行)
  16. paramMap.put("page", "index");
  17. String url = WxConstants.POST_MESSAGE_URL;
  18. String jsonStr = null;
  19. try {
  20. // 转JSON
  21. ObjectMapper objectMapper = new ObjectMapper();
  22. jsonStr = objectMapper.writeValueAsString(paramMap);
  23. } catch (JsonProcessingException e) {
  24. log.error("消息通知转JSON格式异常");
  25. e.printStackTrace();
  26. }
  27. try {
  28. jsonStr = HttpUtil.post(url, access_token, jsonStr);
  29. } catch (Exception e) {
  30. log.error("小程序服务通知异常-转化异常", e);
  31. }
  32. JSONObject jsonObj = JSONObject.parseObject(jsonStr);
  33. String errcode = jsonObj.get("errcode").toString();
  34. Object errmsg = jsonObj.get("errmsg");
  35. if (!errcode.equals("0")) {
  36. log.error("微信通知消息发送失败:code=" + errcode + "msg=" + errmsg);
  37. return false;
  38. }
  39. return true;
  40. }
  41. /**
  42. * 获取access_Token(发送消息需要)
  43. * @return
  44. */
  45. private static String getAccessToken() {
  46. /**
  47. * 非spring环境获取bean(注入redis工具类) 工具类 redis获取缓存的的token
  48. */
  49. RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
  50. /**
  51. * public static final String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
  52. */
  53. String access_token = redisCache.getCacheObject("wx_access_token");
  54. if (access_token == null) {
  55. String url = WxConstants.GET_ACCESS_TOKEN_URL.replace("APPID", WxConstants.APPID)
  56. .replace("APPSECRET", WxConstants.SECRET);
  57. String jsonStr = HttpUtil.httpGet(url);
  58. JSONObject jsonObj = JSONObject.parseObject(jsonStr);
  59. access_token = jsonObj.getString("access_token");
  60. int expires_in = Integer.parseInt(jsonObj.getString("expires_in"));
  61. redisCache.setCacheObject("wx_access_token", access_token, expires_in, TimeUnit.SECONDS);
  62. }
  63. return access_token;
  64. }
  65. /**
  66. * 构建消息主体JSON数据
  67. * @param wxMessageDto
  68. * @return
  69. */
  70. public static Map<String, Object> wxMessageMap(WxMessageDto wxMessageDto){
  71. // 时间格式
  72. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  73. // 格式化时间
  74. String formattedDateTime = wxMessageDto.getTime().format(formatter);
  75. HashMap<String, Object> paramMap = new HashMap<>();
  76. // 创建消息内容的 Map 对象
  77. Map<String, Object> messageContent = new HashMap<>();
  78. messageContent.put("thing13", new HashMap<String, Object>() {{
  79. put("value", wxMessageDto.getProductName());
  80. }});
  81. messageContent.put("amount4", new HashMap<String, Object>() {{
  82. put("value", wxMessageDto.getPrice());
  83. }});
  84. messageContent.put("character_string22", new HashMap<String, Object>() {{
  85. put("value", wxMessageDto.getOrderNo());
  86. }});
  87. messageContent.put("thing24", new HashMap<String, Object>() {{
  88. put("value", wxMessageDto.getAddress());
  89. }});
  90. messageContent.put("time23", new HashMap<String, Object>() {{
  91. put("value", formattedDateTime);
  92. }});
  93. paramMap.put("data", messageContent);
  94. return paramMap;
  95. }
  96. }

2、微信相关链接、消息模板ID常量

  1. /**
  2. * 微信相关参数
  3. */
  4. public class WxConstants {
  5. public static final String APPID = "wxexxxxxxxxxxx";
  6. public static final String SECRET = "b9bc54xxxxxxxxxxxxxxxxxxxxxx";
  7. // public static final String GET_ACK_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code"; // 网页
  8. public static final String GET_ACK_URL2 = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_cod"; // 小程序
  9. public static final String GET_USER_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID"; // 网页
  10. // public static final String POST_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN";
  11. // 小程序消息通知
  12. public static final String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
  13. public static final String POST_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send";
  14. public static final String WX_TEMPLATE_ID_ORDER1 = "8u_2j-thz_6TDIiEZUXOWqwNNbwDoVbdXIwlWB5K91k";
  15. }

3、消息主体的dto

  1. /**
  2. * 消息模类主体数据
  3. */
  4. @Data
  5. @AllArgsConstructor
  6. @NoArgsConstructor
  7. public class WxMessageDto implements Serializable {
  8. private String productName;
  9. private String price;
  10. private String orderNo;
  11. private String address;
  12. private LocalDateTime time;
  13. }

4.3 前端配置

        用微信开发工具做前端测试:

        前端uni-app只需要发送对应请求订阅消息即可(官方规定不能页面加载触发订阅请求,只能点击某个事件触发订阅)

  1. <template>
  2. <view class="content">
  3. <image class="logo" src="/static/logo.png"></image>
  4. <view class="text-area">
  5. <text class="title">{{title}}</text>
  6. </view>
  7. <view >
  8. <text class="title">{{title}}</text>
  9. </view>
  10. <view class="content">
  11. <button @click="requestSubscription">点击订阅消息</button>
  12. </view>
  13. </view>
  14. </template>
  15. <script>
  16. export default {
  17. data() {
  18. return {
  19. title: 'Hello2',
  20. }
  21. },
  22. onLoad() {
  23. const that = this; // 保存组件实例的引用
  24. wx.login({
  25. success (res) {
  26. console.log('登录ok!' + res.code);
  27. that.title = res.code;
  28. }
  29. });
  30. },
  31. methods: {
  32. requestSubscription() {
  33. console.log('点击了订阅1')
  34. wx.requestSubscribeMessage({
  35. tmplIds: ['8u_2j-thz_6TDIiEZUXOWqwNNbwDoVbdXIwlWB5K91k'], // 数组,最多3个订阅
  36. success (res) {
  37. console.log('订阅消息结果', res);
  38. // 处理订阅消息的结果
  39. },
  40. error(){
  41. console.error(222)
  42. }
  43. });
  44. }
  45. }
  46. }
  47. </script>
  48. <style>
  49. .content {
  50. display: flex;
  51. flex-direction: column;
  52. align-items: center;
  53. justify-content: center;
  54. }
  55. .logo {
  56. height: 200rpx;
  57. width: 200rpx;
  58. margin-top: 200rpx;
  59. margin-left: auto;
  60. margin-right: auto;
  61. margin-bottom: 50rpx;
  62. }
  63. .text-area {
  64. display: flex;
  65. justify-content: center;
  66. }
  67. .title {
  68. font-size: 36rpx;
  69. color: #8f8f94;
  70. user-select: text;
  71. }
  72. </style>

        点击订阅即可,每次最多订阅3个(手机端是下面弹出订阅,同时可以选择订阅!此处用模拟器测试前端订阅)

4.4 后端发送消息推送测试

1、springboot测试

  1. @SpringBootTest
  2. @RunWith(SpringRunner.class)
  3. public class AppTest {
  4. @Test
  5. public void shouldAnswerWithTrue() throws Exception {
  6. String openId = "otvf_5HrOcky90_sqST2kvKTvr1k"; // 用户的openId
  7. String templateId = WxConstants.WX_TEMPLATE_ID_ORDER1; // 模板消息Id
  8. WxMessageDto wxMessageDto = new WxMessageDto(); // 消息主体
  9. wxMessageDto.setProductName("黄铜");
  10. wxMessageDto.setPrice("36.8元");
  11. wxMessageDto.setOrderNo("2024032516282222hs9999");
  12. wxMessageDto.setAddress("四川省成都市双流区龙桥地铁站");
  13. wxMessageDto.setTime(LocalDateTime.now());
  14. boolean boo = WxMessageConfig.sendTemplateMsg(openId, templateId, wxMessageDto);
  15. System.out.println("=====================================");
  16. System.out.println(boo);
  17. }

2、控制台输出:

注意:报错就参考官方错误码。注意用户是否订阅,不然报错:

用户为订阅报错:

或者代码配置参数问题:

        result:{"errcode":47003,"errmsg":"argument invalid! data.character_string22.value rid: 66012b9d-00baed03-2e813aea"

发送成功字样 errcode:0 errmsg:ok

3、微信的服务通知提醒

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/963426
推荐阅读
相关标签
  

闽ICP备14008679号