网上大部分京东详情接口示例,侧重于完整拉取全部返回字段,直接将原始 JSON 存入数据库。但在 ERP 增量同步业务中,大量不变的图文、参数信息反复拉取会浪费接口配额,还会加重存储压力。本文基于京东联盟jd.union.open.goods.detail.query接口,设计一套区分静态字段与动态字段的封装逻辑,只对价格、促销、库存这类高频变动字段做更新,静态基础信息做缓存复用,适合大批量商品增量同步业务。
在京东开放平台创建应用,获取app_key、app_secret,开通商品详情查询接口权限。接口入参核心为 skuId,注意区分 SPU 与 SKU,SPU 编号无法直接调用该接口。接口存在 QPS 与日调用上限,大批量同步必须做好节流。
依赖:requests,执行pip install requests。

python
import requests
import time
import json
import hashlib
class JdGoodsDetailClient:
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.gateway = "https://api.jd.com/routerjson"
self.session = requests.Session()
def build_sign(self, params):
filter_p = {k:v for k,v in params.items() if k != "sign"}
sorted_items = sorted(filter_p.items())
raw_str = self.app_secret + "".join(f"{k}{v}" for k,v in sorted_items) + self.app_secret
return hashlib.md5(raw_str.encode("utf-8")).hexdigest().upper()
def get_increment_detail(self, sku_id):
timestamp = str(int(time.time()*1000))
params = {
"method":"jd.union.open.goods.detail.query",
"app_key":self.app_key,
"timestamp":timestamp,
"v":"1.0",
"format":"json",
"360buy_param_json":json.dumps({"goodsId":sku_id})
}
params["sign"] = self.build_sign(params)
try:
resp = self.session.post(self.gateway, data=params, timeout=10)
resp.raise_for_status()
resp_data = resp.json()
except requests.exceptions.RequestException as e:
return {"success":False,"error":f"网络异常:{str(e)}"}
if "error_response" in resp_data:
return {"success":False,"error":resp_data["error_response"].get("zh_desc","业务错误")}
resp_body = resp_data.get("jd_union_open_goods_detail_query_response",{}).get("result",{})
item = resp_body.get("goodsInfo",{})
if not item:
return {"success":False,"error":"商品不存在或已下架"}
# 拆分:动态变动字段(每次更新)、静态字段(可缓存)
dynamic_part = {
"sku_id":item.get("skuId"),
"price":float(item.get("price",0)),
"coupon_price":float(item.get("couponPrice",0)),
"commission_rate":float(item.get("commissionRate",0))
}
static_part = {
"title":item.get("goodsName",""),
"shop_name":item.get("shopName",""),
"is_jd_self":bool(item.get("isJdSelf")),
"main_img":item.get("mainImage","")
}
return {"success":True,"dynamic":dynamic_part,"static":static_part}
if __name__ == "__main__":
cli = JdGoodsDetailClient(app_key="your_key",app_secret="your_secret")
res = cli.get_increment_detail(sku_id=100000000000)
print(res)1. 字段分层设计:把返回数据拆分为动态、静态两部分,增量同步只更新 dynamic_part,静态数据优先读取本地缓存,减少数据库写入压力。
2. 标准 MD5 签名实现,不依赖 SDK,方便项目迁移部署。
3. 完整异常捕获,区分网络异常、平台业务错误、商品下架场景,错误信息清晰。
4.Session 会话复用,减少 http 握手开销,适合循环批量调用。
1. 入参360buy_param_json必须是 JSON 字符串,字典直接传入会报参数非法。
2. 时间戳必须使用 13 位毫秒时间戳,10 位秒级时间戳会鉴权失败。
3. 联盟接口无法获取精确库存,库存业务需要使用商家 JOS 接口。
4. 批量同步不要全量刷新全部字段,优先复用静态缓存,降低接口调用量。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。