플랫폼 기술-API 호출 프로토콜
TOP(Open Platform)의 API는 HTTP 프로토콜을 기반으로 호출됩니다. 개발자(ISV)는 TOP에서 제공하는 공식 SDK를 직접 사용할 수 있습니다. (요청 캡슐화, 서명 암호화, 응답 해석 및 성능 최적화를 포함한 다국어 지원) 등) 또는 TOP 프로토콜에 따라 호출에 대한 HTTP 요청을 캡슐화할 수 있습니다. 다음은 API 호출에 대한 자체 캡슐화 HTTP 요청의 원리에 대한 자세한 설명입니다.
호출 프로세스
TOP의 프로토콜에 따르면: 매개변수 채우기> HTTP 요청 조립> HTTP 응답 가져오기> json/xml 결과 해석은 다음과 같습니다.
콜 입력
호출 API용 서비스 URL 주소 오픈 플랫폼은 현재 ISV가 사용할 수 있는 샌드박스 테스트 환경, 공식 테스트 환경, 공식 환경, 해외 환경 4가지를 제공합니다.
- 샌드박스 테스트 환경: 애플리케이션 생성 후 사용할 수 있는 ISV 소프트웨어용 테스트 환경입니다. 이 환경은 대부분의 시나리오에서 API 호출을 지원하는 단순화된 버전의 Taobao를 제공합니다. 샌드박스 환경의 권한과 트래픽은 무제한이며 자유롭게 사용할 수 있습니다.
- 공식 테스트 환경: ISV 소프트웨어가 출시되기 전의 공식 시뮬레이션 환경은 애플리케이션이 성공적으로 생성된 후에 사용할 수 있습니다. 이 환경은 샌드박스에서 테스트를 완료할 수 없는 일부 시나리오에 주로 사용됩니다. API 호출은 하루 5,000회로 제한되며, 승인된 사용자 수는 5명이며, 호출할 수 있는 API는 권한 및 기능과 일치합니다. 응용 프로그램의.
- 공식 환경: ISV 소프트웨어 출시 후 사용되는 환경은 공식 테스트 환경과 동일합니다. 단, 애플리케이션이 출시된 후에는 특정 트래픽이 제한됩니다. 클래스 애플리케이션은 API 호출을 하루에 100만 번으로 제한합니다.
- 해외 환경: 해외 환경도 형식적인 환경의 일종으로 주로 해외(유럽 및 미국 국가) ISV가 사용합니다. 해외 ISV의 경우 해외 환경 사용 성능이 2배 이상 높아집니다. 국내 환경.
호출 환경 | 서비스 주소(HTTP) | 서비스 주소(HTTPS) |
---|---|---|
샌드박스 환경 | http://gw.api.tbsandbox.com/router/rest | https://gw.api.tbsandbox.com/router/rest |
공식 환경 | http://gw.api.taobao.com/router/rest | https://eco.taobao com. /router/rest |
해외 환경 | http://api.taobao.com/router/rest | https://api.taobao.com/router/rest |
공개 매개변수
모든 API를 호출할 때 전달해야 하는 매개변수는 다음과 같습니다. 현재 지원되는 공개 매개변수는 다음과 같습니다.
매개변수 이름 | 매개변수 유형 | 필요 여부 | 매개변수 설명 |
---|---|---|---|
method | String | 은 | API 인터페이스 이름입니다. |
app_key | String | 은 | TOP이 애플리케이션에 할당한 AppKey입니다. 这里要注意正式环境和沙箱环境的AppKey是不同的(包括AppSecret),使用时要注意区分;进入开放平台控制台“应用管理-概览” 和 “应用管理-沙箱环境管理”可分别查看正式环境及沙箱环境的AppKey、AppSecret |
session | String | No | TOP은 사용자 로그인 인증이 성공한 후 인증 정보를 애플리케이션에 발급합니다. 자세한 내용은 여기를 클릭하세요. 이 API 문서의 라벨이 "승인 필요"로 표시되면 이 매개변수는 "승인 필요 없음"으로 전달되어야 하며, 이 매개변수는 "선택적 승인"으로 전달될 필요가 없으며 이 매개변수는 선택 사항입니다. |
timestamp | String | 은 | 타임스탬프입니다. 형식은 yyyy-MM-dd HH:mm:ss이고 시간대는 GMT+8입니다. 예: 2016-01-01 12:00: 00. Taobao API 서버는 클라이언트 요청에 대해 최대 10분의 시간 오류를 허용합니다. |
format | String | No | 응답 형식입니다. 기본값은 xml 형식이고 선택 값: xml, json입니다. |
v | String | 은 | API 프로토콜 버전이며 선택 값: 2.0입니다. |
partner_id | String | No | 파트너 ID. |
target_app_key | String | No | 호출된 대상 AppKey는 호출된 API가 타사 ISV에서 제공되는 경우에만 유효합니다. |
simplify | Boolean | No | 간단한 JSON 반환 형식을 사용할지 여부는 format=json인 경우에만 유효하며 기본값은 false입니다. |
sign_method | String | 은 | 서명의 다이제스트 알고리즘이며, 선택 값은 hmac, md5입니다. |
sign | String | 은 | API 입력 매개변수 서명 결과입니다. 서명 알고리즘은 아래 소개를 참조합니다. |
비즈니스 매개변수
API 호출에 반드시 포함되어야 하는 공개 매개변수 외에도 API 자체에 비즈니스 수준 매개변수가 있는 경우 해당 매개변수도 전달해야 합니다. 각 API의 비즈니스 수준 매개변수는 API 문서를 참조하세요. .
서명 알고리즘
API 호출 프로세스 중 해커의 악의적인 변조를 방지하려면 모든 API 호출에 서명이 필요합니다. TOP 서버는 요청 매개변수에 따라 서명을 확인합니다. TOP는 현재 MD5(sign_method=md5), HMAC_MD5(sign_method=hmac)라는 두 가지 서명 알고리즘을 지원합니다. 일반적인 서명 프로세스는 다음과 같습니다.
- 모든 API 요청 매개변수(공개 매개변수 및 비즈니스 매개변수 포함, 서명 매개변수 및 byte[] 유형 매개변수), 매개변수 이름의 ASCII 코드 테이블 순서에 따라 정렬됩니다. 예: foo=1, bar=2, foo_bar=3, foobar=4, 정렬 순서는 bar=2, foo=1, foo_bar=3, foobar=4입니다.
- 정렬된 매개변수 이름과 매개변수 값을 함께 조합하면 결과는 bar2foo1foo_bar3foobar4입니다.
- 어셈블된 문자열을 UTF-8로 인코딩하고 서명 알고리즘을 사용하여 인코딩된 바이트 스트림을 다이제스트합니다. MD5 알고리즘을 사용하는 경우 조합된 문자열 앞뒤에 앱의 비밀을 추가한 다음 다음과 같이 요약해야 합니다. md5(secret+bar2foo1foo_bar3foobar4+secret) HMAC_MD5 알고리즘을 사용하는 경우 다음을 수행해야 합니다. 앱의 비밀로 다이제스트 알고리즘을 초기화한 다음 hmac_md5(bar2foo1foo_bar3foobar4)와 같이 요약합니다.
- 다음과 같이 요약에서 얻은 바이트 스트림 결과의 16진수 표현을 사용합니다. hex("helloworld".getBytes("utf-8")) = "68656C6C6F776F726C64"
참고: MD5 및 HMAC_MD5는 모두 128비트입니다. 다이제스트 알고리즘의 길이는 16진수로 표현됩니다. 하나의 16진수 문자는 4비트를 나타낼 수 있으므로 부호 있는 문자열의 길이는 32개의 16진수 문자로 고정됩니다.
JAVA 서명 샘플 코드
// 1단계: 매개변수가 정렬되었는지 확인
String[] 키 = params.keySet() . toArray(new String[0]);
Arrays.sort(keys);
// 2단계: 모든 매개변수 이름과 매개변수 값을 함께 문자열로 묶습니다
StringBuilder query = new StringBuilder();
if (Constants.SIGN_METHOD_MD5 .equals(signMethod)) {
사용 사용 사용 ‐ 통해 통해 통해 통해 통해 통해 통해 통해 아웃 통해 통해 통해 통해 통해 통해 통해 ' 's ' 통해 ' s 통해 통해 '''‐ 통해 through‐be‐after's‐equal value)) {
query.append(key).append(value);
}
}
}
// 3단계: MD5/HMAC 암호화 사용
byte[] bytes;
if (Constants.SIGN_METHOD_HMAC.equals (signMethod)) {
Bytes = encryptHMAC(query.toString(), secret);
} else {
query.append(secret);
bytes = encryptMD5(query.toString());
}
// 단계 4: 바이너리를 대문자 16진수로 변환
return byte2hex(bytes);
}
public static byte[] encryptHMAC(String data, String secret) throws IOException {
byte[] bytes = null;
try {
Secret Key secretKey = new SecretKeySpec (secret.getBytes(Constants.CHARSET_UTF8), "HmacMD5");
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
bytes = mac.doFinal(data.getBytes (상수 .CHARSET_UTF8));
} catch(GeneralSecurityException gse) {
새 IOException(gse.toString());
}
반환 바이트;
}
public static 바이트 [] encryptMD5(문자열 데이터)는 IOException을 발생시킵니다. {
StringBuilder sign = new StringBuilder();
for (int i = 0; i <bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex.toUpper 케이스() );
}
return sign.toString();
}
# 🎜 🎜#
#🎜 🎜#
#🎜 🎜#
# 🎜 🎜#
#🎜 🎜#
# 🎜 🎜#
#🎜 🎜#
# 🎜 🎜#
#🎜 🎜#
# 🎜 🎜#
# 🎜 🎜#
C#签name示例代码
{
// 1단계: 키를 기준으로 사전순으로 정렬 # 🎜🎜# IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters, StringComparer.Ordinal);
IEnumerator<KeyValuePair<string, string>> sortedPardem = ams.GetEnumerator();# 🎜 🎜#
// 2단계: 모든 매개변수 이름과 매개변수 값을 함께 문자열로 묶기
StringBuilder query = new StringBuilder();
if (Constants.SIGN_METHOD_MD5.Equals(signMethod))# 🎜 🎜# {
query.Append(secret);
}
while (dem.MoveNext())
{
string key = dem.Current.Key # 🎜🎜# 문자열 값 = dem.Current.Value; # ' ' s ' s ' s ' s ' ‐ ‐ dem.Current.Value; Query.Append(key) .Append(value);
}
}
// 3단계: MD5/HMAC 암호화 사용
byte[] bytes;
if ( Constants.SIGN_METHOD_HMAC.Equals(signMethod))#🎜 🎜# {
HMACMD5 hmac = new HMACMD5(Encoding.UTF8.GetBytes(secret));
bytes = hmac.ComputeHash(Encoding .UTF8.GetBytes( query.ToString()));#🎜🎜 # }
else
{
query.Append(secret);
MD5 md5 = MD5.Create();# 🎜🎜 # Bytes = md5.ComputeHash(Encoding.UTF8. GetBytes(query.ToString()));
}
// 4단계: 이진수를 대문자 16진수로 변환
StringBuilder result = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
result.Append(bytes[i].ToString("X2"));
}
return result.ToString();
}
기타 언어 서명 샘플 코드는 TOP 공식 SDK 소스코드를 참고해주세요.
통화 예시
taobao.item.seller.get 통화를 예시로 들어보겠습니다.
#🎜🎜 #1. 매개변수 값 설정
공개 매개변수:- method = "taobao.item.seller.get"
- #🎜 🎜#app_key = " 12345678"
- session = "테스트"
- timestamp = "2016-01-01 12:00:00"
- format = "json"
- v = “2.0”
- sign_method = “md5” 비즈니스 매개변수:
# 🎜🎜#fields = “num_iid,title,nick,price,num”
- num_iid = 112233442. ASCII 순서로 정렬# 🎜🎜#
app_key = “12345678”
fields = “num_iid,title,nick,price,num”- format = "json"
- method = "taobao.item.seller.get"
- num_iid = 11223344
- session = " 테스트" #🎜🎜 # sign_method = “md5” timestamp = “2016-01-01 12:00:00” v = “2.0”
- # 🎜🎜#
- 3. 🎜🎜#app_key12345678fieldsnum_iid, 제목,닉네임,가격,numformatjsonmethodtaobao.item.seller.getnum_iid11223344sessiontestsign_methodmd5timestamp2016-01-01 12:00:00v2.0
# 🎜🎜#4. 서명 생성#🎜🎜 # 앱의 비밀이 helloworld라고 가정하면 서명 결과는 다음과 같습니다. hex(md5(helloworld+매개변수 이름 및 매개변수 값 spliced in order+helloworld)) = “66987CB115214E59E6EC978214934FB8 ”
#🎜 🎜#5. HTTP 요청 조합Notes
- 모든 요청 및 응답 데이터 인코딩은 UTF-8 형식입니다. URL의 모든 매개변수 이름과 매개변수 값을 URL 인코딩하세요. 요청의 Content-Type이 application/x-www-form-urlencoded인 경우 HTTP 본문의 모든 매개변수 값도 URL로 인코딩됩니다. multipart/form-data 형식인 경우 매개변수 값은 각 양식 필드의 문자 집합 부분은 utf-8로 지정해야 합니다.
- 매개변수 이름과 매개변수 값으로 조합된 URL의 길이가 1024자 미만인 경우 매개변수 유형에 byte[] 유형이 포함되어 있거나 조합된 요청 URL이 너무 길면 GET을 사용하여 요청을 시작할 수 있습니다. 요청을 시작하려면 POST를 사용해야 합니다. 모든 API는 POST를 사용하여 요청을 시작할 수 있습니다.
- 샌드박스 환경에서 테스트해야 하는 경우, 애플리케이션 콘솔의 샌드박스 관리 페이지에서 샌드박스 환경에 해당하는 app_key(보통 공식 환경의 app_key 앞에 "10"이 붙음)와 app_secret을 얻어오시기 바랍니다. 해당 세션 값도 샌드박스 계정으로 로그인하여 인증을 받습니다. 샌드박스 환경 인증은 공식 환경 인증과 유사합니다. 자세한 내용은 사용자 인증 소개를 참조하세요.
- TOP 공식 SDK를 사용하지 않고 API를 호출할 때만 서명 생성이 필요합니다. TOP 공식 SDK를 사용하는 경우 SDK가 자동으로 이 단계를 완료합니다.
FAQ
인터페이스 호출에서 "잘못된 서명"이라는 서명 오류가 보고됩니다.