使用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


总是保持以上选择,不再询问简单点说,这个选项目的是为了让用户不需要多次点击允许申请这个按钮,简化用户操作,前端通过使用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可能运行会失败,建议仅作为思路交流。

java发送微信订阅消息相关推荐

  1. java发送微信模板消息_java微信公众平台之发送模板消息

    准备条件: 1.一个测试号,有必要说下的是订阅号没有发送模板消息这一功能,那么开发的小伙伴们就可以直接先注册一个测试号 2.目前我并没有就是做的很完善,网页授权获取openId这个我没做,那么我是直接 ...

  2. 后端——》Java程序推送微信订阅消息

    使用场景1:在微信小程序中进行了某种操作后,推送消息告知用户的操作结果 使用场景2:微信端办公流程提交给下一个人审批后,得到审批通过或是驳回修改的命令 使用场景具体如下图,可用在签到.提醒.通知.警告 ...

  3. Java实现体_微信订阅消息体Java实现

    话不多说,直接上代码: SubscribeMsgData.java订阅消息体对象,字符串长度超长可自动截取 package xin.xihc.rebate.bean; import lombok.Al ...

  4. 微信订阅消息(后端)教程

    微信订阅消息(后端) md文件连接添加链接描述 一.订阅消息流程 注意:目前微信这边只支持一次性订阅,就是同意几次发送几次,永久性订阅目前只支持一些政府,医疗等行业.所以我们做不到一次订阅就可以一直发 ...

  5. 发送微信模板消息+定时任务

    在用户购买会员卡后的第二天下午四点发送微信模板消息 在pom.xml里面配置 <dependency><groupId>net.coobird</groupId>& ...

  6. php+实现群发微信模板消息_php实现发送微信模板消息的方法,php信模板消息_PHP教程...

    php实现发送微信模板消息的方法,php信模板消息 本文实例讲述了php实现发送微信模板消息的方法.分享给大家供大家参考.具体如下: 该方法基于thinkphp实现实现,具体OrderPush.cla ...

  7. php redis微信发红包,高阶篇二 使用Redis队列发送微信模版消息

    # 高阶篇二 使用Redis队列发送微信模版消息 > 此命令行执行任务的方法类比较复杂 他需要命令行运行才会有效 > 命令行源码以及创建方法 参见上节 https://www.kanclo ...

  8. 微信小程序云开发教程-手把手:获取微信订阅消息的模板ID

    本小节,我们将手把手带领大家一起实现第一个接口,获取微信订阅消息的模板ID 通过开发这个接口,我们将学会云函数的基本结构和函数返回值的格式定义. 开发接口前,我们必须先写接口文档.小程序后端的接口文档 ...

  9. php网站为微信发信息,PHP发送微信模版消息代码

    做微信开发的人都知道微信模版消息的重要性,今天给大家分享一篇使用PHP来发送微信模版消息的demo,废话少说,进入正题. 1.创建一个发送模版消息的类,我这里命名为"templatesMes ...

  10. openid无效什么意思_发送微信模板消息,返回OpenId无效

    发送订单创建成功通知模板 请求地址  https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN ...

最新文章

  1. 功率半导体碳化硅(SiC)技术
  2. 网站收录上不去估计是这几个方面出了问题
  3. 手机轮廓光怎么拍_想拍美秋天叶子,别犯这5个初级错误!告诉错在哪里及咋拍正确...
  4. 介绍针对企业级Flex开发的开源项目FlexibleShare
  5. 夯实Java基础(二十二)——Java8新特性之Lambda表达式
  6. 越来越难?这届开发者学不会的计算机理论
  7. chmod命令-权限
  8. c语言命令行贪吃蛇,C语言实现贪吃蛇游戏(命令行)
  9. HDL4SE:软件工程师学习Verilog语言(十)
  10. ASP.NET MVC form表单提交
  11. 6.5 特殊用途语言特性
  12. 家用智能洗地机哪个牌子好、洗地机品牌排行榜前十名介绍
  13. 【官宣】.NET 6 正式版来了
  14. [Linux]-堡垒机/跳板机作用、登陆异常处理
  15. 信息系统项目管理师 - 项目范围管理
  16. 直播技术总结(四)音视频数据压缩及编解码基础
  17. git init 命令详解
  18. Java万字长文基础知识总结
  19. file too small (length=0) file
  20. QTYX量化系统实战案例分享|箱体形态选股后蓄势介入之202211

热门文章

  1. 哈夫曼编码C++实现
  2. windows10强制删除文件_360都删除不了顽固文件?别慌,不足1M的工具帮你强制清理...
  3. 中国地区2012年第二季度 网络安全威胁报告
  4. 河南自考本科英语可用计算机代替,河南自考选考2至3门专业课可代替英语课程...
  5. css3学习手册思维导图
  6. 操作系统十二大容量存储的结构
  7. 200410 笔试某居游戏公司数据分析岗前的准备
  8. Android 混淆总结
  9. Soap+xml实现webservice 调用
  10. 计算机专业自我简介50字,2021年个人简历自我评价50字