Dans la deuxième leçon, en utilisant Delphi intraweb pour le développement WeChat 2 : intraweb est publié en mode .net (déployé en mode asp.net mvc4). Sur IIS (hôte virtuel .net), nous avons déployé avec succès l'application iw sur le serveur. hôte virtuel cloud. Dans cette conférence, nous continuerons le contenu de la première conférence et reviendrons au développement de WeChat, en expliquant cette fois le traitement des messages WeChat.
Tout d'abord, clarifiez quelques points de connaissances :
1. La méthode de publication http utilisée par le serveur WeChat pour transférer les messages des utilisateurs. Dans la première leçon, nous n'avons pas mentionné la méthode de publication http. Méthode de soumission des données http du serveur WeChat. Sans entrer dans les détails, WeChat utilise en fait la méthode http get pour la vérification de l'accès ; lors du transfert des messages utilisateur, il utilise la méthode http post, et lors du transfert des messages, les messages sont codés au format XML, ContentType. =texte/xml.
2. Le transfert des messages du serveur WeChat peut choisir trois méthodes de transmission de données : 1. Texte brut ; 2. Cryptage ; 3. Mixte. Dans cet article, pour faciliter le débogage, nous utilisons du texte clair pour transférer les données. La prochaine conférence expliquera le traitement des méthodes de cryptage des messages.
Au départ, j'avais l'impression que le contenu de cette conférence n'était pas difficile à mettre en œuvre avec .net, php ou même Delphi webbroker. Mais après avoir utilisé iw, j'ai trouvé que le problème était très compliqué !
iw La classe qui gère les données de requête http est THttpRequest, mais j'ai parcouru les propriétés et les méthodes de THttpRequest et je n'ai pas trouvé d'endroit pour accéder directement au contenu http. Il n'y a qu'une propriété THttpRequest.ContentFields qui semble. pour lire le contenu http. , mais après avoir réellement exécuté le code et débogué, il a été constaté que cet attribut ne pouvait pas du tout transmettre le fichier XML par le serveur WeChat et que le contenu était toujours vide.
Après une vérification répétée, il a été constaté que cet attribut ContentFields n'est valide que pour la valeur de clé transmise lorsque le ContentType est application/x-www-form-urlencoded dans la requête http, c'est-à-dire qu'il peut être obtenu pour la soumission du type de formulaire.Pour les données, c'est le cas dans l'accès WeChat dans la première leçon. La signature, l'horodatage, le nom occasionnel et les autres valeurs de champ transmis par WeChat peuvent être extraits via THttpRequest.ContentFields.
Les choses sont devenues un dilemme complet maintenant. Alors, comment utiliser la méthode de classe THttpRequest pour obtenir le contenu lorsque ContentType=text/xml ? Après des recherches, j'ai découvert que la classe THttpRequest avait un attribut Files. À cette époque, je sentais que l'espoir était dans cet attribut. Après tout, le XML peut également être téléchargé sous forme de fichier, n'est-ce pas ? Haha, malheureusement, peu importe comment j'ai expérimenté à l'époque (je l'ai utilisé pour démonter la DCU), le nombre de fichiers avec cet attribut était toujours 0, et cet espoir était perdu !
J'ai donc posté un message sur le forum de questions officiel d'iw et j'ai commencé à demander des conseils. Pendant 1 et 2 jours, il y avait toujours des gens qui lisaient mais personne n'a répondu. Après avoir cherché plusieurs fois des questions connexes, j'ai trouvé ça. quelqu'un m'avait déjà rencontré. Quand j'ai eu la même question, l'auteur a répondu que le questionneur n'était pas clair et a demandé d'envoyer le code à l'auteur par e-mail, j'ai immédiatement fait semblant d'être le questionneur et j'ai envoyé mon code à l'auteur. code et j'ai joint la question. Ouais, Perdu dans l'océan, haha, iw, ce n'est vraiment pas facile de t'aimer autant.
Il n'y a aucun moyen de continuer à chercher les questions des autres. Le travail acharné porte ses fruits. J'ai finalement trouvé un message dans lequel la question posée par la personne qui a posé la question était différente de la mienne, mais la personne qui a répondu a mentionné qu'il y avait une question. Exemple PostFormData dans le projet iw demos. J'ai immédiatement vérifié la démo que j'ai téléchargée et j'ai découvert qu'il n'existait aucun projet de ce type. Je suis allé sur le site officiel pour télécharger à nouveau l'exemple de projet, haha, enfin il est là ! Ouvrez le code et jetez un œil, il s'avère que c'est le cas ! Tout comme lors du premier cours, une ligne de code m'a dérangé pendant plusieurs jours.
Chers amis, jetez un œil :
est la méthode "RegisterContentType", haha, y pensez-vous ? Est-ce mentionné dans l'aide ? Putain de merde !
D'accord, ça marche enfin. Continuons. Après avoir ajouté l'enregistrement du type de contenu, vous pouvez utiliser THttpRequest.Files pour obtenir le XML publié. C'est presque la même chose que ma prédiction initiale. .
Chers amis, je vous raconte mon voyage de sang et de larmes. Pour les frameworks de développement Web comme iw, qui ont une aide incomplète et aucun code source, la recherche dans la zone de questions et les démos iw sont nos plus grandes. dépendance. Nous devons utiliser iw, téléchargez simplement la dernière démo et jetez-y un œil.
Il n'y a plus rien à dire. Je posterai une capture d'écran du code pour que tout le monde puisse la consulter. C'est plus simple de suivre la documentation de WeChat :
Classe TEventHandler :Test de capture d'écran avec le client WeChat après le déploiement sur le serveur :
Si vous voyez ceci, d'accord, laissez-moi vous confier un petit secret :
Après des tests répétés de ma part, la méthode "RegisterContentType" n'est disponible qu'en modes SA et ISAPI. est valide. Lorsque je le compile dans une bibliothèque selon le deuxième tutoriel et que je le déploie selon le mode aspx, je ne peux de toute façon pas obtenir le fichier XML. Seul le type de projet a changé en raison des exigences de déploiement, et aucun autre code. a changé. Je ne sais tout simplement pas pourquoi. La capture d'écran que vous voyez ci-dessus a été déployée sur mon serveur à l'aide d'ISAPI.
Enfin, attachez la fonction d'encodage et de décodage du champ de date au format XML du message WeChat. Le type de date de WeChat est une valeur entière, la valeur entière doit donc être convertie en. un type TDateTime. La valeur entière de WeChat est calculée comme la deuxième différence en utilisant « 1970-01-01 00:00:00 » comme heure de base. Une autre chose à noter est que l'heure de WeChat est l'heure UTC, ce qui signifie que 8 heures doivent être ajoutées lors de la conversion à l'heure de Pékin.
///
/// La date et l'heure de WeChat sont toutes de type int64, ce qui est la deuxième différence entre 1970-01-01 00:00:00. Cette fonction est utilisée pour renvoyer 1970-01-01 00:00:00. Heure >///
function
GetWxBaseDt: TDateTime
; begin 🎜 > := VarToDateTime(
'1970-01-01 00:00:00' ; 🎜>
///
🎜> ///
fonction GetWxNow : Int64;
début
Résultat := Secondesentre (Maintenant, GetWxBaseDt) - 3600 * 8;
fin;
fonction GetWxNowStr: chaîne;
var
i64: Int64;
begin
i64 := GetWxNow;
Résultat := IntToStr(i64);
fin;
///
/// La valeur du champ CreateTime obtenue à partir de WeChat XML est utilisée comme paramètre pour transmettre la fonction
/// Convertir l'heure en type TDatetime
///
// /
fonction ConvertWxDtToDateTime(wxDt: string ): TDateTime;
var i64
: Int64; :=
StrToInt64(
wxDt); Résultat := IncSecond(
GetWxBaseDt, i64 3600*8); ;Pour plus d'articles liés à l'utilisation de Delphi intraweb pour le traitement des messages WeChat, veuillez faire attention au site Web PHP chinois !