Senparc.Weixin.MP SDK 微信公眾平臺開發教程(六):瞭解MessageHandler

SZW發表於2013-11-08

    上一篇《Senparc.Weixin.MP SDK 微信公眾平臺開發教程(五):使用Senparc.Weixin.MP SDK》我們講述瞭如何使用Senparc.Weixin.MP SDK對接微信最基礎的驗證API,這一篇我們將具體講一下這個SDK處理微信訊息的核心:MessageHandler。

    有關MessageHandler的實現原理和說明,在這篇Wiki中已經說得比較詳細了,這裡用程式碼演示一下。

 

    延續上一篇的程式碼,我們繼續為專案新增一個CustomMessageHandle.cs類:

    CustomMessageHandle.cs需要繼承Senparc.Weixin.MP.MessageHandlers<TC>這個抽象類,並實現部分方法。最初步的CustomMessageHandle.cs程式碼
可能如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using Senparc.Weixin.MP.Entities;
using Senparc.Weixin.MP.MessageHandlers;

namespace Senparc.Weixin.MP.Sample.Weixin
{
    public class CustomMessageHandler : MessageHandler<CustomMessageContext>
    {
        public CustomMessageHandler(Stream inputStream, PostModel postModel)
            : base(inputStream, postModel)
        {

        }

        public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
        {
            var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); //ResponseMessageText也可以是News等其他型別
            responseMessage.Content = "這條訊息來自DefaultResponseMessage。";
            return responseMessage;
        }
    }
}

  

    我們可以看到必須要重寫實現的抽象方法名為DefaultResponseMessage(),這一條資訊用於返回一條的訊息,假如對應型別(如語音)的微信訊息沒有被程式碼處理,那麼預設會返回這裡的結果。

    在DefaultResponseMessage()方法中,我們看到這樣一句:

var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); //ResponseMessageText也可以是News等其他型別

  這裡的CreateResponseMessage<T>方法即建立一個返回物件,T可以為以下型別的任意一個,分別對應了不同的返回型別:

ResponseMessageText - 對應文字訊息

ResponseMessageNews - 對應圖文訊息

ResponseMessageMusic - 對應音樂訊息

