问题解决了吗?我这边也遇到同样的问题,直接是下周微信提供的demo。
微信公众号消息加解密为何在验签时失败?我们需要在公众号中对收发的消息进行加密,在公众号中设置了兼容模式进行调试,根据文档https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Message_encryption_and_decryption_instructions.html下载了demo,demo可以正常运行,但是如果把其中的参数改成我们公众号自己的参数,解密时在验签步骤就失败了,代码运行后得到的signature和附带的signature不一样,导致验签失败。 我们使用的语言是C#,原本的代码如下: //公众平台上开发者设置的token, appID, EncodingAESKey string sToken = "QDG6eK"; string sAppID = "wx5823bf96d3bd56c7"; string sEncodingAESKey = "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C"; Tencent.WXBizMsgCrypt wxcpt = new Tencent.WXBizMsgCrypt(sToken, sEncodingAESKey, sAppID); /* 1. 对用户回复的数据进行解密。 * 用户回复消息或者点击事件响应时,企业会收到回调消息,假设企业收到的推送消息: * POST /cgi-bin/wxpush? msg_signature=477715d11cdb4164915debcba66cb864d751f3e6×tamp=1409659813&nonce=1372623149 HTTP/1.1 Host: qy.weixin.qq.com Content-Length: 613 * * */ string sReqMsgSig = "477715d11cdb4164915debcba66cb864d751f3e6"; string sReqTimeStamp = "1409659813"; string sReqNonce = "1372623149"; string sReqData = ""; string sMsg = ""; //解析之后的明文 int ret = 0; ret = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, sReqData, ref sMsg); if (ret != 0) { System.Console.WriteLine("ERR: Decrypt fail, ret: " + ret); return; } System.Console.WriteLine(sMsg); 当把其中的参数sToken,sAppID,sEncodingAESKey,sReqMsgSig,sReqTimeStamp,sReqNonce,sReqData替换成真实推送过来的参数,验签步骤就失败了,失败的原因是代码生成的signature和传递过来的signature不一致 ret = VerifySignature(m_sToken, sTimeStamp, sNonce, sEncryptMsg, sMsgSignature); private static int VerifySignature(string sToken, string sTimeStamp, string sNonce, string sMsgEncrypt, string sSigture) { string hash = ""; int ret = 0; ret = GenarateSinature(sToken, sTimeStamp, sNonce, sMsgEncrypt, ref hash); if (ret != 0) return ret; //System.Console.WriteLine(hash); if (hash == sSigture) return 0; else { return (int)WXBizMsgCryptErrorCode.WXBizMsgCrypt_ValidateSignature_Error; } } 返回的ret结果是-40001,尝试过sToken使用token的名称或者最新的值,都在验签步骤失败,一样的错误。 [图片] 根据文档https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Before_Develop/Technical_Plan.html,消息解密需要用到的数据有timestamp, nonce, msg_signature(来自request.querystring), Encrypt Message(来自Request.InputStream中的密文消息体Encrypt节点), Token(微信开放平台上,服务方设置的接收消息的校验 token)。 验签时根据Token, timestamp, nonce, Encrypt生成signature, 和msg_signature比对完成验签。 请问问题出在哪里?是哪个参数没有设置好? 已解决,是Token参数使用错了,用的是AccessToken,导致生成的签名不一致,使用公众号中设置的Token名称即可。
04-15