Dans l'article précédent, le cadre global a été construit et la vérification d'entrée a été mise en œuvre. Une fois la vérification réussie, elle est transmise à la méthode LookMsgType. La méthode LookMsgType décompose principalement les différents messages envoyés par WeChat, et différents. Les types sont transmis à la logique métier. Différentes méthodes sont utilisées pour traiter les couches. Pour juger différents types de messages, vous pouvez utiliser if ou switch. De manière générale, il est préférable d'utiliser switch s'il y a plus de 5 if. La méthode LookMsgType est publiée ici :
public void LookMsgType(string msgType) { #region 判断消息类型 switch (msgType) { case "text": RText mText = new RText(); mText = ReadXml.GetModel<rtext>(mText, xmlModel); BLLWei.DoText(dbHome, mText);//文本消息 break; case "image": RImg mImg = new RImg(); mImg = ReadXml.GetModel<rimg>(mImg, xmlModel); BLLWei.DoImg(dbHome,mImg);//图片 break; case "voice": //声音 RVoice mVoice = new RVoice(); mVoice = ReadXml.GetModel<rvoice>(mVoice, xmlModel); BLLWei.DoVoice(dbHome,mVoice); break; case "video"://视频 RVideo mVideo = new RVideo(); mVideo = ReadXml.GetModel<rvideo>(mVideo, xmlModel); BLLWei.DoVideo(dbHome, mVideo); break; case "location"://地理位置 RLocation mLocation = new RLocation(); mLocation = ReadXml.GetModel<rlocation>(mLocation, xmlModel); BLLWei.DoLocation(dbHome,mLocation); break; case "link"://链接 RLink mLink = new RLink(); mLink = ReadXml.GetModel<rlink>(mLink, xmlModel); BLLWei.DoLink(dbHome,mLink); break; #region 事件 case "event": switch (ReadXml.ReadModel("Event", xmlModel)) { case "subscribe": if (ReadXml.ReadModel("EventKey", xmlModel).IndexOf("qrscene_") >= 0) { RCodeNotSub mNotSub = new RCodeNotSub(); mNotSub = ReadXml.GetModel<rcodenotsub>(mNotSub, xmlModel); BLLWei.DoCodeNotSub(dbHome,mNotSub);//未关注的新用户,扫描带参数的二维码关注 } else { RSub mSub = new RSub(); mSub = ReadXml.GetModel<rsub>(mSub, xmlModel); BLLWei.DoSub(dbHome,mSub);//普通关注 } break; case "unsubscribe": RUnsub mUnSub = new RUnsub (); mUnSub = ReadXml.GetModel<runsub>(mUnSub, xmlModel); BLLWei.DoUnSub(dbHome,mUnSub);//取消关注 break; case "SCAN": RCodeSub mCodeSub = new RCodeSub(); mCodeSub = ReadXml.GetModel<rcodesub>(mCodeSub, xmlModel); BLLWei.DoCodeSub(dbHome,mCodeSub);//已经关注的用户扫描带参数的二维码 break; case "LOCATION"://用户上报地理位置 RSubLocation mSubLoc = new RSubLocation(); mSubLoc = ReadXml.GetModel<rsublocation>(mSubLoc, xmlModel); BLLWei.DoSubLocation(dbHome, mSubLoc); break; case "CLICK"://自定义菜单点击 RMenuClick mMenuClk = new RMenuClick(); mMenuClk = ReadXml.GetModel<rmenuclick>(mMenuClk, xmlModel); BLLWei.DoMenuClick(dbHome, mMenuClk); break; case "VIEW"://自定义菜单跳转事件 RMenuView mMenuVw = new RMenuView(); mMenuVw = ReadXml.GetModel<rmenuview>(mMenuVw, xmlModel); BLLWei.DoMenuView(dbHome, mMenuVw); break; }; break; #endregion } #endregion }</rmenuview></rmenuclick></rsublocation></rcodesub></runsub></rsub></rcodenotsub></rlink></rlocation></rvideo></rvoice></rimg></rtext>
Le commutateur externe détermine le type de message. Lorsque le type d'événement est utilisé, basculez à nouveau pour déterminer le type d'événement spécifique (suivre, ne plus suivre, menu personnalisé. événement, etc.). À ce stade, tous les messages envoyés par WeChat ont été traités. Dans le code ci-dessus, le modèle de message et la méthode ReadXml.GetModel sont utilisés pour attribuer des valeurs au modèle. sont transmis aux méthodes correspondantes de la couche de logique métier pour le traitement. Les méthodes d'encapsulation des messages et d'affectation au modèle sont écrites ci-dessous.
1. Encapsulation des messages :
Encapsulez tous les messages envoyés par WeChat. Créez un dossier de réception et un dossier d'envoi dans le modèle de données, et créez des classes correspondant aux messages qu'ils contiennent. la bibliothèque complète de classes de modèles de données est la suivante :
Exemple
-----Recevoir un message :
Message texte RText . cs
public class RText { public string ToUserName { get; set; }// 开发者微信号 public string FromUserName { get; set; }// 用户号(OpenID) public long CreateTime { get; set; }// 创建时间 public string MsgType { get; set; } //消息类型 public string Content { get; set; }//内容 public long MsgId { get; set; }//消息ID }
Menu personnalisé cliquez sur RMenuClick.cs
public class RMenuClick { public string ToUserName { get; set; }// 开发者微信号 public string FromUserName { get; set; }// 用户号(OpenID) public long CreateTime { get; set; }// 创建时间 public string MsgType { get; set; } //消息类型 public string Event { get; set; }//事件类型 public string EventKey { get; set; }//事件key }
D'autres sont similaires, je ne les listerai donc pas un par un.
-----Envoyer un message
Envoyer un message texte SText.cs
public class SText { public string ToUserName { get; set; }// 用户号(OpenID) public string FromUserName { get; set; }// 开发者微信号 public long CreateTime { get; set; }// 创建时间 public string MsgType { get { return "text"; } } //消息类型 public string Content { get; set; }//内容 } SText
Envoyer un message graphique SNews.cs
namespace DataModel.Send { public class SNews { public string ToUserName { get; set; }// 用户号(OpenID) public string FromUserName { get; set; }// 开发者微信号 public long CreateTime { get; set; }// 创建时间 public string MsgType { get { return "news"; } } //消息类型 public int ArticleCount { get; set; }//图文个数 public List<articlesmodel> Articles { get; set; }//图文列表 } public class ArticlesModel //默认第一条大图显示 { public string Title { get; set; }//标题 public string Description { get; set; }//描述 public string PicUrl { get; set; }//图片链接 public string Url { get; set; }//点击之后跳转的链接 } }</articlesmodel>
Lors de l'envoi de messages graphiques, comme il y a plusieurs messages graphiques spécifiques (jusqu'à 10) dans le message graphique répondu à WeChat, il y aura un modèle d'articles distinct. L'article suivant décrira l'envoi de messages graphiques.
2. Attribuez des valeurs au modèle par réflexion
A l'entrée de l'article précédent, il existe déjà une méthode d'analyse XML, et maintenant le message est encapsulé L'approche habituelle. est de l'utiliser à chaque fois. Le modèle correspondant est attribué en écrivant manuellement du code. Dans la méthode LookMsgType ici, j'utilise la même méthode ReadXml.GetModel lors de l'attribution de valeurs aux messages. La méthode utilisée ici est la réflexion. :
/// <summary> /// 通过反射给接收消息model赋值 /// </summary> /// <typeparam></typeparam> /// <param> /// <returns></returns> public static T GetModel<t>(T model, Dictionary<string> xmlModel) where T : class { var m = model.GetType(); foreach (PropertyInfo p in m.GetProperties()) { string name = p.Name; if (xmlModel.Keys.Contains(name)) { string value=xmlModel.Where(x => x.Key == name).FirstOrDefault().Value; p.SetValue(model, string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, p.PropertyType), null); } } return model; }</string></t>
T Le modèle est la classe de message à utiliser, et le modèle xml est l'information XML analysée envoyée par WeChat qui est transmise à l'entrée. De cette façon, il n'est pas nécessaire de le faire manuellement. écrivez du code et attribuez des valeurs à chaque fois.
D'accord, cet article a implémenté la méthode lookmsgtype, implémenté l'encapsulation des messages et l'affectation de réflexion, puis vient le traitement et l'implémentation spécifique dans la couche de logique métier...
Plus de développement asp .net de la plate-forme publique WeChat (3) Articles liés à l'encapsulation des messages WeChat et à l'affectation de réflexion, veuillez faire attention au site Web chinois PHP !