免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3404 | 回复: 0
打印 上一主题 下一主题

淘宝Open API初学者入门教程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-25 17:06 |只看该作者 |倒序浏览
淘宝Open API初学者入门教程




淘宝Open API开放将近一年了,越来越多的人(包括已工作的和在校的大学生)都在使用淘宝的Open API,有不少ISV应用已上架盈利了。本文作为一篇教程,给大家做启发式教育。




我也使用淘宝Open API也大半年了。不过了,由于阿里软件的文档比较的乱,让很多初学者分不清头绪(注:淘宝Open API是开放在阿里软件的一个平台上,是什么服务集群平台吧)。当然了,在中国,能够将自己的服务资源开放出来给第三方使用,特别是淘宝网这种大型商业网站来说,阿里巴巴的这种分享精神和开放的胸怀还是令人佩服的。因此在使用Open API过程中,我们如果觉得资料不是很充分,也不要过多的抱怨,开放的同时意味着责任。呵呵!

在这了,趁端午节放假,将我使用淘宝Open API的心得分享出来,先写一篇简单的入门教程,也算是分享和开放吧。

通过阅读阿里软件提供的文档,我们对如何调用淘宝Open API有了基本的了解。阿里软件Open API平台即服务集成平台SIP相关的文档链接如下(在使用SIP平台上的Open API还是先要了解下该平台的相关策略如安全策略,访问控制策略等):

http://wiki.isv.alisoft.com/inde ... 0%E5%B9%B3%E5%8F%B0

服务集群平台就不多唠叨了,去上面的文档地址去看看。我就简要的讲讲就我所知道的一些值得注意的地方:

1.淘宝Open API每分钟访问的次数是有限制的,好像是400次/分钟,即一个应用访问任何一个淘宝API,一分钟内最多只能访问400次;

2.在次数方面,除了上面的控制外,还有日访问次数控制。如果你的应用是上架的,则日访问量没有限制;如果你的应用没有上架,那么一天之内,你访问淘宝Open API的次数累计起来不能超过1000次。不要有意见哦,人家的资源也是有限的,而且还是免费的。

3.服务集成平台的api的安全级别分为四类:无安全策略校验;签名校验;用户授权校验(包含签名校验);可选用户授权校验(包含签名校验)。淘宝Open API大多都是需要用户授权的。所谓用户授权就是应用软件在操作用户的淘宝数据时,就需要用户授权。如淘宝卖家在使用店铺管理软件维护自己的店铺时,淘宝网就需要淘宝卖家对该店铺软件进行授权,只有授权了,店铺管理软件才能操作淘宝卖家的数据。

4.授权除了上面所描述的外,授权还有时效性。就是授权是有期限的,现在淘宝授权一次的最大有效时效为一个小时。如果在一个小时内,没用调用任何淘宝Open API,则授权过期了,需要重新授权。而对于未上架的应用,授权时效内不管有没有调用淘宝Open API,授权期限过后就需要重新授权。看来,上架的应用还是有相当大的空间优势。

其他的就不多唠叨了,还没有在阿里软件注册应用的,还得先去阿里软件平台注册一个应用,注册成功后,你会得到APP ID及CERT CODE。其中APP ID是用来标记应用,即你注册应用的ID,CERT CODE则是你应用的密钥,在做签名时用。

下面直接来个demo,感受下淘宝的Open API。我们调用交易类的taobao.trade.get为例,该api文档地址为:http://isp.alisoft.com/apidoc/api/apiIndex.html#isp_taobao-6-281 。可以知道这个api是用户授权,即需要用户授权才可以访问该用户的交易信息。

