>위챗 애플릿 >위챗 개발 >WeChat 개발 시리즈----02: POST 요청 응답 구현

WeChat 개발 시리즈----02: POST 요청 응답 구현

高洛峰
高洛峰원래의
2017-02-14 11:17:351576검색

프로젝트 GitHub 주소:https://github.com/Andyahui/xgyxsh_WeiXin

하나: WeChat XML POST 요청 처리

어제 우리는 개발자가 되었으며, 이에 따라 get 요청이 완료되고 처리될 수 있음을 보여줍니다. URL은 다음과 같습니다. 우리가 구성한 내용이 탐색됩니다.

微信开发系列----02:实现POST请求响应

get 요청에 설정된 반환 값이 여기에 표시되어 테스트가 성공했음을 나타냅니다. 다음으로 POST 요청에 해당하는 작업을 설정해야 합니다.

참고: WeChat과 웹사이트 서버 간의 모든 상호 작용은 원하는 것을 얻기 위한 POST 요청을 통해 이루어지기 때문에 전송을 암호화해야 합니다.

        /// <summary>
        /// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。
        /// PS:此方法为简化方法,效果与OldPost一致。
        /// v0.8之后的版本可以结合Senparc.Weixin.MP.MvcExtension扩展包,使用WeixinResult,见MiniPost方法。
        /// </summary>
        [HttpPost]
        [ActionName("Index")]
        public ActionResult Post(PostModel postModel)
        {
            postModel.Token = Token;
            // postModel.EncodingAESKey = "";          //根据自己后台的设置保持一致
            // postModel.AppId = AppId;                       //根据自己后台的设置保持一致  
            //验证数字签名
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                //??? 这里有问题,要是不注释的话,就会在这里出错,也就是数字签名有问题。
                //return Content("参数错误!");
            }

            //  1:自定义MessageHandler,对微信请求的详细判断操作都在这里面。  实例化了一个类
            var messageHandler = new CustomMessageHandle(Request.InputStream, postModel);   //接收消息

            //  2:执行微信处理过程----执行完这里之后ResponseMessage才会有值。
            messageHandler.Execute();            

            //  3:return new FixWeixinBugWeixinResult(messageHandler); 这个有换行的问题。           
            //return new FixWeixinBugWeixinResult(messageHandler.ToString());

            //  3:注意第三个----为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
            return new WeixinResult(messageHandler);                 //v0.8+
        }

위의 각 줄의 의미를 명확하게 알 수 있습니다. 여기서 궁금한 점이 있습니다. if 판단에 주석을 달지 않고 디지털 서명을 확인하면 "매개변수 오류"가 바로 표시됩니다. "다음 작업은 계속되지 않을 예정인데 공식 블로그에는 아무런 코멘트도 없습니다. 왜인지는 모르겠습니다." ? (하나님께 답을 구하세요.)

위의 세 가지 주요 단계는 다음과 같습니다.

먼저 CustomMessageHandle 개체가 인스턴스화되고 해당 매개변수는 다음과 같습니다. 해당 CTOR가 초기화된 후 Execute() 메서드가 호출되고 마지막으로 WeixinResult를 인스턴스화하여 해당 CustomMessageHandle 개체가 반환됩니다. 이때 개체에는 웹 사이트 백엔드의 논리적 처리 메서드가 포함됩니다.

4e8f309c20344c7bd918f10d1ef485d6

이것이 POST 요청이 매회 처리되는 방식입니다. WeChat 서버에서 전달한 xml 정보가 POST 요청 형식으로 다시 여기로 전달되면 처리해 드리겠습니다.

2: MessageHandler 이해

WeChat 개발을 완료하려면 SDK의 주요 클래스를 이해해야 합니다. 다음은 간단하게 MessageHandler에 대해 이야기해 보겠습니다.

MessageHandler는 SDK에서 메시지를 처리하는 핵심이며 그에 따라 주로 POST 요청을 처리합니다. 논리적인 판단도 가능합니다. 직설적으로 말하면 우리의 모든 비즈니스 로직은 이 클래스에서 수행됩니다. 3c3cf98b8d2405c4741b30e80eddd469. 이것은 추상 클래스이므로 상속을 통해 다시 구현해야 합니다. 다음은 구체적인 구현입니다. "해당 공식 설명WiKi은 다음과 같습니다."

