淘宝 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[n] & 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--