国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

微信公眾平臺開發教程(三) 基礎框架搭建

2019-10-29 21:18:27
字體:
來源:轉載
供稿:網友

首先我們設計了模塊層次圖,當然圖中只是給出一種實現方式,不局限于此。具體見下圖。

主要功能介紹如下:

1)請求接口層。處理HTTP請求,及響應

2)分發層。由接口層傳入請求,然后具體分析請求類型,分發至不同的處理器

3)業務邏輯層。這里是我們的具體業務邏輯了,根據請求,實現具體的業務邏輯。

4)數據層。我們在實現某個應用時可能需要訪問數據,可以是數據庫或者是文件。如果是簡單應用,可能沒有這一層。

其實,具體的應用可以在這個結構上去擴展,可以擴展消息對象層、業務對象層、數據訪問層、功能管理層等。這里只是提供一種思路,不局限于此。

微信公眾號框架搭建

根據層次圖,設計流程圖,具體講述實現的各個過程。以便了解整個處理過程。如下圖所示:

微信公眾號框架搭建

根據流程圖,我們能夠清晰的了解整個流程,消息處理的具體實現步驟。

下面我們針對每個流程進行代碼實現。

一、接收HTTP請求

我們需要一個HttpHandler或者一個網頁,來處理微信服務端HTTP請求。

這里我們使用了HttpHandler。因為其靈活性高,性能好。

具體實現如下。

public class WeiXinHttpHandler:IHttpHandler  {    /// <summary>    ///     /// </summary>    public bool IsReusable    {      get { return true; }    }    /// <summary>    /// 處理請求    /// </summary>    /// <param name="context"></param>    public void ProcessRequest(HttpContext context)    {      //由微信服務接收請求,具體處理請求      WeiXinService wxService = new WeiXinService(context.Request);      string responseMsg = wxService.Response();      context.Response.Clear();      context.Response.Charset = "UTF-8";      context.Response.Write(responseMsg);      context.Response.End();    }  }

如果是HTTPHandler,需要在配置文件中,配置具體的應用。具體的節點配置,我們不作說明。直接給出例子,配置HttpHandler節點如下 

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

2)分發請求

接下來就是具體的消息請求了,這里都是POST請求。

因為有多種消息類型,我們通過工廠類來進行封裝,然后每種消息都有專門的處理器來進行處理。具體實現邏輯:

/// <summary>    /// 處理請求    /// </summary>    /// <returns></returns>    private string ResponseMsg()    {      string requestXml = Common.ReadRequest(this.Request);      IHandler handler = HandlerFactory.CreateHandler(requestXml);      if (handler != null)      {        return handler.HandleRequest();      }      return string.Empty;    }

處理請求的對外方法(HttpHandler調用的方法就是這個了),即:

/// <summary>    /// 處理請求,產生響應    /// </summary>    /// <returns></returns>    public string Response()    {      string method = Request.HttpMethod.ToUpper();      //驗證簽名      if (method == "GET")      {        if (CheckSignature())        {          return Request.QueryString[ECHOSTR];        }        else        {          return "error";        }      }      //處理消息      if (method == "POST")      {        return ResponseMsg();      }      else      {        return "無法處理";      }    }

三、消息處理器具體處理消息

1)消息類型

首先我們來看下,具體的消息類型,其實上一張中已經明確給了消息的接口。

這里再看具體看一下,請求的消息類型有哪些,回復的消息類型有哪些等。

千萬要注意,請求的消息是文本類型,回復的消息,不一定也是文本哦,可以是圖文、音樂等任意一種可回復的消息。具體見下表所示。

微信公眾號框架搭建

2)根據具體的消息接口,設計消息類。

這里給出類圖,供參考。

微信公眾號框架搭建

3)針對不同的消息,會有不同的處理器,來看下具體的類圖。

微信公眾號框架搭建

4)具體業務處理

每個handler里面就是可以處理具體請求。輸入的什么消息,訪問那些數據,調用服務等,都在這里處理。

還是建議大家對具體的業務進行單獨封裝,在Handler中,只提供調用的接口。

因為隨著業務的增加,一個Handler可能要處理很多業務,如果所有的操作邏輯都寫在這里,勢必影響閱讀,也不易于維護與擴展。

5)產生回復消息

在處理完請求后,需要生成回復消息,響應到終端。消息格式,就是我們介紹那些消息類型,但必須是可用于回復的,當前支持的有:文本、圖文、音樂等。

一定要明確:回復的消息類型不一定要與請求的消息類型一樣,比如,請求是文本,回復的可以是圖文、音樂。

產生回復消息的過程,其實,就是特定的消息對象格式化為對應的XML的過程,然后將XML響應至微信服務器。

6)實例

這里以微信用戶關注公眾賬號,然后服務端處理處理事件請求,登記用戶,并提示歡迎信息。

class EventHandler : IHandler  {    /// <summary>    /// 請求的xml    /// </summary>    private string RequestXml { get; set; }    /// <summary>    /// 構造函數    /// </summary>    /// <param name="requestXml"></param>    public EventHandler(string requestXml)    {      this.RequestXml = requestXml;    }    /// <summary>    /// 處理請求    /// </summary>    /// <returns></returns>    public string HandleRequest()    {      string response = string.Empty;      EventMessage em = EventMessage.LoadFromXml(RequestXml);      if (em.Event == EventType.Subscribe)      {        //注冊用戶        User user = new User();        user.OpenID = em.FromUserName;        UserManager.Regester(user);        //回復歡迎消息        TextMessage tm = new TextMessage();        tm.ToUserName = em.FromUserName;        tm.FromUserName = em.ToUserName;        tm.CreateTime = Common.GetNowTime();        tm.Content = "歡迎您關注xxx,我是小微。有什么我能幫助您的嗎?";        response = tm.GenerateContent();      }      return response;    }  }

 四、HTTP響應

 最后將處理結果返回至最初HttpHandler,響應給微信服務器,直接Response處理。這也是在最開始設計的HttpHandler中實現的。

下面是代碼片段,具體可見一、Http請求     

context.Response.Clear();context.Response.Charset = "UTF-8";context.Response.Write(responseMsg);context.Response.End();

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兴化市| 大英县| 治多县| 平凉市| 哈密市| 壶关县| 浠水县| 湖南省| 岳西县| 辽宁省| 城口县| 江永县| 卫辉市| 合川市| 二手房| 高青县| 台前县| 茂名市| 铁岭市| 成武县| 南靖县| 盘山县| 双桥区| 怀宁县| 和硕县| 紫金县| 谢通门县| 阿拉善左旗| 黑水县| 兰州市| 四川省| 内乡县| 荣成市| 富民县| 稷山县| 枝江市| 沙洋县| 韶山市| 孟津县| 顺昌县| 文成县|