【文章摘要】
Senparc.Weixin.MP雖然是微信公衆號的SDK,但因爲易信公衆號和新浪微博粉絲服務平臺也提供了微信兼容接口,因此也可使用其快速實現相應的服務,固然微博因爲與微信存在差別,若是不改動原始SDK,則須要對一些地方進行調整。本文使用Senparc.Weixin.MP快速實現新浪微博粉絲服務平臺的接口。html
【文章索引】git
關於怎麼申請新浪微博粉絲服務平臺就不詳細介紹了,藍V認證後就可使用粉絲服務平臺了,若是須要使用開發模式調用接口的話,還須要在微博開放平臺建立一個應用,類型選擇「微服務應用」->「粉絲服務平臺」,待應用註冊好後,就能夠獲取到應用的AppKey和AppSecret了。而後在微博的「管理中心」->「粉絲服務」->「高級功能」中能夠選擇設置爲開發模式,與微信公衆號不一樣的是,微信在使用開發模式時須要自定義Token並在驗證消息時與其餘參數放置一塊兒建立簽名Signature,而微博在使用開發模式時須要填寫剛纔建立的應用的AppKey,而後建立Signature時使用的是對應的AppSecret。在第一次設置微博粉絲服務平臺時,微博會對設置的服務器地址進行驗證,即經過GET方式傳入echostr參數,而後你須要將參數返回出來,固然你也能夠對其來源真僞進行驗證。數據庫
微博粉絲服務平臺的管理界面與微信公衆號幾乎如出一轍,連圖標都神似。粉絲服務平臺與微信的公衆號也很是相似,底部菜單,消息事件推送等等都是同樣的;與微信相比,在推送的信息中更是直接返回微博用戶的uid,而不是像微信同樣只返回對於當前應用惟一的OpenID。服務器
對於剛配置好的粉絲服務平臺,默認使用的消息推送接口是JSON類型的,不過很貼心的是,微博也提供了兼容微信的XML接口,若是原來開發過微信公衆號的話,能夠極大程度地複用代碼。若是須要切換不一樣的格式,請參考 http://open.weibo.com/wiki/Eps/push/set_format 這個文檔,須要將access_token和format=xml兩個參數POST到接口中,看起來很複雜,其實實現起來很簡單,本身寫一個或者找一個能POST參數的程序便可;而access_token也不像微信同樣須要經過OAuth2.0去獲取,而是在微博的粉絲服務平臺的管理頁面中直接顯示(有效期一年),以下圖。微信
除此以外,自定義菜單接口也與微信的相似,一樣是傳入上述的access_token,以及將菜單的JSON代碼傳入menus參數便可建立菜單。如下主要介紹消息和事件推送這個比較核心的內容。微信公衆平臺
Senparc.Weixin.MP是一個基於FreeBSD的開源的微信公衆平臺SDK,官方網站是:http://weixin.senparc.com,GitHub是:http://github.com/JeffreySu/WeiXinMPSDK。同時,在NuGet上也提供了發佈版,能夠很方便的使用NuGet管理。除此以外,做者也有一份官方的說明文檔,http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html。微服務
微博的粉絲服務平臺與微信公衆號同樣,對於用戶發送的內容以及點擊菜單等的事件都會推送到粉絲服務平臺開發者模式中設置的地址。與微信同樣,對於首次驗證地址使用的是GET請求方式,對於往後的推送使用的都是POST方式。網站
對於每次請求,首先須要驗證來源的真僞,Senparc.Weixin.MP已經將該功能封裝在CheckSignature類中,例如使用HttpHandler的話能夠直接使用以下代碼檢查來源是否有效:
String signature = Request.QueryString["signature"]; String timestamp = Request.QueryString["timestamp"]; String nonce = Request.QueryString["nonce"]; Boolean isRight = CheckSignature.Check(signature, timestamp, nonce, "APP_SECRET");
當驗證來源有效後,便可使用Senparc.WeiXin.MP的MessageHandler來實現對消息的處理,一般咱們須要繼承該類實現自定義的回覆,例如如下代碼能夠將全部用戶發送的信息都回復「默認回覆消息」:
1 public class WeiboMessageHandler : MessageHandler<MessageContext> 2 { 3 private ResponseMessageText responseMessage; 4 5 public WeiboMessageHandler(Stream inputStream) 6 : base(inputStream) 7 { 8 this.responseMessage = this.CreateResponseMessage<ResponseMessageText>(); 9 } 10 11 public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage) 12 { 13 this.responseMessage.Content = "默認回覆消息"; 14 return responseMessage; 15 } 16 }
而後咱們能夠在HttpHanlder中經過以下代碼調用MessageHandler,獲取處理後的結果並輸出:
1 if (String.Equals("POST", Request.HttpMethod.ToUpperInvariant()))//POST方法進行回覆信息 2 { 3 WeiboMessageHandler messageHandler = new WeiboMessageHandler(Request.InputStream); 4 messageHandler.Execute(); 5 6 Response.Output.Write(messageHandler.ResponseDocument.ToString()); 7 }
除此以外,在繼承的MessageHandler中,還能夠重載如下方法實現不一樣的功能:
一、IResponseMessageBase OnTextRequest(RequestMessageText requestMessage):文字消息
二、IResponseMessageBase OnEventRequest(IRequestMessageEventBase requestMessage):事件消息
三、IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage):菜單點擊事件消息
四、IResponseMessageBase OnEvent_ViewRequest(RequestMessageEvent_View requestMessage):菜單點擊連接消息
五、IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage):用戶訂閱事件消息
六、IResponseMessageBase OnEvent_UnsubscribeRequest(RequestMessageEvent_Unsubscribe requestMessage):用戶取消訂閱事件消息
例如在每一個requestMessage中均可以獲取FromUserName,對於微信是隻能保證每一個應用內惟一的OpenID,而在微博中則是用戶的uid。對於文字消息,requestMessage中有Content屬性能夠獲取用戶發送的文字內容,並根據用戶發送的不一樣內容返回不一樣的結果;對於事件消息有Event屬性能夠獲取事件類型;對於菜單點擊事件和連接消息,則有EventKey屬性能夠分別表示菜單事件名稱和點擊菜單後跳轉的Url地址,尤爲是對於點擊事件,能夠根據不一樣的EventKey返回不一樣的內容;而在用戶訂閱和取消訂閱的方法中能夠往本身的數據庫中寫入相關標記。除了能夠重載上述的方法外,還有好多方法能夠重載,在這就不一一介紹了,對於沒有單獨處理的消息(如沒有重載相應方法或在其餘地方進行處理),則默認會返回DefaultResponseMessage中的消息。
須要說明的是,在微博粉絲服務平臺中,對於用戶發送的消息,只有Text、Image、Voice和Position(Location)四種類型,而沒有Video和Link兩種類型;而對於事件消息,與微信相同的有關注(subscribe)、取消關注(unsubscribe)、掃描二維碼(subscribe或SCAN)以及菜單點擊事件(CLICK)和菜單點擊連接(VIEW)幾種,沒有微信的打開聊天窗口自動上報地理位置信息的事件(LOCATION),可是多了用戶關注(follow)和取消關注(unfollow)兩個事件。
Senparc.WeiXin.MP採用了重載的方式使得很是簡單就能實現微信公衆號,可是微博和微信在推送的信息方面有所出入。對於微博少的而言,倒無所謂,但對於微博比微信多的兩個事件(關注和取消關注)就須要作額外的處理了。固然修改Senparc.WeiXin.MP的源代碼是一種方案,但對於使用NuGet管理或者不想對原有代碼進行修改時,須要採用如下的辦法。
因爲Senparc.WeiXin.MP自己不支持follow和unfollow類型,因此經過MessageHandler中的RequestMessage或者OnEventRequest方法中的requestMessage都獲取不到正確的Event屬性,其Event屬性始終爲Enter,若是咱們不對此進行處理的話Senparc.WeiXin.MP也會默認會按Enter事件進行處理。因此咱們須要從原始數據中讀取信息,例如以下代碼:
1 public override IResponseMessageBase OnEventRequest(IRequestMessageEventBase requestMessage) 2 { 3 String key = this.RequestDocument.Root.Element("Event").Value.ToLowerInvariant(); 4 5 switch (key) 6 { 7 case "follow"://關注 8 return this.OnEvent_FollowRequest(requestMessage); 9 case "unfollow"://取消關注 10 return this.OnEvent_UnfollowRequest(requestMessage); 11 } 12 13 //其餘事件處理代碼 14 15 return base.OnEventRequest(requestMessage); 16 } 17 18 public IResponseMessageBase OnEvent_FollowRequest(IRequestMessageEventBase requestMessage) 19 { 20 //處理用戶關注事件 21 22 return this.responseMessage; 23 } 24 public IResponseMessageBase OnEvent_UnfollowRequest(IRequestMessageEventBase requestMessage) 25 { 26 //處理用戶取消關注事件 27 28 return this.responseMessage; 29 }
固然,對於Senparc.WeiXin.MP的老版本,RequestMessageEventBase的繼承關係出現了一個錯誤(RequestMessageEventBase本應該實現IRequestMessageEventBase但卻沒有實現)。當事件類型系統不識別時,執行MessageHanlder的Execute()會發生空指針錯誤,更新到最新的7.0.18及之後的版本便可解決該問題。
【參考連接】