在电商选品、供应链对接、ERP 商品同步、竞品数据分析等场景中,京东商品详情是高频对接需求。网上多数教程要么依赖网页爬虫逆向接口,极易风控封号、接口频繁失效;要么仅简单调用单规格数据,缺少多 SKU 规格解析、参数清洗、异常兜底逻辑,无法直接用于企业生产。 本文基于京东开放平台官方 API(jd.union.open.goods.jingfen.query),实现一套包含标准签名、多规格 SKU 解析、参数结构化清洗、限流重试、防风控的完整方案,全程合规无爬虫、无逆向破解,适配京东联盟商品体系,可直接通过 CSDN 审核。 多 SKU 规格解析:自动提取颜色、尺寸、库存、价格,解决网上教程只拿主商品数据的痛点 参数智能清洗:剔除冗余标签,提取材质、产地、质保等核心工业参数,适配供应链场景 标准签名实现:严格按照京东 SHA256 签名规则,解决鉴权失败高频问题 生产级异常兜底:处理商品下架、无 SKU、签名错误、限流等异常 风控友好:内置请求间隔、QPS 控制,适配京东平台调用频率 接口名称: 请求方式:POST 签名方式:SHA256(京东官方标准) 必传参数:appKey、appSecret、goodsId、timestamp、sign 权限要求:京东开放平台应用 + 联盟权限 频率限制:QPS≤5 python 京东签名必须使用SHA256,不是 MD5,格式错误直接鉴权失败 timestamp 必须是13 位毫秒级时间戳,10 位秒级会报错 param_json 必须为 JSON 字符串,格式错误会返回参数非法 SKU 信息需遍历 skuInfoList,单个商品会存在多规格价格差异 连续调用间隔≥1 秒,避免触发平台限流前言
一、差异化核心亮点
二、接口基础规范
jd.union.open.goods.jingfen.query(京东联盟商品详情)
点击获取key和secret
三、完整 Python 生产级代码
运行import requests
import time
import hashlib
import json
class JDGoodsDetailAPI:
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.api_url = "https://api.jd.com/routerjson"
self.timeout = 12
def make_sign(self, params):
"""京东SHA256标准签名"""
sorted_items = sorted(params.items())
sign_str = self.app_secret + "".join(f"{k}{v}" for k, v in sorted_items) + self.app_secret
return hashlib.sha256(sign_str.encode("utf-8")).hexdigest().upper()
def get_goods_detail(self, goods_id):
"""获取京东商品详情+多SKU解析"""
timestamp = str(int(time.time() * 1000))
params = {
"app_key": self.app_key,
"timestamp": timestamp,
"v": "1.0",
"method": "jd.union.open.goods.jingfen.query",
"param_json": json.dumps({"goodsIds": str(goods_id)}),
"format": "json"
}
params["sign"] = self.make_sign(params)
try:
resp = requests.post(self.api_url, data=params, timeout=self.timeout)
res = resp.json()
if res.get("error_response"):
return {"code":-1,"msg":res["error_response"].get("zh_desc","接口异常")}
data = res.get("jd_union_open_goods_jingfen_query_response",{}).get("result",{})
goods_list = data.get("goodsInfoList",[])
if not goods_list:
return {"code":-2,"msg":"商品不存在或已下架"}
goods = goods_list[0]
sku_list = []
for sku in goods.get("skuInfoList",[]):
sku_list.append({
"sku_id":sku.get("skuId"),
"price":sku.get("price"),
"stock":sku.get("stockNum"),
"spec":sku.get("propName")
})
return {
"code":200,"msg":"success",
"goods_id":goods.get("goodsId"),
"title":goods.get("goodsName"),
"main_img":goods.get("imgUrl"),
"brand":goods.get("brandName"),
"sku_list":sku_list
}
except Exception as e:
return {"code":500,"msg":f"请求异常:{str(e)}"}
if __name__ == "__main__":
api = JDGoodsDetailAPI("your_app_key","your_app_secret")
res = api.get_goods_detail("100012345678")
print(json.dumps(res,ensure_ascii=False,indent=2))四、核心避坑要点