ResponseMessageXXX - 其他型別以此類推

 

    關於上述所有型別引數的設定方法,可以看開源專案的Demo,這裡不再重複:https://github.com/JeffreySu/WeiXinMPSDK

 

    那麼我們如何處理使用者發過來的文字資訊呢?

    很簡單——重寫一個OnTextRequest方法即可:

        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
            responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName      //這裡的requestMessage.FromUserName也可以直接寫成base.WeixinOpenId
                                    + "。\r\n您傳送了文字資訊:" + requestMessage.Content;  //\r\n用於換行,requestMessage.Content即使用者發過來的文字內容
            return responseMessage;
        }

  這個方法中可以自由發揮,比如讀取資料庫、判斷關鍵字,甚至返回不同的ResponseMessageXX型別(只要最終的型別都是在IResponseMessageBase介面下的即可)。

    與OnTextRequest對應,如果我們要處理語音、地理位置、選單等型別的訊息,只需要重寫對應的方法,可以重寫的方法如下:

 

        public virtual IResponseMessageBase OnImageRequest(RequestMessageImage requestMessage);
        public virtual IResponseMessageBase OnLinkRequest(RequestMessageLink requestMessage);
        public virtual IResponseMessageBase OnLocationRequest(RequestMessageLocation requestMessage);
        public virtual IResponseMessageBase OnTextRequest(RequestMessageText requestMessage);
        public virtual IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage);
        public virtual IResponseMessageBase OnVideoRequest(RequestMessageVideo requestMessage);


        public virtual IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage);
        public virtual IResponseMessageBase OnEvent_ViewRequest(RequestMessageEvent_View requestMessage);
        public virtual IResponseMessageBase OnEvent_EnterRequest(RequestMessageEvent_Enter requestMessage);
        public virtual IResponseMessageBase OnEvent_LocationRequest(RequestMessageEvent_Location requestMessage);
        public virtual IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage);
        public virtual IResponseMessageBase OnEvent_UnsubscribeRequest(RequestMessageEvent_Unsubscribe requestMessage);
        public virtual IResponseMessageBase OnEvent_ScanRequest(RequestMessageEvent_Scan requestMessage)
        public virtual IResponseMessageBase OneEvent_MassSendJobFinisRequest(RequestMessageEvent_MassSendJobFinish requestMessage)

 

    其中OnEvent_XX對應的都是Event請求的子型別。

    在CustomMessageHandler的基類設定的時候,我們看到使用了一個叫MessageContext的泛型(MessageHandler<MessageContext>),這個MessageContext是SDK提供的一個預設的訊息上下文處理類,這個類已經能夠處理最基礎的情況,如果您的應用不是很複雜,那麼直接用這個類就行了。如果專案比較複雜,您也可以根據自己的需要寫一個自己的類(繼承IMessageContext介面),或繼承這個類在擴充套件一些更多的屬性(例如工作流和分散式快取等等)。

 

    至此我們已經使用MassageHandler處理所有微信使用者傳送過來的請求。

    下面介紹一些MassageHandler的“祕密武器”。

  • OnExecuting()和OnExecuted()

  我們可以直接重寫這兩個方法。其中OnExecuting會在所有訊息處理方法(如OnTextRequest,OnVoiceRequest等)執行之前執行,這個過程中,我們可以把CancelExecute設為true,來中斷後面所有方法的執行(包括OnExecuted),例如:

        public override void OnExecuting()
        {
            if (RequestMessage.FromUserName == "olPjZjsXuQPJoV0HlruZkNzKc91E")
            {
                CancelExcute = true; //終止此使用者的對話
            
                //如果沒有下面的程式碼,使用者不會收到任何回覆,因為此時ResponseMessage為null

                //新增一條固定回覆
                var responseMessage = CreateResponseMessage<ResponseMessageText>();
                responseMessage.Content = "Hey!你已經被拉黑啦!";

                ResponseMessage = responseMessage;//設定返回物件
            }
        }

  如果OnExecuting中沒有中斷,當例如OnTextRequest方法執行完畢之後(或執行了預設方法),OnExecuted()方法將會觸發,我們也可以對應地重寫。要注意的是,在OnExecuted()方法內,ResponseMessage已經被賦了返回值。

 

  • 處理對話上下文

  CustomMessageHandler繼承了類MessageHandler<CustomMessageContext>,其中的CustomMessageContext是一個我們自定義的上下文類,用於處理單個使用者的對話狀態。這一個功能我們會放到下一篇單獨講述:《Senparc.Weixin.MP SDK 微信公眾平臺開發教程(七):解決使用者上下文(Session)問題》。

 

系列教程索引

地址:http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html

  1. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(一):微信公眾平臺註冊
  2. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(二):成為開發者
  3. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(三):微信公眾平臺開發驗證
  4. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(四):Hello World
  5. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(五):使用Senparc.Weixin.MP SDK
  6. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(六):瞭解MessageHandler
  7. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(七):解決使用者上下文(Session)問題
  8. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(八):通用介面說明
  9. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(九):自定義選單介面說明
  10. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十):多客服介面說明
  11. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十一):高階介面說明
  12. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十二):OAuth2.0說明
  13. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十三):地圖相關介面說明
  14. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十四):請求訊息去重
  15. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十五):訊息加密
  16. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十六):AccessToken自動管理機制
  17. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十七):個性化選單介面說明
  18. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十八):Web代理功能
  19. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(十九):MessageHandler 的未知型別訊息處理
  20. Senparc.Weixin.MP SDK 微信公眾平臺開發教程(二十):使用選單訊息功能

 

相關文章