京东订单类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() 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权限不足)逐一梳理排查清单?