


Série de développement WeChat ---- 02?: Implémentation de la réponse à la demande POST
Feb 14, 2017 am 11:17 AMAdresse GitHub du projet?:https://github.com/Andyahui/xgyxsh_WeiXin
Un?: Traitement des demandes WeChat XML POST
Hier, nous sommes devenus développeurs, ce qui montre que la demande d'obtention peut être complétée et traitée en conséquence. Voici ce que nous faisons via le navigateur L'URL. nous avons configuré est parcouru.
Nous pouvons constater que la valeur de retour définie dans la requête get appara?t ici, indiquant que notre test est réussi. Ensuite, nous devons définir l'action correspondant à la requête POST.
Remarque?: étant donné que chaque interaction entre notre WeChat et le serveur du site Web se fait via une requête POST pour obtenir ce que nous voulons, nous devons crypter la transmission.
/// <summary> /// 用戶發(fā)送消息后,微信平臺(tái)自動(dòng)Post一個(gè)請(qǐng)求到這里,并等待響應(yīng)XML。 /// PS:此方法為簡化方法,效果與OldPost一致。 /// v0.8之后的版本可以結(jié)合Senparc.Weixin.MP.MvcExtension擴(kuò)展包,使用WeixinResult,見MiniPost方法。 /// </summary> [HttpPost] [ActionName("Index")] public ActionResult Post(PostModel postModel) { postModel.Token = Token; // postModel.EncodingAESKey = ""; //根據(jù)自己后臺(tái)的設(shè)置保持一致 // postModel.AppId = AppId; //根據(jù)自己后臺(tái)的設(shè)置保持一致 //驗(yàn)證數(shù)字簽名 if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { //??? 這里有問題,要是不注釋的話,就會(huì)在這里出錯(cuò),也就是數(shù)字簽名有問題。 //return Content("參數(shù)錯(cuò)誤!"); } // 1:自定義MessageHandler,對(duì)微信請(qǐng)求的詳細(xì)判斷操作都在這里面。 實(shí)例化了一個(gè)類 var messageHandler = new CustomMessageHandle(Request.InputStream, postModel); //接收消息 // 2:執(zhí)行微信處理過程----執(zhí)行完這里之后ResponseMessage才會(huì)有值。 messageHandler.Execute(); // 3:return new FixWeixinBugWeixinResult(messageHandler); 這個(gè)有換行的問題。 //return new FixWeixinBugWeixinResult(messageHandler.ToString()); // 3:注意第三個(gè)----為了解決官方微信5.0軟件換行bug暫時(shí)添加的方法,平時(shí)用下面一個(gè)方法即可 return new WeixinResult(messageHandler); //v0.8+ }
On voit clairement la signification de chaque ligne ci-dessus. J'ai une question ici. Si le jugement n'est pas commenté dans la vérification de la signature numérique, il affichera directement " "Erreur de paramètre" ne continuera pas à effectuer les opérations suivantes, mais il n'y a aucun commentaire sur le blog officiel. Je ne sais pas pourquoi ? ? (Demandez des réponses au ma?tre.)
Il y a trois étapes principales ci-dessus?:
Tout d'abord, l'objet CustomMessageHandle est instancié et les paramètres correspondants sont passés. Le CTOR correspondant est initialisé, puis sa méthode Execute() est appelée, et enfin l'objet CustomMessageHandle correspondant est renvoyé en instanciant WeixinResult. à ce stade, l'objet contient la méthode de traitement logique du backend de notre site Web.
C'est ainsi que notre requête POST est traitée, chaque Chaque fois que les informations XML transmises par le serveur WeChat seront à nouveau transmises ici à l'aide du formulaire de demande POST, nous les traiterons.
2?: Comprendre MessageHandler
Pour terminer le développement de WeChat, vous devez comprendre les classes clés du SDK. Ce qui suit est simple Parlons de MessageHandler?;
MessageHandler est le c?ur du traitement des messages du SDK. Il gère principalement les requêtes POST en conséquence. Des jugements logiques peuvent également être formulés. Pour parler franchement, toute notre logique métier est exécutée dans cette classe.
namespace XGY_WeiXin.WeiXinHelper { public class CustomMessageHandle : MessageHandler<CustomMessageContext> { //PostModel:表示的都是從微信服務(wù)器里面得到的值,時(shí)間戳,字符串等。(WeiXinController中使用過) //構(gòu)造函數(shù)的inputStream用于接收來自微信服務(wù)器的請(qǐng)求流(如果需要在外部處理,這里也可以傳入XDocument)。 public CustomMessageHandle(Stream inputSrream,PostModel postModel):base(inputSrream,postModel) { } /// <summary> /// 必須實(shí)現(xiàn)抽象的類------作用:用于放回一條信息,當(dāng)沒有對(duì)應(yīng)類型的微信消息沒有被代碼處理,那么默認(rèn)會(huì)執(zhí)行返回這里的結(jié)果。 /// </summary> /// <param name="requestMessage">請(qǐng)求消息</param> /// <returns></returns> public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage) { //CreateResponseMessage<T> 這里是創(chuàng)建一個(gè)放回的對(duì)象,代表不同的類型, var responseMessage = base.CreateResponseMessage<ResponseMessageText>();//ResponseMessageText可以更換為別的類型 responseMessage.Content = "這條消息來自DefaultResponseMessage。"; return responseMessage; } /// <summary> ///1: 處理用戶發(fā)送過來的文字消息。重寫OnTextRequest方法。 /// --------(總結(jié):)方法里面可以自由發(fā)揮,讀取DB,判斷關(guān)鍵字,甚至返回不同的ResponseMessageXX類型(只要最終的類型都是在IResponseMessageBase接口下的即可)。 /// </summary> /// <param name="requestMessage">請(qǐng)求消息</param> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { //CreateResponseMessage<類型>根據(jù)當(dāng)前的RequestMessage創(chuàng)建指定類型的ResponseMessage;創(chuàng)建相應(yīng)消息. var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName + "。\r\t您發(fā)送了文字信息:" + requestMessage.Content; return responseMessage; } } }
Analysez de haut en bas. J'ai trouvé qu'il est hérité de MessageHandler mais il y a un CustomMessageContext derrière. Pour le moment, j'ai une nouvelle compréhension de MessageHandler. Cette chose s'avère être une classe abstraite générique. Nous devons remplir un type. description et disons que ce CustomMessageContext est une coutume. Je n'ai pas étudié attentivement ce qu'est la classe de contexte définie. Regardons l'introduction officielle (WiKi). Ensuite, vous trouverez ci-dessous un CTOR, qui est principalement utilisé lors de l'instanciation
3?: Contexte personnalisé CustomMessageContext
下面是自定義上下文類CustomMessageContext,主要是繼承自MessageContext
/// <summary> /// 自定義的上下文類---->處理單個(gè)用戶的對(duì)話狀態(tài)。 /// </summary> public class CustomMessageContext : MessageContext<IRequestMessageBase,IResponseMessageBase> { public CustomMessageContext() { base.MessageContextRemoved+=CustomMessageContext_MessageContextRemoved; } /// <summary> /// 當(dāng)上下文過期,被移除的時(shí)候觸發(fā)的時(shí)間 /// </summary> private void CustomMessageContext_MessageContextRemoved(object sender, Senparc.Weixin.Context.WeixinContextRemovedEventArgs<IRequestMessageBase, IResponseMessageBase> e) { /* 注意,這個(gè)事件不是實(shí)時(shí)觸發(fā)的(當(dāng)然你也可以專門寫一個(gè)線程監(jiān)控) * 為了提高效率,根據(jù)WeixinContext中的算法,這里的過期消息會(huì)在過期后下一條請(qǐng)求執(zhí)行之前被清除 */ var messageContext = e.MessageContext as CustomMessageContext; if (messageContext==null) { //如果是正常的調(diào)用,messageContext不會(huì)為null return ; } //TODO:這里根據(jù)需要執(zhí)行消息過期時(shí)候的邏輯,下面的代碼僅供參考 //Log.InfoFormat("{0}的消息上下文已過期",e.OpenId); //api.SendMessage(e.OpenId, "由于長時(shí)間未搭理客服,您的客服狀態(tài)已退出!"); } }
?? 解釋參考官方給的解釋,版本升級(jí)了(WiKi),我覺得這里以后還是會(huì)做大文章的。
四:微信測(cè)試號(hào)效果展示
?? 此時(shí)我們大體的底層框架就搭建成功了,我們發(fā)布部署到服務(wù)器上面就可以看到文本處理的響應(yīng)了。
這是微信的二維碼可以關(guān)注下,可以實(shí)現(xiàn)簡單的互動(dòng)。
更多微信開發(fā)系列----02:實(shí)現(xiàn)POST請(qǐng)求響應(yīng)?相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)