java发送微信订阅消息

使用java发布订阅消息

之前接到了一个需求,要求我使用java发布订阅消息。那么首先,我要知道订阅消息是个什么,他能完成什么功能

一.什么是订阅消息

我直接去官网查看订阅消息的相关文档说明:

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html

然后我注意到了一些东西
1.

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

订阅消息包括两种:

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

长期订阅消息:
一次性订阅消息可满足小程序的大部分服务场景需求,但线下公共服务领域存在一次性订阅无法满足的场景,如航班延误,需根据航班实时动态来多次发送消息提醒。为便于服务,我们提供了长期性订阅消息,用户订阅一次后,开发者可长期下发多条消息。
目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。

这两个地方透露出一个很关键的信息。订阅消息需要用户许可才能发放,一次性订阅消息要用户许可一次,服务器才能发送一次,直接发送会被拒绝;而长期订阅消息是有行业限制的,申请门槛比较高。

2 接着我去到获取发送权限的接口文档寻找相关信息:

https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SnYTCLnE-1620709620544)(http://note.youdao.com/yws/res/9654/WEBRESOURCEebf79a9eee85090ac9d33a0d347d440e)]
在这里插入图片描述

总是保持以上选择,不再询问简单点说,这个选项目的是为了让用户不需要多次点击允许申请这个按钮,简化用户操作,前端通过使用getSetting这个方法去判断是不是要弹出这个申请框,如果不需要,执行方法requestSubscriMessage方法,后端才能够去发送消息。也就是对于一次性订阅消息来说,执行一次requestSubscribeMessage方法,后端才能发送一条消息,如果想要做到使用订阅消息去由后端自发的通知用户,那是行不通的,只能去申请长期订阅消息,或者使用服务号的消息模板。

二.发放订阅消息的提前准备

1.获取appId和appSecret
登录微信公众平台
在这里插入图片描述

2.新建一个模板并获取一个模板id
在这里插入图片描述

3.获取发放用户的openId
查看微信文档,看下openId是如何获取的

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

在这里插入图片描述

也就是我要调用wx.login这个方法获取code,这个code只能用一次,然后调用auth.code2Session这个方法去获取openId,对于一个公众平台来说,openId是唯一的.
wx.login这个方法的调用我通过测试小程序去完成
去公众平台下载一个微信开发者工具,公众平台推荐的那三个都可以,然后用appId新建一个项目。用控制台打印出code信息
在这里插入图片描述
在res=>{}中写console.log(wx.code),直接编译就可以看到code了
然后就是使用SpringBoot的RestTemplate去给微信发请求调用它的auth.code2Session方法了。看官方文档可以看到请求地址

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

这是一个get请求,要传appid,secret和code。grant_type写死就好

    @GetMapping("/getOpenId")public String getOpenId() {RestTemplate restTemplate = new RestTemplate();Map<String,String> params = new HashMap<>();params.put("APPID","");params.put("APPSECRET","");params.put("JSCODE","");ResponseEntity<String> responseEntity = restTemplate.getForEntity("https://api.weixin.qq.com/sns/jscode2session?appid={APPID}&secret={APPSECRET}&js_code={JSCODE}&grant_type=authorization_code",String.class,params);String body = responseEntity.getBody();JSONObject jsonObject = JSON.parseObject(body);String openId = jsonObject.getString("openid");return openId;}

用postman或者swagger去调用这个方法都行

4.然后我们看看发送的接口需要什么东西

https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html

可以看到需要一个接口调用凭证access_token,这个东西是全局唯一的,所有接口调用都要这个凭证,过期时间为2小时,多次向微信获取access_token更改access_token的值,所以如果多人协作开发的话要确定使用同一个access_token。

下面是access_token的请求地址

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

也是一个get请求,需要appid和secret,思路还是用RestTemplate获取其他工具类向微信发送请求

    @GetMapping("/getAccessToken")public String getAccessToken() {RestTemplate restTemplate = new RestTemplate();Map<String,String> params = new HashMap<>();params.put("APPID","");params.put("APPSECRET","");ResponseEntity<String> responseEntity = restTemplate.getForEntity("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}",String.class,params);String body = responseEntity.getBody();JSONObject jsonObject = JSON.parseObject(body);String accessToken = jsonObject.getString("access_token");return accessToken;}

看一些微信官方文档的请求示例

{"touser": "OPENID","template_id": "TEMPLATE_ID","page": "index","miniprogram_state":"developer","lang":"zh_CN","data": {"number01": {"value": "339208499"},"date01": {"value": "2015年01月05日"},"site01": {"value": "TIT创意园"} ,"site02": {"value": "广州市新港中路397号"}}
}

miniprogram_state和lang是选填的,值得注意的是data,data包裹了2层,所以定义请求实体的时候,data应该要设置为Map<String,Map<String,String>>或者Map<String,Object>,Object是你自己封装的类型,里面至少要包含一个data属性,这里我为了省事就直接封装一个类型了

@Data
public class MyTemplate {private String touser;//用户openidprivate String template_id;//订阅消息模版id,这里不要写成templateId,微信无法识别的private String page = "";//点击跳转页面,小程序上线后才能跳转private Map<String, DataValue> data;//推送文字,根据模板设置,DataValue是我封装的实体类
}@Data
public class DataValue {private String value;//public TemplateData(String value) {this.value = value;}
}

这里我用了lombok,如果不用就自己写get和set方法,然后就可以直接写请求了,进去公众平台看看模板的值需要如何设置
(https://note.youdao.com/yws/res/10603/WEBRESOURCEd838eae3339b5bdfaccee7381bd07695)]
在这里插入图片描述

    @GetMapping("/send")public String send(String openid) {RestTemplate restTemplate = new RestTemplate();String accessToken = "" //根据上面的方法自行获取,这里我填空字符串,不要直接cvString url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessTokenMyTemplate t = new MyTemplate();t.setTouser(openid);//根据上面我写的方法自行获取t.setTemplate_id("");//订阅消息模板idt.setPage(null);Map<String, TemplateData> m = new HashMap<>();m.put("thing2", new DataValue("测试1"));m.put("thing3", new DataValue("测试2"));t.setData(m);ResponseEntity<String> responseEntity =restTemplate.postForEntity(url, t, String.class);return responseEntity.getBody();}
  1. 然后就可以开始发送了
    首先我们还是要用小程序开发工具调用requestSubscriMessage方法获取许可

在这里插入图片描述
在这里插入图片描述

点击按钮后就可以调用发送接口,就可以显示发送成功了

说明:前端的方法是我cv其他人的,直接用应该没问题。后端的方法我整理笔记的时候手动编辑过,去掉了一些工具类还有其他信息,直接cv可能运行会失败,建议仅作为思路交流。

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

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

相关文章

微信公众号开发——向指定用户发送模板消息

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 微信公众号开发——向指定用户发送模板消息 ⏱️ 创作时间&#xff1a…

微信公众号一次性订阅消息功能开发实践

截止到2021年6月10日&#xff0c;微信公众号测试号是不支持“微信公众号一次性订阅消息”的开发&#xff0c;必须用正式的微信公众号测试&#xff0c;那如何在不影响正式的微信公众号运营的情况下来开发这个小功能呢&#xff0c;请看看笔者的实践。 微信一次性订阅官方开发文档…

python实现微信公众号给你的重要用户推送消息

最近小红书上这个很火&#xff0c;觉得做起来应该也不会太难&#xff0c;捣鼓了两天有了初步成效&#xff0c;还有一些功能没实现&#xff08;比如定时推送&#xff09;&#xff0c;保姆级教程&#xff0c;大家可以借鉴&#xff0c;动手给自己重要的人做一个&#xff0c;或许可…

JAVA对接微信公众号(服务号、订阅号)实现模板消息推送功能

最近做了个需求要求对接微信公众号&#xff0c;使用模板进行消息推送&#xff0c;今天抽时间总结一下相关的逻辑。 大概逻辑分为四个步骤&#xff1a; 获取微信调用接口凭证access_token。获取微信模板列表。使用模板进行消息推送。公众号配置服务器URL。 我这里的实现没有使…

微信开发工具实现订阅消息功能

微信开发工具实现订阅消息功能 1、新建文件夹&#xff0c;取名为&#xff1a;push1 2、push1.wxml写下如下代码&#xff1a; <button bindtap"dingyue">订阅</button>3、push1.js写下如下代码&#xff1a; // pages/push1/push1.js Page({/*** 页面…

微信公众号 - Java推送小程序订阅消息给用户

不啰嗦&#xff0c;我们直接开始&#xff01; 本文使用体验版小程序进行调试。 一、开发前小程序准备&#xff1a; 1、登录微信公众平台 点开下面链接&#xff0c;使用微信扫码 微信公众平台 然后选择一个小程序并登录 2、在小程序后台找到Appid、AppSecret、Token、Encod…

微信公众号订阅号开发的学习(二):获取用户发送的消息、简单的自动回复、自定义菜单

获取用户发送的消息 基础 微信服务器会发送两种类型的消息给开发者服务器。 get请求 验证服务器的有效性post请求 微信服务器会将用户发送的数据转发到开发者服务器上 实现 基于微信公众号订阅号开发的学习&#xff08;一&#xff09;&#xff1a;基础知识 auth.js //引…

微信第三方平台集成公众号发送模板消息

最近老板下发了个任务&#xff0c;有一个业务是整合用户的微信公众号&#xff08;服务号&#xff09;&#xff0c;然后在我们的erp系统里给下家客户发送模板消息&#xff0c;找了一下发现微信第三方平台可以实现&#xff0c;那就干起来。 先在微信开放平台&#xff0c;申请一个…

元宇宙iwemeta:元宇宙数字人实践落地应用场景

把虚拟数字人装进你的手机&#xff01;百度、腾讯、讯飞盯准这条新赛道。 短短三个月内&#xff0c;几乎每一家拥有智能语音技术能力的大厂都在采取行动布局虚拟数字人。 百度、华为、阿里等都纷纷引入AI数字人入职&#xff0c;担任技术宣讲员、形象代言人&#xff1b;OPPO、…

考研人常说的“死亡211”和“984.5”是什么学校?

&#x1f603;这几所211院校&#xff0c;真香&#xff01;被称为984.5&#xff01;众所周知&#xff0c;985高校是国内最顶尖的一批名牌大学&#xff0c;每年报考的人都疯狂扎堆&#xff0c;分也很高&#xff0c;想去分一杯羹很难。但考个一般211吧&#xff0c;有时又不甘心&am…

华工计算机网络辅修,【JZT干货】双手献上华工辅修攻略

原标题&#xff1a;【JZT干货】双手献上华工辅修攻略 辅修进行了一个多月&#xff0c;相信小伙伴们也对辅修有了基本的了解。那么各课程的期末考试是怎样的&#xff1f;一些老师上课有什么特点&#xff1f;想了解吗&#xff0c;团仔在此献上纯干货给大家。 当然啦&#xff0c;涉…

z世代消费力白皮书_猫哥清华新传考研|如何让Z世代粉上你?

猫小菇/新传考研猫 不管愿不愿意承认&#xff0c;“Z世代”主宰的未来已经悄然来临了。 每个时代的年轻人都是品牌主最想触及的群体&#xff0c;因为他们代表着市场的未来。 当“千禧一代”仍然是当下消费重点群体时&#xff0c;“Z世代”已经带着与生俱来的敏感力和决策力进入…

本土网络安全公司——上讯信息的“老兵新传”

上讯信息&#xff0c;这个名字听起来很耳熟&#xff0c;但是很多人还是对这个公司有点儿陌生。其实就在今年年初&#xff0c;上讯信息获得了由ISCCC颁发的信息安全风险评估一级服务资质&#xff0c;以及信息安全应急处理二级服务资质&#xff0c;成为金融行业“年度信赖品牌”。…

社工库制作

项目结构 https://github.com/Collapsar-G/social_worker_library 后端使用以下模块&#xff1a; pymsql、flask 前端使用vue搭建 完成过程 在完成上参考了《“系统安全”课程项目&#xff1a;一个实用社工库的建设》&#xff0c;加入了一些自己的理解。 数据初始化 导出为c…

社工库2.0

#大题目 社工库2.0 ###环境 whoosh2.7jieba12306python3.7网上嫖来的网页模板(感谢站长之家 ###实现效果建立的索引文件 好看的页面 更快的查找速度 ###实现过程 具体的实现过程比较简易,毕竟whoosh已经封装的很好了第一步 建立索引并存储schema = Schema(zhanghao=TEXT(sto…

搭建社工库

成品大概是这样子&#xff0c;我把主要源码贴在下面 <!doctype html> <html> <head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width,initialscale1"> <title>社工库</title&…

计算机专业的八字,生辰八字自动计算器软件 生辰八字在线计算器

大家对于计算器都很熟悉吧&#xff0c;一点也不陌生&#xff0c;与此同时&#xff0c;那么计算机是大家在日常生活中使用的一个简单软件&#xff0c;在使用的同时&#xff0c;既简单又方便&#xff0c;那么对于计算器大家都有所掌握 &#xff0c;所以这次小编将要给你介绍一下新…

html中如何做出生年月日,出生年月日怎么换成生辰八字

天干有 十个:甲、乙、丙、丁、戊、己、庚、辛、壬、癸。 地支有十二个:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。 二者顺序配合可以产生六十个单位&#xff0c;叫六十甲子。那生出生的年、月、日、时分别用天干、地支配合来表示&#xff0c;正好有八个字&#xff0c;因…

生辰八字计算

年柱、月柱、日柱->根据阴历生日在万年历上查找 时柱计算根据日柱天干以及出生时辰在日上起时表查找 五行属性: 甲属木->阳 乙属木->阴 丙属火->阳 丁属火->阴 戊属土->阳 己属土->阴 庚属金->阳 辛属金->阴 壬属水->阳 癸属水->阴…

找不到电脑C盘下的AppData文件夹怎么办?

电脑C盘下的AppData文件夹消失的解决办法 1. 问题描述2. 解决方案(1) 第一步(2) 第二步(3) 第三步 1. 问题描述 如果找不到电脑C盘下的AppData文件夹&#xff0c;很有可能是该文件夹被隐藏了。 2. 解决方案 (1) 第一步 winR键调出运行框&#xff0c;输入【control folders】…