namespace XGY_WeiXin.WeiXinHelper
{
    public class CustomMessageHandle : MessageHandler<CustomMessageContext>
    {
        //PostModel:表示的都是从微信服务器里面得到的值,时间戳,字符串等。(WeiXinController中使用过)
        //构造函数的inputStream用于接收来自微信服务器的请求流(如果需要在外部处理,这里也可以传入XDocument)。
        public CustomMessageHandle(Stream inputSrream,PostModel postModel):base(inputSrream,postModel)
        {            
        }
        /// <summary>
        /// 必须实现抽象的类------作用:用于放回一条信息,当没有对应类型的微信消息没有被代码处理,那么默认会执行返回这里的结果。
        /// </summary>
        /// <param name="requestMessage">请求消息</param>
        /// <returns></returns>
    public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
    {
        //CreateResponseMessage<T>  这里是创建一个放回的对象,代表不同的类型,
        var responseMessage = base.CreateResponseMessage<ResponseMessageText>();//ResponseMessageText可以更换为别的类型
        responseMessage.Content = "这条消息来自DefaultResponseMessage。";
        return responseMessage;
    }
         /// <summary>
        ///1: 处理用户发送过来的文字消息。重写OnTextRequest方法。
       /// --------(总结:)方法里面可以自由发挥,读取DB,判断关键字,甚至返回不同的ResponseMessageXX类型(只要最终的类型都是在IResponseMessageBase接口下的即可)。
        /// </summary>
        /// <param name="requestMessage">请求消息</param>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //CreateResponseMessage<类型>根据当前的RequestMessage创建指定类型的ResponseMessage;创建相应消息.
            var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
            responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName + "。\r\t您发送了文字信息:" +
                                      requestMessage.Content;
            return responseMessage;
        }
    }
}

위에서 아래로 분석합니다. MessageHandler에서 상속되었지만 그 뒤에 CustomMessageContext가 있다는 것을 알았습니다. 이번에는 MessageHandler에 대한 새로운 이해가 생겼습니다. 공식 형식을 입력해야 합니다. 정의된 컨텍스트 클래스가 무엇인지 자세히 연구하지 않았습니다(WiKi). 아래는 96daa2ef00832a1c934dafecf16f4562을 인스턴스화할 때 주로 사용되는 CTOR입니다. 내부 매개변수에 주의하세요. 하나는 요청 스트림 inputSrream입니다. WeChat 서버 전송된 데이터 클래스는 PostModel입니다. 다음 단계는 우리가 구현하는 메서드입니다. 첫 번째는 반드시 구현해야 하는 DefaultResponseMessage 메서드입니다. WeChat 요청에 대한 응답 없이 데이터를 처리하기 때문에 기본적으로 WeChat 서버에 메시지를 보냅니다. 마지막으로 텍스트 처리에 관한 것입니다. 여기서는 사용자의 텍스트 정보 요청에 응답할 수 있도록 OnTextRequest 메서드를 재정의합니다. 사진, 음성, 지리적 위치 등과 같은 다른 처리를 구현해야 하는 경우 다른 메서드를 별도로 다시 작성하고 해당 메시지 유형을 반환하여 구현할 수 있습니다.

3: 사용자 정의 컨텍스트 CustomMessageContext

下面是自定义上下文类CustomMessageContext,主要是继承自MessageContextfc3c6664750ac75e4617a1dbf32e095a来实现对于的功能。

    /// <summary>
    /// 自定义的上下文类---->处理单个用户的对话状态。
    /// </summary>
    public class CustomMessageContext : MessageContext<IRequestMessageBase,IResponseMessageBase>
    {
        public CustomMessageContext()
        {
            base.MessageContextRemoved+=CustomMessageContext_MessageContextRemoved;
        }
        /// <summary>
        /// 当上下文过期,被移除的时候触发的时间
        /// </summary>
        private void CustomMessageContext_MessageContextRemoved(object sender, Senparc.Weixin.Context.WeixinContextRemovedEventArgs<IRequestMessageBase, IResponseMessageBase> e)
        {
            /* 注意,这个事件不是实时触发的(当然你也可以专门写一个线程监控)
            * 为了提高效率,根据WeixinContext中的算法,这里的过期消息会在过期后下一条请求执行之前被清除
            */
            var messageContext = e.MessageContext as CustomMessageContext;
            if (messageContext==null)
            {
                //如果是正常的调用,messageContext不会为null
                return ;                 
            }
            //TODO:这里根据需要执行消息过期时候的逻辑,下面的代码仅供参考
            //Log.InfoFormat("{0}的消息上下文已过期",e.OpenId);
            //api.SendMessage(e.OpenId, "由于长时间未搭理客服,您的客服状态已退出!");
        }
    }

   解释参考官方给的解释,版本升级了(WiKi),我觉得这里以后还是会做大文章的。

四:微信测试号效果展示

   此时我们大体的底层框架就搭建成功了,我们发布部署到服务器上面就可以看到文本处理的响应了。

微信开发系列----02:实现POST请求响应

这是微信的二维码可以关注下,可以实现简单的互动。

微信开发系列----02:实现POST请求响应

更多微信开发系列----02:实现POST请求响应 相关文章请关注PHP中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.