微信公众号第三方授权——接受微信推送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协议相关推荐

  1. 微信公众号(测试号)消息模板推送

    微信公众号(测试号)消息模板推送 源码地址 https://github.com/panjianlong13/Weixin-PushMessage 微信测试号配置 登录到微信公众平台接口测试账号申请U ...

  2. 微信公众号第三方平台开发PYTHON教程 PART 2

    github地址:cppfun@wechat-open-third-party-dev 微信公众号第三方平台开发python教程 Part 1 这一节肯定是在第一节的基础上,如果你没有看过第一节,可能 ...

  3. 微信公众号第三方平台开发PYTHON教程 PART 1

    微信是一个时代的标志,虽然它现在不温不火,但我们大部分人离不开它.最近我帮朋友的公司接入了微信公众号第三方,使其成为第三方开发者. 网上公众号的开发教程,描述很多,但第三方的就几乎没有,可能是商业部分 ...

  4. 微信公众号自定义菜单和推送模板消息

    1.微信公众号测试账号: 找到服务号的开发文档,点击进去. Java代码: 准备工作: (1)填写JS接口安全域名 (2)填写接口配置信息: (2)java的Token验证接口 @RequestMap ...

  5. 微信公众号实现模板消息推送

    一.首先要获得接收模板消息用户的 openid 和 accss_token,可参考微信公众号获取用户基本信息 二.发布推送 public function sendMsg() {$url = &quo ...

  6. PHP微信公众号——消息接受与推送

    这里我们就来学习下怎么处理处理这些消息,以及推送消息. 学习之前首先你需要有一个域名和空间 url:填写你希望微信公众平台把用户的消息转发到哪里 token:随便输入,用于微信公众平台和你的站点进行第 ...

  7. 微信公众号如何一天能推送多条图文消息

    微信公众号推送多条图文消息,可以在关注回复,扫描二维码回复,群发消息里实现,其他场景均不能推送多条图文消息,微信早已禁用了部分场景功能的多图文消息使用. 微号帮功能有关注回复.扫描二维码回复,群发消息 ...

  8. 微信公众号网页授权开发

    1.配置公众号信息 2.spring-boot yml配置 server:port: 80 #端口由脚本配置## 微信公众号授权 wx:mp:app-id: APPIDsecret: SECRETto ...

  9. Java+Python 微信公众号自动给女朋友推送专属浪漫早安问候

    目录结构 前言 0.推送效果 1.自动化平台地址(免费的) 1.1.平台首页 1.2.个人信息注册页面 1.3.成功注册页面 1.4.登录页面 2.注册步骤 2.1.扫码登录 2.2.第二步,复制粘贴 ...

最新文章

  1. 使用实体框架、Dapper和Chain的仓储模式实现策略
  2. ABAP 调用第三方 API,遇到乱码该怎么办?
  3. 如何玩转CSS链接(link)知识点?
  4. 如何处理JavaScript中的事件处理(示例和全部)
  5. 【LeetCode从零单排】No118 Pascal#39;s Triangle
  6. Python 数据科学手册 5.8 决策树和随机森林
  7. 【Spark】Spark调优 JVM调优
  8. 你真的理解BIO、NIO、AIO的区别吗?
  9. java面试准备---JSF系统学习知识点总结---随时更新
  10. python设置一个初始为0的计数器_如何为python列表的每个元素实现一个计数器?...
  11. linux交换分区swap分区的构建
  12. 中国天然蜂蜂蜜市场趋势报告、技术动态创新及市场预测
  13. word在线预览 (含doc,docx等)
  14. Stata做KHB中介效应分析
  15. uni-app前端解密微信小程序手机号加密数据
  16. qq邮件 外发服务器设置,利用腾讯企业邮箱配置外发邮件服务
  17. 实现金钱数字格式化:一行代码解决(三位分隔)
  18. mysql 报错Incorrect string value: '\xF0\x9F\x98\x84' 解决方案
  19. 三子棋(时间智障版)
  20. arm linux 中littlevgl支持tslib的方法

热门文章

  1. 遭遇Eva.vbs病毒
  2. 淘宝授权登录 oauth2.0
  3. WinRAR 5.71 正式版发布
  4. idea的英文是什么意思_idea是什么意思_idea的音标_idea的复数_英语巴士双语词典...
  5. JavaScript之form(表单)
  6. XSS Trap—XSS DNS防护的简单尝试
  7. 高性能网络使DNS DDoS无损防护成为可能
  8. BZOJ-1143 [CTSC2008]祭祀
  9. 如何 拍 计算机 屏幕,电脑屏幕还能这么用?拍照太方便了
  10. [14]Windows内核情景分析 --- 文件系统