当前位置: 首页 > news >正文

淘宝网Open API 入门教程

淘宝网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/index.php/%E6%9C%8D%E5%8A%A1%E9%9B%86%E6%88%90%E5%B9%B3%E5%8F%B0

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

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

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

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

4.                  授权除了上面所描述的外,授权还有时效性。就是授权是有期限的,现在淘宝授权一次的最大有效时效为一个小时。如果在一个小时内,没用调用任何淘宝的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是用户授权,即需要用户授权才可以访问该用户的交易信息。

 

 

源代码如下:

 

ContractedBlock.gif ExpandedBlockStart.gif
package org.openapi.taobao;

 

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.Set;

import java.util.TreeSet;

 

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.NameValuePair;

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

 

public class TaobaoOpenApiDemo {

 

    
/**

     * 调用淘宝的taobao.trade.get demo,

     * 运行该示例时,你需要将appId,appSecret,tid

     * 这三个参数替换为你自己的,就可以运行该demo

     * 

     * 在第一次运行时 会提醒你登录淘宝进行授权,

     * 授权成功后 再次运行该demo就可以获取指定交易的信息 呵呵

     * 

     * 这只是一个简单的demo,只是为初学者提供方便

     * 有了这个原型 大家就可以各显自己的神通了

     
*/

    
public static void main(String[] args) {

       

       
// 淘宝Open API平台即SIP平台的入口

       String sipRequestUrl 
= "http://sip.alisoft.com/sip/rest"

       String appId 
= "****"// 在阿里软件平台注册的应用ID,请使用你自己的应用ID

       String appSecret 
= "******"// 注册的应用的密钥,请使用你自己应用的密钥

       String taobaoApiName 
= "taobao.trade.get"// 交易类api

       String sessionId 
= "1234567";//sessionId是isv应用自己生成的字符串

//确保每个使用该应用的用户各自的sessionId各不相同

       SimpleDateFormat formater 
= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

 

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

       params.put(
"sip_appkey", appId);

       params.put(
"sip_apiname", taobaoApiName);

       params.put(
"sip_timestamp", formater.format(new Date()));

       params.put(
"sip_sessionid", sessionId);

       params.put(
"fields""seller_nick,buyer_nick,title,type,created,sid");

       params.put(
"tid""******"); //请设置你要查询的交易号

       params.put(
"format""xml");

       params.put(
"v""1.0");

       params.put(
"sip_sign", getSign(appSecret, params));

 

       String result 
= requestOpenApi(sipRequestUrl, params);

       
if (result != null && result.startsWith("sip_isp_loginurl:")) {

           result 
= result.replaceAll("&amp;""&");

           System.out.println(
"打开浏览器,访问下面的URL进行用户授权,授权成功后" +

                  
",再次运行该类就可以调用api获取交易信息");

           System.out.println(result.substring(
"sip_isp_loginurl:".length()));

       } 
else if (result != null)

           System.out.println(result);

 

    }

 

    
/**

     * 请求淘宝Open API服务

     * 
@param url 服务集群平台入口

     * 
@param params 请求参数

     * 
@return 请求结果

     
*/

    
public static String requestOpenApi(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);

           String resultCode 
= postMethod.getResponseHeader("sip_status")

                  .getValue();

           
if (resultCode == null || ("".equals(resultCode)))

              
return null;

           
else if ("1004".equals(resultCode))

              
return "sip_isp_loginurl:"

                     
+ postMethod.getResponseHeader("sip_isp_loginurl")

                            .getValue();

           
else if (!"9999".equals(resultCode))

              
return resultCode

                     
+ ":"

                     
+ postMethod.getResponseHeader("sip_errormessage")

                            .getValue();

 

           
return postMethod.getResponseBodyAsString();

 

       } 
catch (Exception ex) {

           ex.printStackTrace();

       } 
finally {

           
if (postMethod != null)

              postMethod.releaseConnection();

       }

 

       
return null;

 

    }

 

    
/**

     * 对所有参数进行签名

     * 
@param secret APP ID对应的密钥

     * 
@param params 请求中所有的参数

     * 
@return 签名

     
*/

    
public static String getSign(String secret, Map<String, String> params) {

       
if (secret == null || "".equals(secret) || params == null)

           
throw new RuntimeException(

                  
"secret or params is null or blank, please checkdot.gif");

 

       StringBuilder sb 
= new StringBuilder().append(secret);

       String result 
= null;

 

       
try {

           Set
<String> sortedKeys = new TreeSet<String>();

           sortedKeys.addAll(params.keySet());

           
for (String key : sortedKeys)

              sb.append(key).append(params.get(key));

 

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

           result 
= byteTohex(md.digest(sb.toString().getBytes("utf-8")));

 

       } 
catch (Exception e) {

           
throw new RuntimeException(e);

       }

 

       
return result;

    }

 

    
public static String byteTohex(byte[] b) {

       StringBuffer sb 
= new StringBuffer();

       String stmp 
= "";

 

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

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

 

           
if (stmp.length() == 1)

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

           
else

              sb.append(stmp);

       }

 

       
return sb.toString().toUpperCase();

    }

 

}

 

 

 


 

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

如果大家有什么问题,可以回复本贴,有问必答。大家相互探讨,共同进步。呵呵!

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hereweare2009/archive/2009/05/28/4222625.aspx

 

转载于:https://www.cnblogs.com/jxgxy/archive/2009/06/05/1496600.html

相关文章:

  • css3中追加的三种选择器
  • 终于安装成功了
  • angular2开源库收集
  • 如果爱能早点说出来
  • 数据库设计中的14个关键技巧
  • 二分查找模版
  • 大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(三)商业逻辑代码部分...
  • [每日一点]msgsnd函数代码跟踪
  • 硬币
  • 数字化管理(Digital Management)
  • 【生活】2017 开始!
  • UNIX IO---再谈文件描述符
  • HTML5 拖放(Drag 和 Drop)详解与实例
  • ⒍环境变量
  • 清北学堂总结(未完待续。。。。。。。)
  • (三)从jvm层面了解线程的启动和停止
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JS数组方法汇总
  • Just for fun——迅速写完快速排序
  • Node项目之评分系统(二)- 数据库设计
  • react-native 安卓真机环境搭建
  • 坑!为什么View.startAnimation不起作用?
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • (175)FPGA门控时钟技术
  • (C语言)球球大作战
  • (笔试题)合法字符串
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)人的集合论——移山之道
  • (转)四层和七层负载均衡的区别
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .java 9 找不到符号_java找不到符号
  • .net Application的目录
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 反射的使用
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net操作Excel出错解决
  • @RestControllerAdvice异常统一处理类失效原因
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ C++ ] STL---string类的模拟实现
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [2023-年度总结]凡是过往,皆为序章
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [CakePHP] 在Controller中使用Helper
  • [github配置] 远程访问仓库以及问题解决
  • [java/jdbc]插入数据时获取自增长主键的值
  • [java基础揉碎]关系运算符(比较运算符)逻辑运算符赋值运算符三元运算符运算符的优先级
  • [JS]变量