首頁  >  文章  >  微信小程式  >  微信公眾平台開發:了解MessageHandler

微信公眾平台開發:了解MessageHandler

高洛峰
高洛峰原創
2017-02-27 12:00:561942瀏覽

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

微信公眾平台開發:了解MessageHandler

CustomMessageHandle.cs需要繼承Senparc.Weixin.MP.MessageHandlers可能如下:

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可以為以下類型的任一個,分別對應了不同的回傳類型:

ResponseMessageText - 對應文字訊息

ResponseMessageNews - 對應圖文訊息

ResponseMessageMusic - 對應音樂訊息##XXX##ResponseMessage - 其他類型以此類推

 

    關於上述所有類型參數的設定方法,可以看開源專案的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是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已經被賦了回傳值。

更多微信公眾平台開發:了解MessageHandler相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn