Cet article explique comment gérer les messages et les événements dans le développement des comptes publics WeChat, notamment : (1) Aperçu des messages (événements) (2) Vérifier l'authenticité des messages (3) Analyser les messages ; Répondre passivement aux messages ; (5) Envoyer d’autres messages.
1 Aperçu du message (événement)
Lorsqu'un utilisateur WeChat ordinaire envoie un message au compte officiel ou que le serveur WeChat transmet un événement au compte officiel, le serveur WeChat POSTera les données XML. paquet du message (événement) à L'URL du serveur de compte officiel renseignée par le développeur, le serveur de compte officiel répond ensuite au message ;
1.1 Processus de flux de messages
Afin de faciliter la distinction, nous appelons le message envoyé par le serveur WeChat au serveur de compte officiel un message de demande ; le message envoyé par le serveur de compte officiel au serveur WeChat est appelé une réponse ; (Réponse) Message ; traiter les événements push comme des messages de demande spéciale.
Le processus de flux des messages de demande et de réponse est illustré dans la figure ci-dessous :
1.2 Message de demande
Il existe de nombreux types de messages de demande, et nous avons établi les correspondants un par un. La classe, la hiérarchie des classes est comme indiqué dans la figure ci-dessous :
Certains messages de demande, nous pouvons répondre, et d'autres ne peuvent pas, voir le tableau suivant pour plus de détails :
消息类型 | 是否事件 | 能够被动回复 | 备注 |
文本 | × | √ | |
图片 | × | √ | |
声音 | × | √ | |
视频 | × | 未知 | 接收不到视频消息,不知道是否能被动回复 |
地理位置 | × | √ | |
链接 | × | √ | |
订阅 | √ | √ | |
取消订阅 | √ | × | |
扫描二维码 | √ | × | |
上报地理位置 | √ | × | |
点击菜单拉取消息 | √ | √ | |
点击菜单跳转链接 | √ | × | |
点击菜单扫码推 | √ | × | |
点击菜单扫码等待回复 | √ | √ | |
点击菜单系统发图 | √ | 未知 | 接收不到系统发图事件;微信服务器会发送图片消息,可回复 |
点击菜单拍照或相册发图 | √ | × | 微信服务器会发送图片消息,可回复 |
点击菜单微信发图 | √ | × | 微信服务器会发送图片消息,可回复 |
点击菜单选择地理位置 | √ | × | 微信服务器会发送地理位置消息,可回复 |
推送群发消息结果 | √ | × | |
推送发送模板消息结果 | √ | × |
1.3 Message de réponse
La hiérarchie des classes du message de réponse est la suivante :
2 Vérifier l'authenticité de le message
Une fois que le serveur de compte public a reçu la demande du serveur WeChat, la première chose est de vérifier l'authenticité du message.
La méthode Utility.CheckSignature est utilisée pour vérifier si la signature du message est correcte.
Les exemples sont les suivants :
/// <summary> /// 验证消息的有效性 /// </summary> /// <param name="context"></param> /// <returns>如果消息有效,返回true;否则返回false。</returns> private bool Validate(HttpContext context) { string username = RequestEx.TryGetQueryString("username"); //在接口配置的URL中加入了username参数,表示哪个微信公众号 AccountInfo account = AccountInfoCollection.GetAccountInfo(username); if (account == null) return false; string token = account.Token; string signature = RequestEx.TryGetQueryString("signature"); string timestamp = RequestEx.TryGetQueryString("timestamp"); string nonce = RequestEx.TryGetQueryString("nonce"); if (string.IsNullOrWhiteSpace(signature) || string.IsNullOrWhiteSpace(timestamp) || string.IsNullOrWhiteSpace(nonce)) return false; return xrwang.weixin.PublicAccount.Utility.CheckSignature(signature, token, timestamp, nonce); } 验证消息真实性
Vérifier l'authenticité du message
3 Analyser le message
Si le message signature passes Pour vérifier, nous devons analyser le texte du message au format XML dans un objet de message de requête, et la classe RequestMessageHelper est utilisée pour terminer ce travail.
RequestMessageHelper helper = new RequestMessageHelper(context.Request); if(helper.Message != null) { //消息解析成功,对它进行处理 }
Une fois le message analysé avec succès, helper.Message est la classe de base du message RequestBaseMessage Nous pouvons déterminer le résultat en fonction. sur les attributs MsgType et Event. De quel type de message (événement) il s'agit et converti dans le sous-type approprié. Par exemple :
RequestBaseMessage bm=helper.Message; switch(bm.MsgType) { case RequestMessageTypeEnum.text: //文本消息 HandleTextMessage((RequestTextMessage)bm); break; case RequestMessageTypeEnum.image: //图片消息 HandleImageMessage((RequestImageMessage)bm); break; //处理其他消息 case RequestMessageTypeEnum.event: //事件 RequestEventMessage ev=(RequestEventMessage)bm; switch(ev.Event) { case RequestEventTypeEnum.subscribe: //订阅 HandleSubscribeMessage((RequestSubscribeMessage)ev); break; case RequestEventTypeEnum.unsubscribe: //取消订阅 HandleUnsubscribeMessage((RequestUnsubscribeMessage)ev); break; //处理其他事件 } break; default: break; }
Pour plus de détails sur l'analyse du message, veuillez vous référer au code source : http://git.oschina.net/xrwang2/xrwang.weixin .PublicAccount/blob/master /PublicAccount/RequestMessage/RequestMessageHelper.cs
4 Message de réponse passive
Après avoir reçu le message (événement) du serveur WeChat, nous pouvons Répondez directement (passivement) au message ; vous pouvez également répondre directement avec une chaîne vide d'abord, puis répondre au message du service client dans les 48 heures.
Initialisez d'abord ResponseXxxMessage, puis utilisez la méthode ToXml pour obtenir le contenu du message de réponse.
Des exemples de messages à réponse passive sont les suivants :
/// <summary> /// 处理微信的POST请求 /// </summary> /// <param name="context"></param> /// <returns>返回xml响应</returns> private string HandlePost(HttpContext context) { RequestMessageHelper helper = new RequestMessageHelper(context.Request); if (helper.Message != null) { ResponseBaseMessage responseMessage = HandleRequestMessage(helper.Message); return responseMessage.ToXml(helper.EncryptType); } else return string.Empty; } /// <summary> /// 处理请求消息,返回响应消息 /// </summary> /// <returns>返回响应消息</returns> private ResponseBaseMessage HandleRequestMessage(RequestBaseMessage requestMessage) { ResponseTextMessage response = new ResponseTextMessage(requestMessage.FromUserName, requestMessage.ToUserName, DateTime.Now, string.Format("自动回复,请求内容如下:\r\n{0}", requestMessage)); return response; }
5 Envoyer d'autres messages
En plus de répondre passivement aux messages, nous pouvons également envoyer des messages du service client, des messages de groupe et des modèles de messages. Ces contenus seront abordés un par un dans les articles suivants.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!