天天看點

TaoBaoApI簡介1

(注:資料整理還不成體系,很零散,有時間會整理一下!現在就簡單分享一些!)

(注:這些資料在淘寶開放平台,開發文檔裡都有描述,不過我隻是取了我需要的、我用到的,買家版可能用到的接口!

你如果想了解更多的淘寶Open API ,可以登入其開放平台首頁,檢視開發文檔,裡面有更多的介紹!)

調用API

環境入口位址;接口參數;簽名算法;注意事項

1.環境入口:

沙箱入口位址:http://gw.api.tbsandbox.com/router/rest

正式環境入口:http://gw.api.taobao.com/router/rest

3.系統級參數(8個)

<1>.method:String\Y\

說明:API接口名稱

<2>.session:String\Y\

說明:TOP配置設定使用者的SessionKey,自用型應用不需傳入參數;

非自用型的應用需要使用者授權的API必須傳入參數

<3>.timestamp:String\Y\

說明:時間,格式yyyy-MM-dd hh:mm:ss,如2008-01-25 20:23:30

淘寶API服務端允許用戶端請求時間誤差為10分鐘。

<4>.format:String\N

說明:可選,制定響應格式。預設xml,json

<5>.app_key:String\Y

說明:在合作夥伴背景建立應用時TOP配置設定的AppKey

<6>.V:String\Y

說明:API協定版本,可選值:2.0

<7>.sign:String\Y

說明:對調用API時所有輸入參數(包括應用級參數)進行簽名結果

<8>.sing_method:String\Y

說明:參數的加密方法選擇,可選值:md5,hmac。這參數隻在2.0中

4.應用級參數(2個)

調用接口除了系統級參數,還需要應用級參數(某些接口沒有應用級參數)。如下為taobao.user.get的應用級參數

<1>.fields:Field List\Y

說明:需傳回的字段清單。可選值:User結構體中的所有字段;以半形逗號(,)分隔。不支援:位址,真實姓名,身份證,手機,電話,郵箱

<2>.nick:String\Y

說明:使用者昵稱,如果昵稱為中文,請使用UTF-8字元集對昵稱進行URL編碼

5.API調用注意事項

<1>.所有的請求和響應資料編碼皆為utf-8格式,url裡的所有參數值請做urlencode編碼。如果請求的Content-Type是plication/x-www-form-urlencoded, http body裡的所有參數值也做urlencode編碼;如果是multipart/form-data格式,每個表單字段的參數值無需編碼,但每個表單字段的charset部分需要指定為utf-8。

<2>.所有api請求和響應内的日期格式都為yyyy-MM-dd HH:mm:ss,注意小時格式是24小時制,例如:2008-03-12 18:23:43。

<3>.所有api請求參數内的format(即傳回格式)可選值為json,xml,預設xml。

<4>.所有支援分頁的api,預設page_size為40,預設page_no為1。

支援分頁的api的page_size上限taobao.trades.get, taobao.trades.bought.get,taobao.trades.sold.get為100外,其他的皆為200.。

<5>.api接口的錯誤資訊在http response body内.

<6>.簽名方式為 md5(appsecret + key + value .... key + value+appsecret)然後轉大寫字母,其中key,value對是除簽名和圖檔外的所有請求參數按key做的升序排列, value無需編碼。

<7>.所有更新資料操作的api(如taobao.item.add和taobao.item.update)強制使用http post方法,查詢類不限制

6.使用者授權方式

他用型應用(例如标簽:線上訂購應用)需要通過Sessionkey擷取使用者相關資訊,自用型應用(例如标簽:淘寶商家)調用接口時不需要sessionkey。不同環境(沙箱、正式測試環境)下擷取Sessionkey的方式不同。

<1>.沙箱環境下擷取SessionKey

注意:在擷取授權碼時傳入的appkey不需要帶{},以web其他應用為:http://container.api.tbsandbox.com/container?appkey={沙箱下的appkey}

WEB應用:

通路http://container.api.tasandbox.com/container?appkey={appkey}選擇測試環境帳号并沙箱回調URL,例如回調URL填寫為:http://localhost:8080/inde.jsp

http://localhost/?top_appkey={appkey}&top_parameters=xxx&top_sign=xxx

回調url上的top_session即為SessionKey

<2>.正式環境下擷取SessionKey

注意:web插件平台應用和web其他應用在正式環境下是同樣的擷取方法

WEB應用:

例如回調URL為:http://localhost

通路http://container.open.taobao.com/container?appkey={appkey}(注:加上encode=uft-8回調參數後面的編碼就會成為utf-8,如果不加就會預設為gbk,例如http://container.open.taobao.com/container?appkey={appkey}&encode=utf-8),頁面會跳轉到回調URL,位址類似如下:

