이전 기사에서는 전체 프레임워크가 구축되고 입장 확인이 구현되었습니다. 확인을 통과한 후 LookMsgType 메서드로 넘겨집니다. LookMsgType 메서드는 주로 WeChat에서 보낸 다양한 메시지를 분해합니다. 유형은 비즈니스 로직에 전달되며, 레이어를 처리하는 데에는 if 또는 스위치를 사용하는 것이 좋습니다. LookMsgType 메서드는 여기에 게시되어 있습니다:
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>
외부 레이어 스위치가 메시지 유형을 결정합니다. 이벤트 유형이 사용되면 다시 전환하여 특정 이벤트 유형(팔로우, 팔로우 취소, 사용자 정의 메뉴 이벤트)을 결정합니다. 등) 이 시점에서 WeChat에서 보낸 모든 메시지가 처리되었습니다. 위 메시지 모델과 ReadXml.GetModel 메서드는 모델에 값을 할당하는 데 사용됩니다. 처리를 위해 비즈니스 논리 계층의 해당 메서드로 전달됩니다. 메시지 캡슐화 및 모델 할당을 위한 메서드는 다음과 같습니다.
1. 메시지 캡슐화:
WeChat에서 보낸 모든 메시지를 데이터 모델에 생성하고 메시지에 해당하는 클래스를 생성합니다. 전체 데이터 모델 클래스 라이브러리는 아래와 같습니다:
예
------메시지 수신:
문자 메시지 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 }
메뉴를 사용자 정의하고 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 }
를 클릭하세요. 다른 것도 비슷해서 하나씩 나열되지 않습니다.
-----메시지 보내기
문자 메시지 보내기 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
그래픽 메시지 보내기 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>
그래픽 메시지를 보낼 때 WeChat에 대한 답변에는 여러 개의 특정 그래픽 메시지(최대 10개)가 있으므로 별도의 ArticlesModel이 있습니다. 다음 문서에서는 그래픽 메시지 전송에 대해 설명합니다.
2. Reflection을 통해 모델에 값을 할당
이전 글 입구에는 이미 xml을 파싱하는 방법이 있고, 이제 메시지가 캡슐화되어 있습니다. 매번 코드를 수동으로 작성하여 해당 모델을 할당하는 것입니다. 여기의 LookMsgType 메서드에서는 메시지에 값을 할당할 때 ReadXml.GetModel과 동일한 메서드를 사용합니다.
/// <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 모델은 사용할 메시지 클래스인 xmlmodel은 입구에서 전달되는 WeChat에서 전송된 구문 분석된 xml 정보입니다. 이렇게 하면 수동으로 코드를 작성할 필요가 없습니다. 매번 값을 할당하십시오.
좋아요, 이 기사에서는 Lookmsgtype 메소드를 구현하고 메시지 캡슐화 및 반사 할당을 구현한 다음 비즈니스 로직 계층에서 처리 및 특정 구현을 수행했습니다...
asp .net 개발 더보기 위챗 공개 플랫폼 (3) 위챗 메시지 캡슐화 및 반영 할당 관련 글은 PHP 중국어 홈페이지를 주목해주세요!