文章目录

  • 前言
  • 一、什么是消息推送
  • 二、获取模板ID
  • 三、获取access_token
  • 四、发送消息
  • 五、完整的代码
  • 总结

前言

最近做项目时需要做个小程序的消息推送,所以在这里记录分享一下实现过程


一、什么是消息推送

↓↓↓↓
官方文档

小程序提供了多种消息方式,一般常用的是模板消息和订阅消息,但是模板消息推送,在2020年1月10日下线,所以我们就是用使用订阅消息了。

功能介绍
消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。

  • 订阅消息推送位置:服务通知
  • 订阅消息下发条件:用户自主订阅
  • 订阅消息卡片跳转能力:点击查看详情可跳转至该小程序的页面

消息类型

  1. 一次性订阅消息
    一次性订阅消息用于解决用户使用小程序后,后续服务环节的通知问题。用户自主订阅后,开发者可不限时间地下发一条对应的服务消息;每条消息可单独订阅或退订。

  2. 长期订阅消息
    一次性订阅消息可满足小程序的大部分服务场景需求,但线下公共服务领域存在一次性订阅无法满足的场景,如航班延误,需根据航班实时动态来多次发送消息提醒。为便于服务,我们提供了长期性订阅消息,用户订阅一次后,开发者可长期下发多条消息。

目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。

二、获取模板ID

百度搜索微信公众平台

微信扫码登录

在功能中找到订阅消息


点击开通订阅消息

由于长期性订阅消息,目前仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。仅就线下公共服务这一点,长期性订阅消息就和大部分开发者无缘了。
所以我们这里只能以使用一次性订阅消息为例。

选择先要的公共模板,也可以自己定制,但是公共模板已经可以满足我们绝大多数业务场景了

如上图,我们从公共模板库里选择一个一次性订阅的模板。然后编辑模板如下图

下图就是我们添加好的模板,下图的模板id就是我们需要的。

三、获取access_token

首先来看下access_token是什么,下图是官方给出的:

其实通俗的讲,access_token就是小程序官方给我们提供的一个凭证,你要调用小程序官方的接口,就必须先拿到access_token。这个和我们做的项目调用后台接口必须登录后台给你一个token你带token访问相似。

看一下官方文档:

grant_type是一个固定的值,只有appid和secret是需要我们填入的,这两个值在我们的小程序后台就可以拿到。

下面就是Java后台代码的编写了

我这里用的是springboot,这里要请求小程序官方接口,正常项目开发我都是用的自己写的接口请求工具类的,这里为了大家方便就用了springboot自带的RestTemplate来做网络请求。文章最后我会把我自己写的这个请求工具类贴出来有需要的朋友可以copy,具体代码如下。

代码如下(示例):

这里代码很简单,就一个简单的get请求。不过要注意一点,这里获取的access_token是有两个小时的过期时间的

所以在获取到access_token的时候,把access_token存到数据库,或者存到本地缓存,并且还要记录当前时间,后面再用的时候先判断这个access_token有没有超过2个小时,如果超过2个小时的话,就要重新获取了。但这里我就不做了,只是你们在做开发的时候尽量还是规范点。

四、发送消息

官方文档

老规矩还是先看官方文档

上面的参数都是我们发送消息时需要的。

这里有个需要特别注意的点,我们要给用户发送消息,就必须引导用户授权,如下


因为用户不点击允许,你是没有办法给用户推送消息的。每一次授权只允许发送一条消息,所以如果你想尽量多的发送消息,就得尽量多的引导用户授权。

我们这里用到了wx.requestSubscribeMessage这个方法,来获取用户的授权。

这里我把前端的代码也贴出来大家可以参考参考

<button bindtap="getAuthority" type='primary'>获取订阅消息授权</button>//获取授权的点击事件getAuthority() {wx.requestSubscribeMessage({tmplIds: ['CFeSWarQL*************8V8bFLkBzTU'], //这里填入我们生成的模板idsuccess(res) {console.log('授权成功', res)},fail(res) {console.log('授权失败', res)}})}

