一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

微信公眾平臺(tái)開發(fā)教程(三) 基礎(chǔ)框架搭建

 輕應(yīng)用開發(fā) 2014-01-24

微信公眾平臺(tái)開發(fā)教程(三) 基礎(chǔ)框架搭建


上一章,我們已經(jīng)初步講解了微信公眾賬號(hào)開發(fā)的基本原理,今天我們來探索設(shè)計(jì)實(shí)現(xiàn)。


首先我們?cè)O(shè)計(jì)了模塊層次圖,當(dāng)然圖中只是給出一種實(shí)現(xiàn)方式,不局限于此。具體見下圖。


主要功能介紹如下:


1)請(qǐng)求接口層。處理HTTP請(qǐng)求,及響應(yīng)


2)分發(fā)層。由接口層傳入請(qǐng)求,然后具體分析請(qǐng)求類型,分發(fā)至不同的處理器


3)業(yè)務(wù)邏輯層。這里是我們的具體業(yè)務(wù)邏輯了,根據(jù)請(qǐng)求,實(shí)現(xiàn)具體的業(yè)務(wù)邏輯。


4)數(shù)據(jù)層。我們?cè)趯?shí)現(xiàn)某個(gè)應(yīng)用時(shí)可能需要訪問數(shù)據(jù),可以是數(shù)據(jù)庫或者是文件。如果是簡單應(yīng)用,可能沒有這一層。


其實(shí),具體的應(yīng)用可以在這個(gè)結(jié)構(gòu)上去擴(kuò)展,可以擴(kuò)展消息對(duì)象層、業(yè)務(wù)對(duì)象層、數(shù)據(jù)訪問層、功能管理層等。這里只是提供一種思路,不局限于此。


 


 


根據(jù)層次圖,設(shè)計(jì)流程圖,具體講述實(shí)現(xiàn)的各個(gè)過程。以便了解整個(gè)處理過程。如下圖所示:



  


根據(jù)流程圖,我們能夠清晰的了解整個(gè)流程,消息處理的具體實(shí)現(xiàn)步驟。


下面我們針對(duì)每個(gè)流程進(jìn)行代碼實(shí)現(xiàn)。


一、接收HTTP請(qǐng)求


我們需要一個(gè)HttpHandler或者一個(gè)網(wǎng)頁,來處理微信服務(wù)端HTTP請(qǐng)求。


