微信公众号第三方授权开发——推送component_verify_ticket协议
微信公众号第三方授权——接受微信推送component_verify_ticket协议
作者:凌晨四点的newyork
接收component_verify_ticket
在第三方平台创建审核通过后,微信服务器会向其“授权事件接收URL”每隔10分钟定时推送component_verify_ticket。第三方平台方在收到ticket推送后也需进行解密(详细请见【消息加解密接入指引】),接收到后必须直接返回字符串success。
一、接受到微信推送的消息参数值如下
/*** @title 微信端定时通知ticket接收* @param timestamp* @param nonce* @param msgSignature* @return*/@RequestMapping(value = "/ticket", produces = "application/json; charset=utf-8")public String notifyWxTicket(@RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce,@RequestParam("msg_signature") String msgSignature, @RequestBody String postData)
参数说明:timestamp时间戳;nonce随机字符串;msg_signature签名串;postData即xml数据内容。
postData数据示例:
<xml><AppId><![CDATA[AppId]]></AppId><Encrypt><![CDATA[加密XML]]></Encrypt>
</xml>
二、解密xml数据内容
下载官方demo
找到java的文件夹
在项目中的pom文件,添加如下依赖:
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.9</version>
</dependency>
<!--解密jar包-->
<dependency><groupId>com.aes</groupId><artifactId>aes-jre</artifactId><version>1.6</version>
</dependency>
注意:此处引入微信第三方的jar包需要使用maven引入本地jar包。
使用微信第三方的jar包提供的方法对xml数据解密
将参数换成上面接受到的参数数据
/*** 对微信推送消息进行解密,获取ComponentVerifyTicket* * @param timestamp* @param nonce* @param msgSignature* @param postData* @return*/public Map<String, String> Decrypt(String timestamp, String nonce, String msgSignature, String postData)throws Exception {log.info("token: " + token);log.info("encodingAesKey: " + encodingAesKey);log.info("appId: " + appId);WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);String requestXml = pc.decryptMsg(msgSignature, timestamp, nonce, postData);log.info("解密后明文是: " + requestXml);Map<String, String> xmlMap = XMLParser.getMapFromXML(requestXml);//xml格式数据转mapreturn xmlMap;}
高能预警,如下内容,皆为真实亲测,微信第三方jar包中存在一部分坑…
下面是jar包中的源码,对于上面提到的密文postData的提取代码:(箭头表示------点进去)
/*** 提取出xml数据包中的加密消息* @param xmltext 待提取的xml字符串* @return 提取出的加密消息字符串* @throws AesException */public static Object[] extract(String xmltext) throws AesException {Object[] result = new Object[3];try {DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();StringReader sr = new StringReader(xmltext);InputSource is = new InputSource(sr);Document document = db.parse(is);Element root = document.getDocumentElement();NodeList nodelist1 = root.getElementsByTagName("Encrypt");NodeList nodelist2 = root.getElementsByTagName("ToUserName");result[0] = 0;result[1] = nodelist1.item(0).getTextContent();result[2] = nodelist2.item(0).getTextContent();return result;} catch (Exception e) {e.printStackTrace();throw new AesException(AesException.ParseXmlError);}}
注意看这五行代码
NodeList nodelist1 = root.getElementsByTagName("Encrypt");NodeList nodelist2 = root.getElementsByTagName("ToUserName");result[0] = 0;result[1] = nodelist1.item(0).getTextContent();result[2] = nodelist2.item(0).getTextContent();
与上面贴出的postData数据示例做比对,发现微信推送过来的xml数据包中并没有ToUserName这个标签。说明一下,这个ToUserName实际上是一个微信号,在此处微信并没有推送,所以只需把上边这五行代码中跟ToUserName有关的代码去掉即可,与此同时,需要去掉如下图中的两个异常,否则会一直发生异常。
贴一个我解密后的数据示例:
<xml>
<AppId><![CDATA[wx6***********26]]></AppId>
<CreateTime>1557371567</CreateTime>
<InfoType><![CDATA[component_verify_ticket]]></InfoType>
<ComponentVerifyTicket><![CDATA[ticket@@@*******************]]></ComponentVerifyTicket>
</xml>
需要提取出ComponentVerifyTicket这个的值,ComponentVerifyTicket的有效时间为12小时,建议保存最近可用的component_verify_ticket,提供后续获取第三方component_access_token时使用,保存方式自选,可以是数据库,缓存,或静态类等。
微信公众号第三方授权开发——推送component_verify_ticket协议相关推荐
- 微信公众号(测试号)消息模板推送
微信公众号(测试号)消息模板推送 源码地址 https://github.com/panjianlong13/Weixin-PushMessage 微信测试号配置 登录到微信公众平台接口测试账号申请U ...
- 微信公众号第三方平台开发PYTHON教程 PART 2
github地址:cppfun@wechat-open-third-party-dev 微信公众号第三方平台开发python教程 Part 1 这一节肯定是在第一节的基础上,如果你没有看过第一节,可能 ...
- 微信公众号第三方平台开发PYTHON教程 PART 1
微信是一个时代的标志,虽然它现在不温不火,但我们大部分人离不开它.最近我帮朋友的公司接入了微信公众号第三方,使其成为第三方开发者. 网上公众号的开发教程,描述很多,但第三方的就几乎没有,可能是商业部分 ...
- 微信公众号自定义菜单和推送模板消息
1.微信公众号测试账号: 找到服务号的开发文档,点击进去. Java代码: 准备工作: (1)填写JS接口安全域名 (2)填写接口配置信息: (2)java的Token验证接口 @RequestMap ...
- 微信公众号实现模板消息推送
一.首先要获得接收模板消息用户的 openid 和 accss_token,可参考微信公众号获取用户基本信息 二.发布推送 public function sendMsg() {$url = &quo ...
- PHP微信公众号——消息接受与推送
这里我们就来学习下怎么处理处理这些消息,以及推送消息. 学习之前首先你需要有一个域名和空间 url:填写你希望微信公众平台把用户的消息转发到哪里 token:随便输入,用于微信公众平台和你的站点进行第 ...
- 微信公众号如何一天能推送多条图文消息
微信公众号推送多条图文消息,可以在关注回复,扫描二维码回复,群发消息里实现,其他场景均不能推送多条图文消息,微信早已禁用了部分场景功能的多图文消息使用. 微号帮功能有关注回复.扫描二维码回复,群发消息 ...
- 微信公众号网页授权开发
1.配置公众号信息 2.spring-boot yml配置 server:port: 80 #端口由脚本配置## 微信公众号授权 wx:mp:app-id: APPIDsecret: SECRETto ...
- Java+Python 微信公众号自动给女朋友推送专属浪漫早安问候
目录结构 前言 0.推送效果 1.自动化平台地址(免费的) 1.1.平台首页 1.2.个人信息注册页面 1.3.成功注册页面 1.4.登录页面 2.注册步骤 2.1.扫码登录 2.2.第二步,复制粘贴 ...
最新文章
- 使用实体框架、Dapper和Chain的仓储模式实现策略
- ABAP 调用第三方 API,遇到乱码该怎么办?
- 如何玩转CSS链接(link)知识点?
- 如何处理JavaScript中的事件处理(示例和全部)
- 【LeetCode从零单排】No118	Pascal#39;s Triangle
- Python 数据科学手册 5.8 决策树和随机森林
- 【Spark】Spark调优 JVM调优
- 你真的理解BIO、NIO、AIO的区别吗?
- java面试准备---JSF系统学习知识点总结---随时更新
- python设置一个初始为0的计数器_如何为python列表的每个元素实现一个计数器?...
- linux交换分区swap分区的构建
- 中国天然蜂蜂蜜市场趋势报告、技术动态创新及市场预测
- word在线预览 (含doc,docx等)
- Stata做KHB中介效应分析
- uni-app前端解密微信小程序手机号加密数据
- qq邮件 外发服务器设置,利用腾讯企业邮箱配置外发邮件服务
- 实现金钱数字格式化:一行代码解决(三位分隔)
- mysql 报错Incorrect string value: '\xF0\x9F\x98\x84' 解决方案
- 三子棋(时间智障版)
- arm linux 中littlevgl支持tslib的方法
热门文章
- 遭遇Eva.vbs病毒
- 淘宝授权登录 oauth2.0
- WinRAR 5.71 正式版发布
- idea的英文是什么意思_idea是什么意思_idea的音标_idea的复数_英语巴士双语词典...
- JavaScript之form(表单)
- XSS Trap—XSS DNS防护的简单尝试
- 高性能网络使DNS DDoS无损防护成为可能
- BZOJ-1143 [CTSC2008]祭祀
- 如何 拍 计算机 屏幕,电脑屏幕还能这么用?拍照太方便了
- [14]Windows内核情景分析 --- 文件系统