推送的Java代码如下
代码如下(示例):

可以看到,我们这里需要定义用户的openid,模板id,跳转路径,模板消息内容等。
这些都定义好以后,我们就可以提供一个服务给到Java的其他代码调用,或者提供一个接口供外界传入openid,然后给对应的用户推送消息了。

然后小程序就收到了

五、完整的代码

  1. 获取access_token

下面的appId,appSecret替换成你们自己的,具体的可以去小程序后台查看

public static final String WX_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type={grant_type}&appid={appid}&secret={secret}";public String getAccessToken() {Map<String,Object> params = new HashMap<>();params.put("grant_type","client_credential");params.put("appid",appId);params.put("secret",appSecret);//发送请求String result = RestTemplateUtil.requestForGetString(WX_ACCESS_TOKEN , params);JSONObject jsonObject = JSONObject.parseObject(result);String accessToken = jsonObject.getString("access_token");if (StringUtils.isEmpty(accessToken)) {log.error("获取access token失败: {}" , jsonObject.getString("errmsg"));throw new ApiException("获取access token失败");} else {log.info("wx access_token : {}",accessToken);return accessToken;}}
  1. 发送消息
public static final String SEND_INFO_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";public String push(QueueInfoTempDto info) {RestTemplate restTemplate = new RestTemplate();String url =  SEND_INFO_URL  + getAccessToken();//拼接推送的模版WxMssVO wxMssVo = new WxMssVO();wxMssVo.setTouser(info.getOpenId());//用户的openIdwxMssVo.setTemplate_id(templateId);//订阅消息模板idwxMssVo.setPage("pages/appointment/line_up?"+"shopId="+info.getShopId());Map<String, TemplateData> m = new HashMap<>(5);m.put("thing1", new TemplateData(info.getShopName()));m.put("thing2", new TemplateData(info.getCode()));m.put("thing3", new TemplateData("前面还有"+info.getPreNumber()+"桌,请耐心等待"));m.put("thing9", new TemplateData(info.getNumber()+"人"));m.put("time8", new TemplateData(DateUtils.sdfTime.format(info.getCreatedTime())));wxMssVo.setData(m);ResponseEntity<String> responseEntity =restTemplate.postForEntity(url, wxMssVo, String.class);return responseEntity.getBody();}
  1. 对应的两个数据类如下
    WxMssVo用来封装请求官方接口的参数
@Data
public class WxMssVO {private String touser;//用户openidprivate String template_id;//订阅消息模版idprivate String page = "pages/index/index";//默认跳到小程序首页private Map<String, TemplateData> data;//推送文字
}

TemplateData 用来定义消息的内容

@AllArgsConstructor
@Data
public class TemplateData {private String value;
}

到这里我们就可以完整的实现Java发送小程序消息的功能了。完整代码也已经贴给大家了。

总结

以上就是今天要分享给大家的内容,本文简单的讲了怎么发送订阅消息,其实大部分大家参考官方文档都是可以写出来的

