【文章摘要】
Senparc.Weixin.MP雖然是微信公眾號的SDK,但由於易信公眾號和新浪微博粉絲服務平台也提供了微信兼容接口,所以也可以使用其快速實現相應的服務,當然微博由於與微信存在差異,如果不改動原始SDK,則需要對一些地方進行調整。本文使用Senparc.Weixin.MP快速實現新浪微博粉絲服務平台的接口。
【文章索引】
【一、新浪微博粉絲服務平台接口說明】
關於怎麼申請新浪微博粉絲服務平台就不詳細介紹了,藍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去獲取,而是在微博的粉絲服務平台的管理頁面中直接顯示(有效期一年),如下圖。
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及以後的版本即可解決該問題。
【參考鏈接】
只要支持wsdl 就可以添加服務引用
.net,c#是選擇的開發語言
xml應該是接口是使用xml的數據格式通信
webservice:就是接口是以webservice的方式實現,也就是soap協議
花生殼也就是域名綁定