這里我們使用了HttpHandler。因?yàn)槠潇`活性高,性能好。


具體實(shí)現(xiàn)如下。


復(fù)制代碼

    public class WeiXinHttpHandler:IHttpHandler
    {
        /// <summary>
        /// 
        /// </summary>
        public bool IsReusable
        {
            get { return true; }
        }
        /// <summary>
        /// 處理請(qǐng)求
        /// </summary>
        /// <param name="context"></param>
        public void ProcessRequest(HttpContext context)
        {
            //由微信服務(wù)接收請(qǐng)求,具體處理請(qǐng)求
            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();
        }
    }

復(fù)制代碼

 


如果是HTTPHandler,需要在配置文件中,配置具體的應(yīng)用。具體的節(jié)點(diǎn)配置,我們不作說明。直接給出例子,配置HttpHandler節(jié)點(diǎn)如下


 



<httpHandlers>
   <add verb="*" path="WXService.ashx" type="namespace.WeiXinHttpHandler,WXWeb" validate="true"/>
</httpHandlers>


 


二、分發(fā)請(qǐng)求


 為了能功能封裝,我們也將此封裝在了處理組件中。其實(shí)可以放置在HttpHandler中的。 


 1)驗(yàn)證簽名


 如果是首次請(qǐng)求,需要驗(yàn)證簽名。就相當(dāng)于一次HTTP握手。之前在上一章中,設(shè)置的服務(wù)器URL以及token值,這個(gè)功能就是檢驗(yàn)是否鏈接成功。


這個(gè)請(qǐng)求是GET請(qǐng)求。以下具體說明(官方):


業(yè)務(wù)邏輯:


加密/校驗(yàn)流程:


<1> 將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序


<2> 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行SHA1加密


 <3> 開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來源于微信 


而官方只提供了PHP的代碼示例,很多東西在C#中并非直譯既得。所以這里面也有一些具體處理。先看官方的代碼: 


復(fù)制代碼

    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;
        }
    }

復(fù)制代碼

我們將其翻譯成C#版本: 


復(fù)制代碼

        /// <summary>
        /// 檢查簽名
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        private bool CheckSignature()
        {
            string signature = Request.QueryString[SIGNATURE];
            string timestamp = Request.QueryString[TIMESTAMP];
            string nonce = Request.QueryString[NONCE];

            List<string> list = new List<string>();
            list.Add(TOKEN);
            list.Add(timestamp);
            list.Add(nonce);
            //排序
            list.Sort();
            //拼串
            string input = string.Empty;
            foreach (var item in list)
            {
                input += item;
            }
            //加密
            string new_signature = SecurityUtility.SHA1Encrypt(input);
            //驗(yàn)證
            if (new_signature == signature)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

復(fù)制代碼

這里需要SHA1加密,具體的算法如下:


復(fù)制代碼

        /// <summary>
        /// SHA1加密
        /// </summary>
        /// <param name="intput">輸入字符串</param>
        /// <returns>加密后的字符串</returns>
        public static string SHA1Encrypt(string intput)
        {
            byte[] StrRes = Encoding.Default.GetBytes(intput);
            HashAlgorithm mySHA = new SHA1CryptoServiceProvider();
            StrRes = mySHA.ComputeHash(StrRes);
            StringBuilder EnText = new StringBuilder();
            foreach (byte Byte in StrRes)
            {
                EnText.AppendFormat("{0:x2}", Byte);
            }
            return EnText.ToString();
        }

復(fù)制代碼

2)分發(fā)請(qǐng)求


接下來就是具體的消息請(qǐng)求了,這里都是POST請(qǐng)求。


因?yàn)橛卸喾N消息類型,我們通過工廠類來進(jìn)行封裝,然后每種消息都有專門的處理器來進(jìn)行處理。具體實(shí)現(xiàn)邏輯:


復(fù)制代碼

        /// <summary>
        /// 處理請(qǐng)求
        /// </summary>
        /// <returns></returns>
        private string ResponseMsg()
        {
            string requestXml = Common.ReadRequest(this.Request);
            IHandler handler = HandlerFactory.CreateHandler(requestXml);
            if (handler != null)
            {
                return handler.HandleRequest();
            }

            return string.Empty;
        }

復(fù)制代碼

處理請(qǐng)求的對(duì)外方法(HttpHandler調(diào)用的方法就是這個(gè)了),即:


復(fù)制代碼

        /// <summary>
        /// 處理請(qǐng)求,產(chǎn)生響應(yīng)
        /// </summary>
        /// <returns></returns>
        public string Response()
        {
            string method = Request.HttpMethod.ToUpper();
            //驗(yàn)證簽名
            if (method == "GET")
            {
                if (CheckSignature())
                {
                    return Request.QueryString[ECHOSTR];
                }
                else
                {
                    return "error";
                }
            }

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

復(fù)制代碼

 


三、消息處理器具體處理消息


1)消息類型


首先我們來看下,具體的消息類型,其實(shí)上一張中已經(jīng)明確給了消息的接口。


這里再看具體看一下,請(qǐng)求的消息類型有哪些,回復(fù)的消息類型有哪些等。


千萬要注意,請(qǐng)求的消息是文本類型,回復(fù)的消息,不一定也是文本哦,可以是圖文、音樂等任意一種可回復(fù)的消息。具體見下表所示。


 


2)根據(jù)具體的消息接口,設(shè)計(jì)消息類。


這里給出類圖,供參考。



 


3)針對(duì)不同的消息,會(huì)有不同的處理器,來看下具體的類圖。


  


4)具體業(yè)務(wù)處理 


每個(gè)handler里面就是可以處理具體請(qǐng)求。輸入的什么消息,訪問那些數(shù)據(jù),調(diào)用服務(wù)等,都在這里處理。


還是建議大家對(duì)具體的業(yè)務(wù)進(jìn)行單獨(dú)封裝,在Handler中,只提供調(diào)用的接口。


因?yàn)殡S著業(yè)務(wù)的增加,一個(gè)Handler可能要處理很多業(yè)務(wù),如果所有的操作邏輯都寫在這里,勢必影響閱讀,也不易于維護(hù)與擴(kuò)展。 


5)產(chǎn)生回復(fù)消息


在處理完請(qǐng)求后,需要生成回復(fù)消息,響應(yīng)到終端。消息格式,就是我們介紹那些消息類型,但必須是可用于回復(fù)的,當(dāng)前支持的有:文本、圖文、音樂等。


一定要明確:回復(fù)的消息類型不一定要與請(qǐng)求的消息類型一樣,比如,請(qǐng)求是文本,回復(fù)的可以是圖文、音樂。


產(chǎn)生回復(fù)消息的過程,其實(shí),就是特定的消息對(duì)象格式化為對(duì)應(yīng)的XML的過程,然后將XML響應(yīng)至微信服務(wù)器。


6)實(shí)例


這里以微信用戶關(guān)注公眾賬號(hào),然后服務(wù)端處理處理事件請(qǐng)求,登記用戶,并提示歡迎信息。


復(fù)制代碼

    class EventHandler : IHandler
    {
        /// <summary>
        /// 請(qǐng)求的xml
        /// </summary>
        private string RequestXml { get; set; }
        /// <summary>
        /// 構(gòu)造函數(shù)
        /// </summary>
        /// <param name="requestXml"></param>
        public EventHandler(string requestXml)
        {
            this.RequestXml = requestXml;
        }
        /// <summary>
        /// 處理請(qǐng)求
        /// </summary>
        /// <returns></returns>
        public string HandleRequest()
        {
            string response = string.Empty;
            EventMessage em = EventMessage.LoadFromXml(RequestXml);
            if (em.Event == EventType.Subscribe)
            {
                //注冊(cè)用戶
                User user = new User();
                user.OpenID = em.FromUserName;
                UserManager.Regester(user);

                //回復(fù)歡迎消息
                TextMessage tm = new TextMessage();
                tm.ToUserName = em.FromUserName;
                tm.FromUserName = em.ToUserName;
                tm.CreateTime = Common.GetNowTime();
                tm.Content = "歡迎您關(guān)注xxx,我是小微。有什么我能幫助您的嗎?";
                response = tm.GenerateContent();
            }

            return response;
        }
    }

復(fù)制代碼

 


四、HTTP響應(yīng)


 最后將處理結(jié)果返回至最初HttpHandler,響應(yīng)給微信服務(wù)器,直接Response處理。這也是在最開始設(shè)計(jì)的HttpHandler中實(shí)現(xiàn)的。


下面是代碼片段,具體可見一、Http請(qǐng)求 



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


 


 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    日本免费熟女一区二区三区| 人妻少妇av中文字幕乱码高清| 中文字幕免费观看亚洲视频| 好吊日成人免费视频公开| 大香伊蕉欧美一区二区三区| 色鬼综合久久鬼色88| 久久久免费精品人妻一区二区三区| 久久精品国产99精品最新| 中文字幕亚洲在线一区| 中文字幕人妻日本一区二区| 午夜国产精品国自产拍av| 夜夜嗨激情五月天精品| 伊人国产精选免费观看在线视频| 丝袜诱惑一区二区三区| 男女午夜在线免费观看视频| 日韩国产中文在线视频| 日韩一区二区三区嘿嘿| 日韩欧美一区二区黄色| 国产精品人妻熟女毛片av久| 国产成人精品一区二区三区| 日本一本在线免费福利| 国产又黄又爽又粗视频在线| 欧美国产日韩在线综合| 熟女中文字幕一区二区三区| 亚洲精品国产第一区二区多人| 国产精品亚洲欧美一区麻豆| 欧美日韩免费黄片观看| 偷自拍亚洲欧美一区二页| 欧美激情一区=区三区| 日本午夜免费啪视频在线| 亚洲国产av国产av| 亚洲中文字幕三区四区| 日韩精品视频一二三区| 精品国产亚洲免费91| 日韩精品一区二区亚洲| 欧美日韩精品视频在线| 台湾综合熟女一区二区| 亚洲一区二区三区国产| 欧美日韩综合综合久久久| 男人和女人草逼免费视频| 91欧美激情在线视频|