微信三方平台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”);