转载

【.NET微信公众平台SDK封装】第一篇 实现URL接入

接口校验方法

要使 微信 公众平台后台的开发者中心中“填写服务器配置”页面中填写的URL能正常通过为新服务器的校验,需要按《 微信 公众平台开发者文档》中“接入指南”的要求,编写接口校验方法。

开发者提交信息后,为新服务器将发送GET请求到填写的URL上,GET请求携带4个参数,如表所示:

【.NET微信公众平台SDK封装】第一篇 实现URL接入

开发者通过校验signture对请求进行校验,若确认此次GET请求来自 微信 服务器,请原样返回echostr参数内容,则接入生效,成为开发者,否则接入失败。

加密/校验流程:

  • 1. 将token、timestamp、nonce三个参数进行字典序排序
  • 将三个参数字符串拼接成一个字符串进行sha1加密
  • 开发者获得加密后的字符串可与signature对比,标识该请求来源于 微信

在C#中,可以使用LINQ来对参数进行字典排序,代码如下:

           //将token、timestamp、nonce三个参数进行字典序排序           string[] arr = new[] { token, timestamp, nonce }.OrderBy(z => z).ToArray(); 

将3个参数字符串进行拼接:

 //将三个参数字符串拼接成一个字符串 string arrString = string.Join("", arr); 

使用.Net FrameWork 提供的System.Security.Cryptography.SHA1类来实现sha1加密

  //使用.Net FrameWork 提供的System.Security.Cryptography.SHA1类来实现sha1加密 System.Security.Cryptography.SHA1 sha1 = System.Security.Cryptography.SHA1.Create(); byte[] sha1arr = sha1.ComputeHash(Encoding.UTF8.GetBytes(arrString)); 

sha1 加密后的结果是一个byte数组,因此还需将加密结果转换为字符串

   StringBuilder enText = new StringBuilder();    foreach (var b in sha1arr)    {            enText.AppendFormat("{0:x2}", b);     } 

实现接口校验程序完整代码

 using System; using System.Collections.Generic; using System.Linq; using System.Text;   namespace CodeCloud.WeChat<a href="http://www.codecloud.wang/archives/tag/sdk" title="查看更多关于SDK的文章" target="_blank">SDK</a> {     /// <summary>     /// 验证服务器地址的有效性     /// 该类对接口检验方法进行封装,调用名为Check的静态方法,即可实现接口校验。     /// </summary>     public static class CheckSignature     {         /// <summary>         /// 网站没有提供Token(或传入为null)的情况下的默认Token         /// </summary>         public const string Token = "CodeCloud";           /// <summary>         /// 校验签名是否正确         /// </summary>         /// <param name="signture"><a href="http://www.codecloud.wang/archives/tag/%e5%be%ae%e4%bf%a1" title="查看更多关于微信的文章" target="_blank">微信</a>加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。</param>         /// <param name="timestamp">时间戳</param>         /// <param name="nonce">随机数</param>         /// <param name="token">随机字符串</param>         /// <returns></returns>         public static bool Check(string signture,string timestamp,string nonce,string token)         {             return signture == GetSignture(timestamp,nonce,token);         }           /// <summary>         /// 放回本地生成的签名         /// </summary>         /// <param name="timestamp">时间戳</param>         /// <param name="nonce">随机数</param>         /// <param name="token">随机字符串</param>         /// <returns></returns>         public static string GetSignture(string timestamp, string nonce, string token)         {             token = token ?? Token;             //将token、timestamp、nonce三个参数进行字典序排序             string[] arr = new[] { token, timestamp, nonce }.OrderBy(z => z).ToArray();             //将三个参数字符串拼接成一个字符串             string arrString = string.Join("", arr);             //使用.Net FrameWork 提供的System.Security.Cryptography.SHA1类来实现sha1加密             System.Security.Cryptography.SHA1 sha1 = System.Security.Cryptography.SHA1.Create();             byte[] sha1arr = sha1.ComputeHash(Encoding.UTF8.GetBytes(arrString));             //sha1 加密后的结果是一个byte数组,因此还需将加密结果转换为字符串             StringBuilder enText = new StringBuilder();             foreach (var b in sha1arr)             {                 enText.AppendFormat("{0:x2}", b);             }             //返回加密签名             return enText.ToString();         }     } } 

使用示例:

 /// <summary>         /// 处理<a href="http://www.codecloud.wang/archives/tag/%e5%be%ae%e4%bf%a1" title="查看更多关于微信的文章" target="_blank">微信</a>服务器验证消息         /// </summary>         private void Auth()         {             string signture = Request["signture"];             string timestamp = Request["timestamp"];             string nonce = Request["nonce"];             string echostr = Request["echostr"];             if(Request.HttpMothod == "GET")             {                 if (CheckSignature.Check(signture, timestamp, nonce,Token))                 {                     WriteContent(echostr);                 }                 else                 {                     WriteContent("failed:"+ signture+","+ CheckSignature.GetSignture(timestamp, nonce, Token)+"。"+"如果你在浏览器中看到这句话,说明此地址可以被座位微信公众号后台的URL,请注意保持Token一致。");                 }             }         } 

部分代码参考了来源于书籍:《微信公众平台企业开发实战》。 

更多内容请关注【 码云网 】......

正文到此结束
Loading...