WeChat 공개 플랫폼 개발: MessageHandler 이해

高洛峰
풀어 주다: 2017-02-27 12:00:56
원래의
1976명이 탐색했습니다.

이전 기사의 코드에 이어 프로젝트에 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 메소드는 Different return에 해당하는 다음 유형 중 하나일 수 있습니다. 유형:

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)라는 제네릭이 사용되는 것을 확인했습니다. 이 MessageContext는 SDK에서 제공하는 기본 메시지 컨텍스트 처리 클래스입니다. 가장 기본적인 상황입니다. 애플리케이션이 그다지 복잡하지 않다면 이 클래스를 직접 사용하세요. 프로젝트가 더 복잡한 경우 필요에 따라 고유한 클래스(IMessageContext 인터페이스 상속)를 작성하거나 이 클래스를 상속하여 추가 속성(예: 워크플로 및 분산 캐시 등)을 확장할 수도 있습니다.

지금까지 우리는 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 중국어 웹사이트를 주목하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