×

《淘宝开放平台TOP API接入全指南:注册、AppKey获取、签名算法与沙箱调试(2026)》(附python源码)

万邦科技Lex 万邦科技Lex 发表于2026-06-20 15:19:26 浏览18 评论0

抢沙发发表评论

用户这次问的是淘宝开放平台(TOP) API接入全指南:注册、AppKey获取、签名算法(MD5/HmacMD5)、沙箱调试,要求附Python源码。这是一个全新的Topic(之前主要讲1688,现在扩展到Taobao TOP API),需要覆盖:
  1. 简短说明TOP平台与1688区别(TOP是淘宝/天猫的开放平台)

  2. 注册与AppKey/AppSecret获取步骤(控制台操作)

  3. 签名算法详解(TOP支持md5和hmac-md5,重点讲md5,附带hmac版)

  4. 沙箱环境说明(TOP有沙箱sandbox网关)

  5. 完整Python封装:含签名、沙箱调通示例(如taobao.user.seller.gettaobao.item.get模拟)、错误解析

  6. 避坑点: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 获取步骤

  1. 登录 淘宝开放平台控制台

  2. 我的应用 → 创建应用(个人可创建测试应用,正式上线需企业资质)

  3. 应用详情页复制:

    • App Key(公开)

    • App Secret(保密!严禁前端暴露/提交Git)

  4. API权限管理 → 勾选所需接口(如 taobao.item.gettaobao.trades.sold.gettaobao.user.seller.get

  5. 沙箱环境自动分配相同Key(部分接口沙箱返回Mock数据)


三、TOP 签名算法(官方规范)

✅ MD5签名(最常用)

  1. 收集参数:所有API参数(含公共参数 app_key, method, timestamp, format, v, sign_method,若有session也参入),剔除sign字段及值为空的参数

  2. 按参数名 ASCII 升序排序

  3. 拼接key1+value1+key2+value2+...(无=&

  4. 首尾拼AppSecretapp_secret + 上一步串 + app_secret

  5. 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)

  1. 开放平台控制台 → 沙箱环境 → 应用配置 → 点击「获取授权链接」

  2. 用提供的淘宝测试买家/卖家账号登录

  3. 回调页 top_session=xxx即为 session参数

  4. 将此 session 传入需登录态的接口(taobao.user.seller.gettaobao.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封装 吗?


群贤毕至

访客