ホームページ >WeChat アプレット >WeChatの開発 >WeChat パブリック プラットフォーム開発: MessageHandler について

WeChat パブリック プラットフォーム開発: MessageHandler について

高洛峰
高洛峰オリジナル
2017-02-27 12:00:561983ブラウズ

前の記事のコードを続けて、プロジェクトに CustomMessageHandle.cs クラスを追加します。

WeChat パブリック プラットフォーム開発: MessageHandler について

CustomMessageHandle.cs は、抽象クラス Senparc.Weixin.MP.MessageHandlers を継承し、いくつかのメソッドを実装する必要があります。 。最も初期的な 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() という名前であることがわかります。この情報は、対応する型 (. WeChat メッセージがコードによって処理されない場合、デフォルトではここに結果が返されます。

DefaultResponseMessage() メソッドには、次の文があります:

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

ここでの CreateResponseMessage メソッドは、さまざまな戻り値の型に対応する次のいずれかの型になります。

ResponseMessageText - に対応します。テキスト メッセージ

ResponseMessageNews - グラフィック メッセージに対応します

ResponseMessageMusic - 音楽メッセージに対応します

ResponseMessageXXX - 他のタイプについても同様

上記のすべてのタイプのパラメータの設定方法については、次のデモを参照できます。オープン ソース プロジェクトはこちらです。繰り返しません: 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 が相当します。イベントリクエストのサブタイプに。

CustomMessageHandler の基本クラスを設定するときに、MessageContext というジェネリックが使用されていることがわかりました (MessageHandler)。この MessageContext は、SDK によって提供されるデフォルトのメッセージ コンテキスト処理クラスであり、最も基本的な In をすでに処理できます。この場合、アプリケーションがそれほど複雑でない場合は、このクラスを直接使用してください。プロジェクトがより複雑な場合は、必要に応じて独自のクラスを作成したり (IMessageContext インターフェイスを継承したり)、このクラスを継承してさらにいくつかの属性 (ワークフローや分散キャッシュなど) を拡張したりすることもできます。

これまで、WeChat ユーザーから送信されたすべてのリクエストを処理するために、MassageHandler を使用してきました。

ここでは、MassageHandler の「秘密兵器」をいくつか紹介します。

OnExecuting() と OnExecuted()

これら 2 つのメソッドを直接オーバーライドできます。このうち、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;//设置返回对象
    }
}

If OnExecuting メソッドに中断がない場合、たとえば OnTextRequest メソッドが実行されると (またはデフォルトのメソッドが実行されると)、OnExecuted() メソッドがトリガーされ、それに応じて書き換えることもできます。 OnExecuted() メソッド内で、ResponseMessage に戻り値が割り当てられていることに注意してください。

その他の WeChat パブリック プラットフォーム開発: MessageHandler 関連の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。