×

《为什么京东订单API个人号调不通?企业认证+店铺授权完整流程》(附python源码)

万邦科技Lex 万邦科技Lex 发表于2026-07-13 10:29:45 浏览20 评论0

抢沙发发表评论

京东订单类API(如 jingdong.pop.order.search)属于商家私有数据接口,个人开发者账号在权限体系上被严格限制,这是你调不通的核心原因。必须走企业认证 + 店铺 OAuth2.0 授权的完整链路才能拿到数据。

一、为什么个人号调不通?

  • 权限隔离:订单、发货、财务等敏感接口仅对企业开发者开放,个人号在控制台根本申请不到这些权限,调用会返回“权限不足(code:2001)”或“应用不存在”。

  • 私有数据保护:订单数据归属具体店铺,必须通过店铺主账号授权(OAuth2.0)获取 access_token,个人号无法完成店铺绑定与授权流程。

  • 实名校验:即使强行传参,服务端也会校验 AppKey 的主体资质与店铺主体的一致性,个人号会被拦截。

二、企业认证 + 店铺授权完整流程

1. 开放平台企业认证

  • 登录京东开放平台(宙斯 JOS),注册选择企业开发者

  • 提交营业执照、法人身份证、对公账户打款验证等材料,审核通常需 1-3 个工作日

  • 认证通过后,在【开发者中心】→【我的应用】创建应用(选“商家自研”或“ERP 服务商”),获取 App KeyApp Secret

2. 申请订单接口权限

  • 进入应用详情的接口权限管理,搜索并申请订单类接口(如 jingdong.pop.order.searchjingdong.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权限不足)逐一梳理排查清单?


群贤毕至

访客