上一篇已經(jīng)搭建好整體框架,實(shí)現(xiàn)了入口的驗(yàn)證, ? 驗(yàn)證通過(guò)後就交給LookMsgType方法處理,LookMsgType方法主要是對(duì)微信發(fā)來(lái)的不同的訊息進(jìn)行分解,不同的類型交給業(yè)務(wù)邏輯層不同的方法處理, ? 對(duì)不同類型的訊息判斷,可以用if,也可以用switch ? 一般來(lái)說(shuō)超過(guò)5個(gè)的if用switch會(huì)更好, 這裡貼出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);//未關(guān)注的新用戶,掃描帶參數(shù)的二維碼關(guān)注 ????????????????????????????} ????????????????????????????else ????????????????????????????{ ????????????????????????????????RSub?mSub?=?new?RSub(); ????????????????????????????????mSub?=?ReadXml.GetModel<rsub>(mSub,?xmlModel); ????????????????????????????????BLLWei.DoSub(dbHome,mSub);//普通關(guān)注 ????????????????????????????} ????????????????????????????break; ????????????????????????case?"unsubscribe": ????????????????????????????RUnsub?mUnSub?=?new?RUnsub?(); ????????????????????????????mUnSub?=?ReadXml.GetModel<runsub>(mUnSub,?xmlModel); ????????????????????????????BLLWei.DoUnSub(dbHome,mUnSub);//取消關(guān)注 ????????????????????????????break; ????????????????????????case?"SCAN": ????????????????????????????RCodeSub?mCodeSub?=?new?RCodeSub(); ????????????????????????????mCodeSub?=?ReadXml.GetModel<rcodesub>(mCodeSub,?xmlModel); ????????????????????????????BLLWei.DoCodeSub(dbHome,mCodeSub);//已經(jīng)關(guān)注的用戶掃描帶參數(shù)的二維碼 ????????????????????????????break; ????????????????????????case?"LOCATION"://用戶上報(bào)地理位置 ????????????????????????????RSubLocation?mSubLoc?=?new?RSubLocation(); ????????????????????????????mSubLoc?=?ReadXml.GetModel<rsublocation>(mSubLoc,?xmlModel); ????????????????????????????BLLWei.DoSubLocation(dbHome,?mSubLoc); ????????????????????????????break; ????????????????????????case?"CLICK"://自定義菜單點(diǎn)擊 ????????????????????????????RMenuClick?mMenuClk?=?new?RMenuClick(); ????????????????????????????mMenuClk?=?ReadXml.GetModel<rmenuclick>(mMenuClk,?xmlModel); ????????????????????????????BLLWei.DoMenuClick(dbHome,?mMenuClk); ????????????????????????????break; ????????????????????????case?"VIEW"://自定義菜單跳轉(zhuǎn)事件 ????????????????????????????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>
外層switch判斷msgtype, ? 在event類型時(shí),再次switch判斷特定的事件類型(追蹤、取消追蹤、自訂選單事件等), ?至此所有的微信發(fā)來(lái)的訊息都有處理了,在上面程式碼中用到訊息模型以及ReadXml.GetModel方法給模型賦值, 賦值之後傳遞給業(yè)務(wù)邏輯層對(duì)應(yīng)的方法處理, ?下面寫出訊息封裝和給模型賦值的方法。
? ? 1、訊息封裝: ? ??
? ? ? ? ? ?對(duì)所有微型訊號(hào)傳送來(lái)的訊息進(jìn)行封裝,datamodel中建立一個(gè)Receive資料夾和一個(gè)send資料夾,在其中分別建立一個(gè)資料夾的類,對(duì)應(yīng)於訊息完成之後,完整的datamodel類別庫(kù)如下圖:
範(fàn)例
-----接收訊息:
文字訊息RText .cs
public?class?RText ????{ ????????public?string?ToUserName?{?get;?set;?}//?開(kāi)發(fā)者微信號(hào) ????????public?string?FromUserName?{?get;?set;?}//?用戶號(hào)(OpenID) ????????public?long?CreateTime?{?get;?set;?}//?創(chuàng)建時(shí)間 ????????public?string?MsgType?{?get;?set;?}?//消息類型 ????????public?string?Content?{?get;?set;?}//內(nèi)容 ????????public?long?MsgId?{?get;?set;?}//消息ID ????}
自訂選單點(diǎn)擊RMenuClick.cs
public?class?RMenuClick ????{ ????????public?string?ToUserName?{?get;?set;?}//?開(kāi)發(fā)者微信號(hào) ????????public?string?FromUserName?{?get;?set;?}//?用戶號(hào)(OpenID) ????????public?long?CreateTime?{?get;?set;?}//?創(chuàng)建時(shí)間 ????????public?string?MsgType?{?get;?set;?}?//消息類型 ????????public?string?Event?{?get;?set;?}//事件類型 ????????public?string?EventKey?{?get;?set;?}//事件key ???????? ????}
#其他也都類似,不一一列舉。
-----發(fā)送訊息
?
發(fā)送文字訊息SText.cs
public?class?SText ????{ ????????public?string?ToUserName?{?get;?set;?}//?用戶號(hào)(OpenID) ????????public?string?FromUserName?{?get;?set;?}//?開(kāi)發(fā)者微信號(hào) ????????public?long?CreateTime?{?get;?set;?}//?創(chuàng)建時(shí)間 ????????public?string?MsgType?{?get?{?return?"text";?}?}?//消息類型 ????????public?string?Content?{?get;?set;?}//內(nèi)容 ????} SText
傳送圖文訊息SNews.cs
namespace?DataModel.Send { ????public?class?SNews ????{ ????????public?string?ToUserName?{?get;?set;?}//?用戶號(hào)(OpenID) ????????public?string?FromUserName?{?get;?set;?}//?開(kāi)發(fā)者微信號(hào) ????????public?long?CreateTime?{?get;?set;?}//?創(chuàng)建時(shí)間 ????????public?string?MsgType?{?get?{?return?"news";?}?}?//消息類型 ????????public?int?ArticleCount?{?get;?set;?}//圖文個(gè)數(shù) ????????public?List<articlesmodel>?Articles?{?get;?set;?}//圖文列表 ????} ????public?class?ArticlesModel?//默認(rèn)第一條大圖顯示 ????{ ????????public?string?Title?{?get;?set;?}//標(biāo)題 ????????public?string?Description?{?get;?set;?}//描述 ????????public?string?PicUrl?{?get;?set;?}//圖片鏈接?? ????????public?string?Url?{?get;?set;?}//點(diǎn)擊之后跳轉(zhuǎn)的鏈接 ????} }</articlesmodel>
在發(fā)送圖文訊息中,因?yàn)榛馗步o微信的圖文訊息中,具體的圖文內(nèi)容是多條(最多可以10條),所以單獨(dú)會(huì)有ArticlesModel。 ? ?後面文章會(huì)寫出圖文訊息的發(fā)送。
? ? ?2、透過(guò)反射給model賦值?
? ? ? ?在上篇文章寫的入口處,已經(jīng)有了解析xml的方法,現(xiàn)在封裝了訊息,通常的做法,是每次用到對(duì)應(yīng)的model就手動(dòng)寫程式碼賦值, ?而我這裡LookMsgType方法中所有給訊息賦值時(shí)全用的ReadXml.GetModel這同一個(gè)方法, ?這裡用的就是反射,方法如下:
///?<summary> ????????///?通過(guò)反射給接收消息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 model 就是要使用的訊息類, ? xmlmodel是在入口處傳遞進(jìn)來(lái)的解析的微信發(fā)來(lái)的xml訊息, ?這樣,就不需要每次手動(dòng)寫程式碼賦值了。
好了,此篇實(shí)作了lookmsgtype方法, 實(shí)作了訊息封裝與反射賦值,接下去就是到了業(yè)務(wù)邏輯層中的處理與具體實(shí)作了...
更多asp .net開(kāi)發(fā)微信公眾平臺(tái)(3)微信訊息封裝及反射賦值相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)