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

news2025/9/20 17:30:54

文章目录

  • 引言
  • 一、消息订阅
    • 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 {    // 前端模板需要的参数
    //  小程序的登录凭证code
    private String code;

    //订阅消息模版id   TODO
    private String template_id;

    //默认跳到小程序首页 TODO
    private 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_CN
    private String lang;

}

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

@Data
public class WXMssVO {
    //用户openid
    private String touser;

    //订阅消息模版id
    private String template_id;

    //默认跳到小程序首页 TODO
    private 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_CN
    private 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三个参数获取微信用户信息 获取用户的openid
        WxCode2SessionVo 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);    // 用户的openId
        wxMssVO.setTemplate_id(info.getTemplate_id());    //订阅消息模板id
        wxMssVO.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.coloradmin.cn/o/1355001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10款值得推荐的Blazor UI组件库

前言 经常看到有小伙伴在DotNetGuide技术社区交流群里问有什么好用的Blazor UI组件库推荐的&#xff0c;本文将分享一些开源、实用、美观的Blazor UI组件库&#xff0c;提供给广大C#/.NET开发者们学习和使用&#xff08;注意&#xff1a;排名不分先后&#xff0c;都是十分优秀…

算法与数据结构之数组(Java)

目录 1、数组的定义 2、线性结构与非线性结构 3、数组的表现形式 3.1 一维数组 3.2 多维数组 4、重要特性&#xff1a;随机访问 5、ArrayList和数组 6、堆内存和栈内存 7、数组的增删查改 7.1 插入数据 7.2 删除一个数据 7.3 修改数组 7.4 查找数据 8、总结 什么…

CIFAR图片分类数据集

1. CIFAR介绍 官网链接&#xff1a;CIFAR-10 and CIFAR-100 datasets CIFAR-10是一个更接近普适物体的彩色图像数据集。CIFAR-10 是由Hinton 的学生Alex Krizhevsky 和Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含10 个类别的RGB 彩色图片&#xff1a;飞机…

机器学习期末复习

机器学习 选择题名词解释&#xff1a;简答题计算题一、线性回归二、决策树三、贝叶斯 选择题 机器学习利用经验 &#xff0c;须对以下&#xff08;&#xff09;进行分析 A 天气 B 数据 C 生活 D 语言 归纳偏好值指机器学习算法在学习的过程中&#xff0c;对以下&#xff08;&a…

【Java基础篇】 try中return A,catch中return Bfinally中return C,最终返回值是什么?

try中return A&#xff0c;catch中return Bfinally中return C&#xff0c;最终返回值是什么? ✔️典型解析✔️拓展知识仓✔️finally 和 return 的关系 ✔️ final、finally、finalize有什么区别✔️final✔️finally✔️ finalize ✔️典型解析 最终的返回值将会是C 因为 fi…

计算机毕业设计-----SSM自习室图书馆座位预约管理系统

项目介绍 一款由jspssmmysql实现的图书馆预约占座管理系统&#xff0c;前端采用的是当下最流行的easyui框架&#xff0c;后台用的ssm&#xff08;spring、springMVC、mybaits&#xff09;框架.添加学生和教师时会自动在用户表中注册&#xff0c;定时任务会定时生成座位信息&am…

Cortex-M3 内核的中断优先级

第一步&#xff1a;分组&#xff08;一次&#xff09; 第二步&#xff1a;根据每个中断&#xff0c;设置抢占优先级&#xff08;根据分组可以知道可以几位设置&#xff09;&#xff0c;然后子优先级。 1. 中断编号 ARM 为 Cortex-M3 内核 一共设计了 255 个中断&#xff0c;编号…

【SpringBoot开发】之商城项目案例(订单及订单项生成)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之商城项目系列》。&#x1f3af…

Ubuntu无网络解决办法

1.进入root并输入密码 sudo su 2.更新NetworkManager的配置 用vim打开NetworkManager.conf vim /etc/NetworkManager/NetworkManager.conf 将第五行 managedFalse 改为 managedTrue 。 如果本身就是True就不用改了。 3.删除NetworkManager配置 service NetworkManager st…

Application layer

title: 应用层 date: 2023-12-20 21:03:48 tags: 知识总结 categories: 计算机网络 应用层&#xff1a;负责最直观的应用请求的封装、发起 一、域名系统DNS 连接在互联网上的主机不仅有IP地址&#xff0c;还有便于用户记忆的主机名字。域名系统DNS能够把互联网上的主机的名字…

