淘宝 TOP 平台Open API入门篇

淘宝 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--

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值