国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
微信公眾平臺(tái)開發(fā)教程(三) 基礎(chǔ)框架搭建
一、接收HTTP請(qǐng)求
二、分發(fā)請(qǐng)求
三、消息處理器具體處理消息
四、HTTP響應(yīng)
首頁(yè) 微信小程序 微信開發(fā) 微信公眾平臺(tái)開發(fā)教程(三) 基礎(chǔ)框架搭建

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

Feb 16, 2017 pm 04:15 PM
微信公眾平臺(tái)

微信公眾平臺(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ù)庫(kù)或者是文件。如果是簡(jiǎn)單應(yīng)用,可能沒有這一層。

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

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

?

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

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

??

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

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

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

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

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

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

????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();
????????}
????}

?

如果是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#中并非直譯既得。所以這里面也有一些具體處理。先看官方的代碼:?

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

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

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

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

????????///?<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();
????????}

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

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

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

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

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

????????///?<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?"無(wú)法處理";
????????????}
????????}

?

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

1)消息類型

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

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

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

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

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

這里給出類圖,供參考。

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

?

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

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

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ù),如果所有的操作邏輯都寫在這里,勢(shì)必影響閱讀,也不易于維護(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)求,登記用戶,并提示歡迎信息。

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

?

四、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();


?更多微信公眾平臺(tái)開發(fā)教程(三) 基礎(chǔ)框架搭建?相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276