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

最近做了个需求要求对接微信公众号,使用模板进行消息推送,今天抽时间总结一下相关的逻辑。

大概逻辑分为四个步骤:

  1. 获取微信调用接口凭证access_token。
  2. 获取微信模板列表。
  3. 使用模板进行消息推送。
  4. 公众号配置服务器URL。

我这里的实现没有使用微信公众号weixin-java-mp依赖,完全是根据微信官方文档的提示写的代码。

一、二、获取access_token和模板列表

    @Overridepublic String getAccessToken() {RestTemplate restTemplate = new RestTemplate();String accessTokenUrl = getAccessTokenUrl + "?grant_type=" + grantType + "&appid=" + appId + "&secret=" + secret;ResponseEntity<JSONObject> responseEntity = restTemplate.getForEntity(accessTokenUrl, JSONObject.class);if (responseEntity.getStatusCodeValue() == 200) {JSONObject result = responseEntity.getBody();if (result != null) {int errCode = result.getIntValue("errcode");if (errCode == 0) {String accessToken = result.getString("access_token");redisTemplate.opsForValue().set(WeChatConstant.WECHAT_ACCESS_TOKEN_REDIS_KEY, accessToken, 7200, TimeUnit.SECONDS);return accessToken;} else {String errMsg = result.getString("errmsg");logger.info("获取微信access_token返回失败,错误码:{},错误信息:{}", errCode, errMsg);}} else {logger.info("获取微信返回结果json为空");}} else {logger.info("调用微信接口请求失败");}return null;}@Overridepublic List<MsgTemplateVO> getAllTemplates() {RestTemplate restTemplate = new RestTemplate();String accessToken = redisTemplate.opsForValue().get(WeChatConstant.WECHAT_ACCESS_TOKEN_REDIS_KEY);if (StringUtils.isBlank(accessToken)) {accessToken = this.getAccessToken();}String url = getAllTemplateUrl + "?access_token=" + accessToken;List<MsgTemplateVO> templateVOList = new ArrayList<>();ResponseEntity<JSONObject> responseEntity = restTemplate.getForEntity(url, JSONObject.class);if (responseEntity.getStatusCodeValue() == 200) {JSONObject result = responseEntity.getBody();if (result != null) {JSONArray array = result.getJSONArray("template_list");if (!array.isEmpty()) {for (int i = 0; i < array.size(); i++) {JSONObject template = array.getJSONObject(i);MsgTemplateVO msgTemplateVO = new MsgTemplateVO();msgTemplateVO.setTemplateId(template.getString("template_id"));msgTemplateVO.setTitle(template.getString("title"));msgTemplateVO.setPrimaryIndustry(template.getString("primary_industry"));msgTemplateVO.setPrimaryIndustry(template.getString("deputy_industry"));msgTemplateVO.setContent("content");msgTemplateVO.setContent("example");templateVOList.add(msgTemplateVO);}}} else {logger.info("获取微信模板返回结果json为空");}} else {logger.info("调用微信模板接口请求失败");}return templateVOList;}

说明:MsgTeplateVO是我自己定义的消息模板类。

properties配置请求接口的常量

wechat.auth.granttype=client_credential
wechat.auth.token=token
wechat.auth.appid=服务号的appId
wechat.auth.secret=服务号的secret
#获取AccessToken url GET
wechat.url.accesstoken=https://api.weixin.qq.com/cgi-bin/token
#模板消息推送 POST
wechat.url.template.send=https://api.weixin.qq.com/cgi-bin/message/template/send
#获取所有的消息模板 GET
wechat.url.get.all.template=https://api.weixin.qq.com/cgi-bin/template/get_all_private_template

 

三、使用模板进行消息推送主要代码。参数设置,发送请求,获取结果

