×

🏢《淘宝开放平台个人开发者 vs 企业开发者权限与接口差异对比》(附Python源码)

万邦科技Lex 万邦科技Lex 发表于2026-06-25 14:22:00 浏览21 评论0

抢沙发发表评论

🏢《淘宝开放平台个人开发者 vs 企业开发者权限与接口差异对比》(附Python源码)

很多同学在对接淘宝开放平台(TOP)时不清楚个人号和企业号到底差在哪——直接影响你能不能调订单、物流及部分商品接口。下面把差异说清,并给你一份通用的TOP API Client(Python),个人/企业切换只改AppKey即可。

一、个人开发者 vs 企业开发者——核心差异表

对比维度
🧍 个人开发者
🏢 企业开发者(阿里企业实名)
注册方式
个人支付宝实名
企业支付宝 + 营业执照认证
应用类型
自用型(部分ISV)
自用型 / ISV服务商
商品查询 taobao.item.get
✅ 可调用(公开字段)
✅ 同左
店铺商品列表 taobao.items.onsale.get
❌ 通常无权限(需卖家AccessToken+企业)
✅ 需卖家授权后可调
订单同步 taobao.trades.sold.get
❌ 无权限
✅ 需卖家OAuth授权
发货/物流 taobao.logistics.online.send
淘宝客API taobao.tbk.*
✅ 可备案淘宝客应用
日调用额度
较低(约 5k~1万次/天)
高(50万~100万+,可申请扩容)
QPS上限
低(≈1~2/s)
较高(5~20/s,买包可提)
增值/数据接口
❌ 基本不可申请
✅ 可申请(费用另计)
适用场景
学习/选品/比价/淘宝客
ERP订单同步、WMS、全链路供应链
结论:做商品比价、淘宝客选品 → 个人号够用;
店铺商品同步、订单自动回写、发货推单 → 必须企业开发者 + 卖家AccessToken

二、Python:通用TOP API Client(个人/企业通用)

签名/网关完全一致,仅AppKey/AppSecret和是否传session(AccessToken)不同。
# top_universal_client.py
"""
淘宝开放平台(TOP) 通用API Client
兼容个人开发者(无session) 和 企业开发者(传session)
网关: https://gw.api.taobao.com/router/rest  (生产)
"""
import hashlib
import time
import requests
from typing import Dict, Optional

# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
class TopClient:
    GATEWAY = "https://gw.api.taobao.com/router/rest"

    def __init__(self, app_key: str, app_secret: str, sandbox: bool = False):
        self.app_key = app_key
        self.app_secret = app_secret
        if sandbox:
            self.gateway = "https://gw.api.tbsandbox.com/router/rest"
        else:
            self.gateway = self.GATEWAY

    # ─────────── TOP标准MD5签名 ───────────
    def _sign(self, params: Dict) -> str:
        filt = sorted((k, v) for k, v in params.items()
                      if v is not None and str(v).strip() != '' and k != 'sign')
        qs = ''.join(f"{k}{v}" for k, v in filt)
        raw = f"{self.app_secret}{qs}{self.app_secret}"
        return hashlib.md5(raw.encode()).hexdigest().upper()

    def call(self, method: str, biz: Dict,
             session: Optional[str] = None) -> Dict:
        """
        Args:
            method: TOP API名, 如 'taobao.item.get'
            biz:    业务参数字典
            session: 卖家AccessToken(订单/店铺私有数据需传)
        Returns:
            对应 method_response 部分 (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 session:
            api_params["session"] = session

        # 合并业务参数
        api_params.update(biz)
        api_params["sign"] = self._sign(api_params)

        # TOP推荐POST(x-www-form-urlencoded)
        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','')}"
            )

        # 返回根节点数据
        resp_key = method.replace(".", "_") + "_response"
        return data.get(resp_key, data)

    # ---- 快捷方法 ----

    def get_item(self, num_iid: str, fields: str = None,
                 session: str = None) -> Dict:
        """商品详情(个人号可不传session查公开字段)"""
        fields = fields or "num_iid,title,price,pic_url,skus,approve_status,num"
        return self.call(
            "taobao.item.get",
            biz={"num_iid": num_iid, "fields": fields},
            session=session
        ).get("item", {})

    def list_onsale_items(self, page_no=1, page_size=40,
                          session: str = None) -> Dict:
        """
        店铺在售商品列表(★企业开发者+卖家授权才可调,
        个人号调会报 403 no permission)
        """
        return self.call(
            "taobao.items.onsale.get",
            biz={
                "page_no": page_no,
                "page_size": min(page_size, 100),
                "fields": "num_iid,title,price,num,outer_id,approve_status"
            },
            session=session
        )

    def list_sold_orders(self, start_modified: str, end_modified: str,
                         session: str, page_no=1) -> Dict:
        """
        卖家订单列表(企业+授权)
        start/end格式: 'YYYY-MM-DD HH:MM:SS'
        """
        return self.call(
            "taobao.trades.sold.get",
            biz={
                "fields": "tid,status,payment,modified,buyer_nick,"
                          "receiver_name,receiver_mobile,orders",
                "start_modified": start_modified,
                "end_modified": end_modified,
                "page_no": page_no,
                "page_size": 40
            },
            session=session
        )
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex

# =========================================================
# 使用示例
# =========================================================
if __name__ == "__main__":
    client = TopClient(
        app_key="YOUR_APP_KEY",
        app_secret="YOUR_APP_SECRET",
        sandbox=False
    )

    try:
        # ✅ 个人/企业都可查公开商品信息
        item = client.get_item("654321098765")
        print("✅ 商品标题:", item.get("title"))
        print("   价格:", item.get("price"))

        # ⚠️ 下列两行在企业应用+卖家AccessToken下才可用
        # orders = client.list_sold_orders("2026-06-01 00:00:00",
        #                                  "2026-06-25 23:59:59",
        #                                  session="SELLER_ACCESS_TOKEN")
        # print("待处理订单数:", len(orders.get("trades",[])))

    except Exception as e:
        print("❌", e)

三、如何判断当前Key是个人还是企业+有无权限?

运行上面代码调 taobao.items.onsale.get
  • 返回数据 → 企业应用 + 卖家已授权 ✅

  • 403 no permission / invalid method → 个人应用或无权限 ❌(正常)

商品详情 taobao.item.get两个都OK(公开字段)。

四、面试/方案一句话

淘宝开放平台个人号可做商品查询/淘宝客选品,但无店铺订单/物流/在售商品列表权限;企业实名应用获得卖家OAuth授权后可调 taobao.trades.sold.get / items.onsale.get / logistics.online.send完成ERP全链路对接,签名网关完全一致,区别仅在是否传 session(AccessToken)及接口权限审批状态。
需要我补 TOP OAuth2授权码换AccessToken完整Python代码订单增量同步APScheduler脚本(企业版) 吗?


群贤毕至

访客