asp.net を使用した WeChat パブリック プラットフォームの開発 (3) WeChat メッセージのカプセル化とリフレクション割り当て

高洛峰
リリース: 2017-02-23 14:07:15
オリジナル
1775 人が閲覧しました

前回の記事では、全体的なフレームワークを構築し、入口検証を実装しました。検証が完了すると、LookMsgType メソッドに渡されます。LookMsgType メソッドは、主に WeChat によって送信されるさまざまなタイプを分解します。ビジネス ロジック層に渡して、さまざまな種類のメッセージを処理するには、if または switch を使用します。一般的に、if が 5 つを超える場合は switch を使用することをお勧めします。外側のスイッチは msgtype を決定します。イベント タイプでは、再度スイッチして特定のイベント タイプ (フォロー、フォロー解除、カスタム メニュー イベントなど) を決定します。この時点で、WeChat によって送信されたすべてのメッセージと ReadXml が処理されます。上記のコードでは GetModel が使用されており、このメソッドはモデルに値を割り当てます。割り当て後、その値は処理のためにビジネス ロジック層の対応するメソッドに渡されます。メッセージのカプセル化とモデルへの割り当てのメソッドは次のとおりです。 。実装 1. メッセージのパッケージ化:

WeChat によって送信されたすべてのメッセージをパッケージ化し、DataModel で受信フォルダーと送信フォルダーを構築し、その中に対応するメッセージ クラスを確立します。完了すると、以下に示すように、完全な DataModel クラス ライブラリが完成します。

-----メッセージの受信:

テキストメッセージ RText.cs

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>
ログイン後にコピー
asp.net を使用した WeChat パブリック プラットフォームの開発 (3) WeChat メッセージのカプセル化とリフレクション割り当てカスタムメニューをクリック RMenuClick.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

    }
ログイン後にコピー

他も同様なので、一つずつ記載しません。 。

-----メッセージを送信する

テキスト メッセージを送信する SText.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
        
    }
ログイン後にコピー

グラフィック メッセージを送信する SNews.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
ログイン後にコピー

グラフィック メッセージを送信するのは、グラフィック メッセージに返信するためです。 WeChat では、特定のグラフィック コンテンツが複数(最大 10 個)あるため、個別の ArticlesModel が存在します。 次の記事では、グラフィック メッセージの送信について説明します。

2. リフレクションを通じてモデルに値を割り当てる

前の記事の冒頭で、XML を解析する方法がすでに説明されており、メッセージは手動でカプセル化されます。通常のアプローチは、値を割り当てるコードを手動で記述することです。対応するモデルが使用されるたびに、LookMsgType メソッドのメッセージへのすべての割り当てで同じメソッド ReadXml.GetModel が使用されます。ここでは Reflection が使用され、メソッドは次のとおりです。使用するメッセージクラス、入り口でxmlmodelを渡す WeChatから送信された解析済みのxml情報が入ってきます。 これにより、毎回手動でコードを書いて値を代入する必要がありません。

この記事では、lookmsgtype メソッドの実装、メッセージのカプセル化とリフレクション割り当ての実装、そしてビジネス ロジック層での処理と具体的な実装について説明します...

その他の asp.net 開発 WeChat パブリック プラットフォーム (3 ) 関連記事についてWeChat メッセージのカプセル化とリフレクション割り当てについては、PHP 中国語 Web サイトに注意してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート