小步伐一次性订阅消息(消息通知):java服务端实现

打印 上一主题 下一主题

主题 212|帖子 212|积分 636

引言

最近在开发小步伐服务端代码,必要实现一个可以大概实现消息通知的接口业务,记录一下整个接口业务的开发过程。
一、消息订阅

先附上微信官方文档:订阅消息
1.1 小步伐订阅消息功能先容

消息本领是小步伐本领中的重要构成,我们为开发者提供了订阅消息本领,以便实现服务的闭环和更优的体验。
订阅消息推送位置:服务通知
订阅消息下发条件:开发者通过肯定的方式触发用户主动订阅
订阅消息卡片跳转本领:点击检察详情可跳转至该小步伐的页面
1.2 消息分类

1.2.1 新版一次性订阅消息Beta

新版一次性订阅消息是一种无需用户在弹窗中主动订阅即可向用户下发消息的本领,用户的订阅方式为:
当用户在小步伐中进行微信支付后,开发者可将微信支付订单号作为 code 向用户下发服务通知
开发者可在小步伐中将触发服务的 button 组件的 open-type 的值设置为 liveActivity,当用户点击 button 后可获得 code ,后续可利用此 code 向用户下发服务通知
此下发方式由平台定义模版,开发者根据自身业务选择模版进行接入。
详见订阅消息接入 Beta开发指南文档。
1.2.2 一次性订阅消息(用户通过弹窗订阅)

一次性订阅消息用于解决用户利用小步伐后,后续服务环节的通知问题。
开发者在小步伐中调用 requestSubscribeMessage 接口后,将向用户展示弹窗,用户可打开自己想要担当的消息开关。用户订阅后,开发者可不限时间地下发一条对应的服务消息;每条消息可单独订阅或退订。
详见小步伐订阅消息开发指南文档。
1.2.3 恒久订阅消息(用户通过弹窗订阅)

一次性订阅消息可满足小步伐的大部分服务场景需求,但线下公共服务范畴存在一次性订阅无法满足的场景,如航班延误,需根据航班实时动态来多次发送消息提示。为便于服务,我们提供了恒久性订阅消息,用户订阅一次后,开发者可恒久下发多条消息。
目前恒久性订阅消息仅向政务民生、医疗、交通、金融、教诲等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。
详见小步伐订阅消息开发指南文档。
同时恒久订阅消息支持语音提示与添加提示本领。
1.2.4 设备订阅消息

设备订阅消息是一种特殊范例的订阅消息,它属于恒久订阅消息范例,且必要完成设备接入才能利用。
设备订阅消息用于在设备触发某些必要人工介入的变乱时(比方设备发生故障、设备耗材不敷等),向用户发送消息通知。
详见设备订阅消息文档。
二、获取模板ID

先附上微信官方文档:小步伐订阅消息(用户通过弹窗订阅)开发指南
1.登录微信公众平台开通订阅消息

在微信公众平台中的小步伐背景找到订阅消息功能模块

开通订阅消息:

由于恒久性订阅消息,目前仅向政务民生、医疗、交通、金融、教诲等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。仅就线下公共服务这一点,恒久性订阅消息就和大部分开发者无缘了。以是我们这里只能以利用一次性订阅消息为例。
2.在微信公众平台手动设置获取模板 ID:

登录 https://mp.weixin.qq.com 获取模板,如果没有符合的模板,可以申请添加新模板,审核通过后可利用。
选择先要的公共模板,也可以自己定制,但是公共模板已经可以满足我们绝大多数业务场景了

选择或者自己定制一个符合的模板,然后可以进行订阅模板的编辑,当然这都属于前端的工作了,
我们只必要在模板中拿到模板ID即可。

三、获取接口调用根据wx_access_token

先附上微信官方文档:获取接口调用根据
1、接口分析

接口英文名:getAccessToken

功能描述:

  1. 获取小程序全局唯一后台接口调用凭据,token有效期为7200s,开发者需要进行妥善保存。
  2. 如使用云开发,可通过云调用免维护 access_token 调用。
  3. 如使用云托管,也可以通过微信令牌/开放接口服务免维护 access_token 调用。
复制代码
2、调用方式

HTTPS 调用

  1. GET https://api.weixin.qq.com/cgi-bin/token
复制代码
请求参数


3、Java代码实现

  1. /**
  2.      * 获取接口调用凭证 access_token
  3.      */
  4.     private static final String ACCESSTOKEN_GET = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&";
  5. public WxAccessTokenVo getAccessToken() {
  6.         WxAccessTokenVo accessTokenVo  = null;
  7. /*     这个是redis缓存的:没有的话去掉*/
  8.         String wx_access_token = (String) redisTemplate.opsForValue().get("wx_access_token");
  9.         if (wx_access_token != null) {
  10.             accessTokenVo = new WxAccessTokenVo();
  11.             accessTokenVo.setAccess_token(wx_access_token);
  12.             return accessTokenVo;
  13.         }
  14.         String url = ACCESSTOKEN_GET + "appid=" + appId + "&secret=" + appSecret;
  15.         RestTemplate restTemplate = new RestTemplate();
  16.         String response = restTemplate.getForObject(url, String.class);
  17.         try {
  18.             accessTokenVo = JSON.parseObject(response, WxAccessTokenVo.class);
  19.             /* 存储在redis中*/
  20.             if (accessTokenVo.getExpire_in() > 0) {
  21.                 redisTemplate.opsForValue().set("wx_access_token", accessTokenVo.getAccess_token(),
  22.                         accessTokenVo.getExpire_in(), TimeUnit.SECONDS);
  23.             }
  24.             
  25.         } catch (Exception e) {
  26.             logger.error("Json转换异常", e);
  27.         }
  28.         return accessTokenVo;
  29.     }