http://localhost/?top_appkey={appkey}&top_paramenters=xxx&top_session=xxx&top_sign=xxx&encode=utf-8回調url上的top_session參數即為SessionKey

用戶端應用:

通路 http://my.open.taobao.com/auth/authorize.htm?appkey={appkey}(注:加上encode=utf-8回調參數後面的編碼就會成為utf-8,如果不加就會預設為gbk,例如: http://my.open.taobao.com/auth/authorize.htm?appkey={appkey}&encode=utf-8),即可獲得授權碼。通過http方式通路 http://container.open.taobao.com/container?authcode={授權碼},會得到類似如下的字元串top_appkey=1142&top_parameters=xxx&top_session=xxx&top_sign=xxx&encode=utf-8 字元串裡面的top_session值即為SessionKey

7.快速注冊淘寶帳号

<1>.功能描述

使用Taobao ID快速注冊淘寶帳戶調用Taobao ID類似于調用接口,調用成功之後TOP即可傳回該使用者的注冊帳号、sessionKey等資訊

<2>.調用方法

使用Taobao ID與調用TOP接口的原理一樣,Taobao ID像請求URL傳遞規定的參數,TOP解析該請求參數并傳回參數至回調URL

<3>.請求輸入參數

<a>.app_key:Y

說明:TOP配置設定給應用的AppKey,例如:12000024

<b>.sign_method:Y

說明:簽名方法:md5

<c>.sign:Y

說明:簽名:QWERTYYUIO123456UIUIOUYTREWQ1D234

<d>.timestamp:Y

說明:時間戳,校驗允許誤差6min,2010-09-11+23:24:55(yyyy mm-dd HH:MM:SS,空格會被urlencode+)

<e>.app_user_nick:N

說明:自有會員帳号昵稱 例如:hello

<f>.app_user_email:N

說明:自有會員郵箱

<g>.app_user_mobile:N

說明:自有會員手機号

<4>.請求方法

組裝請求參數;生成簽名;請求URL:http://container.api.taobao.com/container/register

<5>.請求URL示例:

http://container.api.taobao.com/container/register?app_key=12129547

&sign=CE6139849660E728676518512B1DA5

&sign_method=md5

&timestamp=2010-12-06%2017:23:54

<6>.TaoBao ID視窗大小設定(非必須使用)

他用型應用使用上面生成的請求URL,可以使用JS控制TaoBao ID視窗的大小,具體方法可參考文檔:使用IS控制TaoBao_ID視窗大小

<a>.傳回結果

http://www.callback.com/?sign=F3F0DD9B2849860E6074E22EA309B8A0

&sign_method=md5

&timestamp=2010-0806+17%3A27%3A19

&notify_result=success

&taobao_user_id=470366697

&taobao_user_nick=%E5%85%B0%E8%AF%B%E9%A1%BF

&session=26697a3300f872fdbe49155a43a2b76c9001b

&app_key=12022739

&notify_type=register

&taobao_user_mobile=13157108843

<b>.傳回字段說明

sign:簽名

sign_method:簽名方法:md5

timestamp:時間戳

notify_result:注冊是否成功,成功:success

taobao_user_id:淘寶使用者帳号數字型辨別符

taobao_user_nick:淘寶帳号

session:目前使用者會話碼

app_key:top頒布的外部應用辨別符

notify_type:identify

taobao_user_mobile:淘寶使用者手機号

<c>示例代碼

/**

* 注冊帳号

* @return

* @throws UnsupportedEncodingException

*/

private String registerparams() throws UnsupportedEncodingException {

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

// 組裝協定參數。

apiparamsMap.put("sign_method", "md5");

apiparamsMap.put("app_key", Util.APP_KEY);

apiparamsMap.put("timestamp", new SimpleDateFormat(

"yyyy-MM-dd HH:mm:ss").format(new Date()));

// 生成簽名

String sign = Util.sign(apiparamsMap, Util.APP_SERCET);

apiparamsMap.put("sign", sign);

StringBuilder param = new StringBuilder();

for (Iterator<Map.Entry<String, String>> it = apiparamsMap.entrySet()

.iterator(); it.hasNext();) {

Map.Entry<String, String> e = it.next();

param.append("&").append(e.getKey()).append("=").append(

e.getValue());

}

return param.toString().substring(1);

}

/*

* 擷取注冊帳号URL

*/

public String getURL() throws UnsupportedEncodingException {

// 組裝請求URL

StringBuilder url = new StringBuilder("http://container.api.taobao.com/container/register?");

url.append(registerparams());

return url.toString();

}

注意:Util類參考:簽名示例

8.使用淘寶帳号快速登入

<1>.功能描述

使用Taobao ID快速登陸第三方應用調用Taobao ID類似于調用接口,調用成功之後TOP即可傳回該使用者的登陸帳号、sessionKey等資訊

<2>.調用方法

使用Taobao ID與調用TOP接口的原理一樣,Taobao ID向請求URL傳遞規定的參數,TOP解析該請求參數并傳回參數至回調URL

<3>.請求輸入參數

<a>.app_key:Y

描述:TOP配置設定給應用的Appkey,例如:12000024

<b>.sign_method:Y

說明:簽名方法:md5

<c>.sign:Y

說明:簽名:QWERTYYUIO123456UIUIOUYTREWQ1D234

<d>.timestamp:Y

說明:時間戳,校驗允許誤差6min,2010-09-11+23:24:55(yyyy mm-dd HH:MM:SS,空格會被urlencode+)

<e>.app_user_nick:N

說明:自有會員帳号昵稱 例如:hello

<f>.target:N

描述:使用者自定義參數,适用場景:根據該字段再作跳轉

<4>.請求方法

組裝請求參數;生成簽名;請求URL:http://container.api.taobao.com/container/identify

<5>.請求URL示例:

http://container.api.taobao.com/container/identify?app_key=12129547

&sign=B78AC46FDD0470661BC2B9B0E11E10FE

&sign_method=md5

&target=1

&timestamp=2010-12-06%2017:23:54

<6>.TaoBao ID視窗大小設定(非必須使用)

他用型應用使用上面生成的請求URL,可以使用JS控制TaoBao ID視窗的大小,具體方法可參考文檔:使用IS控制TaoBao_ID視窗大小

<a>.傳回結果

http://www.callback.com/?sign=F3F0DD9B2849860E6074E22EA309B8A0

&sign_method=md5

&timestamp=2010-0806+17%3A27%3A19

&notify_result=success

&taobao_user_id=470366697

&taobao_user_nick=%E5%85%B0%E8%AF%B%E9%A1%BF

&session=26697a3300f872fdbe49155a43a2b76c9001b

&app_key=12022739

&notify_type=identify

<b>.傳回字段說明

sign:簽名

sign_method:簽名方法:md5

timestamp:時間戳

notify_result:注冊是否成功,成功:success

taobao_user_id:淘寶使用者帳号數字型辨別符

taobao_user_nick:淘寶帳号

session:目前使用者會話碼

app_key:top頒布的外部應用辨別符

notify_type:identify

<c>示例代碼

/**

* 使用淘寶帳号登入

* @return

* @throws UnsupportedEncodingException

*/

private String identifyparams() throws UnsupportedEncodingException {

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

// 組裝協定參數。

apiparamsMap.put("sign_method", "md5");

apiparamsMap.put("app_key", Util.APP_KEY);

apiparamsMap.put("timestamp", new SimpleDateFormat(

"yyyy-MM-dd HH:mm:ss").format(new Date()));

String sign = Util.sign(apiparamsMap, Util.APP_SERCET);

// 組裝協定參數sign

apiparamsMap.put("sign", sign);

StringBuilder param = new StringBuilder();

for (Iterator<Map.Entry<String, String>> it = apiparamsMap.entrySet()

.iterator(); it.hasNext();) {

Map.Entry<String, String> e = it.next();

param.append("&").append(e.getKey()).append("=").append(

e.getValue());

}

return param.toString().substring(1);

}

/*

* 擷取app使用淘寶帳号登入URL

*/

public String getidentifyURL() throws UnsupportedEncodingException {

// 組裝請求URL

StringBuilder url = new StringBuilder("http://container.api.taobao.com/container/identify?");

url.append(identifyparams());

return url.toString();

}

注意:Util類參考:簽名示例

9.使用者驗證

<1>.功能描述

非自用型應用需要做TOP使用者簽名驗證(防止非法使用者僞造參數),自用型應用不需要top簽名驗證

<2>.回調位址格式和參數說明

<a>.應用上下文協定是TOP通過應用的回調位址傳遞的url格式如下

http://callback.com/callback?top_appkey=xxx

&top_parameters=xxxx

&top_session=xxxx

&top_sign=xxxx

<b>.傳遞的具體參數

top_appkey:String\Y

描述:TOP配置設定給應用的Key

top_session:String\Y

描述:使用者session key

top_parameters:String\Y

描述:上下文參數

top_sign:String\Y

描述:簽名(簽名規則為base64(md5(top_appkey+top_parameters+top_session+app_secret)))

<c>.top_parameters

是插件容器傳遞給插件的參數集合,具體的參數内容是

ts:類型:整數;Y;

描述:目前時間戳(時間戳,插件需要對該時間戳進行驗證)

iframe:類型:編碼串;Y

描述:應用輸出是否在IFRAME中(取值說明:0和Top頁面內建在一起;1輸出到IFRAME中)

visitor_id:類型:字元串;N

描述:目前使用者ID(即uid,使用者不登陸則不傳)

visitor_nick:類型:字元串;N

描述:目前使用者昵稱(使用者不登陸則不傳)

visitor_role:類型:字元串;N

描述:目前使用者角色(5未登入使用者)

(注:top_parameters具體的産生方式是:base64(key1=value1&key2=value2……);如果使用者登陸,傳的是visitor_id和visitor_nick;如果使用者沒有登陸,傳的是 visitor_role)

<3>.回調位址驗證規則

<a>.驗證簽名是否合法

解析規則為:判斷base64(md5(top_appkey+top_parameters+top_session+top_secret))(注:這裡的MD5的結果應該是長度為16的位元組數組)之後的結果和top_sign是否相等,示例代碼參照:簽名驗證算法

<b>.top_parameters中解析出所需的上下文參數

解析規則為:将top_parameter進行base64編碼,得到key1=value1&key2=value2....這樣的字元串,然後再解析成MAP或者數組這樣的對象,并根據上述參數名擷取對應的參數值

top_parameters示例代碼(注:預設采用的是GBK編碼,如果在回調位址中多傳入一個encode=utf-8參數,就會變為utf-8編碼)

<c>.驗證時間戳是否在應用允許的誤差範圍

在步驟2中解析的參數中,包含一個參數名為ts的參數,對應的值就是時間戳,然後驗證時間戳是否在允許的範圍内(公關費建議誤差在5秒以内,最長不超過30秒)

<d>.得到上下文參數及對應的session(即上面的top_session),就可以進行OpenAPI調用了

<e>.示例代碼:

驗證插件容器簽名

/**

* 簽名運算

* @param parameter

* @param secret

* @return

* @throws EncryptException

*

*/

 public static String sign(String parameter, String secret) throws EncryptException{

?

// 對參數+密鑰做MD5運算

MessageDigest md = null;

try {

 md = MessageDigest.getInstance("MD5");

} catch (NoSuchAlgorithmException e) {

 log.error(e.getMessage(), e);

 throw new EncryptException(e);

 }

 byte[] digest = md.digest((parameter + secret).getBytes());

 // 對運算結果做BASE64運算并加密

 BASE64Encoder encode = new BASE64Encoder();

 return encode.encode(digest);

 }

/**

* 驗證簽名

* @param sign

* @param parameter

* @param secret

* @return

* @throws EncryptException

*/

public static boolean validateSign(String sign, String parameter, String secret ) throws EncryptException {

?????????? return sign!= null && parameter?!= null && secret?!= null&& sign.equals(sign(parameter, secret));

//注意,這個parameter并不就是上面的top_paramater,而是指的待簽名驗證的參數,即上面的top_appkey+top_parameter+top_session

}

擷取插件上下文:

(import org.apache.commons.codec.binary.Base64;

import org.apache.commons.lang.StringUtils;)

/**

* 把經過BASE64編碼的字元串轉換為Map對象

* @param str

* @return

* @throws Exception

*/

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

if (str == null)

 return null;

 String keyvalues = null;

 try {

 keyvalues = new String(Base64.decodeBase64(URLDecoder.decode(str, "utf-8").getBytes("utf-8")));

 } catch (UnsupportedEncodingException e) {

 e.printStackTrace();

 }

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

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

 for (String keyvalue?: keyvalueArray) {

 String[] s = StringUtils.split("\\=");

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

 return null;

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

 }

 return map;

 }

驗證TOP回調位址的簽名是否合法:

/**

* 驗證TOP回調位址的簽名是否合法。要求所有參數均為已URL反編碼的。

* @param topParams TOP私有參數(未經BASE64解密)

* @param topSession TOP私有會話碼

* @param topSign TOP回調簽名

* @param appKey 應用公鑰

* @param appSecret 應用密鑰

* @param appSecret 應用密鑰

* @return 驗證成功傳回true,否則傳回false

* @throws NoSuchAlgorithmException

* @throws IOException

*/

 public static boolean verifyTopResponse(String topParams, String topSession, String topSign,  String appKey, String appSecret) throws NoSuchAlgorithmException, IOException {

StringBuilder result = new StringBuilder();

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

 result.append(appKey).append(topParams).append(topSession).append(appSecret);

 byte[] bytes = md5.digest(result.toString().getBytes("UTF-8"));

 BASE64Encoder encoder = new BASE64Encoder();

 return encoder.encode(bytes).equals(topSign);

   }

解析top_parameters:

public String ParametersName(String top_parameters){

String nick=null;

Map<String, String> map= convertBase64StringtoMap(top_parameters);

Iterator keyValuePairs = map.entrySet().iterator();

for (int i = 0; i < map.size(); i++){

Map.Entry entry = (Map.Entry) keyValuePairs.next();

Object key = entry.getKey();

Object value = entry.getValue();

if(key.equals("visitor_nick")){

nick=(String) value;

}

}

}

return nick;

}

TaoBaoApI簡介1