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

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

Feb 27, 2017 pm 12:00 PM
微信大眾平台

  延續上一篇的程式碼,我們繼續為專案新增一個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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1323
25
PHP教程
1272
29
C# 教程
1251
24