我们需要在公众号中对收发的消息进行加密,在公众号中设置了兼容模式进行调试,根据文档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名称即可。
你好,是否有返回rid呢?
enum WXBizMsgCryptErrorCode
{
WXBizMsgCrypt_OK = 0,
WXBizMsgCrypt_ValidateSignature_Error = -40001,
WXBizMsgCrypt_ParseXml_Error = -40002,
WXBizMsgCrypt_ComputeSignature_Error = -40003,
WXBizMsgCrypt_IllegalAesKey = -40004,
WXBizMsgCrypt_ValidateAppid_Error = -40005,
WXBizMsgCrypt_EncryptAES_Error = -40006,
WXBizMsgCrypt_DecryptAES_Error = -40007,
WXBizMsgCrypt_IllegalBuffer = -40008,
WXBizMsgCrypt_EncodeBase64_Error = -40009,
WXBizMsgCrypt_DecodeBase64_Error = -40010
};
找到原因了,是参数Token,使用错误,应该使用微信公众号->基本配置->服务器配置里的令牌(Token), 而不是每两小时刷新一次的accesstoken
问题解决了吗?我这边也遇到同样的问题,直接是下周微信提供的demo。