Heim >WeChat-Applet >WeChat-Entwicklung >Verwendung von Delphi+intraweb für die WeChat-Nachrichtenverarbeitung
In der zweiten Vorlesung wird Delphi + Intraweb für die WeChat-Entwicklung 2 verwendet – Intraweb wird im .net-Modus veröffentlicht (bereitgestellt im asp.net mvc4-Modus). Auf IIS (virtueller .net-Host) haben wir die iw-Anwendung erfolgreich bereitgestellt Die virtuelle Cloud Auf dem Host setzen wir in dieser Vorlesung den Inhalt der ersten Vorlesung fort und kehren zur WeChat-Entwicklung zurück, wobei wir diesmal die WeChat-Nachrichtenverarbeitung erläutern.
Klären Sie zunächst einige Wissenspunkte:
1. Die HTTP-Post-Methode, die der WeChat-Server zum Weiterleiten von Benutzernachrichten verwendet, haben wir nicht erwähnt HTTP-Datenübermittlungsmethode des WeChat-Servers: WeChat verwendet tatsächlich die HTTP-Get-Methode zur Zugriffsüberprüfung, während es die HTTP-Post-Methode verwendet, und wenn Nachrichten weitergeleitet werden, werden die Nachrichten im XML-Format, ContentType, codiert =text/xml.
2. Für die Weiterleitung von WeChat-Servern stehen drei Datenübertragungsmethoden zur Auswahl: 1. Nur-Text; 3. Gemischt. In diesem Artikel verwenden wir zur Vereinfachung des Debuggens Klartext zum Übertragen von Daten. In der nächsten Vorlesung wird die Verarbeitung von Nachrichtenverschlüsselungsverfahren erläutert.
Ich hatte ursprünglich das Gefühl, dass der Inhalt dieser Vorlesung nicht schwierig war. Er sollte mit .net, PHP oder sogar Delphi Webbroker einfach zu implementieren sein. Aber nachdem ich iw verwendet hatte, stellte ich fest, dass das Problem sehr kompliziert ist!
iwDie Klasse, die http-Anforderungsdaten verarbeitet, ist THttpRequest, aber ich habe die Eigenschaften und Methoden von THttpRequest durchgesehen und konnte keinen Ort finden, an dem ich direkt auf http-Inhalte zugreifen kann. Es scheint nur eine THttpRequest.ContentFields-Eigenschaft zu geben Lesen Sie den http-Inhalt. Nach der tatsächlichen Ausführung des Codes und dem Debuggen wurde jedoch festgestellt, dass dieses Attribut die XML-Datei überhaupt nicht vom WeChat-Server übergeben kann und der Inhalt immer leer ist.
Nach wiederholter Überprüfung wurde festgestellt, dass dieses ContentFields-Attribut nur für den übergebenen Schlüsselwert gültig ist, wenn der ContentType in der http-Anfrage application/x-www-form-urlencoded ist, d. h. er kann abgerufen werden Für die Übermittlung des Formulartyps ist dies beim WeChat-Zugriff in der ersten Vorlesung der Fall. Die von WeChat übergebenen Signaturen, Zeitstempel, Nonce und andere Feldwerte können über THttpRequest.ContentFields entnommen werden.
Die Dinge haben sich mittlerweile zu einem völligen Dilemma entwickelt. Wie kann man also die Klassenmethode THttpRequest verwenden, um den Inhalt zu erhalten, wenn ContentType=text/xml? Nach Recherchen habe ich herausgefunden, dass die THttpRequest-Klasse ein Dateiattribut hat. Damals hatte ich das Gefühl, dass die Hoffnung in diesem Attribut liegt. XML kann doch auch als Datei hochgeladen werden, oder? Haha, leider war die Anzahl der Dateien mit diesem Attribut immer 0, egal wie sehr ich damals experimentiert habe (ich habe es zum Zerlegen der DCU verwendet), und diese Hoffnung war verloren!
Also habe ich eine Nachricht im offiziellen iw-Fragenforum gepostet und angefangen, um Rat zu fragen. Ein bis zwei Tage lang lasen immer Leute, aber nachdem ich viele Male nach verwandten Fragen gesucht hatte, fand ich das Als ich die gleiche Frage hatte, antwortete der Autor, dass der Fragesteller unklar sei und bat darum, dem Autor den Code per E-Mail zu senden. Ich habe mich sofort als der Fragesteller ausgegeben Code und habe die Frage angehängt. Ja, Lost in the Ocean, haha, es ist wirklich nicht einfach, dich so sehr zu lieben.
Es gibt keine Möglichkeit, weiter nach den Fragen anderer Leute zu suchen. Endlich habe ich einen Beitrag gefunden, in dem die Frage des Fragestellers anders war als meine, aber der Beantworter erwähnte, dass es eine gibt PostFormData-Beispiel im iw-Demos-Projekt, ich habe sofort die heruntergeladene Demo überprüft und festgestellt, dass es überhaupt kein solches Projekt gibt. Ich bin auf die offizielle Website gegangen, um das Beispielprojekt erneut herunterzuladen, haha, endlich ist es da! Öffnen Sie den Code und schauen Sie nach, es stellt sich heraus, dass dies der Fall ist! Genau wie in der ersten Vorlesung hat mich eine Codezeile mehrere Tage lang gestört.
Liebe Freunde, schaut mal rein:
ist die Methode „RegisterContentType“, haha, fällt euch das ein? Wird es in der Hilfe erwähnt? Heilige Scheiße!
Okay, es funktioniert endlich. Nach dem Hinzufügen der Inhaltstypregistrierung können Sie THttpRequest.Files verwenden, um die gepostete XML-Datei abzurufen. Es ist ein kleiner Trost. .
Liebe Freunde, ich erzähle euch von meiner blutigen und tränenreichen Reise. Für Webentwicklungs-Frameworks wie iw, die unvollständige Hilfe und keinen Quellcode haben, sind die Suche im Fragenbereich und iw-Demos unsere größten Wir müssen iw verwenden, laden Sie einfach die neueste Demo herunter und werfen Sie einen Blick darauf.
Es gibt nichts mehr zu sagen. Ich werde einen Screenshot des Codes posten, damit jeder einen Blick darauf werfen kann. Es ist einfacher, der Dokumentation von WeChat zu folgen:
TEventHandler-Klasse:
Test-Screenshot mit WeChat-Client nach der Bereitstellung auf dem Server:
Wenn Sie das sehen, okay, lassen Sie mich Ihnen ein kleines Geheimnis verraten:
Nach wiederholten Tests von mir ist die Methode „RegisterContentType“ nur im SA- und ISAPI-Modus verfügbar Wenn ich es gemäß dem zweiten Tutorial in eine Bibliothek kompiliere und es gemäß dem ASPX-Modus bereitstelle, kann ich die XML-Datei trotzdem nicht abrufen, da sich aufgrund der Bereitstellungsanforderungen kein anderer Code geändert hat hat sich geändert. Ich weiß nur nicht, warum. Der Screenshot, den Sie oben sehen, wurde auf meinem Server mithilfe von ISAPI bereitgestellt.
Fügen Sie abschließend die Codierungs- und Decodierungsfunktion des Datumsfelds im XML-Format der WeChat-Nachricht hinzu. Der Datumstyp ist ein ganzzahliger Wert, sodass der ganzzahlige Wert konvertiert werden muss ein TDateTime-Typ. Der Wert wird als zweite Differenz unter Verwendung von „1970-01-01 00:00:00“ als Basiszeit berechnet. Beachten Sie außerdem, dass die WeChat-Zeit UTC-Zeit ist, was bedeutet, dass bei der Umrechnung in Pekinger Zeit 8 Stunden hinzugefügt werden müssen.
/// Funktion GetWxNow: Int64; ( ///
/// Datum und Uhrzeit von WeChat sind alle vom Typ int64, was den zweiten Unterschied zwischen 1970-01-01 00:00:00 darstellt. Diese Funktion wird verwendet, um 1970-01-01 00:00:00 zurückzugeben Zeit > /// & lt; return & gt; 1970-01-01 00: 00: 00 & lt;/returns & gt;
Funktion
GetWxBaseDt: TDateTime
; begin 🎜 > := VarToDateTime(
'1970-01-01 00:00:00'; für WeChat, ausgedrückt in int64, ist es der zweite Unterschied zwischen der aktuellen Zeit und 1970-01-01 00:00:00
Konvertieren Sie 3600*8 in UTC-Zeit und die zweite Differenz ist die WeChat-Zeit 🎜> ///
Jetzt, GetWxBaseDt
) - 3600 * 8; Ende; function GetWxNowStr
: string
;
var i64: Int64;
beginnen
i64 := GetWxNow;
Ergebnis :=
IntToStr(i64);
end;
/// Der aus WeChat XML erhaltene Feldwert „CreateTime“ wird als Parameter zum Übergeben der Funktion verwendet
/// Konvertiert die Zeit in den TDatetime-Typ
///
// /
Funktion ConvertWxDtToDateTime(wxDt: string ): TDateTime;
var i64
: Int64; :=
StrToInt64(
wxDt); Ergebnis := IncSecond(
GetWxBaseDt, i64 + 3600*8); >;Weitere Artikel zur Verwendung von Delphi+intraweb für die WeChat-Nachrichtenverarbeitung finden Sie auf der chinesischen PHP-Website!