Maison  >  Article  >  Applet WeChat  >  Développement de la plateforme publique WeChat : comprendre MessageHandler

Développement de la plateforme publique WeChat : comprendre MessageHandler

高洛峰
高洛峰original
2017-02-27 12:00:561978parcourir

Poursuivant le code de l'article précédent, nous continuons à ajouter une classe CustomMessageHandle.cs au projet :

Développement de la plateforme publique WeChat : comprendre MessageHandler

CustomMessageHandle.cs doit hériter de Senparc.Weixin.MP .MessageHandlers peut être le suivant :

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;
        }
    }
}

Nous pouvons voir que la méthode abstraite qui doit être réécrite et implémentée s'appelle DefaultResponseMessage(). Cette information est utilisée pour. renvoyer un message Si le message WeChat du type correspondant (comme la voix) n'est pas traité par le code, le résultat ici sera renvoyé par défaut.

Dans la méthode DefaultResponseMessage(), nous voyons cette phrase :

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

La méthode CreateResponseMessage différents types de retour :

ResponseMessageText - message texte correspondant

ResponseMessageNews - message graphique correspondant

ResponseMessageMusic - message musical correspondant

ResponseMessageXXX - D'autres types peuvent être déduits par analogie

Concernant les méthodes de réglage de tous les types de paramètres ci-dessus, vous pouvez voir la Démo du projet open source, qui ne sera pas répétée ici : https://github. com/JeffreySu/WeiXinMPSDK.

Alors, comment traitons-nous les messages texte envoyés par les utilisateurs ?

C'est très simple - il suffit de réécrire une méthode 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;
}

Vous pouvez jouer librement avec cette méthode, comme lire la base de données, juger des mots-clés et même renvoyer différents types de ResponseMessageXX (comme tant que les types finaux sont sous l'interface IResponseMessageBase).

correspond à OnTextRequest. Si l'on veut gérer la voix, la localisation géographique, le menu et d'autres types de messages, il suffit de réécrire la méthode correspondante. Les méthodes qui peuvent être réécrites sont les suivantes :

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)

Où OnEvent_XX correspond au sous-type de demande d'événement.

Lors de la définition de la classe de base de CustomMessageHandler, nous avons vu qu'un générique appelé MessageContext (MessageHandler) est utilisé. Ce MessageContext est une classe de traitement de contexte de message par défaut fournie par le SDK. les situations les plus élémentaires. Si votre application n’est pas très complexe, utilisez simplement cette classe directement. Si le projet est plus complexe, vous pouvez également écrire votre propre classe (en héritant de l'interface IMessageContext) selon vos propres besoins, ou hériter de cette classe pour étendre davantage d'attributs (tels que le workflow et le cache distribué, etc.).

Jusqu'à présent, nous avons utilisé MassageHandler pour traiter toutes les demandes envoyées par les utilisateurs de WeChat.

Voici quelques-unes des "armes secrètes" de MassageHandler.

OnExecuting() et OnExecuted()

Nous pouvons remplacer ces deux méthodes directement. OnExecuting sera exécuté avant que toutes les méthodes de traitement des messages (telles que OnTextRequest, OnVoiceRequest, etc.) soient exécutées. Au cours de ce processus, nous pouvons définir CancelExecute sur true pour interrompre l'exécution de toutes les méthodes suivantes (y compris OnExecuted), par exemple :

public override void OnExecuting()
{
    if (RequestMessage.FromUserName == "olPjZjsXuQPJoV0HlruZkNzKc91E")
    {
        CancelExcute = true; //终止此用户的对话
     
        //如果没有下面的代码,用户不会收到任何回复,因为此时ResponseMessage为null
 
        //添加一条固定回复
        var responseMessage = CreateResponseMessage<ResponseMessageText>();
        responseMessage.Content = "Hey!你已经被拉黑啦!";
 
        ResponseMessage = responseMessage;//设置返回对象
    }
}
S'il n'y a pas d'interruption dans OnExecuting, lorsque, par exemple, la méthode OnTextRequest est exécutée (ou que la méthode par défaut est exécutée), la méthode OnExecuted() sera déclenchée, et nous pourrons également la réécrire en conséquence . Il convient de noter que dans la méthode OnExecuted(), ResponseMessage s'est vu attribuer une valeur de retour.

Plus de développement de la plateforme publique WeChat : pour en savoir plus sur les articles liés à MessageHandler, veuillez prêter attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn