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

文章目录

  • 引言
  • 一、消息订阅
    • 1.1 小程序订阅消息功能介绍
    • 1.2 消息分类
      • 1.2.1 新版一次性订阅消息Beta
      • 1.2.2 一次性订阅消息(用户通过弹窗订阅)
      • 1.2.3 长期订阅消息(用户通过弹窗订阅)
      • 1.2.4 设备订阅消息
  • 二、获取模板ID
    • 1.登录[微信公众平台](https://mp.weixin.qq.com)开通订阅消息
    • 2.在微信公众平台手动配置获取模板 ID:
  • 三、获取接口调用凭据wx_access_token
    • 1、接口说明
      • 接口英文名:getAccessToken
      • 功能描述:
    • 2、调用方式
      • HTTPS 调用
      • 请求参数
    • 3、Java代码实现
  • 四、发送消息
    • 1、接口说明
      • 接口英文名:sendMessage
      • 功能描述:
      • 调用方式
        • HTTPS 调用
      • 请求参数
      • 返回参数
    • 2、注意点(需要前端配合)
    • 3、发送消息的Java代码实现
      • 1)封装前端引导用户授权所需的参数:
      • 2)封装后台调用微信官方API所需的参数:
      • 3)编写发送消息的内容:
      • 4)获取用户的openid
      • 5)编写发送消息的函数:
  • 总结

引言

最近在开发小程序服务端代码,需要实现一个能够实现消息通知的接口业务,记录一下整个接口业务的开发过程。

一、消息订阅

先附上微信官方文档:订阅消息

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 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用。
选择先要的公共模板,也可以自己定制,但是公共模板已经可以满足我们绝大多数业务场景了
Alt
选择或者自己定制一个合适的模板,然后可以进行订阅模板的编辑,当然这都属于前端的工作了,
我们只需要在模板中拿到模板ID即可。
在这里插入图片描述

三、获取接口调用凭据wx_access_token

先附上微信官方文档:获取接口调用凭据

1、接口说明

接口英文名:getAccessToken

功能描述:

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

2、调用方式

HTTPS 调用

GET https://api.weixin.qq.com/cgi-bin/token 

请求参数

在这里插入图片描述

3、Java代码实现

/*** 获取接口调用凭证 access_token*/private static final String ACCESSTOKEN_GET = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&";public WxAccessTokenVo getAccessToken() {WxAccessTokenVo accessTokenVo  = null;/*     这个是redis缓存的:没有的话去掉*/String wx_access_token = (String) redisTemplate.opsForValue().get("wx_access_token");if (wx_access_token != null) {accessTokenVo = new WxAccessTokenVo();accessTokenVo.setAccess_token(wx_access_token);return accessTokenVo;}String url = ACCESSTOKEN_GET + "appid=" + appId + "&secret=" + appSecret;RestTemplate restTemplate = new RestTemplate();String response = restTemplate.getForObject(url, String.class);try {accessTokenVo = JSON.parseObject(response, WxAccessTokenVo.class);/* 存储在redis中*/if (accessTokenVo.getExpire_in() > 0) {redisTemplate.opsForValue().set("wx_access_token", accessTokenVo.getAccess_token(),accessTokenVo.getExpire_in(), TimeUnit.SECONDS);}} catch (Exception e) {logger.error("Json转换异常", e);}return accessTokenVo;}

所以在获取到access_token的时候,把access_token存到数据库,或者存到本地缓存,并且还要记录当前时间,后面再用的时候先判断这个access_token有没有超过2个小时,如果超过2个小时的话,就要重新获取了。
附微信官方说明:获取 Access token
在这里插入图片描述

四、发送消息

先附上微信官方文档:发送订阅消息

1、接口说明

接口英文名:sendMessage

功能描述:

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

调用方式

HTTPS 调用
POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN 

请求参数

在这里插入图片描述
这些参数都是我们需要封装好发送给微信官方,调用时候需要的。

返回参数

在这里插入图片描述

2、注意点(需要前端配合)

这里有个需要特别注意的点,我们要给用户发送消息,就必须前端实现引导用户授权,因为用户不点击允许,你是没有办法给用户推送消息的。每一次授权只允许发送一条消息,所以如果你想尽量多的发送消息,就得尽量多的引导用户授权。

