微信获取临时ticket:每10分钟推送一次用户需要在接收信息后想微信后台推送"success"字符串

推送字段为 nonce timestamp signature msg_signature

其中msg_signature需要对字段进行校验操作 需要用到加密工具 SHA加密(对token,timestamp,nonce)进行消息加密

得出数据与msg_signature是否一致(消息来源检测)

public void processAuthorizeEvent(HttpServletRequest request) throws IOException, DocumentException, AesException {String nonce = request.getParameter("nonce");String timestamp = request.getParameter("timestamp");String signature = request.getParameter("signature");String msgSignature = request.getParameter("msg_signature");if (!StringUtils.isNotBlank(msgSignature))return;// 微信推送给第三方开放平台的消息一定是加过密的,无消息加密无法解密消息boolean isValid = checkSignature(Configure.getValue("MCToken"), signature, timestamp, nonce);//消息加密校验if (isValid) {StringBuilder sb = new StringBuilder();BufferedReader in = request.getReader();String line;while ((line = in.readLine()) != null) {sb.append(line);}String xml = sb.toString();
//            LogUtil.info("第三方平台全网发布-----------------------原始 Xml="+xml);String encodingAesKey = Configure.getValue("MEADKey");// 第三方平台组件加密密钥
//            String appId = getAuthorizerAppidFromXml(xml);// 此时加密的xml数据中ToUserName是非加密的,解析xml获取即可//LogUtil.info("第三方平台全网发布-------------appid----------getAuthorizerAppidFromXml(xml)-----------appId="+appId);WXBizMsgCrypt pc = new WXBizMsgCrypt(Configure.getValue("MCToken"), encodingAesKey, Configure.getValue("AppID"));xml = pc.decryptMsg(msgSignature, timestamp, nonce, xml);//解密处理
//            LogUtil.info("第三方平台全网发布-----------------------解密后 Xml="+xml);processAuthorizationEvent(xml);//保存ticket}}
   /*** 判断是否加密** @param token* @param signature* @param timestamp* @param nonce* @return*/public static boolean checkSignature(String token, String signature, String timestamp, String nonce) {System.out.println("###token:" + token + ";signature:" + signature + ";timestamp:" + timestamp + "nonce:" + nonce);boolean flag = false;if (signature != null && !signature.equals("") && timestamp != null && !timestamp.equals("") && nonce != null && !nonce.equals("")) {String sha1 = "";String[] ss = new String[]{token, timestamp, nonce};Arrays.sort(ss);for (String s : ss) {sha1 += s;}sha1 = AddSHA1.SHA1(sha1);if (sha1.equals(signature)) {flag = true;}}return flag;}
}
/*** 检验消息的真实性,并且获取解密后的明文.* <ol>*    <li>利用收到的密文生成安全签名,进行签名验证</li>*   <li>若验证通过,则提取xml中的加密消息</li>*     <li>对消息进行解密</li>* </ol>* * @param msgSignature 签名串,对应URL参数的msg_signature* @param timeStamp 时间戳,对应URL参数的timestamp* @param nonce 随机串,对应URL参数的nonce* @param postData 密文,对应POST请求的数据* * @return 解密后的原文* @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息*/public String decryptMsg(String msgSignature, String timeStamp, String nonce, String postData)throws AesException {// 密钥,公众账号的app secret// 提取密文Object[] encrypt = XMLParse.extract(postData);// 验证安全签名String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt[1].toString());// 和URL中的签名比较是否相等// System.out.println("第三方收到URL中的签名:" + msg_sign);// System.out.println("第三方校验签名:" + signature);
//      if (!signature.equals(msgSignature)) {
//          throw new AesException(AesException.ValidateSignatureError);
//      }// 解密String result = decrypt(encrypt[1].toString());return result;}/*** 对密文进行解密.* * @param text 需要解密的密文* @return 解密得到的明文* @throws AesException aes解密失败*/String decrypt(String text) throws AesException {byte[] original;try {// 设置解密模式为AES的CBC模式Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES");IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));cipher.init(Cipher.DECRYPT_MODE, key_spec, iv);// 使用BASE64对密文进行解码byte[] encrypted = Base64.decodeBase64(text);// 解密original = cipher.doFinal(encrypted);} catch (Exception e) {e.printStackTrace();throw new AesException(AesException.DecryptAESError);}String xmlContent, from_appid;try {// 去除补位字符byte[] bytes = PKCS7Encoder.decode(original);// 分离16位随机字符串,网络字节序和AppIdbyte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20);int xmlLength = recoverNetworkBytesOrder(networkOrder);xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET);from_appid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length),CHARSET);} catch (Exception e) {e.printStackTrace();throw new AesException(AesException.IllegalBuffer);}// appid不相同的情况if (!from_appid.equals(appId)) {throw new AesException(AesException.ValidateAppidError);}return xmlContent;}/*** 保存Ticket** @param xml*/void processAuthorizationEvent(String xml) {Document doc;try {doc = DocumentHelper.parseText(xml);Element rootElt = doc.getRootElement();String ticket = rootElt.elementText("ComponentVerifyTicket");//这就是需要的ticketif (oConvertUtils.isNotEmpty(ticket)) {//对应的逻辑处理LogUtil.info("8、推送component_verify_ticket协议-----------ticket = " + ticket);EssentialInfo essentialInfo =new EssentialInfo();essentialInfo.setId(Configure.getValue("ticketId"));essentialInfo.setRemark(ticket);essentialInfoService.updateByPrimaryKeySelective(essentialInfo);}} catch (DocumentException e) {e.printStackTrace();}}

这是微信发送的<xml>    <AppId><![CDATA[wxb59277af5bfc4209]]></AppId>    <Encrypt><![CDATA[CWMcnHwxoGoc51SUP02lZOxo7BcYDaIb0GWfLJfbU+R7kCDzLhW+Lk1qSRaGu0BPIaIYWcTbFL4YYuRsbEMu/iTZM1EjrZXiF4xapcZEPY7OmrVydw6rxvyAnUUADAyG7CtwnrE27UQpZJY+TG9vPrrJE4IFbtoFt+s9pdPLO0CJSLEGrocYcnLTuUd4igNclfmzlX6FkkZSv5H0T/pFWXn4xGSzwus9MCX0Qc+AeTaZmQYlU+ffEQI50k6DyyVcVc7lYdY8FXWWrGVpWujNMMUQ0FfqB7n8wbyqwZOOxPONbx0vnftfsKkEfzddQ8ioOoPk/1kVrOoZxlJjb8abONy35j2oyUPeLDIv2KjRCR8pvsTZ8id4WHNR9PE9njiOrJYXZTLaZesPq1wUgOSmt9mAIDQdGctqC85V2IeaXo78cZBP1gsBtDNUaJzPvYM+FNuyke4Qiax1CTHqCFng6A==]]></Encrypt></xml>密文

这是消息加解密出来的数据

<xml><AppId><![CDATA[wxb59277af5bfc4209]]></AppId>

<CreateTime>1523842949</CreateTime>

<InfoType><![CDATA[component_verify_ticket]]></InfoType>

<ComponentVerifyTicket><![CDATA[ticket@@@f-8eeS5HYKjDTfBUHqZrqQ24QYrMEMr4aM9oqEuApSHlVUd5ifSMDtRx8osp1Lo_yuVW4_uUs4Bq0K5kOEUPfQ]]></ComponentVerifyTicket>

</xml>

微信公众号ticket的获取过程全部完成

微信开放平台10分钟推送一次临时ticket相关推荐

  1. 京东京麦商家开放平台的消息推送架构演进之路

    1.前言 京麦实时消息推送是京东的京麦商家开放平台的核心组成部分.从消息源到消息中心再到触达用户,以及最终根据消息协议呼起操作页面,京麦实时消息推送是一个完整且健康的生态闭环.下面我会详细的介绍下京麦 ...

  2. php订阅号发送消息,PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息...

    2013年10月06日最新整理. PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制 微信公共平台消息主动推送接口一直是腾讯的私用接口,相信很多朋友都非常想要用到这个功能. 通过学习 ...

  3. 淘宝开放平台:消息推送接口问题一则

    https://open.taobao.com/doc.htm?spm=a219a.7386653.0.0.120c669apt4vTq&docId=1&docType=15& ...

  4. 微信开放平台初步对接开发(PHP)

    首先,申请一个微信开放平台,相关的申请流程这里就不具体说了,当时傻乎乎的申请了定制化开发服务商,导致耽误了一段时间,一定要申请平台型服务商! 第二,选择合适的代码框架,如果你的环境能够支持EasyWe ...

  5. 微信开放平台全网发布

    最近刚做了微信开放平台全网发布的开发,整理一下贴出来 前置条件 已经做好了相关的开发工作(比如扫码授权之类的),项目导入了微信SDK(最后会附上我自己用的SDK jar包) sdk jar 地址: h ...

  6. EasyWeChat微信开放平台第三方平台接入流程

    授权流程技术说明: https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Authorization_Process ...

  7. EasyWeChat微信开放平台第三方平台接入

    目录 实例化 微信服务器推送事件 预授权 获取预授权 Code 获取预授权 URL API 列表 使用授权码换取公众号的接口调用凭据和授权信息 获取授权方的公众号帐号基本信息 获取授权方的选项设置信息 ...

  8. 微信开放平台PC端扫码登录

    最近公司给我安排一个微信登录的功能,需求是这样的: 1.登录授权 点击二维码图标后,登录界面切换为如下样式(二维码),微信扫描二维码并授权,即可成功登录:    若当前账号未绑定微信账号,扫描后提示& ...

  9. 微信小程序开发—消息推送

    微信小程序的消息推送简单的说就是发送一条微信通知给用户,用户点开消息可以查看消息内容,可以链接进入到小程序的指定页面. 微信小程序消息推送需要用户触发动作才能发送消息,比如用户提交订单.支付成功.一次 ...

最新文章

  1. LeetCode 98. Validate Binary Search Tree--C++解法--判断是否是BST--递归,迭代做法,中序遍历
  2. 原型模式Prototype,constructor,__proto__详解
  3. 网页加载报错——URL网页连接错误
  4. macOS 10.12 Sierra 中文官网正式推出
  5. linux命令详解:md5sum命令
  6. MyBatis 源码解读-带着问题去看源码
  7. QQ号终于可以当传家宝了!没车没房的,就留几个游戏账号给儿子吧?
  8. mysql表名怎么拼接_自学MySQL第九天
  9. UnityShader - 模拟动态光照特效
  10. 21天学通mysql_《21天学通JavaWeb》 - 随笔分类 - 疯狂delphi - 博客园
  11. ensp查看历史配置命令_学习华为ensp基本命令小技巧
  12. BAT 批处理的注释语句
  13. 黑莓7100T激活上网、彩信设置(转)
  14. java获取本机ip和端口_java获取本机ip和端口
  15. 软件项目工作量评估方法COSMIC重点笔记
  16. 安全攻防技能——身份认证
  17. MyBatis中传递多个参数的方法以及传入混合参数的获取方式
  18. 104Triangle Area三角面积
  19. 好文:中国Saas蜕变史
  20. 大使、布道师、贡献者,OpenHarmony社区发起三大贡献者激励计划

热门文章

  1. 会员体系是以权益为表现的用户场景连接
  2. 纤亿通带您了解光开关是如何工作的?
  3. Dgraph安装和使用(一)
  4. pcie m.2固态硬盘装机后无法识别到启动盘
  5. 快速搭建迷你云 mini cloud storage
  6. 源码安全:悬在大厂头上的达摩克利斯之剑
  7. android jelly bean 电影工作室,Jelly Bean仍然是最流行的Android版本
  8. 计算机类专业小组,计算机音乐创作类专业组
  9. C# 读取并显示word文档中的内容
  10. 计算机科学是最受欢迎的英文,比较好写的计算机科技英语论文题目 计算机科技英语论文题目哪个好...