當(dāng)前位置:首頁(yè) > IT技術(shù) > 微信平臺(tái) > 正文

C#-MVC開(kāi)發(fā)微信應(yīng)用(2)--微信消息的處理和應(yīng)答
2021-07-26 17:21:48

微信應(yīng)用使用場(chǎng)景和商機(jī)很多,所以這也是一個(gè)技術(shù)的方向,因此,有空研究下、學(xué)習(xí)下微信的相關(guān)開(kāi)發(fā),也就成為SNF完善的必要條件了。本系列文章希望從一個(gè)循序漸進(jìn)的角度上,全面介紹微信的相關(guān)開(kāi)發(fā)過(guò)程和相關(guān)經(jīng)驗(yàn)總結(jié),希望給大家了解一下相關(guān)的開(kāi)發(fā)歷程。本篇隨筆主要基于上一篇《C#-MVC開(kāi)發(fā)微信應(yīng)用(1)--開(kāi)始使用微信接口》的基礎(chǔ)上進(jìn)行深入的介紹,介紹微信消息的處理和應(yīng)答的過(guò)程。

1、微信的消息應(yīng)答交互

我們知道,微信的服務(wù)器架起了客戶手機(jī)和開(kāi)發(fā)者服務(wù)器的一個(gè)橋梁,通過(guò)消息的傳遞和響應(yīng),實(shí)現(xiàn)了與用戶的交互操作,下面是它的消息流程圖。

C#-MVC開(kāi)發(fā)微信應(yīng)用(2)--微信消息的處理和應(yīng)答_應(yīng)答

微信向開(kāi)發(fā)者服務(wù)器請(qǐng)求的消息包含了多種類型,不過(guò)基本來(lái)說(shuō),分為了文本消息處理、事件消息處理、語(yǔ)音消息的識(shí)別,以及成為開(kāi)發(fā)者之前的那個(gè)消息認(rèn)證操作基本分類,下面是我繪制的一個(gè)消息分類圖,其中介紹了這幾種關(guān)系,以及各自的消息細(xì)化分類。

C#-MVC開(kāi)發(fā)微信應(yīng)用(2)--微信消息的處理和應(yīng)答_微信_(tái)02

對(duì)于這些消息的請(qǐng)求,我們?cè)陂_(kāi)發(fā)服務(wù)器端,需要編寫(xiě)相關(guān)的邏輯進(jìn)行對(duì)應(yīng)給的處理,然后給微信服務(wù)器平臺(tái)回應(yīng)消息即可。

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

/// <summary>
        /// 用戶發(fā)送消息后,微信平臺(tái)自動(dòng)Post一個(gè)請(qǐng)求到這里,并等待響應(yīng)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("請(qǐng)求值:" + requestStr);
            return Content(SNFWeiXinProcess.Run(requestStr));
            //return Content(sss(signature, timestamp, nonce, echostr) );

            //return Content(ReceiveXml());

        }
SNFWeiXinProcess.Run(requestStr)就是對(duì)消息的處理函數(shù),它實(shí)現(xiàn)了對(duì)不同消息的分發(fā)處理過(guò)程?!?/pre>
public static string Run(string requestStr)
        {
            BaseMessage info = new BaseMessage();
            if (!string.IsNullOrEmpty(requestStr))
            {
                info = XmlHelper.Deserialize<BaseMessage>(requestStr, info);
              

            }
            //創(chuàng)建 分發(fā)器
            IDistributor distributor = new SNFWeiXinDistributor();
            string result = "抱歉,此功能暫未開(kāi)通";
            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就是一個(gè)分發(fā)的管理類,它提取請(qǐng)求消息的內(nèi)容,并構(gòu)建不同類型的消息參數(shù),傳遞給不同的響應(yīng)函數(shù)進(jìn)行處理,然后返回封裝好的XML內(nèi)容,作為響應(yīng)。

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

C#-MVC開(kāi)發(fā)微信應(yīng)用(2)--微信消息的處理和應(yīng)答_微信_(tái)03

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

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.接收的語(yǔ)音消息 OnActionVoice(RequestVoice voice)
        /// <summary>
        /// 接收的語(yǔ)音消息
        /// </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.點(diǎn)擊菜單跳轉(zhuǎn)鏈接時(shí)的事件推送 OnActionEventView(RequestEventView view)
    /// <summary>
    /// 點(diǎn)擊菜單跳轉(zhuǎn)鏈接時(shí)的事件推送
    /// </summary>
    /// <param name="view"></param>
    /// <returns>返回值</returns>
    string OnActionEventView(RequestEventView view);
    #endregion
  }

