C#-MVC開發微信應用(2)--微信消息的處理和應答


微信應用使用場景和商機很多,所以這也是一個技術的方向,因此,有空研究下、學習下微信的相關開發,也就成為SNF完善的必要條件了。本系列文章希望從一個循序漸進的角度上,全面介紹微信的相關開發過程和相關經驗總結,希望給大家了解一下相關的開發歷程。本篇隨筆主要基於上一篇《C#-MVC開發微信應用(1)--開始使用微信接口》的基礎上進行深入的介紹,介紹微信消息的處理和應答的過程。

1、微信的消息應答交互

我們知道,微信的服務器架起了客戶手機和開發者服務器的一個橋梁,通過消息的傳遞和響應,實現了與用戶的交互操作,下面是它的消息流程圖。

微信向開發者服務器請求的消息包含了多種類型,不過基本來說,分為了文本消息處理、事件消息處理、語音消息的識別,以及成為開發者之前的那個消息認證操作基本分類,下面是我繪制的一個消息分類圖,其中介紹了這幾種關系,以及各自的消息細化分類。

對於這些消息的請求,我們在開發服務器端,需要編寫相關的邏輯進行對應給的處理,然后給微信服務器平台回應消息即可。

在前一篇的隨筆里面我貼過代碼,介紹微信消息處理的入口操作,代碼如下所示。

/// <summary>
        /// 用戶發送消息后,微信平台自動Post一個請求到這里,並等待響應XML。
        /// </summary>
        [HttpPost]
        [ActionName("Index")]
        public ActionResult Post(string signature, string timestamp, string nonce, string echostr)
        {
            Stream requestStream = System.Web.HttpContext.Current.Request.InputStream;
            byte[] requestByte = new byte[requestStream.Length];
            requestStream.Read(requestByte, 0, (int)requestStream.Length);
            string requestStr = Encoding.UTF8.GetString(requestByte);

            SNFWeiXinProcess.Log("請求值:" + requestStr);
            return Content(SNFWeiXinProcess.Run(requestStr));
            //return Content(sss(signature, timestamp, nonce, echostr) );

            //return Content(ReceiveXml());

        }
SNFWeiXinProcess.Run(requestStr)就是對消息的處理函數,它實現了對不同消息的分發處理過程。‘
public static string Run(string requestStr)
        {
            BaseMessage info = new BaseMessage();
            if (!string.IsNullOrEmpty(requestStr))
            {
                info = XmlHelper.Deserialize<BaseMessage>(requestStr, info);
              

            }
            //創建 分發器
            IDistributor distributor = new SNFWeiXinDistributor();
            string result = "抱歉,此功能暫未開通";
            switch (info.MsgType)
            {
                case "text": //01.接收文本信息
                    RequestText text = new RequestText();
                    text = XmlHelper.Deserialize<RequestText>(requestStr, text);
                    result = distributor.OnActionText(text);
                    break;
          default: throw new Exception("找不到處理類型:" + info.MsgType);
                    
            }
         return result;
        }

里面的SNFWeiXinProcess就是一個分發的管理類,它提取請求消息的內容,並構建不同類型的消息參數,傳遞給不同的響應函數進行處理,然后返回封裝好的XML內容,作為響應。

具體的代碼處理邏輯如下圖所示。

這個消息處理接口,其實就是定義好一系列的對請求消息的處理操作,參數是不同給的消息對象,具體的代碼定義如下所示(由於篇幅原因,省略部分接口,具體可以參考上圖)。

public interface IDistributor
    {
        #region 01.文本信息處理 OnActionText(RequestText text)
        /// <summary>
        /// 文本信息處理
        /// </summary>
        /// <param name="text"></param>
        /// <returns>返回值</returns>
        string OnActionText(RequestText text);
        #endregion

        #region 02.圖片信息處理 OnActionImage(RequestImage image)
        /// <summary>
        /// 圖片信息處理
        /// </summary>
        /// <param name="image"></param>
        /// <returns>返回值</returns>
        string OnActionImage(RequestImage image);
        #endregion

        #region 03.接收的語音消息 OnActionVoice(RequestVoice voice)
        /// <summary>
        /// 接收的語音消息
        /// </summary>
        /// <param name="voice"></param>
        /// <returns>返回值</returns>
        string OnActionVoice(RequestVoice voice);
        #endregion

       .........................................................

        #region 02.訂閱 OnActionEventSubscribe(RequestEventSubscribe subscribe)
        /// <summary>
        /// 取消訂閱
        /// </summary>
        /// <param name="subscribe"></param>
        /// <returns>返回值</returns>
        string OnActionEventSubscribe(RequestEventSubscribe subscribe);
        #endregion
    .........................................................
  

    #region 06.點擊菜單跳轉鏈接時的事件推送 OnActionEventView(RequestEventView view)
    /// <summary>
    /// 點擊菜單跳轉鏈接時的事件推送
    /// </summary>
    /// <param name="view"></param>
    /// <returns>返回值</returns>
    string OnActionEventView(RequestEventView view);
    #endregion
  }

 
        

從上面的代碼可以看出,不同的消息,到處理函數這里,就以不同的消息實體類的方式傳遞過來了(注意:實體類是我根據程序開發需要自己定義的,非微信本身的實體類),這樣非常方便我們處理操作,否則每次需要解析不同的消息內容,很容易出現問題,這樣強類型的數據類型,提高了我們開發微信應用的強壯型和高效性。這些實體類的對象有一定的繼承關系的,他們的繼承關系如下所示。

效果:

 

作者: 王春天 2015-12-24
作者Blog:http://www.cnblogs.com/spring_wang 出處: http://www.cnblogs.com/spring_wang/p/5073670.html

  如果覺得還不錯,歡迎轉載。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM