实际上就是在填写如下配置时,微信需要验证以下第三方服务器接口是否能够正常调用,后续所有微信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; } }