微信公眾平臺開發(fā)教程(三) 基礎框架搭建
上一章,我們已經(jīng)初步講解了微信公眾帳號開發(fā)的基本原理,今天我們來探索設計實現(xiàn)。
首先我們設計了模組層次圖,當然圖中只是給出一種實作方式,不限於此。具體見下圖。
主要功能介紹如下:
1)請求介面層。處理HTTP請求,及回應
2)分送層。由介面層傳入請求,然後具體分析請求類型,分發(fā)至不同的處理器
3)業(yè)務邏輯層。這裡是我們的具體業(yè)務邏輯了,根據(jù)請求,實現(xiàn)具體的業(yè)務邏輯。
4)資料層。我們在實現(xiàn)某個應用程式時可能需要存取數(shù)據(jù),可以是資料庫或是文件。如果是簡單應用,可能沒有這一層。
其實,具體的應用可以在這個結(jié)構(gòu)上去擴展,可以擴展訊息物件層、業(yè)務物件層、資料存取層、功能管理階層等。這裡只是提供一種思路,不限於此。
?
?
根據(jù)層次圖,設計流程圖,具體講述實現(xiàn)的各個過程。以便了解整個處理過程。如下圖:
??
根據(jù)流程圖,我們能夠清楚的了解整個流程,訊息處理的具體實現(xiàn)步驟。
下面我們針對每個流程進行程式碼實作。
一、接收HTTP請求
我們需要一個HttpHandler或一個網(wǎng)頁,來處理微信服務端HTTP請求。
這裡我們使用了HttpHandler。因為其靈活性高,性能好。
具體實現(xiàn)如下。
????public?class?WeiXinHttpHandler:IHttpHandler ????{????????///?<summary> ????????///? ????????///?</summary> ????????public?bool?IsReusable ????????{????????????get?{?return?true;?} ????????}????????///?<summary> ????????///?處理請求????????///?</summary> ????????///?<param name="context"></param> ????????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(); ????????} ????}
?
如果是HTTPHandler,需要在設定檔中,設定特定的應用。具體的節(jié)點配置,我們不作說明。直接給出例子,配置HttpHandler節(jié)點如下
?
<httpHandlers> ???<add verb="*" path="WXService.ashx" type="namespace.WeiXinHttpHandler,WXWeb" validate="true"/></httpHandlers>
?
二、分發(fā)請求
?
二、分發(fā)請求了?二、分發(fā)請求其實可以放置在HttpHandler中的。?
?1)驗證簽章
?如果是首次要求,則需要驗證簽章。就相當於一次HTTP握手。之前在上一章中,設定的伺服器URL以及token值,這個功能就是檢驗是否連結(jié)成功。
這個請求是GET請求。以下具體說明(官方):
業(yè)務邏輯:
加密/校驗流程:
將token、timestamp、nonce三個參數(shù)進行字典序排序
將三個參數(shù)字串拼接成一個字串進行SHA1加密
? 開發(fā)者獲得加密後的字串可與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; ????????} ????}我們翻譯成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);????????????//驗證 ????????????if?(new_signature?==?signature) ????????????{????????????????return?true; ????????????}????????????else ????????????{????????????????return?false; ????????????} ????????}
2)分發(fā)請求
接下來就是具體的訊息請求了,這裡都是POST請求。 因為有多種訊息類型,我們透過工廠類別來進行封裝,然後每種訊息都有專門的處理器來進行處理。具體實作邏輯:????????///?<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(); ????????}處理請求的對外方法(HttpHandler呼叫的方法就是這個了),即:
????????///?<summary> ????????///?處理請求????????///?</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; ????????}
)訊息類型首先我們來看下,具體的訊息類型,其實上一張中已經(jīng)明確給了訊息的介面。
這裡再看具體看一下,請求的訊息類型有哪些,回覆的訊息類型有哪些等。
千萬要注意,請求的訊息是文字類型,回覆的訊息,不一定也是文字哦,可以是圖文、音樂等任意一種可回覆的訊息。具體見下表所示。
?
2)根據(jù)特定的訊息接口,設計訊息類別。這里給出類圖,供參考。
?
3)針對不同的消息,會有不同的處理器,來看下具體的類圖。
??
4)具體業(yè)務處理?
每個handler里面就是可以處理具體請求。輸入的什么消息,訪問那些數(shù)據(jù),調(diào)用服務等,都在這里處理。
還是建議大家對具體的業(yè)務進行單獨封裝,在Handler中,只提供調(diào)用的接口。
因為隨著業(yè)務的增加,一個Handler可能要處理很多業(yè)務,如果所有的操作邏輯都寫在這里,勢必影響閱讀,也不易于維護與擴展。?
5)產(chǎn)生回復消息
在處理完請求后,需要生成回復消息,響應到終端。消息格式,就是我們介紹那些消息類型,但必須是可用于回復的,當前支持的有:文本、圖文、音樂等。
一定要明確:回復的消息類型不一定要與請求的消息類型一樣,比如,請求是文本,回復的可以是圖文、音樂。
產(chǎn)生回復消息的過程,其實,就是特定的消息對象格式化為對應的XML的過程,然后將XML響應至微信服務器。
6)實例
這里以微信用戶關注公眾賬號,然后服務端處理處理事件請求,登記用戶,并提示歡迎信息。
????class?EventHandler?:?IHandler ????{????????///?<summary> ????????///?請求的xml????????///?</summary> ????????private?string?RequestXml?{?get;?set;?}????????///?<summary> ????????///?構(gòu)造函數(shù)????????///?</summary> ????????///?<param name="requestXml"></param> ????????public?EventHandler(string?requestXml) ????????{????????????this.RequestXml?=?requestXml; ????????}????????///?<summary> ????????///?處理請求????????///?</summary> ????????///?<returns></returns> ????????public?string?HandleRequest() ????????{????????????string?response?=?string.Empty; ????????????EventMessage?em?=?EventMessage.LoadFromXml(RequestXml);????????????if?(em.Event?==?EventType.Subscribe) ????????????{????????????????//注冊用戶 ????????????????User?user?=?new?User(); ????????????????user.OpenID?=?em.FromUserName; ????????????????UserManager.Regester(user);????????????????//回復歡迎消息 ????????????????TextMessage?tm?=?new?TextMessage(); ????????????????tm.ToUserName?=?em.FromUserName; ????????????????tm.FromUserName?=?em.ToUserName; ????????????????tm.CreateTime?=?Common.GetNowTime(); ????????????????tm.Content?=?"歡迎您關注xxx,我是小微。有什么我能幫助您的嗎?"; ????????????????response?=?tm.GenerateContent(); ????????????}????????????return?response; ????????} ????}
?
四、HTTP響應
?最后將處理結(jié)果返回至最初HttpHandler,響應給微信服務器,直接Response處理。這也是在最開始設計的HttpHandler中實現(xiàn)的。
下面是代碼片段,具體可見一、Http請求?
????????????context.Response.Clear(); ????????????context.Response.Charset?=?"UTF-8"; ????????????context.Response.Write(responseMsg); ????????????context.Response.End();
?更多微信公眾平臺開發(fā)教程(三) 基礎框架搭建?相關文章請關注PHP中文網(wǎng)!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

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

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)