文章出處

【文章摘要】
Senparc.Weixin.MP雖然是微信公眾號的SDK,但由于易信公眾號和新浪微博粉絲服務平臺也提供了微信兼容接口,所以也可以使用其快速實現相應的服務,當然微博由于與微信存在差異,如果不改動原始SDK,則需要對一些地方進行調整。本文使用Senparc.Weixin.MP快速實現新浪微博粉絲服務平臺的接口。

 

【文章索引】

  1. 新浪微博粉絲服務平臺接口說明
  2. Senparc.Weixin.MP使用介紹
  3. 對于微博特有事件的處理

 

【一、新浪微博粉絲服務平臺接口說明】

關于怎么申請新浪微博粉絲服務平臺就不詳細介紹了,藍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使用介紹】

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中,還可以重載以下方法實現不同的功能:

1、IResponseMessageBase OnTextRequest(RequestMessageText requestMessage):文字消息
2、IResponseMessageBase OnEventRequest(IRequestMessageEventBase requestMessage):事件消息
3、IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage):菜單點擊事件消息
4、IResponseMessageBase OnEvent_ViewRequest(RequestMessageEvent_View requestMessage):菜單點擊鏈接消息
5、IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage):用戶訂閱事件消息
6、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及以后的版本即可解決該問題。

 

【參考鏈接】

  1. 粉絲服務平臺 - 微博API:http://open.weibo.com/wiki/%E7%B2%89%E4%B8%9D%E6%9C%8D%E5%8A%A1%E5%B9%B3%E5%8F%B0

文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()