?

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

C#-MVC開(kāi)發(fā)微信應(yīng)用(2)--微信消息的處理和應(yīng)答_微信_(tái)04

效果:

C#-MVC開(kāi)發(fā)微信應(yīng)用(2)--微信消息的處理和應(yīng)答_微信_(tái)05

C#-MVC開(kāi)發(fā)微信應(yīng)用(2)--微信消息的處理和應(yīng)答_回復(fù)信息_06

?

 

? 如果覺(jué)得還不錯(cuò),歡迎轉(zhuǎn)載。

本系列文章列表如下:

基于SNF-快速開(kāi)發(fā)平臺(tái)框架的系列文章:

C#-MVC開(kāi)發(fā)微信應(yīng)用(8)--菜單管理的實(shí)現(xiàn)

C#-MVC開(kāi)發(fā)微信應(yīng)用(7)--在管理系統(tǒng)中同步微信用戶分組信息

C#-MVC開(kāi)發(fā)微信應(yīng)用(6)--用戶分組信息管理

C#-MVC開(kāi)發(fā)微信應(yīng)用(5)--自動(dòng)應(yīng)答系統(tǒng)-自動(dòng)回復(fù)機(jī)器人

C#-MVC開(kāi)發(fā)微信應(yīng)用(4)--微信門(mén)戶菜單的管理操作

C#-MVC開(kāi)發(fā)微信應(yīng)用(3)--文本消息和圖文消息的應(yīng)答

C#-MVC開(kāi)發(fā)微信應(yīng)用(2)--微信消息的處理和應(yīng)答?

C#-MVC開(kāi)發(fā)微信應(yīng)用(1)--開(kāi)始使用微信接口

?

作者: 王春天  
QQ群:322581894 關(guān)于作者: 大連天翼信息科技有限公司 技術(shù)總監(jiān)。 SNF快速開(kāi)發(fā)平臺(tái) 創(chuàng)始人。應(yīng)用平臺(tái)架構(gòu)師、IT規(guī)劃咨詢專家、業(yè)務(wù)流程設(shè)計(jì)專家。 專注于快速開(kāi)發(fā)平臺(tái)的開(kāi)發(fā)、代碼生成器。同時(shí)專注于微軟平臺(tái)項(xiàng)目架構(gòu)、管理和企業(yè)解決方案,多年項(xiàng)目開(kāi)發(fā)與管理經(jīng)驗(yàn),精通DotNet系列技術(shù)Vue、.NetCore、MVC、Webapi、C#、WinForm等,DB(SqlServer、Oracle等)技術(shù),移動(dòng)端開(kāi)發(fā)。熟悉Java、VB及PB開(kāi)發(fā)語(yǔ)言。在面向?qū)ο?、面向服?wù)以及數(shù)據(jù)庫(kù)領(lǐng)域有一定的造詣?,F(xiàn)從事項(xiàng)目實(shí)施、開(kāi)發(fā)、架構(gòu)等工作。并從事用友軟件產(chǎn)品U8、U9、PLM 客開(kāi)工作。 如有問(wèn)題或建議,請(qǐng)多多賜教! 本文版權(quán)歸作者和CNBLOGS博客共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,如有問(wèn)題,可以通過(guò)郵箱或QQ 聯(lián)系我,非常感謝。

?

?
?
?
?

本文摘自 :https://blog.51cto.com/u

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >