WebsiteDdesign

网站设计

028微信开发 > 资讯 > 028微信开发之基础框架搭建
联系我们

028微信开发之基础框架搭建

来源:028微信开发 | 2016-11-23

028微信开发作为成都优秀的微信开发和为微信公众平台定制开发公司,在微成都企业提供微信开发是积累了丰富的经验,那么微信公众平台在进行基础功能搭建时主要有哪些内容呢,主要功能介绍如下:


(1)请求接口层。处理HTTP请求,以及响应;

(2)分发层。由接口层传入请求,然后具体分析请求类型,分发至不同的处理器;

(3)业务逻辑层。这里是我们的具体业务逻辑了,根据请求,实现具体的业务逻辑;

(4)数据层。我们在实现某个应用时可能需要访问数据,可以是数据库或者是文件。如果是简单应用,可能没有这一层;


其实,具体的应用可以在这个结构上去扩展,可以扩展消息对象层、业务对象层、数据访问层、功能管理层等。这里只是提供一种思路,不局限于此。

028微信定制开发工程师根据层次图,设计流程图,具体讲述实现的各个过程。以便了解整个处理过程。如下图所示:



20151211143743_3897.png




一、接收HTTP请求


根据028开发的经验,我们需要一个Http Handler或者一个网页,来处理微信服务端HTTP请求。这里我们使用了HttpHandler,因为其灵活性高,性能好。具体实现过程如下代码所示:


  public class WeiXinHttpHandler:IHttpHandler
    {
        ////// 
        ///public bool IsReusable
        {
            get { return true; }
        }
        ////// 处理请求
        //////public void ProcessRequest(HttpContext context)
        {
            //由微信服务接收请求,具体处理请求
            WeiXinService wxService = new WeiXinService(context.Request);
            string responseMsg = wxService.Response();
            context.Response.Clear();
            context.Response.Charset = "UTF-8";
            context.Response.Write(responseMsg);
            context.Response.End();
        }
    }


二、分发请求


 为了能更好地实现功能封装,我们也将此封装在了处理组件中。其实可以放置在Http Handler中的。 


( 1)验证签名

 如果是首次请求,需要验证签名。就相当于一次HTTP握手。之前在上一章中,设置的服务器URL以及token值,这个功能就是检验是否链接成功。

这个请求是GET请求。以下具体说明(官方):加密/校验流程:

将token、timestamp、nonce三个参数进行字典序排序

将三个参数字符串拼接成一个字符串进行SHA1加密

开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 

而官方只提供了PHP的代码示例,很多东西在C#中并非直译既得。所以这里面也有一些具体处理。先看官方的代码:


 private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];    
                
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }


(2)分发请求

接下来就是具体的消息请求了,这里都是POST请求。因为有多种消息类型,我们通过工厂类来进行封装,然后每种消息都有专门的处理器来进行处理。具体实现逻辑:


 ////// 处理请求
        //////private string ResponseMsg()
        {
            string requestXml = Common.ReadRequest(this.Request);
            IHandler handler = HandlerFactory.CreateHandler(requestXml);
            if (handler != null)
            {
                return handler.HandleRequest();
            }

            return string.Empty;
        }


处理请求的对外方法(Http Handler调用的方法就是这个了),即:


 ////// 处理请求,产生响应
        //////public string Response()
        {
            string method = Request.HttpMethod.ToUpper();
            //验证签名
            if (method == "GET")
            {
                if (CheckSignature())
                {
                    return Request.QueryString[ECHOSTR];
                }
                else
                {
                    return "error";
                }
            }

            //处理消息
            if (method == "POST")
            {
                return ResponseMsg();
            }
            else
            {
                return "无法处理";
            }
        }




三、消息处理器具体处理消息


(1)消息类型

具体的消息类型,其实上一张中已经明确给了消息的接口。这里再看具体看一下,请求的消息类型有哪些,回复的消息类型有哪些等。千万要注意,请求的消息是文本类型,回复的消息,不一定也是文本哦,可以是图文、音乐等任意一种可回复的消息。具体见下表所示。


20151211144710_8607.png



(2)设计消息类

根据具体的消息接口,设计消息类。这里给出类图,供参考。


20151211144808_6171.png



(4)具体业务处理 

每个handler里面就是可以处理具体请求。输入的什么消息,访问那些数据,调用服务等,都在这里处理。

还是建议对具体的业务进行单独封装,在Handler中,只提供调用的接口。

因为随着业务的增加,一个Handler可能要处理很多业务,如果所有的操作逻辑都写在这里,势必影响阅读,也不易于维护与扩展。 


(5)产生回复消息

在处理完请求后,需要生成回复消息,响应到终端。消息格式,就是我们介绍那些消息类型,但必须是可用于回复的,当前支持的有:文本、图文、音乐等。产生回复消息的过程,其实,就是特定的消息对象格式化为对应的XML的过程,然后将XML响应至微信服务器。




四、HTTP响应

 最后将处理结果返回至最初HttpHandler,响应给微信服务器,直接Response处理。这也是在最开始设计的HttpHandler中实现的。下面是代码片段,具体可见一、Http请求 :


    context.Response.Clear();
    context.Response.Charset = "UTF-8";
    context.Response.Write(responseMsg);
    context.Response.End();