首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >京东商品详情接口:增量同步场景下数据裁剪与缓存适配方案

京东商品详情接口:增量同步场景下数据裁剪与缓存适配方案

原创
作者头像
用户12731069
发布2026-09-01 15:34:20
发布2026-09-01 15:34:20
580
举报

前言

网上大部分京东详情接口示例,侧重于完整拉取全部返回字段,直接将原始 JSON 存入数据库。但在 ERP 增量同步业务中,大量不变的图文、参数信息反复拉取会浪费接口配额,还会加重存储压力。本文基于京东联盟jd.union.open.goods.detail.query接口,设计一套区分静态字段与动态字段的封装逻辑,只对价格、促销、库存这类高频变动字段做更新,静态基础信息做缓存复用,适合大批量商品增量同步业务。

前置准备

在京东开放平台创建应用,获取app_keyapp_secret,开通商品详情查询接口权限。接口入参核心为 skuId,注意区分 SPU 与 SKU,SPU 编号无法直接调用该接口。接口存在 QPS 与日调用上限,大批量同步必须做好节流。 依赖:requests,执行pip install requests

python

代码语言:javascript
复制
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 删除。

目录
  • 前言
  • 前置准备
  • 代码逻辑解析
  • 对接踩坑要点
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档