热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

这篇文章主要介绍微信开发系列----02:实现POST请求响应
项目GitHub地址https://github.com/Andyahui/xgyxsh_WeiXin

一:微信XML的POST请求处理

昨天我们已经成为了开发者,说明get请求时可以到底,且是得到了相应的处理,下面是我们通过浏览器我们配置的URL浏览到的。

我们可以发现在get请求中设置的返回值在这里出现了,说明我们的测试是成功的。下面我们需要设置POST请求对应的Action。

注意:由于我们微信和网站服务器的每一次交互都是通过POST请求来得到自己想要的东西,我们就必须为传输进行加密。

        /// 
        /// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。
        /// PS:此方法为简化方法,效果与OldPost一致。
        /// v0.8之后的版本可以结合Senparc.Weixin.MP.MvcExtension扩展包,使用WeixinResult,见MiniPost方法。
        /// 
        [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对象,此时对象中就包含了我们网站后台的逻辑处理方法。

这就是我们POST请求对于的处理,每一次微信服务器转发的xml信息都会利用POST请求形式再次转发到这里,我们进行处理。

二:了解MessageHandler

要完成微信开发,SDK中关键类就需要了解,下面就简单说下MessageHandler;

MessageHandler是SDK处理消息的核心,主要对于POST请求,进行对应的处理。还可以进行逻辑判断,说白了就是我们所有的业务逻辑都是在这个类下面进行的。<消息和事件>。这是一个抽象类,我们需要通过继承重新实现它。下面是具体的实现。《这里是对应官方的解释WiKi》。

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

从上到下分析。发现它是继承自MessageHandler但是它后面还有个CustomMessageContext,此时对于MessageHandler有了重新的认识,这货原来是个泛型的抽象类,我们需要往里面填写个类型,查看官方说明说这个CustomMessageContext是个自定义的上下文类,到底是什么了,我也没仔细研究,看官方的介绍吧(WiKi)。接着下面是个CTOR,主要是实例化的时候使用,注意里面的参数,一个是请求流inputSrream,一个是微信服务器发送的数据类PostModel。在接着就是我们实现的方法了,第一个是DefaultResponseMessage方法,这个是必须实现的。因为它是处理微信请求来没有响应的数据,默认给微信服务器发送消息的。最后到了文本处理了,这里override了OnTextRequest方法,从而可以对应响应用户的文本信息请求。我们要是需要实现别的处理,比如图片,语音,地理位置等,分别重写别的方法,返回对应的消息类型就可以实现。

三:自定义上下文CustomMessageContext

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

    /// 
    /// 自定义的上下文类---->处理单个用户的对话状态。
    /// 
    public class CustomMessageContext : MessageContext
    {
        public CustomMessageContext()
        {
            base.MessageContextRemoved+=CustomMessageContext_MessageContextRemoved;
        }
        /// 
        /// 当上下文过期,被移除的时候触发的时间
        /// 
        private void CustomMessageContext_MessageContextRemoved(object sender, Senparc.Weixin.Context.WeixinContextRemovedEventArgs 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请求响应 相关文章请关注PHP中文网!

推荐阅读
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
author-avatar
小圈44
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有