溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

微信公眾平臺(tái)開發(fā)中MessageHandler怎么用

發(fā)布時(shí)間:2021-09-10 11:32:21 來源:億速云 閱讀:127 作者:小新 欄目:移動(dòng)開發(fā)

小編給大家分享一下微信公眾平臺(tái)開發(fā)中MessageHandler怎么用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

繼續(xù)為項(xiàng)目添加一個(gè)CustomMessageHandle.cs類:

微信公眾平臺(tái)開發(fā)中MessageHandler怎么用

CustomMessageHandle.cs需要繼承Senparc.Weixin.MP.MessageHandlers<TC>這個(gè)抽象類,并實(shí)現(xiàn)部分方法。最初步的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;
        }
    }
}

我們可以看到必須要重寫實(shí)現(xiàn)的抽象方法名為DefaultResponseMessage(),這一條信息用于返回一條的消息,假如對(duì)應(yīng)類型(如語音)的微信消息沒有被代碼處理,那么默認(rèn)會(huì)返回這里的結(jié)果。

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

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

  這里的CreateResponseMessage<T>方法即創(chuàng)建一個(gè)返回對(duì)象,T可以為以下類型的任意一個(gè),分別對(duì)應(yīng)了不同的返回類型:

ResponseMessageText - 對(duì)應(yīng)文本消息

ResponseMessageNews - 對(duì)應(yīng)圖文消息

ResponseMessageMusic - 對(duì)應(yīng)音樂消息

ResponseMessageXXX - 其他類型以此類推

關(guān)于上述所有類型參數(shù)的設(shè)置方法,可以看開源項(xiàng)目的Demo,這里不再重復(fù):https://github.com/JeffreySu/WeiXinMPSDK。

那么我們?nèi)绾翁幚碛脩舭l(fā)過來的文字信息呢?

很簡(jiǎn)單——重寫一個(gè)OnTextRequest方法即可:

public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
{
    var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
    responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName      //這里的requestMessage.FromUserName也可以直接寫成base.WeixinOpenId
                            + "。\r\n您發(fā)送了文字信息:" + requestMessage.Content;  //\r\n用于換行,requestMessage.Content即用戶發(fā)過來的文字內(nèi)容
    return responseMessage;
}

這個(gè)方法中可以自由發(fā)揮,比如讀取數(shù)據(jù)庫(kù)、判斷關(guān)鍵字,甚至返回不同的ResponseMessageXX類型(只要最終的類型都是在IResponseMessageBase接口下的即可)。

與OnTextRequest對(duì)應(yīng),如果我們要處理語音、地理位置、菜單等類型的消息,只需要重寫對(duì)應(yīng)的方法,可以重寫的方法如下:

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對(duì)應(yīng)的都是Event請(qǐng)求的子類型。

在CustomMessageHandler的基類設(shè)置的時(shí)候,我們看到使用了一個(gè)叫MessageContext的泛型(MessageHandler<MessageContext>),這個(gè)MessageContext是SDK提供的一個(gè)默認(rèn)的消息上下文處理類,這個(gè)類已經(jīng)能夠處理最基礎(chǔ)的情況,如果您的應(yīng)用不是很復(fù)雜,那么直接用這個(gè)類就行了。如果項(xiàng)目比較復(fù)雜,您也可以根據(jù)自己的需要寫一個(gè)自己的類(繼承IMessageContext接口),或繼承這個(gè)類在擴(kuò)展一些更多的屬性(例如工作流和分布式緩存等等)。

至此我們已經(jīng)使用MassageHandler處理所有微信用戶發(fā)送過來的請(qǐng)求。

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

OnExecuting()和OnExecuted()

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

public override void OnExecuting()
{
    if (RequestMessage.FromUserName == "olPjZjsXuQPJoV0HlruZkNzKc91E")
    {
        CancelExcute = true; //終止此用戶的對(duì)話
     
        //如果沒有下面的代碼,用戶不會(huì)收到任何回復(fù),因?yàn)榇藭r(shí)ResponseMessage為null
 
        //添加一條固定回復(fù)
        var responseMessage = CreateResponseMessage<ResponseMessageText>();
        responseMessage.Content = "Hey!你已經(jīng)被拉黑啦!";
 
        ResponseMessage = responseMessage;//設(shè)置返回對(duì)象
    }
}

如果OnExecuting中沒有中斷,當(dāng)例如OnTextRequest方法執(zhí)行完畢之后(或執(zhí)行了默認(rèn)方法),OnExecuted()方法將會(huì)觸發(fā),我們也可以對(duì)應(yīng)地重寫。要注意的是,在OnExecuted()方法內(nèi),ResponseMessage已經(jīng)被賦了返回值。

看完了這篇文章,相信你對(duì)“微信公眾平臺(tái)開發(fā)中MessageHandler怎么用”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI