(注:資料整理還不成體系,很零散,有時間會整理一下!現在就簡單分享一些!)
(注:這些資料在淘寶開放平台,開發文檔裡都有描述,不過我隻是取了我需要的、我用到的,買家版可能用到的接口!
你如果想了解更多的淘寶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
×tamp=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
×tamp=2010-0806+17%3A27%3A19
¬ify_result=success
&taobao_user_id=470366697
&taobao_user_nick=%E5%85%B0%E8%AF%B%E9%A1%BF
&session=26697a3300f872fdbe49155a43a2b76c9001b
&app_key=12022739
¬ify_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
×tamp=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
×tamp=2010-0806+17%3A27%3A19
¬ify_result=success
&taobao_user_id=470366697
&taobao_user_nick=%E5%85%B0%E8%AF%B%E9%A1%BF
&session=26697a3300f872fdbe49155a43a2b76c9001b
&app_key=12022739
¬ify_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;
}