复制代码
以是在获取到access_token的时候,把access_token存到数据库,或者存到当地缓存,而且还要记录当前时间,后面再用的时候先判断这个access_token有没有超过2个小时,如果超过2个小时的话,就要重新获取了。
附微信官方分析:获取 Access token

四、发送消息

先附上微信官方文档:发送订阅消息
1、接口分析

接口英文名:sendMessage

功能描述:

该接口用于发送订阅消息。
调用方式

HTTPS 调用

  1. POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
复制代码
请求参数


这些参数都是我们必要封装好发送给微信官方,调用时候必要的。
返回参数


2、注意点(必要前端共同)

这里有个必要特别注意的点,我们要给用户发送消息,就必须前端实现引导用户授权,因为用户不点击答应,你是没有办法给用户推送消息的。每一次授权只答应发送一条消息,以是如果你想只管多的发送消息,就得只管多的引导用户授权。
3、发送消息的Java代码实现

1)封装前端引导用户授权所需的参数:

  1. @Data
  2. public class AddMessageSubscribeForm {    // 前端模板需要的参数
  3.     //  小程序的登录凭证code
  4.     private String code;
  5.     //订阅消息模版id   TODO
  6.     private String template_id;
  7.     //默认跳到小程序首页 TODO
  8.     private String page = "pages/index/index";
  9.     //推送文字
  10.     private Map<String, TemplateData> data;
  11.     //   跳转小程序的类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
  12.     private String miniprogram_state;
  13.     //  进入小程序查看的语言类型:支持zh_CN、en_US、zh_HK、zh_TW,默认为zh_CN
  14.     private String lang;
  15. }
复制代码
2)封装背景调用微信官方API所需的参数:

  1. @Data
  2. public class WXMssVO {
  3.     //用户openid
  4.     private String touser;
  5.     //订阅消息模版id
  6.     private String template_id;
  7.     //默认跳到小程序首页 TODO
  8.     private String page = "pages/index/index";
  9.     //推送内容
  10.     private Map<String, TemplateData> data;
  11.     //   跳转小程序的类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
  12.     private String miniprogram_state;
  13.     //  进入小程序查看的语言类型:支持zh_CN、en_US、zh_HK、zh_TW,默认为zh_CN
  14.     private String lang;
  15. }
复制代码
3)编写发送消息的内容:

  1. @AllArgsConstructor
  2. @Data
  3. public class TemplateData {
  4.     /**
  5.      *   消息通知的内容
  6.      */
  7.     private String value;
  8. }
复制代码
4)获取用户的openid

  1.     /**
  2.      * 获取微信用户唯一标识OpenID
  3.      */
  4.     private static final String CODE2SESSION_GET = "https://api.weixin.qq.com/sns/jscode2session?";
  5. /**
  6.      * code2sessino接口
  7.      * @param code
  8.      * @return
  9.      */
  10.     public WxCode2SessionVo getCode2Session(String code) {
  11.         String url = CODE2SESSION_GET + "appid=" + appId + "&secret=" + appSecret + "&js_code=" + code + "&grant_type=authorization_code";
  12.         RestTemplate restTemplate = new RestTemplate();
  13.         String response = restTemplate.getForObject(url, String.class);
  14.         WxCode2SessionVo code2SessionVo = null;
  15.         try {
  16.             code2SessionVo = JSON.parseObject(response, WxCode2SessionVo.class);
  17.         } catch (Exception e) {
  18.             logger.error("Json转换异常", e);
  19.         }
  20.         return code2SessionVo;
  21.     }
复制代码
5)编写发送消息的函数:

  1.     /**
  2.      *    给用户发送通知
  3.      *    TODO  参数设置
  4.      * @param info
  5.      * @return
  6.      */
  7. /**
  8.      *   给用户发送消息
  9.      */
  10.     public static final String SEND_INFO_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";
  11.   
  12.     public String pushMessage(AddMessageSubscribeForm info){
  13.         RestTemplate restTemplate = new RestTemplate();
  14.         String url = SEND_INFO_URL + getAccessToken().getAccess_token();
  15.         // 通过 appId+appsecret+code三个参数获取微信用户信息 获取用户的openid
  16.         WxCode2SessionVo code2Session = this.getCode2Session(info.getCode());
  17.         if (code2Session == null || (code2Session.getErrcode() != null && code2Session.getErrcode() != 0)) {
  18.             return  "获取用户微信信息失败:" + code2Session.toString();
  19.         }
  20.         String openid = code2Session.getOpenid();
  21.         //  拼接推送的模板
  22.         WXMssVO wxMssVO = new WXMssVO();
  23.         wxMssVO.setTouser(openid);    // 用户的openId
  24.         wxMssVO.setTemplate_id(info.getTemplate_id());    //订阅消息模板id
  25.         wxMssVO.setLang(info.getLang());     //语言类型
  26.         wxMssVO.setMiniprogram_state(info.getMiniprogram_state());   //跳转小程序类型
  27.         //TODO:指定跳转的页面
  28.         wxMssVO.setPage(info.getPage());
  29.         // TODO: 推送的内容
  30.         Map<String, TemplateData> map = new HashMap<>();
  31.         map.put("msg", new TemplateData("发消息了"));
  32.         wxMssVO.setData(map);
  33.         // 发送
  34.         ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxMssVO, String.class);
  35.         return responseEntity.getBody();
  36.     }
复制代码
到这里我们就可以完整的实现Java发送小步伐消息的功能了。
总结

以上就是本日要分享给各人的内容,本文简朴的记录了一下小步伐发送通知的开发,很多内容实在都来自官方文档,欢迎各人品评指正、共同进步!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

高级会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表