放暑假了,生活基本穩定下來,項目的剩餘部分也要開始慢慢的研究了。 項目GitHub地址: https://github.com/Andyahui/xgyxsh_WeiXin SDK的GitHub地址:https://github.com/JeffreySu/WeiXinMPSDK/ SDK官方介紹博 ...
放暑假了,生活基本穩定下來,項目的剩餘部分也要開始慢慢的研究了。
項目GitHub地址: https://github.com/Andyahui/xgyxsh_WeiXin
SDK的GitHub地址:https://github.com/JeffreySu/WeiXinMPSDK/
SDK官方介紹博客:http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html
一:關於SDK中的消息處理機制說明
之前的一篇博文中有兩個關於消息的方法,現在就讓我們真正的瞭解它,因為微信伺服器是轉發客戶端的消息繼而發送給網站伺服器,那這就存在弊端,它每一次只能發送一個,而且是每一個用戶發送一個。這樣伺服器端的session就沒有辦法保存使用,這樣我們就沒有辦法取到用戶的個人信息。
1:瞭解Session和Cookie
SDK幫我們封裝了所有用戶的上下文實體的容器(全局上下文)WeixinContext<TM>,保存的是所以請求對象的信息,這樣我們就可以在同一個應用中創建多個上下文實體。既然都有全局上下文信息了,那麼想必單個用戶的信息也就可以創建了,MessageContext就是用於保存單個用戶的上下文信息(Wike),可以在這裡獲取用戶的個人信息。保存在WeixinContent的MessageCollection及MessageQueus對象中。
二:xx學院官方微信的分析
我們學校的官方微信是白老大(博客)開發的,當時參加了市裡面的比賽還得了獎,我們在老大的帶領下也做了很多關於微信的項目,這幾天就想好好的學習下微信,就一直在分析裡面的代碼,有了自己的一些想法。
現在伺服器端可以進行簡單的響應了,其實老大的微信開發前期也就是實現了用戶在客戶端發送消息,服務端響應等功能,只是他在後臺管理裡面添加文本素材,圖文素材,功能管理,這些功能,其實意思就是想通過我們管理人員將我們自己需要響應的東西手動進行添加,明確需要回覆哪些東西。
這裡的這些管理就是我們經常做的CRUD的功能,主要是想讓管理員在後臺中可以進行配置,也方便管理。其實這裡主要的內容是在功能設置裡面,比如現有功能有查詢成績,查詢課表,查詢圖書信息等,很是實用,他在這裡面是將我們的各種外部的東西都進行的封裝,比如查詢成績,是利用爬蟲將學生管理系統中的成績拉下來的,之後只要用戶在客戶端發送任何有關於成績的字元就進行一次爬取;這樣保證了數據的實時性,其實我覺得這裡可以利用時間來將成績保存在資料庫中,這樣我們不用每次接收到請求就去爬取數據,因為成績的更新是有時間的,主要是在期末等幾個時間段來添加成績,其餘時間的成績是不變的。很多都是這樣的,對於老大當時的技術做到這樣已經很牛逼了;之後我們在一起開發別的項目的時候基本上在SDK的幫助下把微信80%的功能都實現了,也不得不說SDK的強大。
三:本地存儲一些回覆內容
--->想法是將回覆給用戶的內容可以在我們的管理系統中實現後臺可配置,這樣就方便編輯人員發佈內容。
其實就是按照微信官方的文檔內容來編寫我們的實體。這樣做的好處就是我們要是需要回覆直接取資料庫中的內容就OK。
就拿一個文本回覆看就好了。這裡有請求和響應兩個類(請求只有一個,響應很多,對應微信的響應)
- 請求RequestMessage
/// <summary> /// 請求消息基類 /// </summary> public class RequestMessage : BaseEntity { /// <summary> /// 用戶發來的關鍵字 /// </summary> public virtual string KeyWord { get; set; } /// <summary> /// 消息類型 /// </summary> public virtual RequestMsgType MsgType { get; set; } /// <summary> /// 響應消息的類型 /// </summary> public virtual ResponseMsgType ResponseMsgType { get; set; } /// <summary> /// 響應文本消息的ID /// </summary> public virtual Guid ResponseTextMessageId { get; set; } /// <summary> /// 響應文本消息 /// </summary> public virtual ResponseTextMessage ResponseTextMessage { get; set; } /// <summary> /// 響應圖文消息ID /// </summary> public virtual Guid ResponseNewsMessageId { get; set; } /// <summary> /// 響應圖文消息 /// </summary> public virtual ResponseNewsMessage ResponseNewsMessage { get; set; } /// <summary> /// 響應方法消息ID /// </summary> public virtual Guid ResponseMethodId { get; set; } /// <summary> /// 響應方法消息 /// </summary> public virtual ResponseMethodMessage ResponseMethodMessage { get; set; } }
- 響應ResponseTextMessage
/// <summary> /// 響應的文本消息 /// </summary> public class ResponseTextMessage : BaseEntity { public ResponseTextMessage() { // this.RequestMessage = new Collection<RequestMessage>(); } /// <summary> /// 文本內容 /// </summary> public virtual string Content { get; set; } /// <summary> /// 響應消息分類 /// </summary> public virtual ResponseMsgType ResponseMsgType { get; set; } /// <summary> /// 一對多屬性配置----相當於導航屬性 /// </summary> public virtual ICollection<RequestMessage> RequestMessage { get; set; } }
- 一些公用的枚舉值
/// <summary> /// 用戶的Request類型 /// </summary> public enum RequestMsgType : int { /// <summary> /// 用戶發來文字時 /// </summary> Text = 0,//文本 Voice = 1,//語音 Image = 2,//圖片 Menu = 3,//點擊菜單 Subscription = 4,//訂閱 NoMatch = 5,//沒有匹配時 } /// <summary> /// 響應消息類型 /// </summary> public enum ResponseMsgType : int { Text = 0, News = 1, Music = 2, Image = 3, Method = 4 }
通過上面的代碼可以發現RequestMessage和ResponseTextMessage之間存在著一對多的關係,也就是一個響應對應於多個請求。這隻是裡面的一個,還有圖文消息,圖片消息,地址位置消息,Music消息等,都可以進行這樣的設置,只要我們將其保存到資料庫中就OK了。
此時應該設置其Text的CRUD了,這樣就可以保存到資料庫中了。最終實現這樣的效果就可以進行下一步自定義響應了。
四:自定義文本響應
我們現在已經在資料庫中添加了文本的內容,但是要實現自定義回覆,就需要考慮一些邏輯,我們試想一下:用戶為什麼需要自定義回覆,肯定是想要知道一些內容,方便,快捷,比如我們假設用戶發送你好,那麼我們就回覆你好,這樣就行了。還有就是對於學生成績,課表的查詢,也是通過這樣的方式來實現的,用戶發送特定的文字,我們在後端得到用戶發送的文字查看裡面的內容,要是含有成績或者課表那麼就調用相應的方法,將其得到的成績或者課表打包成html發送給微信伺服器,接著發送給用戶客戶端。那麼這裡的邏輯在哪裡寫呢,之前我們重寫了很多sdk中的基類,就在那裡面。
/// <summary> ///1: 處理用戶發送過來的文字消息。重寫OnTextRequest方法。 /// </summary> /// <param name="requestMessage">請求消息</param> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { //CreateResponseMessage<類型>根據當前的RequestMessage創建指定類型的ResponseMessage;創建相應消息. var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); if (requestMessage.Content=="客服") { //多客服功能。 return this.CreateResponseMessage<ResponseMessageTransfer_Customer_Service>(); } else { //普通文本功能。 responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName + "。\r\t您發送了文字信息:" + requestMessage.Content + "註意了,我是張輝"; return responseMessage; } }
這裡只是簡單的利用if…else來實現兩種識別。和前面說的原理一樣,先是查看請求中內容是否包含需要辨別的文字,接著調用對應的方法,從資料庫中取出對應的數據,這樣就可以實現我們的可配置。要是之後我們需要回覆的內容多,那就需要使用switch語句來進行分支的多選擇,這樣就很方便了。
---------------------------期待之後的完整版自定義回覆吧------------------------