最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年12月01日 10:36:57   作者:停留的風  
這篇文章主要介紹了微信公眾平臺開發(fā)教程(三) 基礎框架搭建,具有一定的參考價值,有需要的可以了解一下。

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

主要功能介紹如下:

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

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

3)業(yè)務邏輯層。這里是我們的具體業(yè)務邏輯了,根據(jù)請求,實現(xiàn)具體的業(yè)務邏輯。

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

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


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


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

下面我們針對每個流程進行代碼實現(xiàn)。

一、接收HTTP請求

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

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

具體實現(xiàn)如下。

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,需要在配置文件中,配置具體的應用。具體的節(jié)點配置,我們不作說明。直接給出例子,配置HttpHandler節(jié)點如下 

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

二、分發(fā)請求

 為了能功能封裝,我們也將此封裝在了處理組件中。其實可以放置在HttpHandler中的。

 1)驗證簽名

 如果是首次請求,需要驗證簽名。就相當于一次HTTP握手。之前在上一章中,設置的服務器URL以及token值,這個功能就是檢驗是否鏈接成功。

這個請求是GET請求。以下具體說明(官方):

業(yè)務邏輯:

加密/校驗流程:

<1> 將token、timestamp、nonce三個參數(shù)進行字典序排序

<2> 將三個參數(shù)字符串拼接成一個字符串進行SHA1加密

 <3> 開發(fā)者獲得加密后的字符串可與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)分發(fā)請求

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

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

/// <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調(diào)用的方法就是這個了),即:

/// <summary>
    /// 處理請求,產(chǎn)生響應
    /// </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)消息類型

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

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

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


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

這里給出類圖,供參考。

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

4)具體業(yè)務處理

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

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

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

5)產(chǎn)生回復消息

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

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

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

6)實例

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

class EventHandler : IHandler
  {
    /// <summary>
    /// 請求的xml
    /// </summary>
    private string RequestXml { get; set; }
    /// <summary>
    /// 構造函數(shù)
    /// </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中實現(xiàn)的。

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

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C#如何實現(xiàn)調(diào)取釘釘考勤接口的功能

    C#如何實現(xiàn)調(diào)取釘釘考勤接口的功能

    這篇文章主要介紹了C#如何實現(xiàn)調(diào)取釘釘考勤接口的功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解C#用new和override來實現(xiàn)抽象類的重寫區(qū)別

    詳解C#用new和override來實現(xiàn)抽象類的重寫區(qū)別

    本篇文章主要介紹了詳解C#用new和override來實現(xiàn)抽象類的重寫區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧。
    2017-02-02
  • C#項目彩票選號實現(xiàn)思路

    C#項目彩票選號實現(xiàn)思路

    今天做了一個彩票選號的小軟件,將學到的知識點總結一下,下面通過本文給大家分享C#項目彩票選號實現(xiàn)思路,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • C#使用CefSharp實現(xiàn)內(nèi)嵌網(wǎng)頁詳解

    C#使用CefSharp實現(xiàn)內(nèi)嵌網(wǎng)頁詳解

    這篇文章主要介紹了C# WPF里怎么使用CefSharp嵌入一個網(wǎng)頁,并給出一個簡單示例演示C#和網(wǎng)頁(JS)的交互實現(xiàn),感興趣的小伙伴可以了解一下
    2023-04-04
  • Unity Shader實現(xiàn)素描風格的渲染

    Unity Shader實現(xiàn)素描風格的渲染

    這篇文章主要為大家詳細介紹了Unity Shader實現(xiàn)素描風格的渲染,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • c#禁止通過拖動,雙擊標題欄改變窗體大小的方法

    c#禁止通過拖動,雙擊標題欄改變窗體大小的方法

    今天小編就為大家分享一篇c#禁止通過拖動,雙擊標題欄改變窗體大小的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • C#實現(xiàn)拼手氣紅包算法

    C#實現(xiàn)拼手氣紅包算法

    這篇文章主要為大家詳細介紹了C#實現(xiàn)拼手氣紅包算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C#批量刪除Excel重復項的實現(xiàn)方法

    C#批量刪除Excel重復項的實現(xiàn)方法

    當從不同來源導入Excel數(shù)據(jù)時,可能存在重復的記錄,為了確保數(shù)據(jù)的準確性,通常需要刪除這些重復的行,本文將提供一個使用C# 快速查找并刪除Excel重復項的免費解決方案,需要的朋友可以參考下
    2024-04-04
  • C# Console.WriteLine()用法案例詳解

    C# Console.WriteLine()用法案例詳解

    這篇文章主要介紹了C# Console.WriteLine()用法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 如何在C#9 中使用static匿名函數(shù)

    如何在C#9 中使用static匿名函數(shù)

    這篇文章主要介紹了如何在C#9中使用static匿名函數(shù),幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03

最新評論

伊吾县| 夹江县| 保亭| 连江县| 姚安县| 黄冈市| 专栏| 衡东县| 城口县| 桓仁| 五莲县| 兴海县| 通榆县| 阿尔山市| 广昌县| 鹰潭市| 张家界市| 大兴区| 思茅市| 海阳市| 广宁县| 崇文区| 蕲春县| 荥经县| 阿荣旗| 昌乐县| 建阳市| 应城市| 彰化县| 洪江市| 西和县| 偃师市| 托克逊县| 舒城县| 固始县| 双峰县| 友谊县| 武汉市| 桐柏县| 长治市| 武威市|