用户这次问的是淘宝开放平台(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 获取步骤
- 登录 https://open.taobao.com
- 我的应用 → 创建应用(个人可创建测试应用,正式上线需企业资质)
应用详情页复制:
• 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封装 吗?