이전 기사의 코드에 이어 프로젝트에 CustomMessageHandle.cs 클래스를 계속 추가합니다.
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()라는 것을 알 수 있습니다. 이 정보는 메시지를 반환하는 데 사용됩니다. 해당 WeChat 메시지 유형(예: 음성)이 코드로 처리되지 않으면 기본적으로 여기에 있는 결과가 반환됩니다.
DefaultResponseMessage() 메소드에서 다음 문장을 볼 수 있습니다.
var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); //ResponseMessageText也可以是News等其他类型
여기서 CreateResponseMessage
ResponseMessageText - 문자 메시지에 해당
ResponseMessageNews - 그래픽 메시지에 해당
ResponseMessageMusic - 음악 메시지에 해당
ResponseMessageXXX - 기타 유형 등 on
위의 모든 유형의 매개변수 설정 방법과 관련하여 오픈 소스 프로젝트의 데모를 볼 수 있으며 여기에서는 반복되지 않습니다: 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
지금까지 우리는 MassageHandler를 사용하여 WeChat 사용자가 보낸 모든 요청을 처리했습니다.
다음은 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에 반환 값이 할당되었다는 점에 유의해야 합니다.
더 많은 WeChat 공개 플랫폼 개발: MessageHandler 관련 기사를 알아보려면 PHP 중국어 웹사이트를 주목하세요!