Heim > Artikel > WeChat-Applet > Entwicklung der öffentlichen WeChat-Plattform: MessageHandler verstehen
In Fortsetzung des Codes aus dem vorherigen Artikel fügen wir dem Projekt weiterhin eine CustomMessageHandle.cs-Klasse hinzu:
CustomMessageHandle.cs muss Senparc.Weixin.MP erben .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; } } }
Wir können sehen, dass die abstrakte Methode, die neu geschrieben und implementiert werden muss, DefaultResponseMessage() heißt Wenn die WeChat-Nachricht des entsprechenden Typs (z. B. Sprache) vom Code nicht verarbeitet wird, wird das Ergebnis hier standardmäßig zurückgegeben.
In der DefaultResponseMessage()-Methode sehen wir diesen Satz:
var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); //ResponseMessageText也可以是News等其他类型
Die CreateResponseMessage
ResponseMessageText – entsprechende Textnachricht
ResponseMessageNews – entsprechende Grafiknachricht
ResponseMessageMusic – entsprechende Musiknachricht
ResponseMessageXXX – Weitere Typen können abgeleitet werden analog
Zu den Einstellungsmethoden aller oben genannten Parametertypen können Sie sich die Demo des Open-Source-Projekts ansehen, die hier nicht wiederholt wird: https://github. com/JeffreySu/WeiXinMPSDK.
Wie verarbeiten wir also von Benutzern gesendete Textnachrichten?
Es ist ganz einfach – schreiben Sie einfach eine OnTextRequest-Methode neu:
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; }
Sie können diese Methode frei spielen, z. B. die Datenbank lesen, Schlüsselwörter beurteilen und sogar verschiedene ResponseMessageXX-Typen zurückgeben ( Wie solange sich die endgültigen Typen unter der IResponseMessageBase-Schnittstelle befinden).
entspricht OnTextRequest. Wenn wir Sprache, geografischen Standort, Menü und andere Arten von Nachrichten verarbeiten möchten, müssen wir nur die entsprechenden Methoden neu schreiben:
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)
Wobei OnEvent_XX dem Untertyp der Ereignisanforderung entspricht.
Beim Festlegen der Basisklasse von CustomMessageHandler haben wir gesehen, dass ein generischer Name namens MessageContext verwendet wird (MessageHandler
Bisher haben wir MassageHandler verwendet, um alle von WeChat-Benutzern gesendeten Anfragen zu bearbeiten.
Hier sind einige der „Geheimwaffen“ von MassageHandler.
OnExecuting() und OnExecuted()
Wir können diese beiden Methoden direkt überschreiben. OnExecuting wird ausgeführt, bevor alle Nachrichtenverarbeitungsmethoden (wie OnTextRequest, OnVoiceRequest usw.) ausgeführt werden. Während dieses Vorgangs können wir CancelExecute auf true setzen, um die Ausführung aller nachfolgenden Methoden (einschließlich OnExecuted) zu unterbrechen, zum Beispiel:
public override void OnExecuting() { if (RequestMessage.FromUserName == "olPjZjsXuQPJoV0HlruZkNzKc91E") { CancelExcute = true; //终止此用户的对话 //如果没有下面的代码,用户不会收到任何回复,因为此时ResponseMessage为null //添加一条固定回复 var responseMessage = CreateResponseMessage<ResponseMessageText>(); responseMessage.Content = "Hey!你已经被拉黑啦!"; ResponseMessage = responseMessage;//设置返回对象 } }
Wenn es bei OnExecuting keine Unterbrechung gibt, wenn beispielsweise die OnTextRequest-Methode ausgeführt wird (oder die Standardmethode ausgeführt wird), wird die OnExecuted()-Methode ausgelöst, und wir können sie auch entsprechend umschreiben . Es ist zu beachten, dass ResponseMessage innerhalb der Methode OnExecuted() ein Rückgabewert zugewiesen wurde.
Mehr zur Entwicklung der öffentlichen WeChat-Plattform: Um mehr über MessageHandler-bezogene Artikel zu erfahren, achten Sie bitte auf die chinesische PHP-Website!