看完这篇 教你玩转镜像转换神器qumu实现虚拟机做题自由!

前言&#xff1a; 最近有小伙伴说比赛没设备&#xff0c;问有没有不需要设备也能实现做题自由的方法&#xff0c;今天这里分享一期&#xff01; 看完这篇你将学会 使用qumu转换镜像格式 一般我们做题都是img格式的环境 需要导入设备&#xff0c;有些小伙伴没有设备 就可以使用…

擎创动态 | 某城商行案例入选信通院 GOLF+年度明星解决方案

2023年12月15日&#xff0c;“2023GOLF IT新治理领导力论坛”在京召开&#xff0c;该论坛由中国信息通信研究院、中国通信标准化协会主办。在此次论坛中&#xff0c;主办方正式发布了XOps领域年度评选结果。擎创科技“一体化智能根因定位解决方案”凭借优秀的落地实践成果&…

Navicat 技术干货 | 如何查看关系型数据库(MySQL、PostgreSQL、SQL Server、 Oracle)查询的运行时间

在数据库优化中&#xff0c;理解和监控查询运行时间是至关重要的。无论你是数据库管理员、开发人员或是参与性能调优的人员&#xff0c;知道如何查看查询运行时间能为你的数据库操作提供有价值的参考。本文中&#xff0c;我们将探索几款热门的关系数据库&#xff08;如 MySQL、…

门店总数超9000家,手握大众茶饮“下沉市场牌”的古茗冲刺上市

奶茶品牌上市潮来袭。1月2日&#xff0c;奶茶品牌古茗控股有限公司&#xff08;下称“古茗”&#xff09;、蜜雪冰城股份有限公司&#xff08;下称“蜜雪冰城”&#xff09;一同递交招股书&#xff0c;计划在港交所主板上市。 近年来&#xff0c;随着现制茶饮的爆火&#xff0…

vue-amap区域显示,3d棱柱效果

文章目录 一、在vue项目中安装和基本使用1. 安装2. 在vue项目中使用1. 在main.js中引入2. demo显示高德地图 二、显示区域三、只显示某个区域四、3D棱柱区域五、添加卫星图层 vue-amap中文文档&#xff1a; https://www.wenjiangs.com/doc/mdxkhhtr 一、在vue项目中安装和基本…

30道Nginx面试题含答案(很全)

1. 什么是Nginx&#xff1f; Nginx是一个 轻量级/高性能的反向代理Web服务器&#xff0c;他实现非常高效的反向代理、负载平衡&#xff0c;他可以处理2-3万并发连接数&#xff0c;官方监测能支持5万并发。 2. 为什么要用Nginx&#xff1f; 跨平台、配置简单、方向代理、高并…

nVisual如何实现数据中心资产管理

背景 随着信息技术的迅速发展&#xff0c;数据中心已经成为了企业信息化建设的重要基础设施之一。数据中心不仅承载着大量的企业数据和业务应用&#xff0c;而且也需要大量的资产投入来支持其运营和发展。 因此&#xff0c;数据中心资产管理的重要性也日益凸显&#xff0c;数…

单电阻落地扇电机驱动 DEMO 方案

SYNWIT DEMO方案 低压 PMSM 电机&#xff0c;软件上采用SVPWM空间电压矢量调制技术&#xff0c;直接闭环启动&#xff0c;相比传统方波效率提高15%&#xff0c;具有更小的谐波分量及转矩脉动&#xff0c;同时采用32位MCU芯片SWM201G6S7 SSOP28 封装为主控&#xff0c;为驱动算…

thinkadmin安装步骤

一,先cmd运行安装命令 ### 创建项目&#xff08; 需要在英文目录下面执行 &#xff09; composer create-project zoujingli/thinkadmin二,在confing中的database.php配置数据库 三,将仓库的data复制到app目录下 https://gitee.com/zoujingli/think-plugs-data 四,在cmd运…

ssm基于BS的仓库在线管理系统的设计与实现论文

摘 要 如今的时代&#xff0c;是有史以来最好的时代&#xff0c;随着计算机的发展到现在的移动终端的发展&#xff0c;国内目前信息技术已经在世界上遥遥领先&#xff0c;让人们感觉到处于信息大爆炸的社会。信息时代的信息处理肯定不能用之前的手工处理这样的解决方法&#x…