源代码如下:
  1. package org.openapi.taobao;
  2. import java.security.MessageDigest;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.Map;
  8. import java.util.Set;
  9. import java.util.TreeSet;
  10. import org.apache.commons.httpclient.HttpClient;
  11. import org.apache.commons.httpclient.NameValuePair;
  12. import org.apache.commons.httpclient.methods.PostMethod;
  13. public class TaobaoOpenApiDemo {
  14. /**
  15. * 调用淘宝的taobao.trade.get demo,
  16. * 运行该示例时,你需要将appId,appSecret,tid
  17. * 这三个参数替换为你自己的,就可以运行该demo
  18. *
  19. * 在第一次运行时 会提醒你登录淘宝进行授权,
  20. * 授权成功后 再次运行该demo就可以获取指定交易的信息 呵呵
  21. *
  22. * 这只是一个简单的demo,只是为初学者提供方便
  23. * 有了这个原型 大家就可以各显自己的神通了
  24. */
  25. public static void main(String[] args) {

  26. // 淘宝Open API平台即SIP平台的入口
  27. String sipRequestUrl = "http://sip.alisoft.com/sip/rest";
  28. String appId = "****"; // 在阿里软件平台注册的应用ID,请使用你自己的应用ID
  29. String appSecret = "******"; // 注册的应用的密钥,请使用你自己应用的密钥
  30. String taobaoApiName = "taobao.trade.get"; // 交易类api
  31. String sessionId = "1234567";//sessionId是isv应用自己生成的字符串
  32. //确保每个使用该应用的用户各自的sessionId各不相同
  33. SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  34. Map params = new HashMap();
  35. params.put("sip_appkey", appId);
  36. params.put("sip_apiname", taobaoApiName);
  37. params.put("sip_timestamp", formater.format(new Date()));
  38. params.put("sip_sessionid", sessionId);
  39. params.put("fields", "seller_nick,buyer_nick,title,type,created,sid");
  40. params.put("tid", "******"); //请设置你要查询的交易号
  41. params.put("format", "xml");
  42. params.put("v", "1.0");
  43. params.put("sip_sign", getSign(appSecret, params));

  44. String result = requestOpenApi(sipRequestUrl, params);
  45. if (result != null && result.startsWith("sip_isp_loginurl:")) {
  46. result = result.replaceAll("&", "&");
  47. System.out.println("打开浏览器,访问下面的URL进行用户授权,授权成功后" +
  48. ",再次运行该类就可以调用api获取交易信息");
  49. System.out.println(result.substring("sip_isp_loginurl:".length()));
  50. } else if (result != null)
  51. System.out.println(result);

  52. }

  53. /**
  54. * 请求淘宝Open API服务
  55. * @param url 服务集群平台入口
  56. * @param params 请求参数
  57. * @return 请求结果
  58. */
  59. public static String requestOpenApi(String url, Map params) {
  60. HttpClient client = new HttpClient();
  61. PostMethod postMethod = new PostMethod(url);

  62. try {
  63. NameValuePair[] postData = new NameValuePair[params.size()];

  64. Iterator iters = params.keySet().iterator();
  65. int i = 0;

  66. while (iters.hasNext()) {
  67. String key = (String) iters.next();
  68. postData[i] = new NameValuePair(key, params.get(key).toString());
  69. i++;
  70. }

  71. postMethod.setRequestBody(postData);
  72. client.executeMethod(postMethod);
  73. String resultCode = postMethod.getResponseHeader("sip_status")
  74. .getValue();
  75. if (resultCode == null || ("".equals(resultCode)))
  76. return null;
  77. else if ("1004".equals(resultCode))
  78. return "sip_isp_loginurl:"
  79. + postMethod.getResponseHeader("sip_isp_loginurl")
  80. .getValue();
  81. else if (!"9999".equals(resultCode))
  82. return resultCode
  83. + ":"
  84. + postMethod.getResponseHeader("sip_errormessage")
  85. .getValue();

  86. return postMethod.getResponseBodyAsString();

  87. } catch (Exception ex) {
  88. ex.printStackTrace();
  89. } finally {
  90. if (postMethod != null)
  91. postMethod.releaseConnection();
  92. }

  93. return null;

  94. }

  95. /**
  96. * 对所有参数进行签名
  97. * @param secret APP ID对应的密钥
  98. * @param params 请求中所有的参数
  99. * @return 签名
  100. */
  101. public static String getSign(String secret, Map params) {
  102. if (secret == null || "".equals(secret) || params == null)
  103. throw new RuntimeException(
  104. "secret or params is null or blank, please check");

  105. StringBuilder sb = new StringBuilder().append(secret);
  106. String result = null;

  107. try {
  108. Set sortedKeys = new TreeSet();
  109. sortedKeys.addAll(params.keySet());
  110. for (String key : sortedKeys)
  111. sb.append(key).append(params.get(key));

  112. MessageDigest md = MessageDigest.getInstance("MD5");
  113. result = byteTohex(md.digest(sb.toString().getBytes("utf-8")));

  114. } catch (Exception e) {
  115. throw new RuntimeException(e);
  116. }

  117. return result;
  118. }

  119. public static String byteTohex(byte[] b) {
  120. StringBuffer sb = new StringBuffer();
  121. String stmp = "";

  122. for (int n = 0; n < b.length; n++) {
  123. stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));

  124. if (stmp.length() == 1)
  125. sb.append("0").append(stmp);
  126. else
  127. sb.append(stmp);
  128. }

  129. return sb.toString().toUpperCase();
  130. }
  131. }
复制代码
上面短短的100多行代码只是向初学者展示如何使用淘宝Open API服务。从代码也可以看到,基于rest的Open API的确使用起来相当的方便。当然,要想使用好淘宝Open API,还得好好的阅读淘宝Open API文档。同时,还需打开自己的思维,使用淘宝Open API编写出有创意的应用。早日上架,早日盈利!

如果大家有什么问题,可以回复本贴,有问必答。大家相互探讨,共同进步。呵呵!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP