2008年10月25日

校内/Manyou/Alisoft API应用开发Demo

作者 非鱼

其实要写个完整的Demo是挺困难的,而且目前我只做了Python的开发,没有写过其它版本,而且以我的习惯,我也不喜欢写完整的代码给别人去抄,所谓授之以鱼不如授之以渔。写个自然语言的版本吧,写起来简单,看的人也容易使用自己喜欢的语言来搞定。

为什么把三个放在一起呢,其实它们的API区别不大,流程都是一样的,只是参数名字的区别而已。

API的工作流程如下:(这些东西三个网站的开发手册里都有)

用户登录到校内/Manyou/Alisoft以后,进入他的应用列表,可以看到他安装过的所有的应用,点击某个应用的时候,就会跳到一个特定的地址。校内和Manyou有XNML/MYML的开发方式,在这种方式下,用户的每次点击都是点到他们的地址上,在他们的服务器上把请求转发到你的网址。这种情况下你在自己的网站上是不能用Session或者Cookie来记住用户的,因为所有的用户都是同一个地方发来的请求。所以你只能每个页面都要从他们传过来的参数里获取当前用户的信息。而IFrame的方式要简单的多,只要给他们一个入口,他们就会生成一个IFrame把参数传入你这个入口地址,以后用户的所有操作都是在你的网站上,所以只要这个入口页面处理查询用户信息并用你自己的Cookie来登录,剩下的跟其它的页面逻辑是一样的。Alisoft也是这样做的。所以这里我只讲IFrame方式。

校内和Manyou是跳到它自己域名的一个URL,然后生成一个IFrame链接到你网站的一个地址,Alisoft则是直接跳到你的网站上的地址。跳到这个地址的时候会带一些参数过来,比如当前用户的ID,SessionID,还有其它一些参数,但是真正有用的就是这两个。凭这两个参数,你就可以反过来去查询该用户的所有信息。

所以你首先需要一个处理登录的页面,接收他传过来的参数,在参数里获取用户ID,SessionID,然后查询用户的真实身份和用户名,如果验证是从API应用里点过来的,就在你自己的站上查询这个用户ID是否已存在,如果存在就取出来设他的Cookie或Session让他登录,如果不存在,就生成一个新用户,跟这个用户ID绑定起来,然后让他登录就行了。用户再点你其它的链接,就是你网站的一般逻辑而已了。

各种语言都有自己发POST请求的方式,需要自己去看看帮助了。

查询用户信息的方式:

校内的:只需要在REQUEST里获取这两个参数:xn_sig_user,xn_sig_session_key,然后往这个地址http://api.xiaonei.com/restserver.do Post这些参数:

api_key:你的应用的Key,官方给出来的那个串,method:’xiaonei.users.getInfo’,session_key:就是前面获取的这个,call_id:0,sig:空字符串,v: ‘1.0’,fields:’name,sex’,uids:前面获取的那个user。

单引号括起来的就是固定字符串。至于sig,本来它应该是个用来验证请求身份是否合法的加密串,但是校内现在并没有用到,所以传个空的过去就行。如果用户是合法的,你就会得到一个包含<name>和<sex>的XML文本,剩下的应该是你自己的问题啦。

Manyou的:你需要获取三个参数:my_sig_uId,my_sig_sessionId,my_sig_prefix,前两个跟校内一样,最后一个是该用户实际所在站点的URL(因为Manyou是一个应用服务器给所有的UCenter子站服务的)。当然还有个参数my_sig_key可以用来验证传过来的参数是否合法,如果你只需要获取用户ID,不需要知道他的名字,就用这个参数来验证的话就可以省却一次POST的时间了。

然后需要需要往这个地址http://api.manyou.com/openapi.php POST这些参数:

api_key:你的应用的key,官方给的,format:’JSON’,(否则默认返回PHP格式的),method:’user.getinfo’,session_key:前面获取的sessionId,v:’0.1’,args[fields]: ‘name,sex’,args[uids]:前面获取的uId,sig:加密字符串。

重点在这个加密字符串的计算上,它的算法是把通用参数按字母排序,再加上你所调用的这个API方法的专用参数,再加上你的应用的安全码(申请的时候给的),拼成一个字符串算出来的MD5。比如上面这个方法,拼字符串就是:

‘api_key=’+apikey+’&format=JSON&method=user.getinfo&session_key=’+my_sig_sessionId+’&v=0.1&args[fields]=name,sex&args[uids]=’+userid+’&’+code

注意我中间引号外面的是自己的变量名,别照抄。最后的code就是你的安全码。对这个字符串算一个MD5就是前面需要POST的那个sig参数的值了。

这样如果请求合法,你会得到一个JSON格式的返回,格式为"name":"用户名","sex":"性别"。你只要分解字符串就可以拿到这个用户名了。剩下的就是自己的问题了。

Alisoft的:跟Manyou的非常相似

你需要获取三个参数:user_id,app_instance_id(就是sessionID),token(有特殊用途)。

然后往这个地址http://sipdev.alisoft.com/sip/rest (正式上线后把域名里的dev去掉)POST以下参数:

appId:你的应用的编号(官方给出的),appInstanceId:前面给出的,sip_apiname : ‘alisoft.validateUser’,sip_appkey:跟appId一样,sip_timestamp:当前时间字符串,格式为2008-10-01 08:00:00,token:前面获取的那个,userId:前面获取的那个,sip_sign:加密字符串。

加密字符串的计算方法跟Manyou类似,但是串联字符串的时候没有&和=,而是把所有的内容串在一起,而且你的安全码是放在字符串的最前面的,前面这个方法的字符串就是:

code+’appId’+appid+’appInstanceId’+instance+’sip_apinamealisoft.validateUser’+’sip_appkey’+appid+’sip_timestamp’+now +’token’+token+’userId’+userid

code是你的安全码,now就是前面说的时间字符串,其它的变量一看就知道了。

返回的内容只有一个<String>1</String>,包含这个就说明该用户是合法的,但是并不会返回他的用户名,如果你想获取用户名的话,还得再去调用另外一个API,自己去看看官方的文档吧(因为他的用户可能是淘宝的,也可能是阿里巴巴的)。调用方法是一样的。