在电商数据应用开发中,对接官方 API 是获取商品数据的最佳方式 —— 相比网页爬虫,API 接口更稳定、数据结构更规范,且能避免反爬限制。本文将详细介绍京东开放平台(JD Open Platform)的商品 API 集成流程,从账号注册、认证授权到实时价格与库存的获取,提供完整的技术指南和代码实现。
一、京东开放平台准备工作
1. 注册开发者账号
首先访问完成开发者注册:
- 个人开发者需提供身份证信息
- 企业开发者需提供营业执照等资质
- 获取**
appKey**和appSecret(关键接口请求认证信息)
2. 了解 API 权限
京东商品相关核心 API 及权限要求:
- 商品详情查询:
jingdong.ware.product.detail.get(基础权限) - 实时价格查询:
jingdong.price.get(需申请特殊权限) - 库存查询:
jingdong.stock.get(需申请特殊权限) - 注意:部分 API 需通过企业认证后才能申请使用
二、认证授权机制解析
京东开放平台采用OAuth 2.0授权机制,分为两种模式:
-
客户端模式(Client Credentials) 适用于服务器端直接调用 API,无需用户授权,流程如下:
- 使用
appKey和appSecret获取访问令牌(Access Token) - 令牌有效期通常为 30 天,需定期刷新
- 使用
-
授权码模式(Authorization Code) 适用于需要用户授权的场景(如获取用户订单),本文以客户端模式为例。
三、获取 Access Token(认证实现)
1. 接口说明
- 请求 URL:
- 请求方式:POST
- 核心参数:
appKey、appSecret、grant_type=client_credentials
2. Python 实现代码
import requests
class JDClient:
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.token_url = "https://oauth.jd.com/oauth/token"
self.access_token = None
self.expires_in = 0 # 令牌有效期(秒)
def get_access_token(self):
"""获取访问令牌"""
params = {
"grant_type": "client_credentials",
"client_id": self.app_key,
"client_secret": self.app_secret
}
try:
response = requests.post(self.token_url, params=params)
result = response.json()
if "access_token" in result:
self.access_token = result["access_token"]
self.expires_in = result["expires_in"]
print(f"令牌获取成功,有效期:{self.expires_in}秒")
return self.access_token
else:
print(f"令牌获取失败:{result.get('error_description')}")
return None
except Exception as e:
print(f"请求异常:{str(e)}")
return None
四、获取实时商品价格(API 调用)
1. 接口说明
- API 名称:
jingdong.price.get - 请求 URL:
https://api.jd.com/routerjson - 请求方式:POST
- 核心参数:
access_token、skuIds(商品 ID,多个用逗号分隔)
2. 签名机制
京东 API 要求对请求参数进行签名,签名算法如下:
- 按参数名 ASCII 升序排序
- 拼接为
key=value&key=value格式 - 首尾添加
appSecret - 进行 MD5 加密并转为大写
3. 价格查询实现
import time
import hashlib
import json
class JDProductAPI(JDClient):
def __init__(self, app_key, app_secret):
super().__init__(app_key, app_secret)
self.api_url = "https://api.jd.com/routerjson"
def sign_params(self, params):
"""生成签名"""
# 1. 排序参数
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接参数
sign_str = self.app_secret
for k, v in sorted_params:
sign_str += f"{k}{v}"
sign_str += self.app_secret
# 3. MD5加密
return hashlib.md5(sign_str.encode()).hexdigest().upper()
def get_product_price(self, sku_ids):
"""获取商品实时价格"""
# 检查令牌是否有效(简化版,实际需判断过期时间)
if not self.access_token:
if not self.get_access_token():
return None
# 构建请求参数
params = {
"method": "jingdong.price.get",
"app_key": self.app_key,
"access_token": self.access_token,
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"format": "json",
"v": "1.0",
"skuIds": sku_ids
}
# 生成签名
params["sign"] = self.sign_params(params)
try:
response = requests.post(self.api_url, data=params)
result = response.json()
# 解析价格数据
if "price_get_response" in result:
return result["price_get_response"]["result"]
else:
print(f"价格查询失败:{result.get('error_response', {}).get('zh_desc')}")
return None
except Exception as e:
print(f"请求异常:{str(e)}")
return None
五、获取商品库存信息
1. 接口说明
- API 名称:
jingdong.stock.get - 请求参数:
skuIds、area(区域编码,如 1_2800_2855_0 表示北京) - 区域编码可通过
jingdong.area.get接口获取
2. 库存查询实现
def get_product_stock(self, sku_ids, area="1_2800_2855_0"):
"""获取商品库存信息"""
if not self.access_token:
if not self.get_access_token():
return None
params = {
"method": "jingdong.stock.get",
"app_key": self.app_key,
"access_token": self.access_token,
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"format": "json",
"v": "1.0",
"skuIds": sku_ids,
"area": area
}
params["sign"] = self.sign_params(params)
try:
response = requests.post(self.api_url, data=params)
result = response.json()
if "stock_get_response" in result:
return result["stock_get_response"]["result"]
else:
print(f"库存查询失败:{result.get('error_response', {}).get('zh_desc')}")
return None
except Exception as e:
print(f"请求异常:{str(e)}")
return None
六、完整使用示例
if __name__ == "__main__":
# 替换为你的appKey和appSecret
APP_KEY = "你的appKey"
APP_SECRET = "你的appSecret"
# 初始化客户端
jd_api = JDProductAPI(APP_KEY, APP_SECRET)
# 测试商品ID(可替换为实际商品ID)
test_sku_ids = "100012345678,100008348544"
# 获取价格
price_data = jd_api.get_product_price(test_sku_ids)
if price_data:
print("价格信息:")
for item in json.loads(price_data):
print(f"SKU: {item['skuId']}, 价格: {item['price']}元")
# 获取库存
stock_data = jd_api.get_product_stock(test_sku_ids)
if stock_data:
print("\n库存信息:")
for item in json.loads(stock_data):
stock_status = "有货" if item["stockState"] == 3 else "无货"
print(f"SKU: {item['skuId']}, 状态: {stock_status}")
七、进阶技巧与注意事项
1. 令牌管理
- 实现令牌自动刷新机制(记录获取时间,过期前主动更新)
- 建议将令牌缓存到本地(如文件或 Redis),避免频繁获取
2. 接口限流处理
- 京东 API 有调用频率限制(通常为 100 次 / 分钟)
- 实现请求重试机制,处理
429 Too Many Requests错误
import time
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def create_retry_session():
"""创建带重试机制的会话"""
session = requests.Session()
retry = Retry(
total=3,
backoff_factor=1, # 重试间隔:1s, 2s, 4s...
status_forcelist=[429, 500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry)
session.mount("https://", adapter)
return session
3. 错误处理
-
常见错误码:
1000:参数错误(检查签名或参数格式)1001:令牌无效(重新获取令牌)2000:权限不足(申请对应 API 权限)
4. 合规性说明
- 严格遵守《京东服务协议》
- 不得将 API 数据用于商业竞争或非法用途
- 大规模调用需提前与京东开放平台沟通
八、总结
本文详细介绍了京东商品 API 的集成流程,包括认证授权、签名生成、价格与库存查询等核心功能。通过官方 API 获取数据不仅稳定性更高,还能避免法律风险。实际开发中,建议根据业务需求扩展功能(如商品详情、分类查询等),并做好异常处理和性能优化,构建可靠的电商数据应用。