【文章摘要】
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来实现对消息的处理,通常我们需要继承该类实现自定义的回复,例如以下代码可以将所有用户发送的信息都回复“默认回复消息”:

 public class WeiboMessageHandler : MessageHandler<MessageContext>
{
private ResponseMessageText responseMessage; public WeiboMessageHandler(Stream inputStream)
: base(inputStream)
{
this.responseMessage = this.CreateResponseMessage<ResponseMessageText>();
} public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
{
this.responseMessage.Content = "默认回复消息";
return responseMessage;
}
}

然后我们可以在HttpHanlder中通过如下代码调用MessageHandler,获取处理后的结果并输出:

 if (String.Equals("POST", Request.HttpMethod.ToUpperInvariant()))//POST方法进行回复信息
{
WeiboMessageHandler messageHandler = new WeiboMessageHandler(Request.InputStream);
messageHandler.Execute(); Response.Output.Write(messageHandler.ResponseDocument.ToString());
}

除此之外,在继承的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事件进行处理。所以我们需要从原始数据中读取信息,例如如下代码:

 public override IResponseMessageBase OnEventRequest(IRequestMessageEventBase requestMessage)
{
String key = this.RequestDocument.Root.Element("Event").Value.ToLowerInvariant(); switch (key)
{
case "follow"://关注
return this.OnEvent_FollowRequest(requestMessage);
case "unfollow"://取消关注
return this.OnEvent_UnfollowRequest(requestMessage);
} //其他事件处理代码 return base.OnEventRequest(requestMessage);
} public IResponseMessageBase OnEvent_FollowRequest(IRequestMessageEventBase requestMessage)
{
//处理用户关注事件 return this.responseMessage;
}
public IResponseMessageBase OnEvent_UnfollowRequest(IRequestMessageEventBase requestMessage)
{
//处理用户取消关注事件 return this.responseMessage;
}

当然,对于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

.NET实现微博粉丝服务平台接口的更多相关文章

  1. Spring Cloud 微服务开放平台接口

    github源码地址:https://github.com/spring-cloud/spring-cloud-security 前言: 什么是开放平台接口 场景 : 总公司与子公司 对接接口  还有 ...

  2. 用c#开发微信 (19) 公众平台接口权限列表说明 - 订阅号、服务号认证后的区别

    最新发现有些原来认证服务号的权限对认证的订阅号开放了,这里是官方的文档说明<公众平台接口权限列表说明>,明显比这里说得详细.准确多了<微信公众平台服务号.订阅号的相关说明>.另 ...

  3. 微信公众平台接口API

    <?php /** * Author: helen * CreateTime: 2015/12/9 20:14 * description: 微信公众平台接口API */ class Wecha ...

  4. 《小猪CMS(PigCms)多用户微信营销服务平台系统V6.1完美破解至尊版带微用户管理CRM+微信支付》

    <小猪CMS(PigCms)多用户微信营销服务平台系统V6.1完美破解至尊版带微用户管理CRM+微信支付> 之前发布了不少微赢的多用户微信网站源码,今天为我的小伙伴们准备的是功能非常强悍, ...

  5. ML平台_微博深度学习平台架构和实践

    ( 转载至: http://www.36dsj.com/archives/98977)  随着人工神经网络算法的成熟.GPU计算能力的提升,深度学习在众多领域都取得了重大突破.本文介绍了微博引入深度学 ...

  6. 云极知客开放平台接口调用方法(C#)

    云极知客为企业提供基于SAAS的智能问答服务.支持企业个性化知识库的快速导入,借助语义模型的理解和分析,使企业客户立即就拥有本行业的24小时客服小专家.其SAAS模式实现零成本投入下的实时客服数据的可 ...

  7. 微信公共服务平台开发(.Net 的实现)13-------网页授权(下 :C#代码的实现 )

    接着上次的理论,我们这次来研究用代码实现“网页授权获取用户基本信息”,首先我们需要一个链接指向微信的授权页面,在微信开发平台中已经说了,这个链接必须在微信客户端中打开,那么我们就干脆使用文本消息来完成 ...

  8. 【译文】用Spring Cloud和Docker搭建微服务平台

    by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-mi ...

  9. Java版 家政服务 社区服务 家装服务平台 源码 有案例 可定制

    产品说明: 家装服务平台.社区服务平台.服务类型的平台--公司成熟产品 包括工匠注册.资质认证.发布服务产品.会员注册.预约服务.工匠定价.执行服务.服务完毕填写工作日志上传现场照片.会员确认服务.返 ...

随机推荐

  1. linux下libuv库安装教程

    下载并编译libuv libuv需要自己手动下载源码,并手动编译. 当前目录为:/home/xlz/test/github,在后面,会用$PATH来代替,我的系统的Debian8,64bit. $gi ...

  2. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  3. 听大神说:https和http有何区别?(转)

    在做雅虎的时候,发现用第三方工具截取不到客户端与服务端的通讯,以前重来没碰到过这种情况,仔细看了看,它的url请求时基于https的,gg了下发现原来https协议和http有着很大的区别.总的来说, ...

  4. Hadoop 全分布模式 平台搭建

    现将博客搬家至CSDN,博主改去CSDN玩玩~ 传送门:http://blog.csdn.net/sinat_28177969/article/details/54138163 Ps:主要答疑区在本帖 ...

  5. AOP详解

    什么是AOP AOP Aspect Oriented Programing 面向切面编程 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视.事务管理.安全检查.缓存) Spring ...

  6. 关于安装Apache之后,解析PHP的配置

    需要配置四个地方 LoadModule php5_module modules/libphp5.soServerName localhost:80DirectoryIndex index.phpAdd ...

  7. jquery 回车事件

    简单地记下jquery实现回车事件,代码如下: 全局: $(document).keydown(function(e){ if(e.keyCode==13){ $(".login-li in ...

  8. 《DSP using MATLAB》示例Example5.20

  9. CentOS 搭建 nginx + tomcat

    安装nginx yum install nginx 修改 nginx.conf, (/etc/nginx/nginx.conf), 网上有人做人所有配置项目的详解. #nu For more info ...

  10. < meta > 元素

    < meta > 元素 概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 we ...