【简述】
实际上就是在填写如下配置时,微信需要验证以下第三方服务器接口是否能够正常调用,后续所有微信api接口推送xml数据都是到这个接口
【验证代码】
1)获取参数
微信在调用第三方服务器接口时,会带上echostr、signature、timestamp、nonce参数
2)字典排序
将token, timestamp, nonce,这个三个变量进行字典排序
sha1加密上面字典排序得到的加密字符串,然后喝微信带过来的参数signature对比,一致则表示通过,然后响应echostr即可
3)可以将验证方法单独写,返回true和false来验证
- 代码如下
看了下面的代码,有人就会问了,既然最后是输出echostr,那么我直接写个输出echostr不就得了,我的回答是的
那还要什么验证,目的就是验证消息的确来自微信服务器
//先验证通过再写业务逻辑代码 - 验证服务器有效性
public void Data()
{
bool flag = CheckData();
if (flag)
{
Response.Write(Request.QueryString["echostr"]);
Response.End();
//第一次配置填写URL验证通过后,将上面注释,在下面写自己的业务逻辑代码
}
}
public bool CheckData()
{
bool flag = false;
try
{
CheckInfoModel CheckInfoModel = new CheckInfoModel();
string echoStr = Request.QueryString["echostr"];
CheckInfoModel.echostr = echoStr;
string signature = Request.QueryString["signature"];
string timestamp = Request.QueryString["timestamp"];
string nonce = Request.QueryString["nonce"];
string token = "weixin2021"; //自定义的那个token字符串
CheckInfoModel.signature = signature;
CheckInfoModel.timestamp = timestamp;
CheckInfoModel.nonce = nonce;
CheckInfoModel.token = token;
string[] tmpArr = { token, timestamp, nonce };
Array.Sort(tmpArr); //字典排序
string arraystring = string.Join("", tmpArr);//将三个字符串组成一个字符串
CheckInfoModel.arraystring = arraystring;
string arraystringsha1 = FormsAuthentication.HashPasswordForStoringInConfigFile(arraystring, "SHA1");//进行sha1加密
CheckInfoModel.arraystringsha1 = arraystringsha1;
arraystringsha1 = arraystringsha1.ToLower();
//加过密的字符串与微信发送的signature进行比较,一样则通过微信验证,否则失败。
if (arraystringsha1 == signature)
{
flag = true;
}
}
catch(Exception ex)
{
}
finally
{
/*
{
"signature":"ea66e58266edf2e640b1aacfb6a6cb8bf20e7847",
"timestamp":"1618101663",
"nonce":"143865222",
"token":"weixin2021",
"echostr":"1241980243149020575",
"arraystring":"1438652221618101663weixin2021",
"arraystringsha1":"EA66E58266EDF2E640B1AACFB6A6CB8BF20E7847"
}
*/
}
return flag;
}
public class CheckInfoModel
{
public string signature { get; set; }
public string timestamp { get; set; }
public string nonce { get; set; }
public string token { get; set; }
public string echostr { get; set; }
public string arraystring { get; set; }
public string arraystringsha1 { get; set; }
}