zoukankan      html  css  js  c++  java
  • C#-MVC开发微信应用(2)--微信消息的处理和应答

    微信应用使用场景和商机很多,所以这也是一个技术的方向,因此,有空研究下、学习下微信的相关开发,也就成为SNF完善的必要条件了。本系列文章希望从一个循序渐进的角度上,全面介绍微信的相关开发过程和相关经验总结,希望给大家了解一下相关的开发历程。本篇随笔主要基于上一篇《C#-MVC开发微信应用(1)--开始使用微信接口》的基础上进行深入的介绍,介绍微信消息的处理和应答的过程。

    1、微信的消息应答交互

    我们知道,微信的服务器架起了客户手机和开发者服务器的一个桥梁,通过消息的传递和响应,实现了与用户的交互操作,下面是它的消息流程图。

    微信向开发者服务器请求的消息包含了多种类型,不过基本来说,分为了文本消息处理、事件消息处理、语音消息的识别,以及成为开发者之前的那个消息认证操作基本分类,下面是我绘制的一个消息分类图,其中介绍了这几种关系,以及各自的消息细化分类。

    对于这些消息的请求,我们在开发服务器端,需要编写相关的逻辑进行对应给的处理,然后给微信服务器平台回应消息即可。

    在前一篇的随笔里面我贴过代码,介绍微信消息处理的入口操作,代码如下所示。

    /// <summary>
            /// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。
            /// </summary>
            [HttpPost]
            [ActionName("Index")]
            public ActionResult Post(string signature, string timestamp, string nonce, string echostr)
            {
                Stream requestStream = System.Web.HttpContext.Current.Request.InputStream;
                byte[] requestByte = new byte[requestStream.Length];
                requestStream.Read(requestByte, 0, (int)requestStream.Length);
                string requestStr = Encoding.UTF8.GetString(requestByte);
    
                SNFWeiXinProcess.Log("请求值:" + requestStr);
                return Content(SNFWeiXinProcess.Run(requestStr));
                //return Content(sss(signature, timestamp, nonce, echostr) );
    
                //return Content(ReceiveXml());
    
            }
    SNFWeiXinProcess.Run(requestStr)就是对消息的处理函数,它实现了对不同消息的分发处理过程。‘
    public static string Run(string requestStr)
            {
                BaseMessage info = new BaseMessage();
                if (!string.IsNullOrEmpty(requestStr))
                {
                    info = XmlHelper.Deserialize<BaseMessage>(requestStr, info);
                  
    
                }
                //创建 分发器
                IDistributor distributor = new SNFWeiXinDistributor();
                string result = "抱歉,此功能暂未开通";
                switch (info.MsgType)
                {
                    case "text": //01.接收文本信息
                        RequestText text = new RequestText();
                        text = XmlHelper.Deserialize<RequestText>(requestStr, text);
                        result = distributor.OnActionText(text);
                        break;
              default: throw new Exception("找不到处理类型:" + info.MsgType);
                        
                }
             return result;
            }

    里面的SNFWeiXinProcess就是一个分发的管理类,它提取请求消息的内容,并构建不同类型的消息参数,传递给不同的响应函数进行处理,然后返回封装好的XML内容,作为响应。

    具体的代码处理逻辑如下图所示。

    这个消息处理接口,其实就是定义好一系列的对请求消息的处理操作,参数是不同给的消息对象,具体的代码定义如下所示(由于篇幅原因,省略部分接口,具体可以参考上图)。

    public interface IDistributor
        {
            #region 01.文本信息处理 OnActionText(RequestText text)
            /// <summary>
            /// 文本信息处理
            /// </summary>
            /// <param name="text"></param>
            /// <returns>返回值</returns>
            string OnActionText(RequestText text);
            #endregion
    
            #region 02.图片信息处理 OnActionImage(RequestImage image)
            /// <summary>
            /// 图片信息处理
            /// </summary>
            /// <param name="image"></param>
            /// <returns>返回值</returns>
            string OnActionImage(RequestImage image);
            #endregion
    
            #region 03.接收的语音消息 OnActionVoice(RequestVoice voice)
            /// <summary>
            /// 接收的语音消息
            /// </summary>
            /// <param name="voice"></param>
            /// <returns>返回值</returns>
            string OnActionVoice(RequestVoice voice);
            #endregion
    
           .........................................................
    
            #region 02.订阅 OnActionEventSubscribe(RequestEventSubscribe subscribe)
            /// <summary>
            /// 取消订阅
            /// </summary>
            /// <param name="subscribe"></param>
            /// <returns>返回值</returns>
            string OnActionEventSubscribe(RequestEventSubscribe subscribe);
            #endregion
        .........................................................
      

        #region 06.点击菜单跳转链接时的事件推送 OnActionEventView(RequestEventView view)
        /// <summary>
        /// 点击菜单跳转链接时的事件推送
        /// </summary>
        /// <param name="view"></param>
        /// <returns>返回值</returns>
        string OnActionEventView(RequestEventView view);
        #endregion
      }

    
    

    从上面的代码可以看出,不同的消息,到处理函数这里,就以不同的消息实体类的方式传递过来了(注意:实体类是我根据程序开发需要自己定义的,非微信本身的实体类),这样非常方便我们处理操作,否则每次需要解析不同的消息内容,很容易出现问题,这样强类型的数据类型,提高了我们开发微信应用的强壮型和高效性。这些实体类的对象有一定的继承关系的,他们的继承关系如下所示。

    效果:

    作者: 王春天 2015-12-24
    作者Blog:http://www.cnblogs.com/spring_wang 出处: http://www.cnblogs.com/spring_wang/p/5073670.html

      如果觉得还不错,欢迎转载。

  • 相关阅读:
    Sql Server中暂停命令
    优化SQL Sever查询语句的几个要点
    SQL Server 常用日期查询语句
    Android开发环境配置
    java实验报告(实验一)
    java实验报告(实验二)
    学习java的一点体会
    [已解决]求助:vs2003用代码实现excel的设置
    关于webform信息提示框
    DataGrid按钮事件的触发
  • 原文地址:https://www.cnblogs.com/spring_wang/p/5074148.html
Copyright © 2011-2022 走看看