微信公众号授权验证签名

自带BGM的青春 2017-03-24 10:33:37
/**
* 检验消息的真实性,并且获取解密后的明文.
* <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)) {//这块比较时候不一样,我已经对照了好久,AppSecret也重置了但是都不行
throw new AesException(AesException.ValidateSignatureError);
}

// 解密
String result = decrypt(encrypt[1].toString());
return result;
}
...全文
618 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengchengupup 2019-05-25
  • 打赏
  • 举报
回复
参数取错了 取的应该是request.getParameter("msg_signature")。 有signature跟msg_signature之分,我也是找了好久才解决这个
自带BGM的青春 2017-03-24
  • 打赏
  • 举报
回复
postData.toString().trim()这个参数不是URL是xml, <xml> <AppId><![CDATA[wx51a8e16a18240358]]></AppId> <Encrypt><![CDATA[UwIsm684NQEEjYug4cAIuEptIpt3rnvenXlhaE3RVVYeKCpzdpzSYh50SyGkNW3tNJ7JGUCMKedlXw4Kpz+HhzmgNcZFCanO6nhVsAvmz+RJcN+r9gASwd4DbPyGPl1lEmvcHBbxJumg6zFaBxTs1DbvGPHbQBc+YD4X7QbFiMgNih3AOLjt4XcjEqUMWP/jouSd6WjzrMhzdZLVH4rKmy/b0lizmkpnBcKhbKVzBZ+5M4tsHFTsUnXbAGvyTiaI9bJU3wD4/QL3rEVYrb40WQCnK7XkN+uK8slRZZSmuFUNNJTRDZB2iDxy4LS4mfTPyV2JZJqHcjDC28/Y9cWYqMjy3IVIzUEtBiHGLSjxm2eG1YKF7z0CMbv+p4CQzZYF/pN4Clpix+BvbzhKKft+2Nm38b6XHDej3VLJ6rHqFtgkOT2JLRDabfknDMZFQOmDpxa1D2I+tQhP5OjsyFmlBg==]]></Encrypt> </xml> 这种的
s593360340 2017-03-24
  • 打赏
  • 举报
回复
String afterDecrpt = pc.decryptMsg(signature, timestamp, nonce, postData.toString().trim());//死在了这里面 就是这个啊,你把这几个参数输入到那个校验工具里面去,生成的密文 看跟微信服务器返回的肯定不一致,所以你那地方就抛异常了, 一般不一致的 无外乎几个结果 1:token过期 2:url写的不对(这个很大概率) 好像是要https开头,还是http开头,忘记了。然后你的微信公众号里面的几个设置项什么的 都要配置好
自带BGM的青春 2017-03-24
  • 打赏
  • 举报
回复
我用的不是那个参数,我是 request.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); timestamp = request.getParameter("timestamp"); nonce = request.getParameter("nonce"); signature = request.getParameter("signature"); // Authorization authorization = new Authorization(); //从请求中读取整个post数据 //从请求中读取整个post数据 InputStream inputStream = request.getInputStream(); String postData = IOUtils.toString(inputStream, "UTF-8"); System.out.println(postData); WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId); String afterDecrpt = pc.decryptMsg(signature, timestamp, nonce, postData.toString().trim());//死在了这里面
s593360340 2017-03-24
  • 打赏
  • 举报
回复
微信有个js接口签名校验的工具的 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 用这个区校验你的参数看是不是正确的, 一般都是url那地方错了

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