【小5聊】微信公众号开发系列之验证服务器有效性

【简述】

实际上就是在填写如下配置时,微信需要验证以下第三方服务器接口是否能够正常调用,后续所有微信api接口推送xml数据都是到这个接口

【小5聊】微信公众号开发系列之验证服务器有效性

【验证代码】

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; }
}

【小5聊】微信公众号开发系列之验证服务器有效性

上一篇:PHP开发api接口安全验证 -- 逻辑严谨性判断


下一篇:比特币技术 --- 交易的验签原理