run in this way,   no why,   only for you heart
CSDN博客(点击进入) CSDN
51CTO(点击进入) 51CTO

微信公众号开发--服务器接入

前提:
1.微信订阅号。
2.有自己的域名,且可以正常使用。


1.在微信公众平台注册账号,因为是个人使用,企业号和服务号个人都是无法注册的,我们只能注册一个订阅号,订阅号其实也有相对优势每天可以发布一篇文章。

2.注册后进入微信公众平台中,左侧菜单栏最下方“开发”是微信公众号开发的API,进入"基本配置"中,可以看到公众号的基本配置信息,最上方的“公众号开发信息”如下图,这里的内容先别管。
在这里插入图片描述

3.下面的“服务器配置”既是我们要做服务器接入的部分,截图如下(图中的账号已经配置好),其中包括“服务器地址”,“TOKEN”,“密匙”以及“加密方式”,这是个都是请求的必填项,服务器地址既URL必须是公网可以访问的,加密方式只需要选择明文方式,密匙是随机生成的,不用在意,TOKEN是要填写的,在下面的开发中会使用。

在这里插入图片描述

4.项目工程在GitHub中 https://github.com/wangqilong1225/WeChat,下面为接口API的代码:

  1. 下面的Wx()方法为公众平台填写URL接入的接口,接口验证为Get请求,且会有signature, timestamp, string nonce, echostr四个参数,都为字符串类型。接收到参数后需要去计算签名,既 CheckWeChatServer()方法,具体实现在下面第2步中,当签名比对成功后,再将接收的echostr返回给微信平台就可以了。
          注意:微信公众号的一次请求中,会反复执行3次,建议在搭建好项目后,一遍调试,一遍写代码。
		private static string TOKEN = "wangqilong";  //后期采用配置文件
		
        /// <summary>
        /// 服务器接入接口验证
        /// </summary>
        /// <param name="signature">微信加密签名</param>
        /// <param name="timestamp">时间戳</param>
        /// <param name="nonce">随机数</param>
        /// <param name="echostr">随机字符串</param>        
        public void Wx(string signature, string timestamp, string nonce, string echostr)
        {
            //Get请求处理
            if (System.Web.HttpContext.Current.Request.HttpMethod.ToUpper() == "Get")
            {
                //效验请求
                bool signatureFlag = CheckWeChatServer(signature, timestamp, nonce, echostr);
                if (signatureFlag)
                {
                    System.Web.HttpContext.Current.Response.Write(echostr);
                    System.Web.HttpContext.Current.Response.End();
                }
                else
                {
                    System.Web.HttpContext.Current.Response.Write("签名验证错误!");
                    System.Web.HttpContext.Current.Response.End();
                }
            }   
        }
  1. 计算签名以及比对,API的签名计算首先要将内容按字典序排序,然后进行指定方式加密,微信提供的加密方式一种是sha1加密,类似MD5加密。
        #region 服务器接入签名计算和比对
        public bool CheckWeChatServer(string signature, string timestamp, string nonce, string echostr)
        {
            //将token、timestamp、nonce三个参数进行字典序排序
            string[] strs = new string[] { TOKEN, timestamp, nonce };
            Array.Sort(strs);

            //将三个参数字符串拼接成一个字符串进行sha1加密 
            string str = strs[0] + strs[1] + strs[2];
            string mySignature = Sha1(str);
            if (signature == mySignature)
            {
                return true;
            }
            else
            {
                Console.WriteLine(mySignature);
                return false;
            }
        }
        #endregion
  1. sha1加密
       #region sha1加密    
        public string Sha1(string str)
        {
            var buffer = Encoding.UTF8.GetBytes(str);
            var data = SHA1.Create().ComputeHash(buffer);
            var sb = new StringBuilder();
            foreach (var t in data)
            {
                //x2 签名全部为小写
                sb.Append(t.ToString("x2"));
            }

            return sb.ToString();
        }
        #endregion

5.以上如有不足之处望指出,欢迎加入我的github项目中。

posted @ 2019-01-09 23:51  _小龙人  阅读(176)  评论(0编辑  收藏  举报