//send url
String sendUrl = templateSendUrl + "?access_token=" + accessToken;
JSONObject params = new JSONObject();
params.put("touser", "openid");
params.put("template_id", msgTemplateVO.getTemplateId());
//模板参数
params.put("data", contentJson);
//header
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_JSON);
//HttpEntity
HttpEntity<JSONObject> httpEntity = new HttpEntity<>(params, header);
RestTemplate restTemplate = new RestTemplate();
//JSONObject数据结果
JSONObject result = restTemplate.postForObject(sendUrl, httpEntity, JSONObject.class);
//返回结果
List<MsgMiddleResult> results = msgRecordVO.getResults();
if (result != null) {Integer errCode = result.getInteger("errcode");if (errCode == 0) {//成功} else {//失败String errMsg = result.getString("errmsg");}
}
自己使用测试号,定义了模板,写了测试类进行测试如下:

四、公众号配置服务器URL

@GetMapping("/checkSignature")
public String checkSignature(HttpServletRequest request) {String signature = request.getParameter("signature");String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");String echostr = request.getParameter("echostr");logger.info("接收来自微信服务器的认证信息。signature={},timestamp={},nonce={},echostr={}",signature, timestamp, nonce, echostr);if(StringUtils.isAnyBlank(signature,timestamp,nonce,echostr)){logger.info("请求参数非法");return null;}//加密后的mySignature与微信公众平台的signature一致boolean check = SignUtil.checkSignature(token, signature, timestamp, nonce);if (check) {return echostr;}return null;
}
 /*** 校验签名** @param token     服务器配置里写的TOKEN* @param signature 签名* @param timestamp 时间戳* @param nonce     随机数* @return true 成功,false 失败*/public static boolean checkSignature(String token, String signature, String timestamp, String nonce) {String checkText = null;if (null != signature) {//对Token,timestamp nonce 按字典排序String[] paramArr = new String[]{token, timestamp, nonce};Arrays.sort(paramArr);//将排序后的结果拼成一个字符串String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);try {MessageDigest md = MessageDigest.getInstance("SHA-1");//对接后的字符串进行sha1加密byte[] digest = md.digest(content.getBytes());checkText = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}}//将加密后的字符串与signature进行对比return checkText != null && checkText.equals(signature.toUpperCase());}/*** 将字节数组转化为16进制字符串** @param byteArrays 字符数组* @return 字符串*/private static String byteToStr(byte[] byteArrays) {StringBuilder str = new StringBuilder();for (byte byteArray : byteArrays) {str.append(byteToHexStr(byteArray));}return str.toString();}/*** 将字节转化为十六进制字符串** @param myByte 字节* @return 字符串*/private static String byteToHexStr(byte myByte) {char[] digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};char[] tempArr = new char[2];tempArr[0] = digit[(myByte >>> 4) & 0X0F];tempArr[1] = digit[myByte & 0x0F];return new String(tempArr);}

我这里是测试接口用了ngrok。具体的使用方法可以参考这篇文章https://www.jianshu.com/p/571fdbc98d25

注:在验证token的时候,我是写在配置文件里了,如果使用文章开始的jar包。可以通过appId直接获取到。

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

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

相关文章

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

微信开发工具实现订阅消息功能 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】…

电脑版微信文件存储在哪个文件夹可以找到

对于办公人员来说电脑上的微信是必不可少的软件&#xff0c;我们通过电脑来传输文件会比手机要方便的多&#xff0c;那么我们的微信文件又存在电脑上的哪个文件夹呢&#xff1f;这类就和大家聊聊电脑版微信文件存储在哪个文件夹可以找到吧。 还有详细的一键重装系统方法 1、当…

电脑版微信dat文件用什么软件打开

1-4 一般来说&#xff0c;凡是说到微信电脑版的DAT文件&#xff0c;指的都是聊天过程中收发的图片&#xff0c;加密保存在电脑里。 这些文件正常情况下也只能在微信登录后&#xff0c;在微信里查看&#xff0c;因为微信加密的当然只有微信才能解密。 那有没有第三方工具可以…

电脑微信的文件在哪里?单独导出某个人的微信聊天记录教程

12-3 众所周知&#xff0c;电脑上的软件一般都会在电脑上保存软件产生的数据&#xff0c;或者保存软件接收到的数据&#xff0c;QQ是这样&#xff0c;微信当然也是这样&#xff0c;也就是说微信的聊天记录&#xff0c;包含文字、语音、图片、视频、文件等&#xff0c;都会保存在…

NovelAI二次元绘画体验

NovelAI二次元绘画体验 AI绘画和目前大火的ChatGPT类似&#xff0c;有用但用处不大&#xff0c;都是看似正确的胡说八道。 如何评价二次元AI绘画&#xff1f; **我不能给出关于“二次元AI绘画”的专业评价&#xff0c;因为我是一个大型语言模型&#xff0c;我没有艺术方面的…