用户这次问的是淘宝开放平台(TOP) API接入全指南:注册、AppKey获取、签名算法(MD5/HmacMD5)、沙箱调试,要求附Python源码。这是一个全新的Topic(之前主要讲1688,现在扩展到Taobao TOP API),需要覆盖:
- 简短说明TOP平台与1688区别(TOP是淘宝/天猫的开放平台)
- 注册与AppKey/AppSecret获取步骤(控制台操作)
- 签名算法详解(TOP支持md5和hmac-md5,重点讲md5,附带hmac版)
- 沙箱环境说明(TOP有沙箱
sandbox网关) - 完整Python封装:含签名、沙箱调通示例(如
taobao.user.seller.get或taobao.item.get模拟)、错误解析 - 避坑点:timestamp毫秒、参数排序ASCII、session(access_token)处理、sign不参与签名等
不要重复太多1688内容但可类比说明区别。给出可运行Python代码(类似之前1688的风格但用TOP网关和TOP签名规范)。
特别注意TOP签名规范:
- 所有业务参数+公共参数(不含
sign,file字段空值剔除) - 按key ASCII升序
- 拼串
app_secret+key1value1key2value2...+app_secret - MD5 → 大写
- HmacMD5也提一下
沙箱网关TOP一般是:
https://gw.api.tbsandbox.com/router/rest(或 https://eco.taobao.com/router/rest新版沙箱需确认,给常用地址并注释)生产网关:
https://gw.api.taobao.com/router/rest给出示例调
taobao.user.seller.get(需session)或 taobao.item.get(部分可不传session在沙箱返回mock)来验证。# 🛠️ 淘宝开放平台(TOP) API接入全指南:注册·AppKey·签名算法·沙箱调试(2026版|附Python源码)淘宝开放平台(TOP)与1688开放平台签名规则相似但网关、AppKey体系独立。下面按实际接入顺序给你完整说明 + 可直接跑的Python签名/沙箱验证代码。
一、快速导航:TOP接入四步曲
① 注册开放平台 → 创建应用(自用/ISV) → 获取 AppKey + AppSecret https://open.taobao.com ② 申请接口权限(商品/订单/用户…) ③ 理解签名算法(MD5 / HmacMD5) ④ 沙箱调通 → 切生产网关上线
二、AppKey / AppSecret 获取步骤
- 登录 淘宝开放平台控制台
- 我的应用 → 创建应用(个人可创建测试应用,正式上线需企业资质)
- 应用详情页复制:
App Key(公开)App Secret(保密!严禁前端暴露/提交Git)- API权限管理 → 勾选所需接口(如
taobao.item.get、taobao.trades.sold.get、taobao.user.seller.get) - 沙箱环境自动分配相同Key(部分接口沙箱返回Mock数据)
三、TOP 签名算法(官方规范)
✅ MD5签名(最常用)
- 收集参数:所有API参数(含公共参数
app_key, method, timestamp, format, v, sign_method,若有session也参入),剔除sign字段及值为空的参数 - 按参数名 ASCII 升序排序
- 拼接:
key1+value1+key2+value2+...(无=无&) - 首尾拼AppSecret:
app_secret + 上一步串 + app_secret - MD5 → 转大写
待签名串 = APP_SECRET + app_keyxxxformatjsonmethodtaobao.item.gettimestampxxxv2.0 + APP_SECRET sign = MD5(待签名串).upper()
✅ HmacMD5(可选,安全略高)
- 同上排序拼接(不加首尾Secret)
sign = HMAC_MD5(AppSecret, 拼接串).hex().upper()
四、Python完整封装:签名 + 沙箱/生产调用
# top_api_client.py
"""
淘宝开放平台(TOP) API Client
支持: MD5签名 / HmacMD5 / 沙箱 & 生产网关 / 限流重试
"""
import hashlib
import hmac
import time
import requests
import urllib.parse
from typing import Dict, Optional
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
class TaobaoTopClient:
"""
淘宝TOP API Client
沙箱网关: https://gw.api.tbsandbox.com/router/rest
生产网关: https://gw.api.taobao.com/router/rest
"""
SANDBOX = "https://gw.api.tbsandbox.com/router/rest"
PRODUCTION = "https://gw.api.taobao.com/router/rest"
def __init__(self, app_key: str, app_secret: str,
sandbox: bool = True, sign_method: str = "md5"):
self.app_key = app_key
self.app_secret = app_secret
self.gateway = self.SANDBOX if sandbox else self.PRODUCTION
self.sign_method = sign_method.lower() # 'md5' or 'hmac-md5'
# ────────────────────────────────────────────────
# 签名
# ────────────────────────────────────────────────
def _sign(self, params: Dict[str, str]) -> str:
# 1. 剔除空值 & sign
filt = {k: v for k, v in params.items()
if v is not None and str(v).strip() != "" and k != "sign"}
# 2. ASCII升序
sorted_items = sorted(filt.items(), key=lambda x: x[0])
# 3. 拼 key+value
qs = "".join(f"{k}{v}" for k, v in sorted_items)
if self.sign_method == "hmac-md5":
sig = hmac.new(
self.app_secret.encode("utf-8"),
qs.encode("utf-8"),
hashlib.md5
).hexdigest().upper()
else: # md5
raw = f"{self.app_secret}{qs}{self.app_secret}"
sig = hashlib.md5(raw.encode("utf-8")).hexdigest().upper()
return sig
# ────────────────────────────────────────────────
# 通用调用
# ────────────────────────────────────────────────
def call(self, method: str, biz_params: Optional[Dict[str, str]] = None,
session: str = None) -> Dict:
"""
Args:
method: TOP API名,如 'taobao.item.get'
biz_params: 业务参数 {key: str_value}
session: AccessToken(卖家接口必传)
Returns:
TOP返回的 data 部分 (dict)
"""
api_params = {
"method": method,
"app_key": self.app_key,
"timestamp": str(int(time.time() * 1000)), # 毫秒!
"format": "json",
"v": "2.0",
"sign_method": "md5" if self.sign_method == "md5" else "hmac-md5",
}
if session:
api_params["session"] = session
# 合并业务参数
if biz_params:
api_params.update(biz_params)
# 生成签名
api_params["sign"] = self._sign(api_params)
# TOP使用 POST(x-www-form-urlencoded) 或 GET均可,推荐POST
resp = requests.post(self.gateway, data=api_params, timeout=15)
resp.raise_for_status()
data = resp.json()
# 错误检测
if "error_response" in data:
err = data["error_response"]
raise Exception(
f"TOP Err [{err.get('code')}]: {err.get('msg')} "
f"sub:{err.get('sub_msg','')}"
)
# TOP返回根键 = method名转驼峰去掉点,如 taobao_item_get_response
resp_key = method.replace(".", "_") + "_response"
return data.get(resp_key, data)
# ────────────────────────────────────────────────
# 快捷示例:获取卖家昵称(需session)
# ────────────────────────────────────────────────
def get_seller_user(self, session: str) -> Dict:
return self.call("taobao.user.seller.get",
biz_params={"fields": "user_id,nick,sex"},
session=session)
# ────────────────────────────────────────────────
# 商品详情(沙箱可返回mock;生产部分字段需session)
# ────────────────────────────────────────────────
def get_item(self, num_iid: str, fields: str = None, session: str = None) -> Dict:
biz = {"num_iid": num_iid,
"fields": fields or "num_iid,title,price,pic_url,sku"}
return self.call("taobao.item.get", biz_params=biz, session=session)
# =========================================================
# 使用示例 —— 沙箱调通签名
# =========================================================
if __name__ == "__main__":
client = TaobaoTopClient(
app_key="YOUR_TOP_APP_KEY",
app_secret="YOUR_TOP_APP_SECRET",
sandbox=True # ← 切生产改 False
)
try:
# ① 沙箱调 taobao.user.seller.get(需沙箱生成的 session)
# 沙箱 session 在控制台「沙箱管理」点「获取授权链接」用淘宝测试账号登录后得到
TEST_SESSION = "SANDBOX_TEST_SESSION_XXX"
user = client.get_seller_user(TEST_SESSION)
print("✅ TOP沙箱签名验证通过!卖家昵称:", user.get("nick"))
# ② 商品详情(沙箱返回mock数据)
item = client.get_item("110000000001", session=TEST_SESSION)
print("模拟商品:", item)
except Exception as e:
print("❌", e)
print("→ 确认: AppKey/Secret正确、沙箱Session有效、接口权限已申请")五、获取沙箱 AccessToken(Session)
- 开放平台控制台 → 沙箱环境 → 应用配置 → 点击「获取授权链接」
- 用提供的淘宝测试买家/卖家账号登录
- 回调页
top_session=xxx即为session参数 - 将此 session 传入需登录态的接口(
taobao.user.seller.get、taobao.trades.sold.get等)
⚠️ 沙箱 session 有时效(通常数小时~1天),过期需重新授权获取
六、高频避坑清单(TOP特有)
坑 | 现象 | 解决 |
|---|---|---|
时间戳单位错 | Invalid Timestamp | 必须 13位毫秒 int(time.time()*1000) |
sign不参与签名但必须传 | Missing sign | 先算sign再放进参数字典再POST |
字段值为None参入签名 | Invalid Signature | 严格过滤空值 |
生产接口403无权限 | 接口未申请 | 控制台→应用→API权限→申请(需描述场景) |
HmacMD5 vs MD5 | 与服务端不一致报签名错 | sign_method参数须匹配(通常 md5) |
图片上传接口 | 特殊 Filedata字段 | 图片API用 multipart/form-data,不参与签名的是二进制体,其他字段照常签 |
七、面试/方案一句话
淘宝TOP API接入 = 创建应用拿AppKey/Secret → MD5签名(参数ASCII升序拼AppSecret+KV+AppSecret) → 毫秒级timestamp → POST网关,沙箱验证签名逻辑后切生产;订单/用户类接口需session(AccessToken)来自OAuth授权。
需要我补 TOP OAuth2.0 授权码换AccessToken Python完整流程 或 淘宝商品上下架/库存同步API封装 吗?