>  기사  >  위챗 애플릿  >  asp.net을 이용한 WeChat 공개 플랫폼 개발 (3) WeChat 메시지 캡슐화 및 반영 할당

asp.net을 이용한 WeChat 공개 플랫폼 개발 (3) WeChat 메시지 캡슐화 및 반영 할당

高洛峰
高洛峰원래의
2017-02-23 14:07:151766검색

이전 기사에서는 전체 프레임워크가 구축되고 입장 확인이 구현되었습니다. 확인을 통과한 후 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에서 보낸 모든 메시지를 데이터 모델에 생성하고 메시지에 해당하는 클래스를 생성합니다. 전체 데이터 모델 클래스 라이브러리는 아래와 같습니다:

asp.net을 이용한 WeChat 공개 플랫폼 개발 (3) 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 중국어 홈페이지를 주목해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.