3、发送消息的Java代码实现

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

@Data
public class AddMessageSubscribeForm {    // 前端模板需要的参数//  小程序的登录凭证codeprivate String code;//订阅消息模版id   TODOprivate String template_id;//默认跳到小程序首页 TODOprivate String page = "pages/index/index";//推送文字private Map<String, TemplateData> data;//   跳转小程序的类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版private String miniprogram_state;//  进入小程序查看的语言类型:支持zh_CN、en_US、zh_HK、zh_TW,默认为zh_CNprivate String lang;}

2)封装后台调用微信官方API所需的参数:

@Data
public class WXMssVO {//用户openidprivate String touser;//订阅消息模版idprivate String template_id;//默认跳到小程序首页 TODOprivate String page = "pages/index/index";//推送内容private Map<String, TemplateData> data;//   跳转小程序的类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版private String miniprogram_state;//  进入小程序查看的语言类型:支持zh_CN、en_US、zh_HK、zh_TW,默认为zh_CNprivate String lang;
}

3)编写发送消息的内容:

@AllArgsConstructor
@Data
public class TemplateData {/***   消息通知的内容*/private String value;
}

4)获取用户的openid

    /*** 获取微信用户唯一标识OpenID*/private static final String CODE2SESSION_GET = "https://api.weixin.qq.com/sns/jscode2session?";/*** code2sessino接口* @param code* @return*/public WxCode2SessionVo getCode2Session(String code) {String url = CODE2SESSION_GET + "appid=" + appId + "&secret=" + appSecret + "&js_code=" + code + "&grant_type=authorization_code";RestTemplate restTemplate = new RestTemplate();String response = restTemplate.getForObject(url, String.class);WxCode2SessionVo code2SessionVo = null;try {code2SessionVo = JSON.parseObject(response, WxCode2SessionVo.class);} catch (Exception e) {logger.error("Json转换异常", e);}return code2SessionVo;}

5)编写发送消息的函数:

    /***    给用户发送通知*    TODO  参数设置* @param info* @return*/
/***   给用户发送消息*/public static final String SEND_INFO_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";public String pushMessage(AddMessageSubscribeForm info){RestTemplate restTemplate = new RestTemplate();String url = SEND_INFO_URL + getAccessToken().getAccess_token();// 通过 appId+appsecret+code三个参数获取微信用户信息 获取用户的openidWxCode2SessionVo code2Session = this.getCode2Session(info.getCode());if (code2Session == null || (code2Session.getErrcode() != null && code2Session.getErrcode() != 0)) {return  "获取用户微信信息失败:" + code2Session.toString();}String openid = code2Session.getOpenid();//  拼接推送的模板WXMssVO wxMssVO = new WXMssVO();wxMssVO.setTouser(openid);    // 用户的openIdwxMssVO.setTemplate_id(info.getTemplate_id());    //订阅消息模板idwxMssVO.setLang(info.getLang());     //语言类型wxMssVO.setMiniprogram_state(info.getMiniprogram_state());   //跳转小程序类型//TODO:指定跳转的页面wxMssVO.setPage(info.getPage());// TODO: 推送的内容Map<String, TemplateData> map = new HashMap<>();map.put("msg", new TemplateData("发消息了"));wxMssVO.setData(map);// 发送ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxMssVO, String.class);return responseEntity.getBody();}

到这里我们就可以完整的实现Java发送小程序消息的功能了。

总结

以上就是今天要分享给大家的内容,本文简单的记录了一下小程序发送通知的开发,很多内容其实都来自官方文档,欢迎大家批评指正、共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/319542.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运用Jmeter进行登录测试

开始了解Jmeter,写篇关于Jmeter的博客做备忘,这里以苏宁易购网站的登录请求为例实战来说明测试计划元件,创建一个 Web 测试计划。 今天简单介绍Jemeter的入门,Jmeter 的安装这边就跳过,直接讲述如何使用JMETER,如何运用Jmeter进行测试。 a.下载jmeter软件 b.安装…

Centos 磁盘挂载和磁盘扩容(新加硬盘方式)

步骤总结如下 一、对磁盘进行分区 二、对磁盘进行格式化 三、将磁盘挂载到对应目录 四、做开机自动挂载磁盘 磁盘分区 1.使用命令&#xff1a;fdisk -l 查看磁盘&#xff08;注&#xff1a;正常在Centos7中第一块数据盘标识一般是/dev/sda,第二块数据盘标识一般是/dev/sdb&…

