用户问的是淘宝订单API(taobao.trades.sold.get / taobao.trade.fullinfo.get 等)为什么个人开发者账号调不通,需要企业认证+场景核验的避坑指南,附Python源码。
之前对话已经多次给过 TOP 签名/订单同步/OAuth 代码,这里要聚焦解释清楚个人号为何403、企业认证怎么做、场景核验是什么、AccessToken怎么来、给一个带明确错误提示的订单调用示例(区分个人vs企业)。还要给出避坑点(ISV应用需入驻、订单接口需卖家自己授权不能是买家token、沙箱不支持订单等)。
应:
- 开门见山结论:个人应用无订单接口权限,必须企业实名+申请接口+卖家OAuth
- 列出现象(403 no permission / invalid method)
- 步骤:企业支付宝认证 → 创建自用型应用 → 申请 trades.sold.get 等 → 卖家账号OAuth授权 → 用返回的 session(AccessToken) 调接口
- Python:完整订单调用封装 + 明确捕获"个人号无权限"给提示
- 场景核验说明(开放平台要求描述调用场景、店铺类型、数据用途,审核员可能电联)
- 其他坑:session必须是卖家AccessToken不是买家、沙箱不返回真实订单、ISV需软服中心入驻、回调URL必须HTTPS或可公网访问(或用授权链接手动粘code)
- 一句话总结
不要重复大段1688内容,TOP签名可简短引或内联最小版。# 🔐 淘宝订单API为什么个人账号调不通?企业认证+场景核验避坑指南(附Python源码)
直接给结论:
淘宝订单类接口(taobao.trades.sold.get、taobao.trade.fullinfo.get、taobao.logistics.online.send)个人开发者应用默认无权限,必须:
用企业支付宝完成实名认证创建「自用型应用」 在应用后台申请订单相关接口权限(需填场景说明) 用卖家账号OAuth 2.0授权获取session(AccessToken)再调接口个人应用调会返回403 no permission或invalid method,属正常限制。
一、现象对照表
你做的 | 返回 | 原因 |
|---|---|---|
个人应用 + taobao.trades.sold.get | 403 no permission/ invalid method | 个人号无订单接口权限 |
企业应用但未申请接口 | 同上 403 | 控制台→API权限→申请 |
企业应用+申请OK,但未传 session | Missing session/ need login | 订单接口必须带卖家AccessToken |
传了买家 AccessToken | 空列表或 403 | 必须是店铺卖家授权拿的 token |
沙箱调订单接口 | 返回 mock/空 | 沙箱不支持真实订单,仅验签名 |
二、企业认证 + 场景核验操作流程
- 企业认证开放平台 → 账户管理 → 企业实名(营业执照 + 企业支付宝)
- 创建应用应用类型选 「自用型应用」(ISV需额外入驻软服中心)
- 申请接口权限应用详情 → API权限 → 申请:📌 场景核验:填写「调用场景说明」如:"内部ERP系统同步店铺已付款订单,生成采购单并回写发货物流,仅读取本店铺数据,不转发第三方"审核通常 1~3 工作日,部分情况阿里小二电话核实。
taobao.trades.sold.get(卖家订单列表)taobao.trade.fullinfo.get(订单明细)taobao.logistics.online.send(发货填运单)taobao.logistics.trace.get(轨迹查询)- 卖家OAuth授权换取 AccessToken
- 配置回调地址
redirect_uri(需在应用→OAuth配置登记) - 引导卖家访问授权URL → 跳回
?code=xxx - 用 code 调
https://oauth.taobao.com/token换access_token+refresh_token - 此
access_token= TOP接口中的session参数
三、Python:订单接口调用 + 明确个人/企业权限提示
# top_order_with_auth.py
"""
淘宝订单同步 Demo(企业应用 + 卖家AccessToken)
个人应用运行会明确提示"需企业认证"
依赖: requests (pip install requests)
"""
import hashlib
import time
import requests
from datetime import datetime, timedelta
from typing import Dict, List
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
class TopOrderClient:
GW = "https://gw.api.taobao.com/router/rest"
def __init__(self, app_key: str, app_secret: str):
self.ak = app_key
self.ask = app_secret
# ───── 签名(MD5) ─────
def _sign(self, p: Dict) -> str:
filt = sorted((k, v) for k, v in p.items()
if v is not None and str(v).strip() != '' and k != 'sign')
qs = ''.join(f"{k}{v}" for k, v in filt)
return hashlib.md5(f"{self.ask}{qs}{self.ask}".encode()).hexdigest().upper()
def _call(self, method: str, biz: Dict, session: str) -> Dict:
p = {
"method": method, "app_key": self.ak,
"timestamp": str(int(time.time() * 1000)),
"format": "json", "v": "2.0", "sign_method": "md5",
"session": session
}
p.update(biz)
p["sign"] = self._sign(p)
r = requests.post(self.GW, data=p, timeout=15)
r.raise_for_status()
d = r.json()
if "error_response" in d:
err = d["error_response"]
code = str(err.get("code", ""))
sub = err.get("sub_code", "")
msg = err.get("msg", "")
if "no permission" in msg or "invalid method" in msg:
raise PermissionError(
"❌ 【无权限】订单接口需:\n"
" 1) 企业实名应用\n"
" 2) 已申请 taobao.trades.sold.get 权限\n"
" 3) session 须是【卖家】OAuth AccessToken\n"
" → 个人开发者应用无法调用订单API"
)
if "session" in msg.lower() or "login" in msg.lower():
raise PermissionError("❌ session 无效或过期,需用卖家账号重新OAuth授权")
if "FLOW_CONTROL" in code or code == "7":
raise RuntimeError(f"⚠️ QPS限流,退避重试 ({code}: {msg})")
raise Exception(f"TOP[{code}][{sub}]: {msg} {err.get('sub_msg','')}")
return d.get(list(d.keys() - {"error_response"})[0], {})
# ───── 增量拉取卖家订单 ─────
def list_sold(self, session: str,
minutes_back: int = 30,
page_no: int = 1,
page_size: int = 40) -> Dict:
now = datetime.now()
start = (now - timedelta(minutes=minutes_back)).strftime("%Y-%m-%d %H:%M:%S")
end = now.strftime("%Y-%m-%d %H:%M:%S")
return self._call(
"taobao.trades.sold.get",
biz={
"fields": (
"tid,status,payment,modified,buyer_nick,"
"receiver_name,receiver_mobile,receiver_address,"
"orders.num_iid,orders.title,orders.num,orders.price,"
"orders.outer_sku_id,orders.sku_properties_name"
),
"start_modified": start,
"end_modified": end,
"page_no": page_no,
"page_size": min(page_size, 100)
},
session=session
)
# ───── 订单明细 ─────
def get_detail(self, session: str, tid: str) -> Dict:
return self._call(
"taobao.trade.fullinfo.get",
biz={
"fields": (
"tid,status,payment,created,modified,buyer_nick,"
"receiver_name,receiver_mobile,receiver_address,"
"orders.num_iid,orders.outer_sku_id,orders.outer_iid,"
"orders.title,orders.num,orders.price,orders.sku_properties_name,"
"invoice_name,invoice_type"
),
"tid": tid
},
session=session
).get("trade", {})
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
# =========================================================
# 使用示例
# =========================================================
if __name__ == "__main__":
client = TopOrderClient(
app_key="YOUR_ENTERPRISE_APP_KEY",
app_secret="YOUR_APP_SECRET"
)
SELLER_SESSION = "SELLER_ACCESS_TOKEN" # ← OAuth2 换取的卖家 token
try:
res = client.list_sold(SELLER_SESSION, minutes_back=30)
trades = res.get("trades", []) or []
total = res.get("total_results", 0)
print(f"✅ 近30分钟变更订单: {len(trades)} / 共计{total}")
for t in trades[:3]:
detail = client.get_detail(SELLER_SESSION, str(t.get("tid")))
print(f" 单 {detail.get('tid')} {detail.get('status')} ¥{detail.get('payment')}")
except PermissionError as pe:
print(pe)
print("\n➡ 解决步骤:开放平台→企业实名→创建自用型应用→申请订单权限→卖家OAuth授权→填入SELLER_SESSION")
except Exception as e:
print("❌", e)四、OAuth 换 Token 最简片段(补全用)
# 用授权回调中的 code 换 token
def exchange_token(app_key, app_secret, code, redirect_uri):
r = requests.post("https://oauth.taobao.com/token", data={
"grant_type": "authorization_code",
"client_id": app_key,
"client_secret": app_secret,
"code": code,
"redirect_uri": redirect_uri
}, timeout=15)
r.raise_for_status()
return r.json() # access_token / refresh_token / expires_in授权URL格式:
https://oauth.taobao.com/authorize?response_type=code&client_id=APP_KEY&redirect_uri=URLEncode(回调地址)&state=erp
五、高频避坑清单
坑 | 现象 | 解决 |
|---|---|---|
个人应用调订单 | 403 no permission | 切企业实名应用 |
接口未申请 | 同上 403 | 应用→API权限→申请(填场景说明) |
传买家 token | 空/403 | 必须用卖家账号授权获得的 AccessToken |
session 过期 | Invalid session | 用 refresh_token 刷新,或重新授权 |
沙箱返回空订单 | 正常 | 沙箱只验签名,用生产网关测真数据 |
ISV应用403 | 未入驻软服中心/未绑定店铺 | 完成 ISV 入驻并绑定授权店铺 |
六、一句话总结(面试/实施)
淘宝订单API(taobao.trades.sold.get等)个人开发者无权限,须企业实名应用 + 申请接口权限 + 卖家OAuth授权AccessToken(session参数);调通后按start_modified/end_modified增量同步防超量,遇403先确认以上三点。
需要我补 APScheduler 定时增量订单同步(断点续跑+Token自动刷新) 或 发货回填
taobao.logistics.online.send完整参数 吗?