


Tutorial zur Entwicklung der ?ffentlichen WeChat-Plattform (3) Grundlegende Framework-Konstruktion
Feb 16, 2017 pm 04:15 PMTutorial zur Entwicklung ?ffentlicher WeChat-Plattformen (3) Grundlegender Framework-Aufbau
Im vorherigen Kapitel haben wir zun?chst die Grundprinzipien der Entwicklung ?ffentlicher WeChat-Konten erl?utert. Heute werden wir die Designimplementierung untersuchen.
Zun?chst haben wir ein Modulhierarchiediagramm entworfen. Das Diagramm zeigt natürlich nur eine Implementierungsmethode und ist nicht darauf beschr?nkt. Einzelheiten finden Sie in der Abbildung unten.
Die Hauptfunktionen werden wie folgt eingeführt:
1) Anforderungsschnittstellenschicht. Verarbeitung von HTTP-Anfragen und -Antworten
2) Verteilungsschicht. Die Anfrage wird von der Schnittstellenschicht übergeben, und dann wird der Anfragetyp spezifisch analysiert und an verschiedene Prozessoren verteilt
3) Gesch?ftslogikschicht. Hier ist unsere spezifische Gesch?ftslogik. Je nach Anforderung wird die spezifische Gesch?ftslogik implementiert.
4) Datenschicht. Wenn wir eine Anwendung implementieren, müssen wir m?glicherweise auf Daten zugreifen, bei denen es sich um eine Datenbank oder eine Datei handeln kann. Wenn es sich um eine einfache Anwendung handelt, ist diese Ebene m?glicherweise nicht verfügbar.
Tats?chlich k?nnen bestimmte Anwendungen auf dieser Struktur erweitert werden, und die Nachrichtenobjektschicht, die Gesch?ftsobjektschicht, die Datenzugriffsschicht, die Funktionsverwaltungsschicht usw. k?nnen erweitert werden. Dies dient lediglich der Veranschaulichung und ist nicht darauf beschr?nkt.
Entwerfen Sie ein Flussdiagramm basierend auf dem hierarchischen Diagramm und beschreiben Sie jeden Implementierungsprozess im Detail. den gesamten Prozess zu verstehen. Wie in der folgenden Abbildung dargestellt:
Anhand des Flussdiagramms k?nnen wir den gesamten Prozess und die spezifischen Implementierungsschritte der Nachrichtenverarbeitung klar verstehen.
Nachfolgend implementieren wir den Code für jeden Prozess.
1. HTTP-Anfragen empfangen
Wir ben?tigen einen HttpHandler oder eine Webseite, um HTTP-Anfragen des WeChat-Servers zu verarbeiten.
Hier verwenden wir HttpHandler. Aufgrund seiner hohen Flexibilit?t und guten Leistung.
Die spezifische Implementierung ist wie folgt.
????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(); ????????} ????}
Wenn es sich um HTTPHandler handelt, müssen Sie die spezifische Anwendung in der Konfigurationsdatei konfigurieren. Wir werden die spezifische Knotenkonfiguration nicht erkl?ren. Geben Sie direkt ein Beispiel und konfigurieren Sie den HttpHandler-Knoten wie folgt: Verteilungsanforderung
Um die Funktion zu kapseln, kapseln wir diese auch in der Verarbeitungskomponente. Tats?chlich kann es in HttpHandler platziert werden.
1) Signatur überprüfen
<httpHandlers> ???<add verb="*" path="WXService.ashx" type="namespace.WeiXinHttpHandler,WXWeb" validate="true"/></httpHandlers>Wenn dies die erste Anfrage ist, muss die Signatur überprüft werden. Es entspricht einem HTTP-Handshake. Im vorherigen Kapitel wurden die Server-URL und der Token-Wert festgelegt. Mit dieser Funktion wird überprüft, ob die Verbindung erfolgreich ist. Diese Anfrage ist eine GET-Anfrage. Die folgenden spezifischen Anweisungen (offiziell):
Gesch?ftslogik:
Verschlüsselungs-/Verifizierungsprozess: <1> Fügen Sie die drei Parameter Token, Zeitstempel und Nonce in das W?rterbuch ein Reihenfolge sortieren<2> Fügen Sie die drei Parameterzeichenfolgen zu einer Zeichenfolge für die SHA1-Verschlüsselung zusammen <3> Der Entwickler kann die verschlüsselte Zeichenfolge mit der Signatur vergleichen, um zu identifizieren, von wem die Anfrage stammt WeChat und die offiziell bereitgestellten PHP-Codebeispiele sind nicht direkt in C# übersetzt. Daher gibt es auch hier einige spezifische Behandlungen. Schauen wir uns zun?chst den offiziellen Code an: Wir übersetzen ihn in die C#-Version:Hier ist eine SHA1-Verschlüsselung erforderlich. Der spezifische Algorithmus lautet wie folgt:
????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) Verteilungsanfrage
????????///?<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; ????????????} ????????}
Der n?chste Schritt ist die spezifische Nachrichtenanfrage, hier sind alle POST-Anfragen.
Da es mehrere Nachrichtentypen gibt, kapseln wir sie durch Fabrikklassen, und dann verfügt jede Nachricht über einen eigenen Prozessor für die Verarbeitung. Spezifische Implementierungslogik:
????????///?<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(); ????????}
Externe Methode zur Verarbeitung von Anforderungen (dies ist die von HttpHandler aufgerufene Methode), das hei?t:
????????///?<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; ????????}
3. Nachrichtenprozessor verarbeitet speziell Nachrichten
1) Nachrichtentyp
Zuerst Werfen wir einen Blick auf die spezifischen Nachrichtentypen. Tats?chlich wurde die Nachrichtenschnittstelle im vorherigen Bild klar dargestellt.
????????///?<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ú)法處理"; ????????????} ????????}Schauen wir uns hier genauer an, um zu sehen, welche Arten von Nachrichten angefordert werden, auf welche Arten von Nachrichten geantwortet wird usw. Beachten Sie unbedingt, dass es sich bei der angeforderten Nachricht um eine Textnachricht handelt und dass es sich bei der Antwortnachricht nicht unbedingt um eine beliebige Antwortnachricht wie Bilder, Text, Musik usw. handeln kann. Einzelheiten finden Sie in der Tabelle unten.
2) Entwerfen Sie die Nachrichtenklasse entsprechend der spezifischen Nachrichtenschnittstelle.
這里給出類圖,供參考。
?
3)針對(duì)不同的消息,會(huì)有不同的處理器,來(lái)看下具體的類圖。
??
4)具體業(yè)務(wù)處理?
每個(gè)handler里面就是可以處理具體請(qǐng)求。輸入的什么消息,訪問(wèn)那些數(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)前支持的有:文本、圖文、音樂(lè)等。
一定要明確:回復(fù)的消息類型不一定要與請(qǐng)求的消息類型一樣,比如,請(qǐng)求是文本,回復(fù)的可以是圖文、音樂(lè)。
產(chǎn)生回復(fù)消息的過(guò)程,其實(shí),就是特定的消息對(duì)象格式化為對(duì)應(yīng)的XML的過(guò)程,然后將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處理。這也是在最開(kāi)始設(shè)計(jì)的HttpHandler中實(shí)現(xiàn)的。
下面是代碼片段,具體可見(jiàn)一、Http請(qǐng)求?
????????????context.Response.Clear(); ????????????context.Response.Charset?=?"UTF-8"; ????????????context.Response.Write(responseMsg); ????????????context.Response.End();
?更多微信公眾平臺(tái)開(kāi)發(fā)教程(三) 基礎(chǔ)框架搭建?相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)