.NET实现微博粉丝服务平台接口

【文章摘要】
Senparc.Weixin.MP虽然是微信公众号的SDK,但因为易信公众号和新浪微博粉丝服务平台也提供了微信兼容接口,因此也可使用其快速实现相应的服务,固然微博因为与微信存在差别,若是不改动原始SDK,则须要对一些地方进行调整。本文使用Senparc.Weixin.MP快速实现新浪微博粉丝服务平台的接口。html

 

【文章索引】git

  1. 新浪微博粉丝服务平台接口说明
  2. Senparc.Weixin.MP使用介绍
  3. 对于微博特有事件的处理

 

【1、新浪微博粉丝服务平台接口说明】github

关于怎么申请新浪微博粉丝服务平台就不详细介绍了,蓝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参数便可建立菜单。如下主要介绍消息和事件推送这个比较核心的内容。微信公众平台

 

【2、Senparc.Weixin.MP使用介绍】ide

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)两个事件。

 

【3、对于微博特有事件的处理】

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
相关文章
相关标签/搜索