京东订单类API(如
jingdong.pop.order.search)属于商家私有数据接口,个人开发者账号在权限体系上被严格限制,这是你调不通的核心原因。必须走企业认证 + 店铺 OAuth2.0 授权的完整链路才能拿到数据。一、为什么个人号调不通?
- 权限隔离:订单、发货、财务等敏感接口仅对企业开发者开放,个人号在控制台根本申请不到这些权限,调用会返回“权限不足(code:2001)”或“应用不存在”。
- 私有数据保护:订单数据归属具体店铺,必须通过店铺主账号授权(OAuth2.0)获取
access_token,个人号无法完成店铺绑定与授权流程。 - 实名校验:即使强行传参,服务端也会校验 AppKey 的主体资质与店铺主体的一致性,个人号会被拦截。
二、企业认证 + 店铺授权完整流程
1. 开放平台企业认证
- 登录京东开放平台(宙斯 JOS),注册选择企业开发者。
- 提交营业执照、法人身份证、对公账户打款验证等材料,审核通常需 1-3 个工作日。
- 认证通过后,在【开发者中心】→【我的应用】创建应用(选“商家自研”或“ERP 服务商”),获取 App Key 和 App Secret。
2. 申请订单接口权限
- 进入应用详情的接口权限管理,搜索并申请订单类接口(如
jingdong.pop.order.search、jingdong.pop.order.get)。 - 填写详细用途说明(如“自有店铺 ERP 订单同步”),提交后等待审核(1-5 个工作日)。
3. 店铺 OAuth2.0 授权(最关键一步)
订单 API 必须携带店铺授权的
access_token,流程如下:- 配置回调地址:在应用管理中填写 HTTPS 的回调 URI(用于接收授权码)。
- 引导店铺授权:用店铺主账号浏览器访问京东授权 URL:
https://oauth.jd.com/oauth/authorize?response_type=code&client_id=YOUR_APP_KEY&redirect_uri=URL_ENCODE(你的回调地址)&scope=seller_order_get
店铺主账号确认授权后,京东会跳转到你的redirect_uri并带上code参数。 - 换取 Access Token:后端用
code调用京东 token 接口换取access_token(有效期通常 30 天,注意刷新)。
三、附:Python 完整调用源码(含签名+授权)
京东 API 采用 MD5 签名(AppSecret + 参数 ASCII 升序拼接 + AppSecret),且需带入
access_token。import hashlib
import time
import requests
import urllib.parse
封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
class JDAPIClient:
def __init__(self, app_key, app_secret, access_token=None):
self.gateway = "https://api.jd.com/routerjson"
self.app_key = app_key
self.app_secret = app_secret
self.access_token = access_token
def _generate_sign(self, params):
"""京东 JOS MD5 签名:AppSecret + KV升序拼接 + AppSecret -> MD5大写"""
# 过滤空值,按 key ASCII 升序
filtered = sorted((k, v) for k, v in params.items() if v is not None and str(v).strip())
# 拼接 keyvalue(无=无&)
base_str = "".join(f"{k}{v}" for k, v in filtered)
sign_str = self.app_secret + base_str + self.app_secret
return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
def call(self, method, biz_params=None, page_no=1, page_size=50):
"""调用京东 API"""
timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
public_params = {
"method": method,
"app_key": self.app_key,
"timestamp": timestamp,
"format": "json",
"v": "2.0",
"sign_method": "md5",
}
if self.access_token:
public_params["access_token"] = self.access_token
# 业务参数放 360buy_param_json
if biz_params is None:
biz_params = {}
biz_params.setdefault("page", str(page_no))
biz_params.setdefault("page_size", str(page_size))
public_params["360buy_param_json"] = json.dumps(biz_params, ensure_ascii=False)
# 生成签名
sign = self._generate_sign(public_params)
public_params["sign"] = sign
# 发送请求(form-urlencoded)
headers = {"Content-Type": "application/x-www-form-urlencoded"}
resp = requests.post(
self.gateway,
data=urllib.parse.urlencode(public_params),
headers=headers,
timeout=10
)
return resp.json()
封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
if __name__ == "__main__":
import json
APP_KEY = "YOUR_APP_KEY"
APP_SECRET = "YOUR_APP_SECRET"
ACCESS_TOKEN = "YOUR_SHOP_ACCESS_TOKEN" # 店铺授权换来的
client = JDAPIClient(APP_KEY, APP_SECRET, ACCESS_TOKEN)
# 示例:查询订单列表
result = client.call(
method="jingdong.pop.order.search",
biz_params={
"start_date": "2026-07-10 00:00:00",
"end_date": "2026-07-13 23:59:59",
"order_state": "WAIT_SELLER_STOCK_OUT"
}
)
print(json.dumps(result, indent=2, ensure_ascii=False))代码关键注意点:
- 签名拼接规则:必须是
AppSecret + 排序后KV + AppSecret,中间无=无&,最后 MD5 转大写,否则报签名错误(code:1003)。 - timestamp 格式:需用
"YYYY-MM-DD HH:MM:SS"字符串,且与京东服务器时间误差不超过 5 分钟。 - access_token 必传:订单类接口不带 token 会直接报权限错误,token 过期需重新用 refresh_token 刷新。
如果你在授权回调或签名校验这一步报错了,可以告诉我具体的错误码,要不要我帮你按常见报错(如1003签名失败、2001权限不足)逐一梳理排查清单?