springboot 2.7 oauth server配置源码走读一

springboot 2.7 oauth server配置源码走读 入口&#xff1a; 上述截图中的方法签名和OAuth2AuthorizationServerConfiguration类中的一个方法一样&#xff0c;只不过我们自己的配置类优先级比spring中的配置类低&#xff0c;算是配置覆盖&#xff0c;看下图所示&#xff1a; …

【MATLAB源码-第103期】基于simulink的OFDM+16QAM系统仿真,输出误码率和星座图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交频分复用&#xff08;英语&#xff1a;Orthogonal frequency-division multiplexing, OFDM&#xff09;有时又称为分离复频调制技术&#xff08;英语&#xff1a;discrete multitone modulation, DMT&#xff09;&#x…

Gamebryo游戏引擎源码(gb2.6+gb3.2+gb4.0+中文手册)

Gamebryo游戏引擎源码&#xff0c;是源码&#xff0c;是源码&#xff0c;是源码。喜欢研究游戏的可以下载研究研究&#xff0c;代码写得很好&#xff0c;有很多借得参考的地方。 Gamebryo游戏引擎源码&#xff08;gb2.6gb3.2gb4.0中文手册&#xff09; 下载地址&#xff1a; 链…

叮咚~请查收你的2023年度AI项目实战报告

岁月不居&#xff0c;时节如流。转眼间&#xff0c;2024悄然而至&#xff0c;AidLux AI实战训练营也陪伴大家走过了科技浪潮汹涌澎湃的一年。 这一年里&#xff0c;AI不断突破崭新高度、数字世界持续涌动创新&#xff0c;AI实战训练营也逐渐被越来越多的开发者所熟知&#xff…

软件测试基础理论学习-软件测试方法论

软件测试方法论 软件测试的方法应该建立在不同的软件测试类型上&#xff0c;不同的测试类型会存在不同的方法。本文以软件测试中常见的黑盒测试为例&#xff0c;简述常见软件测试方法。 黑盒测试用例设计方法包括等价类划分法、边界值分析法、因果图法、判定表驱动法、正交试…

14|工具和工具箱:LangChain中的Tool和Toolkits一览

14&#xff5c;工具和工具箱&#xff1a;LangChain中的Tool和Toolkits一览 工具是代理的武器 LangChain 之所以强大&#xff0c;第一是大模型的推理能力强大&#xff0c;第二则是工具的执行能力强大&#xff01;孙猴子法力再强&#xff0c;没有金箍棒&#xff0c;也降伏不了妖…

Spring配置文件

一&#xff1a; Bean标签基本配置 1&#xff1a;用途 用于配置对象交由Spring来创建&#xff0c;默认情况下它调用的是类中的无参构造函数&#xff0c;如果没有无参构造函数则不能创建成功。 2&#xff1a;基本属性&#xff08;id&#xff09; Bean实例在Spring容器中的唯一…

全志R128硬件设计指南②

PCB设计 叠层设计 R128采用两层板或四层板设计。 2层板设计参考 4层板设计参考 SoC Fanout R128封装采用 8x8mm QFN设计&#xff0c;0.35mm ball pitch&#xff0c;0.17mm ball size&#xff0c;可支持 2 层板方案与 4 层板方案。 两层板 Fanout 建议 尽量保证 SOC 背面 …

nuxt3 env文件、全局变量处理

有两种方向 通过配置nuxt.config.ts Nuxt提供的钩子函数&#xff0c;实现全局变量的获取 runtimeconfig env文件往runtimeconfig放入内容 useAppConfig 通过env文件配置来获取服务端全局变量&#xff0c;客户端通过vite.define实现 nuxt.config.ts Nuxt钩子 1. runtim…

如何修复卡在恢复模式的Android 手机并恢复丢失的数据

Android 系统恢复是一项内置功能&#xff0c;如果您的 Android 设备无法正常工作或触摸屏出现问题&#xff0c;该功能会很有帮助。您可以启动进入恢复模式并使用它来恢复出厂设置您的 Android 设备&#xff0c;而无需访问设置。此外&#xff0c;它还经常用于重新启动系统、从 A…