java实现小程序订阅消息推送(附源码)相关推荐

  1. in java中文版百度云 thinking_小程序订阅消息推送(含源码)java实现小程序推送,springboot实现微信消息推送...

    前面写过一篇云开发实现小程序订阅消息(模板消息)推送的文章,<借助云开发实现小程序订阅消息和模板消息的推送功能>是有好多同学用的是Java写后台,所以今天就再来写一篇Java后台实现小程序 ...

  2. 微信小程序订阅消息推送(附带后台java代码)

    官方文档: 小程序前端:点击进入 小程序服务端:点击进入 一,代码实现(后端) ①定义实体类 package com.saic.fin.system.sendInfo;import lombok.Da ...

  3. 【Node.js】实现微信小程序订阅消息推送功能

    实战项目名称:实现微信小程序订阅消息通知 文章目录 一.实战步骤 1. 登录微信小程序管理端,添加订阅消息模板 2. 定义好需要发送的消息 3.获取小程序的access_token 4. 发起请求,向 ...

  4. 云开发实现小程序订阅消息推送功能

    步骤一:获取模板 ID 在微信公众平台手动配置获取模板 ID: 登录 https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用. 步骤二:请 ...

  5. Java开发微信小程序订阅消息推送

    使用到开源工具WxJava 这里环境使用到springboot 框架,废话不多说直接上干货. pom.xml引用 <!-- https://mvnrepository.com/artifact/ ...

  6. 小程序订阅消息推送工具类

    直接上代码: 1.首先引入maven依赖: <dependency><groupId>com.github.binarywang</groupId><arti ...

  7. 微信小程序--订阅消息推送

    首先我开发的小程序是一个员工积分系统,分为员工端.管理端.员工端发布的任务 要求推送到对应员工.以下贴一下大概流程代码 1. $this->messagePush($data['task_tit ...

  8. 微信小程序订阅消息推送-php

    最近在给微信小程序写后端接口,有一个场景是 每天给指定账号推送 小程序消息,这期间踩了不少坑,希望记录下来能帮助导大家. 给小程序用户推送消息,首先需要获取用户的openid,这个是小程序的openi ...

  9. java推送微信消息换行_5行代码实现微信小程序模版消息推送 (含推送后台和小程序源码)...

    我们在做小程序开发时,消息推送是不可避免的.今天就来教大家如何实现小程序消息推送的后台和前台开发.源码会在文章末尾贴出来. 其实我之前有写过一篇:<springboot实现微信消息推送,java ...

  10. java实现微信消息和小程序模板消息推送

    002java实现微信模版消息推送 本节知识点 1,注册微信公号测试账号 2,获取测试账号的用户openid 3,接入微信推送sdk 4,实现微信推送 课程中用到的网址和文件 1,微信官方注册测试账号 ...

最新文章

  1. TinyDBCluster Vs routing4db
  2. 停止FMS3.5的Apache服务
  3. 云上的可观察性数据中台,如何构建?
  4. 如何使用 ABAP 报表将 ABAP 服务器上的 SAP UI5 应用下载到本地
  5. java sampling_Java机器学习库ML之三Sampling(采样)
  6. 静态路由和默认路由的配置实战及其区别--很详细哦
  7. r语言中删除向量的某些元素_R中的向量
  8. sql08 访问接口没有oraoledb_如何配置交换机和防火墙以访问 Internet?
  9. 远程桌面登陆不上的解决思路
  10. 初识 Cisco Packet Tracer 思科模拟器 入门基础教学
  11. STM32F100X RCC_APB2Periph_AFIO--复用IO时钟的使用
  12. matlab 设计滤波器,FIR 滤波器设计
  13. 【运维心得】如何一步切换企业邮箱主域名
  14. 小武与retinanet的斗争
  15. The Design of Model (part 1)
  16. 1000: 从今天开始入坑C语言
  17. 周训练计划之(韦德分化训练法:胸、肩、背、腿、腹)
  18. 【EXCEL】用公式筛选符合条件的内容,输出固定格式字符
  19. PHP 生成条形码每页44个
  20. VBS 文本歌词粤语拼音翻译

热门文章

  1. SpringBoot系列(9):SpringBoot配置文件详解
  2. bzoj3884: 上帝与集合的正确用法 扩展欧拉定理
  3. Shiro 基础教程
  4. 关于websocket长链接的使用
  5. 高德地图——一款功能强大的APP
  6. Lenovo E46A-Win 7_无线灯亮但无法启动(耽误3天以上您信吗.....)问题: wlan autoconfig 依赖服务或组无法启动...
  7. 【转载】关于:读写xls文件,提供下载的一个小例子(jxl 的简单运用) - 读取文件...
  8. 详细解读Python中的__init__()方法
  9. create 添加async和不添加的区别_六偏磷酸钠不可怕—谈谈食品添加剂中的用途
  10. windows10下 mysql5.7.24 免安装版 安装笔记