您的位置:首页 > 运维架构

淘宝 TOP 平台Open API入门篇

2009-06-22 23:27 323 查看
淘宝 TOP 平台Open API入门篇

[未经本人许可 严禁转载]

前不久刚写了一篇关于淘宝Open API的入门教程,具体见http://blog.csdn.net/hereweare2009/archive/2009/05/28/4222625.aspx ,今天刚刚得知,淘宝也发布了自己的平台---Taobao Open Platform,简称TOP平台。此前淘宝的Open API是通过alisoft的SIP平台对外开放的。具体的TOP信息去官网看看,http://open.taobao.com/ 。我也没仔细看,我比较急切,我就直接在我上一篇的Blog的代码上,尝试改造走TOP平台调用,整个过程不到10分钟,也许俺对alisoft的SIP机制比较清楚吧。我个人觉得整个调用过程基本上和alisoft的SIP没啥区别,呵呵!

TOP的OpenAPI与alisoft的SIP一样,分为三类:apiType=1表示调用时需要ISV(第三方开发者)签名和认证;apiType=2表示调用时需要ISV签名和认证,同时需要用户授权确认;apiType=3表示:调用时需要ISV签名和认证,可选用户授权确认(授权后可获取公开信息) 。taobao.user.get是属于可选用户授权。未经用户授权只能获得用户的公开信息。整个过程与SIP不同的是Session的生成,具体见:http://wiki.open.taobao.com/index.php/%E5%A6%82%E4%BD%95%E5%8F%96%E5%BE%97session%EF%BC%9F ,下面代码有说明。其它的我啥也不懂,也不罗嗦了,直接贴代码:

import java.io.IOException;

import java.security.MessageDigest;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.TreeMap;

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.NameValuePair;

import org.apache.commons.httpclient.methods.PostMethod;

import sun.misc.BASE64Decoder;

/**

* TOP Open API开发实例

* 今天得知淘宝TOP平台发布

* 发了几分钟时间 将上次alisoft 平台的demo改了下

* 测试一把,呵呵 alisoft的SIP调用见上一篇Blog:

* http://blog.csdn.net/hereweare2009/archive/2009/05/28/4222625.aspx

*/

public class TOPDemo {

public static void main(String... args)

{

String TopUrl = "http://gw.sandbox.taobao.com/router/rest?";

//组装请求参数

TreeMap<String, String> apiparamsMap = new TreeMap<String, String>();

apiparamsMap.put("method", "taobao.user.get");

//关键是获取session,先请求授权URL:http://open.taobao.com/isv/authorize.php?appkey=alipublic01

// 就会获得淘宝TOP授权码,点复制按钮,复制授权码,

// 再访问http://container.sandbox.taobao.com/container?authcode=授权码

// 将上面的“授权码”替换出刚才授权的授权码,请求该url,则在结果中top_session即为所要的结果

apiparamsMap.put("session", "*****");//替换为你自己的session

apiparamsMap.put("api_key", "alipublic01");//我使用的是测试帐号alipublic01

apiparamsMap.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));

apiparamsMap.put("v", "1.0");

apiparamsMap.put("fields", "created,nick,sex,location,buyer_credit.level,last_visit");

apiparamsMap.put("nick", "tbtest520");

String sign = sign(apiparamsMap, "test");//alipublic01的密钥是test

apiparamsMap.put("sign", sign);

// 向TOP平台测试环境发起调用

System.out.println(requestTOPApi(TopUrl, apiparamsMap));

}

/**

* 请求淘宝TOP平台OpenAPI服务

* @param url TOP平台入口

* @param params 请求参数

* @return 请求结果

*/

public static String requestTOPApi(String url, Map<String, String> params) {

HttpClient client = new HttpClient();

PostMethod postMethod = new PostMethod(url);

try {

NameValuePair[] postData = new NameValuePair[params.size()];

Iterator<String> iters = params.keySet().iterator();

int i = 0;

while (iters.hasNext()) {

String key = (String) iters.next();

postData[i] = new NameValuePair(key, params.get(key).toString());

i++;

}

postMethod.setRequestBody(postData);

client.executeMethod(postMethod);

return postMethod.getResponseBodyAsString();

} catch (Exception ex) {

ex.printStackTrace();

} finally {

if (postMethod != null)

postMethod.releaseConnection();

}

return null;

}

private static String byte2hex(byte[] b) {

StringBuffer hs = new StringBuffer();

String stmp = "";

for (int n = 0; n < b.length; n++) {

stmp = (java.lang.Integer.toHexString(b
& 0XFF));

if (stmp.length() == 1)

hs.append("0").append(stmp);

else

hs.append(stmp);

}

return hs.toString().toUpperCase();

}

/**

* 把经过BASE64编码的字符串转换为Map对象

*/

public static Map<String, String> convertBase64StringtoMap(String str) {

if (str == null)

return null;

BASE64Decoder decoder = new BASE64Decoder();

String keyvalues = null;

try {

keyvalues = new String(decoder.decodeBuffer(str));

} catch (IOException e) {

// log.error(str + "不是一个合法的BASE64编码字符串");

return null;

}

if (keyvalues == null || keyvalues.length() == 0)

return null;

String[] keyvalueArray = keyvalues.split("&");

Map<String, String> map = new HashMap<String, String>();

for (String keyvalue : keyvalueArray) {

String[] s = keyvalue.split("=");

if (s == null || s.length != 2)

return null;

map.put(s[0], s[1]);

}

return map;

}

/**

* 签名方法,用于生成签名。生成签名的描述见注3

*

* @param params

* 传给服务器的参数

* @param secret

* 分配给您的APP_SECRET

*/

private static String sign(TreeMap<String, String> params, String secret) {

String result = null;

if (params == null)

return result;

Iterator<String> iter = params.keySet().iterator();

StringBuffer orgin = new StringBuffer(secret);

while (iter.hasNext()) {

String name = (String) iter.next();

orgin.append(name).append(params.get(name));

}

try {

MessageDigest md = MessageDigest.getInstance("MD5");

result = byte2hex(md.digest(orgin.toString().getBytes("utf-8")));

} catch (Exception ex) {

throw new java.lang.RuntimeException("sign error !");

}

return result;

}

}

执行结果如下:

<?xml version="1.0" encoding="utf-8" ?>

<rsp>

<user>

<buyer_credit><level>0</level></buyer_credit>

<created>2008-03-09 02:19:35</created>

<last_visit>2009-04-16 14:57:14</last_visit>

<location>

<city><![CDATA[杭州]]></city>

<state><![CDATA[浙江]]></state>

</location>

<nick><![CDATA[tbtest520]]></nick>

<sex><![CDATA[m]]></sex>

</user>

</rsp><!--xvm169.sqa-->

永久链接: http://blog.csdn.net/hereweare2009/archive/2009/06/22/4290239.aspx

--EOF--
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: