微信开发之服务器认证

时间:2024-03-07 20:26:17

  做公司的微信开发也有一段时间了,从开始的茫然无知,到现在的小有了解,中间查阅资料、微信API以及一步一步手动尝试的个中酸爽,只有自己最清楚。但坚持下来之后收获到的也很多。本着分享精神,现在总结一下微信开发的一些心得体会。

  首先,申请公众号,成为开发者这些就不再啰嗦,这里注意介绍一下微信服务器url验证,这也是微信开发的第一步以及最重要的一步。首先你得有一个服务器,需要有公网IP。我本人使用的是阿里云服务器(每个月200大洋,肉疼。。。),接下来,你需要开发自己的接口,这里本人新建一个mvc项目(webform也可以,个人喜好,道理是一样的),在homecongroller里面新建一个action方法,方法接收四个参数,参数名称为小写(记得是小写),其中,nonce是一个随机数字,timestamp64位整型的时间戳echostr是微信验证的时候发送的随机串,signature是加密签名。这四个参数是微信给我们的接口地址发送请求的时候附加上去的。所以我们需要对它进行验证(当然这里不做任何验证,直接返回echostr也是可以通过验证的,但为了安全性考虑,还是需要进行验证)。

  验证方法是,拿到noncetimestamp以及你自己设置的token,进行字典排序,然后对排序后的字符串拼接成一个新的字符串,对这个字符串进行sha1加密,并且于signature进行对比,如果相等,则表示该请求是微信服务器发送的。下面贴上验证代码:

  Sha1加密方法:

public string Sha1(string input)
        {
            byte[] cleanBytes = Encoding.Default.GetBytes(input);
            byte[] hashedBytes = System.Security.Cryptography.SHA1.Create().ComputeHash(cleanBytes);
            return BitConverter.ToString(hashedBytes).Replace("-", "");
        }
View Code

 

  请求真实性校验:

public bool TokenAuthentication(string nonce, string timestamp, string signture)
        {
            bool tag = false;
            try
            {
                string token = "开发者token";
                List<string> list = new List<string>() { token, nonce, timestamp };
                list.Sort();
                string str = "";
                foreach (string s in list)
                    str += s;
                str = Sha1(str);
                str = str.ToLower();
                signture = signture.ToLower();
                if (signture.Equals(str))
                    tag = true;
            }
            catch (Exception)
            {

            }
            return tag;
        }
View Code

  控制器部分:

public class HomeController : Controller
    {
        //
        // GET: /Home/
        public ActionResult Index(string nonce, string timestamp, string echostr, string signature)
        {
            //验证请求是否来自微信服务器
            if(!TokenAuthentication(nonce,timestamp,signature))
            {
                //请求不是来自微信服务器
                return Content("非法的请求!");
            }
            //验证通过,返回echostr即可通过验证
            return Content(echostr);
        }

        #region sha1加密(不可逆)
        /// <summary>
        /// sha1加密(不可逆)
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public string Sha1(string input)
        {
            byte[] cleanBytes = Encoding.Default.GetBytes(input);
            byte[] hashedBytes = System.Security.Cryptography.SHA1.Create().ComputeHash(cleanBytes);
            return BitConverter.ToString(hashedBytes).Replace("-", "");
        }
        #endregion

        #region 微信消息真实性验证
        /// <summary>
        /// 微信消息真实性验证
        /// </summary>
        /// <param name="nonce"></param>
        /// <param name="timestamp"></param>
        /// <param name="signture"></param>
        /// <returns></returns>
        public bool TokenAuthentication(string nonce, string timestamp, string signture)
        {
            bool tag = false;
            try
            {
                string token = "开发者token";
                List<string> list = new List<string>() { token, nonce, timestamp };
                list.Sort();
                string str = "";
                foreach (string s in list)
                    str += s;
                str = Sha1(str);
                str = str.ToLower();
                signture = signture.ToLower();
                if (signture.Equals(str))
                    tag = true;
            }
            catch (Exception)
            {

            }
            return tag;
        }
        #endregion
    }
View Code

  以上工作完毕之后,将你的项目发布到你的服务器,一定要80端口,然后填写token以及加密密钥,点击提交即可完成服务器配置。服务器配置之后,微信服务器会把相关的信息发送到你的这个url上面(不过要先到微信公众号的基本配置-->服务器配置里面启用)。

  

  配置完成之后,点击提交按钮即可。