


Développement WeChat de la réception d'événements push et de la déduplication des messages
May 09, 2017 am 09:39 AMComme mentionné dans le billet de blog précédent, les messages WeChat peuvent être grossièrement divisés en deux types. L'un est constitué de messages ordinaires comprenant?: du texte, de la voix, des images, etc., et l'autre est le type d'événement qui sera abordé dans cet article. . Y compris?: suivre/ne plus suivre les événements, scanner les événements de code QR avec des paramètres, signaler les événements de localisation géographique, les événements liés au menu personnalisé, etc. Cet article les explique un par un.
Comme mentionné dans l'article précédent, Si le serveur WeChat ne re?oit pas de réponse dans les 5 secondes, il se déconnectera et relancera la demande, en réessayant trois fois au total. Dans ce cas, un problème se pose. Il existe un tel scénario : lorsqu'un utilisateur suit un compte WeChat, les informations de l'utilisateur actuel sont obtenues, puis les informations sont écrites dans la base de données. Semblable à l’inscription sur le site Web du PC. C'est peut-être à cause de cette préoccupation que la logique métier que nous devons gérer est relativement complexe. Tels que l'envoi de points, la rédaction de journaux d'utilisateurs et l'attribution de groupes d'utilisateurs. Attendez... Une série de logiques doit être exécutée, ou l'environnement réseau est relativement complexe et il n'y a aucune garantie que l'opération de l'utilisateur actuel recevra une réponse dans les 5 secondes. Ensuite, si l'opération n'est pas encore terminée, le serveur WeChat. envoie le même événement d'attention à notre serveur. Nous exécuterons à nouveau notre logique, ce qui peut conduire à des données en double dans la base de données (diront certaines chaussures d'enfants, je détermine d'abord si elle existe déjà avant d'insérer des données. Si il existe L'opération d'insertion ne sera pas effectuée. Ce que je veux dire, c'est que je le pensais au début, mais il y a encore un écart entre l'environnement d'exploitation réel et notre environnement de débogage jusqu'à ce que je découvre qu'il y avait beaucoup de doublons. informations utilisateur dans la base de données, ce n'est qu'à ce moment-là que j'ai réalisé l'importance de la déduplication des messages).
Il existe une différence entre les messages normaux et les messages d'événement dans la déduplication des messages. Les messages ordinaires utilisent msgid, tandis que les messages d'événement utilisent FromUserName + CreateTime. Mon idée est la suivante?:
Créer une nouvelle classe BaseMsg avec trois attributs à savoir FromUser, MsgFlag et CreateTime. Le code est le suivant?:
public class BaseMsg { /// <summary> /// 發(fā)送者標(biāo)識 /// </summary> public string FromUser { get; set; } /// <summary> /// 消息表示。普通消息時,為msgid,事件消息時,為事件的創(chuàng)建時間 /// </summary> public string MsgFlag { get; set; } /// <summary> /// 添加到隊列的時間 /// </summary> public DateTime CreateTime { get; set; } }
Créez une staticlist_queue pour stocker la liste de messages. Le type de liste est List<. ;BaseMsg> ;.
Avant de traiter le corps du message WeChat, déterminez d'abord si la liste est instanciée. Sinon, instanciez-la. Sinon, déterminez si la longueur de la liste est supérieure ou. égal à 50 (cela peut être fait automatiquement. Définition, le but est le nombre de messages simultanés sur WeChat). S'il est supérieur ou égal à 50, les messages qui n'ont pas répondu dans les 20 secondes seront conservés (réessayez une fois toutes les 5 secondes). , un total de 3 tentatives, soit 15 secondes. Par mesure de sécurité, écrivez 20 secondes ici) .
Obtenez le type de message du corps du message actuel et déterminez si le message actuel a été demandé en fonction de _queue. S'il s'agit d'un événement, FromUser et l'heure de création sont enregistrés. S'il s'agit d'un message normal, MsgFlag est enregistré. Voici le code?:
if (_queue == null) { _queue = new List<BaseMsg>(); } else if(_queue.Count>=50) { _queue = _queue.Where(q => { return q.CreateTime.AddSeconds(20) > DateTime.Now; }).ToList();//保留20秒內(nèi)未響應(yīng)的消息 } XElement xdoc = XElement.Parse(xml); var msgtype = xdoc.Element("MsgType").Value.ToUpper(); var FromUserName = xdoc.Element("FromUserName").Value; var MsgId = xdoc.Element("MsgId").Value; var CreateTime = xdoc.Element("CreateTime").Value; MsgType type = (MsgType)Enum.Parse(typeof(MsgType), msgtype); if (type!=MsgType.EVENT) { if (_queue.FirstOrDefault(m => { return m.MsgFlag == MsgId; }) == null) { _queue.Add(new BaseMsg { CreateTime = DateTime.Now, FromUser = FromUserName, MsgFlag = MsgId }); } else { return null; } } else { if (_queue.FirstOrDefault(m => { return m.MsgFlag == CreateTime; }) == null) { _queue.Add(new BaseMsg { CreateTime = DateTime.Now, FromUser = FromUserName, MsgFlag = CreateTime }); } else { return null; } }
Lorsque le message existe déjà dans la file d'attente, le message actuel n'est pas converti en entité, et null est renvoyé directement lors de l'appel, lors de l'appel. null est renvoyé, aucun traitement n'est effectué.
Ce qui suit commence à expliquer l'actualité de l'événement. Suite de l'article précédent. Tous les messages héritent de BaseMessage et tous les types d'événements contiennent une propriété Event. Pour faciliter l'appel, le type de message est défini comme une énumération. Le code est le suivant?:
/// <summary> /// 事件類型枚舉 /// </summary> public enum Event { /// <summary> /// 非事件類型 /// </summary> NOEVENT, /// <summary> /// 訂閱 /// </summary> SUBSCRIBE, /// <summary> /// 取消訂閱 /// </summary> UNSUBSCRIBE, /// <summary> /// 掃描帶參數(shù)的二維碼 /// </summary> SCAN, /// <summary> /// 地理位置 /// </summary> LOCATION, /// <summary> /// 單擊按鈕 /// </summary> CLICK, /// <summary> /// 鏈接按鈕 /// </summary> VIEW, /// <summary> /// 掃碼推事件 /// </summary> SCANCODE_PUSH, /// <summary> /// 掃碼推事件且彈出“消息接收中”提示框 /// </summary> SCANCODE_WAITMSG, /// <summary> /// 彈出系統(tǒng)拍照發(fā)圖 /// </summary> PIC_SYSPHOTO, /// <summary> /// 彈出拍照或者相冊發(fā)圖 /// </summary> PIC_PHOTO_OR_ALBUM, /// <summary> /// 彈出微信相冊發(fā)圖器 /// </summary> PIC_WEIXIN, /// <summary> /// 彈出地理位置選擇器 /// </summary> LOCATION_SELECT, /// <summary> /// 模板消息推送 /// </summary> TEMPLATESENDJOBFINISH }
Après avoir défini l'énumération, il est temps de définir l'entité du message.
Suivre/ne plus suivre l'événement
Le package de données XML est le suivant?:
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[FromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[subscribe]]></Event></xml>
Entité correspondante?:
/// <summary> /// 訂閱/取消訂閱事件 /// </summary> public class SubEventMessage : EventMessage { private string _eventkey; /// <summary> /// 事件KEY值,qrscene_為前綴,后面為二維碼的參數(shù)值(已去掉前綴,可以直接使用) /// </summary> public string EventKey { get { return _eventkey; } set { _eventkey = value.Replace("qrscene_", ""); } } /// <summary> /// 二維碼的ticket,可用來換取二維碼圖片 /// </summary> public string Ticket { get; set; } }
Ce qu'il faut noter ici, c'est que lorsque l'utilisateur scanne le code QR avec les paramètres, si l'utilisateur ne suit pas le compte officiel actuel, lorsque l'utilisateur le suit, le paramètre qrscene_ et Ticket seront inclus dans le corps du message, donc deux les attributs sont définis ici. :EventKey,Ticket. Lorsque vous attribuez une valeur à EventKey, remplacez qrscene_, car ce dont nous avons réellement besoin, ce sont les paramètres suivants.
Scanner l'événement du code QR avec les paramètres
Lorsque l'utilisateur scanne le code QR avec la valeur de la scène, deux événements peuvent être poussés?:
-
Si l'utilisateur n'a pas suivi le compte officiel, l'utilisateur peut suivre le compte officiel. Après avoir suivi le compte officiel, WeChat transmettra l'événement de suivi avec la valeur de la scène au développeur.
Si l'utilisateur a suivi le compte officiel, WeChat transmettra l'événement d'analyse de la valeur de la scène au développeur. ,
Le premier type a été discuté ci-dessus, et seul le deuxième type sera expliqué ici.
Evénement push lorsque l'utilisateur a suivi
Le package xml est le suivant :
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[FromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[SCAN]]></Event><EventKey><![CDATA[SCENE_VALUE]]></EventKey><Ticket><![CDATA[TICKET]]></Ticket></xml>
Les entités correspondantes sont les suivants?:
/// <summary> /// 掃描帶參數(shù)的二維碼實體 /// </summary> public class ScanEventMessage : EventMessage { /// <summary> /// 事件KEY值,是一個32位無符號整數(shù),即創(chuàng)建二維碼時的二維碼scene_id /// </summary> public string EventKey { get; set; } /// <summary> /// 二維碼的ticket,可用來換取二維碼圖片 /// </summary> public string Ticket { get; set; } }
Rapport d'événements de localisation géographique
Lorsque le compte officiel active la fonction de rapport de localisation géographique, chaque fois que l'utilisateur entre dans la session du compte officiel et s'engage à signaler la localisation géographique, à signaler la localisation géographique lors de l'entrée, ou à signaler la localisation géographique toutes les 5 secondes après avoir entré la conversation. Le compte officiel peut modifier les paramètres en arrière-plan de la plateforme officielle. Lors du signalement de l'emplacement géographique, WeChat transmettra l'événement de localisation géographique signalé vers l'URL renseignée par le développeur.
Le package de données XML est le suivant?:
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[LOCATION]]></Event><Latitude>23.137466</Latitude><Longitude>113.352425</Longitude><Precision>119.385040</Precision></xml>
L'entité correspondante est la suivante?:
/// <summary> /// 上報地理位置實體 /// </summary> public class LocationEventMessage : EventMessage { /// <summary> /// 地理位置緯度 /// </summary> public string Latitude { get; set; } /// <summary> /// 地理位置經(jīng)度 /// </summary> public string Longitude { get; set; } /// <summary> /// 地理位置精度 /// </summary> public string Precision { get; set; } }
自定義菜單事件常用的事件有:click,view,scancode_puth,scancode_waitmsg,location_select。另外還有三種發(fā)圖的事件,由于并不常用,筆者也沒想到使用場景,再次就不一一講述了,有興趣的可以自己研究下,或者和我進(jìn)行交流。
click事件推送的xml數(shù)據(jù)包:
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[FromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[CLICK]]></Event><EventKey><![CDATA[EVENTKEY]]></EventKey></xml>
view事件推送的xml數(shù)據(jù)包和click的格式是一樣的,所以定義一個類就可以了,如下:
/// <summary> /// 普通菜單事件,包括click和view /// </summary> public class NormalMenuEventMessage : EventMessage { /// <summary> /// 事件KEY值,設(shè)置的跳轉(zhuǎn)URL /// </summary> public string EventKey { get; set; } }
scancode事件的xml數(shù)據(jù)包如下:
<xml><ToUserName><![CDATA[ToUserName]]></ToUserName><FromUserName><![CDATA[FromUserName]]></FromUserName><CreateTime>1419265698</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[scancode_push]]></Event><EventKey><![CDATA[EventKey]]></EventKey><ScanCodeInfo><ScanType><![CDATA[qrcode]]></ScanType><ScanResult><![CDATA[http://weixin.qq.com/r/JEy5oRLE0U_urVbC9xk2]]></ScanResult></ScanCodeInfo></xml>
對應(yīng)的實體如下:
/// <summary> /// 菜單掃描事件 /// </summary> public class ScanMenuEventMessage : EventMessage { /// <summary> /// 事件KEY值 /// </summary> public string EventKey { get; set; } /// <summary> /// 掃碼類型。qrcode是二維碼,其他的是條碼 /// </summary> public string ScanType { get; set; } /// <summary> /// 掃描結(jié)果 /// </summary> public string ScanResult { get; set; } }
至此,當(dāng)前常用的事件類型消息都已定義完畢,結(jié)合上一篇所講的,將xml數(shù)據(jù)包轉(zhuǎn)換成對象的完整代碼如下:
public class MessageFactory { private static List_queue; public static BaseMessage CreateMessage(string xml) { if (_queue == null) { _queue = new List<BaseMsg>(); } else if(_queue.Count>=50) { _queue = _queue.Where(q => { return q.CreateTime.AddSeconds(20) > DateTime.Now; }).ToList();//保留20秒內(nèi)未響應(yīng)的消息 } XElement xdoc = XElement.Parse(xml); var msgtype = xdoc.Element("MsgType").Value.ToUpper(); var FromUserName = xdoc.Element("FromUserName").Value; var MsgId = xdoc.Element("MsgId").Value; var CreateTime = xdoc.Element("CreateTime").Value; MsgType type = (MsgType)Enum.Parse(typeof(MsgType), msgtype); if (type!=MsgType.EVENT) { if (_queue.FirstOrDefault(m => { return m.MsgFlag == MsgId; }) == null) { _queue.Add(new BaseMsg { CreateTime = DateTime.Now, FromUser = FromUserName, MsgFlag = MsgId }); } else { return null; } } else { if (_queue.FirstOrDefault(m => { return m.MsgFlag == CreateTime; }) == null) { _queue.Add(new BaseMsg { CreateTime = DateTime.Now, FromUser = FromUserName, MsgFlag = CreateTime }); } else { return null; } } switch (type) { case MsgType.TEXT: return Utils.ConvertObj (xml); case MsgType.IMAGE: return Utils.ConvertObj (xml); case MsgType.VIDEO: return Utils.ConvertObj (xml); case MsgType.VOICE: return Utils.ConvertObj (xml); case MsgType.LINK: return Utils.ConvertObj (xml); case MsgType.LOCATION: return Utils.ConvertObj (xml); case MsgType.EVENT://事件類型 { var eventtype = (Event)Enum.Parse(typeof(Event), xdoc.Element("Event").Value.ToUpper()); switch (eventtype) { case Event.CLICK: return Utils.ConvertObj (xml); case Event.VIEW: return Utils.ConvertObj (xml); case Event.LOCATION: return Utils.ConvertObj (xml); case Event.LOCATION_SELECT: return Utils.ConvertObj (xml); case Event.SCAN: return Utils.ConvertObj (xml); case Event.SUBSCRIBE: return Utils.ConvertObj (xml); case Event.UNSUBSCRIBE: return Utils.ConvertObj (xml); case Event.SCANCODE_WAITMSG: return Utils.ConvertObj (xml); default: return Utils.ConvertObj (xml); } } break; default: return Utils.ConvertObj (xml); } } }
【相關(guān)推薦】
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!

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)

PHP est un langage de script open source largement utilisé dans le développement Web et la programmation c?té serveur, notamment dans le développement de WeChat. Aujourd'hui, de plus en plus d'entreprises et de développeurs commencent à utiliser PHP pour le développement de WeChat, car il est devenu un langage de développement vraiment facile à apprendre et à utiliser. Dans le développement de WeChat, le cryptage et le décryptage des messages sont une question très importante car ils impliquent la sécurité des données. Pour les messages sans méthodes de cryptage et de décryptage, les pirates peuvent facilement obtenir les données, ce qui constitue une menace pour les utilisateurs.

Dans le développement des comptes publics WeChat, la fonction de vote est souvent utilisée. La fonction de vote est un excellent moyen pour les utilisateurs de participer rapidement aux interactions, et c'est également un outil important pour organiser des événements et recueillir des opinions. Cet article vous présentera comment utiliser PHP pour implémenter la fonction de vote WeChat. Obtenez l'autorisation du compte officiel WeChat. Tout d'abord, vous devez obtenir l'autorisation du compte officiel WeChat. Sur la plateforme publique WeChat, vous devez configurer l'adresse API du compte public WeChat, le compte officiel et le token correspondant au compte public. Dans le processus de développement en langage PHP, nous devons utiliser le PH officiellement fourni par WeChat

Avec la popularité de WeChat, de plus en plus d’entreprises commencent à l’utiliser comme outil marketing. La fonction de messagerie de groupe WeChat est l'un des moyens importants permettant aux entreprises de mener du marketing WeChat. Cependant, si vous comptez uniquement sur l’envoi manuel, il s’agit d’une tache extrêmement longue et laborieuse pour les spécialistes du marketing. Il est donc particulièrement important de développer un outil de messagerie de masse WeChat. Cet article présentera comment utiliser PHP pour développer des outils d'envoi de masse WeChat. 1. Travail de préparation Pour développer les outils d'envoi de masse WeChat, nous devons ma?triser les points techniques suivants : Connaissance de base du développement de la plateforme publique PHP WeChat Outils de développement : Sub

WeChat est actuellement l'une des plateformes sociales comptant la plus grande base d'utilisateurs au monde. Avec la popularité de l'Internet mobile, de plus en plus d'entreprises commencent à prendre conscience de l'importance du marketing WeChat. Lors du marketing WeChat, le service client est un élément crucial. Afin de mieux gérer la fenêtre de discussion du service client, nous pouvons utiliser le langage PHP pour le développement de WeChat. 1. Introduction au développement PHP WeChat PHP est un langage de script open source c?té serveur largement utilisé dans le domaine du développement Web. En combinaison avec l'interface de développement fournie par la plateforme publique WeChat, nous pouvons utiliser le langage PHP pour mener WeChat

Dans le développement des comptes publics WeChat, la gestion des balises utilisateur est une fonction très importante, qui permet aux développeurs de mieux comprendre et gérer leurs utilisateurs. Cet article explique comment utiliser PHP pour implémenter la fonction de gestion des balises utilisateur WeChat. 1. Obtenez l'openid de l'utilisateur WeChat Avant d'utiliser la fonction de gestion des balises utilisateur WeChat, nous devons d'abord obtenir l'openid de l'utilisateur. Dans le développement des comptes publics WeChat, il est courant d'obtenir l'openid via l'autorisation de l'utilisateur. Une fois l'autorisation de l'utilisateur terminée, nous pouvons obtenir l'utilisateur via le code suivant

Alors que WeChat devient un outil de communication de plus en plus important dans la vie des gens, sa fonction de messagerie agile est rapidement privilégiée par un grand nombre d'entreprises et de particuliers. Pour les entreprises, développer WeChat en une plate-forme marketing est devenu une tendance, et l'importance du développement de WeChat est progressivement devenue plus importante. Parmi eux, la fonction d'envoi de groupe est encore plus largement utilisée. Alors, en tant que programmeur PHP, comment implémenter des enregistrements d'envoi de messages de groupe ? Ce qui suit vous donnera une brève introduction. 1. Comprendre les connaissances en développement liées aux comptes publics WeChat. Avant de comprendre comment mettre en ?uvre des enregistrements d'envoi de messages de groupe, je

Comment utiliser PHP pour développer des comptes publics WeChat Les comptes publics WeChat sont devenus un canal important de promotion et d'interaction pour de nombreuses entreprises, et PHP, en tant que langage Web couramment utilisé, peut également être utilisé pour développer des comptes publics WeChat. Cet article présentera les étapes spécifiques pour utiliser PHP pour développer des comptes publics WeChat. étape 1 : Obtenez le compte développeur du compte officiel WeChat. Avant de commencer le développement du compte officiel WeChat, vous devez demander un compte développeur du compte officiel WeChat. Pour le processus d'inscription spécifique, veuillez vous référer au site officiel de la plateforme publique WeChat

Avec le développement d’Internet et des appareils mobiles intelligents, WeChat est devenu un élément indispensable dans les domaines social et marketing. Dans cette ère de plus en plus numérique, la manière d'utiliser PHP pour le développement de WeChat est devenue la préoccupation de nombreux développeurs. Cet article présente principalement les points de connaissances pertinents sur la fa?on d'utiliser PHP pour le développement WeChat, ainsi que certains conseils et précautions. 1. Préparation de l'environnement de développement Avant de développer WeChat, vous devez d'abord préparer l'environnement de développement correspondant. Plus précisément, vous devez installer l'environnement d'exploitation PHP et la plateforme publique WeChat
