延續上一篇的程式碼,我們繼續為專案新增一個CustomMessageHandle.cs類別:
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
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
至此我們已經使用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中文網!