Heim  >  Artikel  >  WeChat-Applet  >  Entwicklung der öffentlichen WeChat-Plattform mit asp.net (3) WeChat-Nachrichtenkapselung und Reflexionszuweisung

Entwicklung der öffentlichen WeChat-Plattform mit asp.net (3) WeChat-Nachrichtenkapselung und Reflexionszuweisung

高洛峰
高洛峰Original
2017-02-23 14:07:151777Durchsuche

Im vorherigen Artikel wurde das Gesamtframework erstellt und die Eingangsüberprüfung implementiert. Nach bestandener Überprüfung wird sie an die LookMsgType-Methode übergeben. Die LookMsgType-Methode zerlegt hauptsächlich verschiedene von WeChat gesendete Nachrichten Um verschiedene Arten von Nachrichten zu beurteilen, ist es besser, Schalter zu verwenden, wenn es mehr als 5 Typen gibt Die LookMsgType-Methode wird hier veröffentlicht:

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>

Der äußere Schalter bestimmt den Nachrichtentyp. Wenn der Ereignistyp verwendet wird, wechseln Sie erneut, um den spezifischen Ereignistyp (Folgen, Nicht mehr folgen, benutzerdefiniertes Menü) zu bestimmen Zu diesem Zeitpunkt wurden alle von WeChat gesendeten Nachrichten verarbeitet. Im obigen Code werden dem Modell Werte zugewiesen ​​werden zur Verarbeitung an die entsprechenden Methoden der Geschäftslogikschicht übergeben. Die Methoden zur Nachrichtenkapselung und Zuweisung zum Modell werden unten beschrieben.

1. Nachrichtenkapselung:

Kapseln Sie alle von WeChat gesendeten Nachrichten. Erstellen Sie einen Empfangsordner und einen Sendeordner im Datenmodell und erstellen Sie nach Abschluss Klassen, die den darin enthaltenen Nachrichten entsprechen. Die vollständige Datenmodell-Klassenbibliothek sieht wie folgt aus:

Entwicklung der öffentlichen WeChat-Plattform mit asp.net (3) WeChat-Nachrichtenkapselung und Reflexionszuweisung

Beispiel

-----Nachricht empfangen:

Textnachricht 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

    }

Benutzerdefiniertes Menü klicken Sie auf 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
        
    }

Andere sind ähnlich, daher werde ich sie nicht einzeln auflisten.

-----Nachricht senden

Textnachricht SText.cs senden

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

Grafiknachricht SNews.cs senden

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>

Da beim Senden von Grafiknachrichten mehrere spezifische Grafikinhalte (bis zu 10) in der an WeChat geantworteten Grafiknachricht vorhanden sind, gibt es ein separates ArticlesModel. Der folgende Artikel beschreibt das Versenden von grafischen Nachrichten.

2. Weisen Sie dem Modell Werte durch Reflexion zu

Am Eingang des vorherigen Artikels gibt es bereits eine Methode zum Parsen von XML, und jetzt ist die Nachricht gekapselt Der übliche Ansatz ist es, jedes Mal das entsprechende Modell zu verwenden, indem ich Code hier manuell schreibe. Ich verwende die gleiche Methode ReadXml.GetModel, wenn ich Nachrichten Werte zuweise. Die hier verwendete Methode ist wie folgt :

/// <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 Das Modell ist die zu verwendende Nachrichtenklasse, und das XML-Modell sind die von WeChat gesendeten analysierten XML-Informationen, die am Eingang übergeben werden. Auf diese Weise ist keine manuelle Eingabe erforderlich Schreiben Sie Code und weisen Sie jedes Mal Werte zu.

Okay, in diesem Artikel wurde die Methode „lookmsgtype“ implementiert, die Nachrichtenkapselung und die Reflexionszuweisung implementiert, und dann folgt die Verarbeitung und spezifische Implementierung in der Geschäftslogikschicht ...

Mehr asp .net-Entwicklung Bitte achten Sie auf die öffentliche WeChat-Plattform (3). Artikel zu WeChat-Nachrichtenkapselung und Reflexionszuweisung beachten Sie bitte die chinesische PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn