小程序一次性订阅消息(消息通知):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 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用。
选择先要的公共模板,也可以自己定制,但是公共模板已经可以满足我们绝大多数业务场景了
选择或者自己定制一个合适的模板,然后可以进行订阅模板的编辑,当然这都属于前端的工作了,
我们只需要在模板中拿到模板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发送小程序消息的功能了。
总结
以上就是今天要分享给大家的内容,本文简单的记录了一下小程序发送通知的开发,很多内容其实都来自官方文档,欢迎大家批评指正、共同进步!
相关文章:

小程序一次性订阅消息(消息通知):java服务端实现
文章目录 引言一、消息订阅1.1 小程序订阅消息功能介绍1.2 消息分类1.2.1 新版一次性订阅消息Beta1.2.2 一次性订阅消息(用户通过弹窗订阅)1.2.3 长期订阅消息(用户通过弹窗订阅)1.2.4 设备订阅消息 二、获取模板ID1.登录[微信公众…...

百度自由DIY小程序源码:PHP+MySQL组合开发 带完整的搭建教程
随着移动互联网的快速发展,小程序已成为企业与用户互动的重要平台。然而,对于许多中小企业和开发者来说,从零开始开发一款小程序需要投入大量的时间和资源。 以下是部分代码示例: 系统特色功能一览: 1.高度自定义&…...

Vue中的选项式 API 和组合式 API,两者有什么区别
Vue中的选项式 API(Option API)和组合式 API(Composition API)是两种不同的组件编写方式,它们各有特点和适用场景: 选项式 API(Option API): 传统方法:Vue最初的编程范式…...

Linux下误删除后的恢复操作测试之extundelete工具使用
一、工具介绍 extundelete命令的功能可用于系统删除文件的恢复。在使用前,需要先将要恢复的分区卸载,以防数据被意外覆盖。 语法格式:extundelete [参数] 文件或目录名 常用参数: --after 只恢复指定时间后被删除的文件 --bef…...

table表格中使用el-popover 无效问题解决
实例只针对单个的按钮管用在表格里每一列都有el-popover相当于是v-for遍历了 所以我们在触发按钮的时候并不是单个的触发某一个 主要执行 代码 <el-popover placement"left" :ref"popover-${scope.$index}"> 动态绑定了ref 关闭弹窗 执行deltask…...
c++类全面讲解
文章目录 前言类的基本概念基本结构类与结构体的区别示例代码 类的属性和方法属性(成员变量)方法(成员函数)访问修饰符示例代码 类的构造函数和析构函数构造函数析构函数示例代码 类的构造函数重载重载构造函数示例代码 类中的拷贝…...

使用Python和Pygame库创建简单的的彩球效果
简介 Pygame是一款强大的游戏开发库,可以用于创建各种有趣的图形效果。为了更好地了解Pygame的功能,今天我们将要做的是在屏幕上随机生成一些彩色的小球,并使它们以不同的速度和方向移动。当小球碰到屏幕边缘时,它们将反弹。 功能…...

第2课 使用FFmpeg读取rtmp流并用openCV显示视频
本课对应源文件下载链接: https://download.csdn.net/download/XiBuQiuChong/88680079 这节课我们开始利用ffmpeg和opencv来实现一个rtmp播放器。播放器的最基本功能其实就两个:显示画面和播放声音。在实现这两个功能前,我们需要先用ffmpeg连接到rtmp服…...

【中小型企业网络实战案例 七】配置限速
相关学习文章: 【中小型企业网络实战案例 一】规划、需求和基本配置 【中小型企业网络实战案例 二】配置网络互连互通【中小型企业网络实战案例 三】配置DHCP动态分配地址 【中小型企业网络实战案例 四】配置OSPF动态路由协议【中小型企业网络实战案例 五】配置可…...
Hive实战:实现数据去重
文章目录 一、实战概述二、提出任务三、完成任务(一)准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 (二)实现步骤1、启动Hive Metastore服务2、启动Hive客户端3、基于HDFS数据文件创建Hive外部表4、利用Hive SQL实…...
客户满意度调查常用的ChatGPT通用提示词模板
调查目的与范围:如何明确调查的目的和范围,确保调查的针对性? 调查方法选择:如何选择合适的调查方法,如问卷调查、访谈等? 问卷设计:如何设计问卷,确保问题的针对性和客观性&#…...

Android--Jetpack--Paging详解
不尝世间醋与墨,怎知人间酸与苦。 择一业谋食养命,等一运扭转乾坤。 你见过哪些令你膛目结舌的代码技巧? 文章目录 不尝世间醋与墨,怎知人间酸与苦。择一业谋食养命,等一运扭转乾坤。你见过哪些令你膛目结舌的代码技…...

Unity 基于UDP实现本地时间与网络时间校验 防客户端修改日期作弊
新建一个Unity GameObject 挂上NTPComponent脚本 时间校验 源码 using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using UnityEngine.Networking; using System.Text; using System.Net.Sockets; using System.Net; using Sys…...

ArduPilot开源代码之MatekSys Optical Flow 3901-L0X
ArduPilot开源代码之MatekSys Optical Flow 3901-L0X 1. 源由2. 安装3. 参数配置3.1 配置光流定位3.2 配置激光测距3.3 辅助配置 4. 测试4.1 光流数据测试4.2 测距数据测试4.3 飞行注意事项4.4 实际飞行测试 5. 参考资料 1. 源由 之前介绍过MatekSys Optical Flow 3901-L0X模块…...

【时钟】分布式时钟HLC|Logical Time|Vector Clock|True Time
目录 简略 详细 附录 1 分布式系统不能使用NTP的原因 简略 分布式系统中不同于单机系统不能使用NTP(网络时间协议(Network Time Protocol))来获取时间,所以我们需要一个特别的方式来获取分布式系统中的时间,mvcc也是使用time保证读…...

人工智能AI与3D视觉技术的结合正在引领新一代移动机器人的革新
随着科技的飞速发展,人工智能AI与3D视觉技术的结合正在引领新一代移动机器人的革新。富唯智能移动机器人,以其独特的3D视觉技术,赋予了移动机器人一双“智慧之眼”,从而为现代工业自动化带来了前所未有的突破。 富唯智能移动机器…...

NSSCTF 简单包含
开启环境: 使用POST传flag,flag目录/var/www/html/flag.php 先使用post来尝试读取该flag.php 没反应: 查看一下源码index.php,看有什么条件 base64解密: <?php$path $_POST["flag"];if (strlen(file_get_contents(php://input)) <…...
FlinkSQL处理Canal-JSON数据
背景信息 Canal是一个CDC(ChangeLog Data Capture,变更日志数据捕获)工具,可以实时地将MySQL变更传输到其他系统。Canal为变更日志提供了统一的数据格式,并支持使用JSON或protobuf序列化消息(Canal默认使用…...

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— DevEco Studio下载与安装
一、下载DevEco Studio IDE开发工具 1. 登录鸿蒙官网 网址为: 华为HarmonyOS智能终端操作系统官网 | 应用设备分布式开发者生态 页面如下: 2. 搜索“DevEco Studio IDE” 点击右上角的“请输入关键词”,在其中搜索“DevEc…...

大模型上下文长度的超强扩展:从LongLora到LongQLora
前言 本文一开始是《七月论文审稿GPT第2版:从Meta Nougat、GPT4审稿到Mistral、LongLora Llama》中4.3节的内容,但考虑到 一方面,LongLora的实用性较高二方面,为了把LongLora和LongQLora更好的写清楚,而不至于受篇幅…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...