微信公众平台开发教程(三) 基础框架搭建

2019-12-30 14:45:49于丽


<httpHandlers>
  <add verb="*" path="WXService.ashx" type="namespace.WeiXinHttpHandler,WXWeb" validate="true"/>
</httpHandlers>

二、分发请求

 为了能功能封装,我们也将此封装在了处理组件中。其实可以放置在HttpHandler中的。

 1)验证签名

 如果是首次请求,需要验证签名。就相当于一次HTTP握手。之前在上一章中,设置的服务器URL以及token值,这个功能就是检验是否链接成功。

这个请求是GET请求。以下具体说明(官方):

业务逻辑:

加密/校验流程:

<1> 将token、timestamp、nonce三个参数进行字典序排序

<2> 将三个参数字符串拼接成一个字符串进行SHA1加密

 <3> 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

而官方只提供了PHP的代码示例,很多东西在C#中并非直译既得。所以这里面也有一些具体处理。先看官方的代码:


private function checkSignature()
  {
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];  
        
    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr);
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
    
    if( $tmpStr == $signature ){
      return true;
    }else{
      return false;
    }
  }

我们将其翻译成C#版本:


/// <summary>
    /// 检查签名
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    private bool CheckSignature()
    {
      string signature = Request.QueryString[SIGNATURE];
      string timestamp = Request.QueryString[TIMESTAMP];
      string nonce = Request.QueryString[NONCE];

      List<string> list = new List<string>();
      list.Add(TOKEN);
      list.Add(timestamp);
      list.Add(nonce);
      //排序
      list.Sort();
      //拼串
      string input = string.Empty;
      foreach (var item in list)
      {
        input += item;
      }
      //加密
      string new_signature = SecurityUtility.SHA1Encrypt(input);
      //验证
      if (new_signature == signature)
      {
        return true;
      }
      else
      {
        return false;
      }
    }

这里需要SHA1加密,具体的算法如下:


/// <summary>
    /// SHA1加密
    /// </summary>
    /// <param name="intput">输入字符串</param>
    /// <returns>加密后的字符串</returns>
    public static string SHA1Encrypt(string intput)
    {
      byte[] StrRes = Encoding.Default.GetBytes(intput);
      HashAlgorithm mySHA = new SHA1CryptoServiceProvider();
      StrRes = mySHA.ComputeHash(StrRes);
      StringBuilder EnText = new StringBuilder();
      foreach (byte Byte in StrRes)
      {
        EnText.AppendFormat("{0:x2}", Byte);
      }
      return EnText.ToString();
    }