微信三方平台component_verify_ticket数据的解密

首先,接收component_verify_ticket信息

其中signature,timestamp,nonce,encryptType,msgSignature这些信息可以通过参数接收,直接接收参数就ok了,下面的xml则需要重request对象中接收
BufferedReader reader = request.getReader();
System.out.println(IOUtils.toString(reader));
在这里插入图片描述

然后就是最坑的,解析这个消息

为什么我会说解析消息坑呢,因为你按照官方给的文档去跑,并把接收到的参数带入,你就会发现,各种签名错误,偶尔还会有空指针……………………………………………………………………………………………

错误实例

按照官方的方法,我们整理后可以得到如下解密方式:

WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
String format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%1$s]]></Encrypt></xml>";
String fromXML = String.format(format, xml);
String result2 = pc.decryptMsg(msgSignature, timestamp, nonce, fromXML);

我天真的以为将加密的数据导入到format 这个格式里就ok了,,,,于是第一个签名错误诞生了

注意:直接将原xml串带入也会报错

正确方式

写文章主要是将自己的解决方案写出来说以我这里就不过多描述错误的案例了,正确方式应该是将xml变为一下格式,然后进行解密:
这里我将项目里放了两份,其中一份没有换行方便copy,并且对数据进行appid和encrypt进行了改变,主要是防止appid等数据泄露

<xml><ToUserName><![CDATA[toUser]]></ToUserName><AppId><![CDATA[wxb0d0be000000000]]></AppId><Encrypt><![CDATA[/cAhm000003hedlGM]]></Encrypt></xml>
<xml>
	<ToUserName><![CDATA[toUser]]></ToUserName>
	<AppId><![CDATA[wxb0d0be000000000]]></AppId>
	<Encrypt><![CDATA[/cAhm000003hedlGM]]></Encrypt>
</xml>

这个时候再去进行解密就ok了
完整代码:

    @Test
    public void test() throws AesException {
        String signature="d6ecd60000000000000c911f28c30";
        String timestamp="1577000003";
        String nonce="13650000050";
        String encryptType="aes";
        String msgSignature="c3b9db9f8d00000000000000000000000000b057f";
        String encodingAesKey = "ildycnk0000000000000000000000iiuxwwdl";
        String token = "6a00000000000000031";
        String appId="wxb0d0be000000000";
        String  xml="<xml><ToUserName><![CDATA[toUser]]></ToUserName><AppId><![CDATA[wxb0d0be000000000]]></AppId><Encrypt><![CDATA[/cAhm000003hedlGM]]></Encrypt></xml>";
        WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
        String result2 = pc.decryptMsg(msgSignature, timestamp, nonce, xml);
        System.out.println("解密后明文: " + result2);
    }

这样就ok了,,,记得response.getWriter().write(“success”);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值