• 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

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

  • 相关阅读:
    hdu acm 2844 Coins 解题报告
    hdu 1963 Investment 解题报告
    codeforces 454B. Little Pony and Sort by Shift 解题报告
    广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告
    hdu acm 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
    hdu acm 1114 Piggy-Bank 解题报告
    poj 2531 Network Saboteur 解题报告
    数据库范式
    ngnix 配置CI框架 与 CI的简单使用
    Vundle的安装
  • 原文地址:https://www.cnblogs.com/spring_wang/p/5074148.html
Copyright © 2020-2023  润新知