×

🔄《京东宙斯迁移公告解读:老接口 360buy.ware.get→ jingdong.ware.read.get平滑切换(附Python源码)》

万邦科技Lex 万邦科技Lex 发表于2026-07-07 10:23:12 浏览21 评论0

抢沙发发表评论

🔄《京东宙斯迁移公告解读:老接口 360buy.ware.getjingdong.ware.read.get平滑切换(附Python源码)》

京东早期商品查询接口曾用 360buy.ware.get(method值 jingdong.ware.get),现在官方统一推荐 jingdong.ware.read.get(新版只读商品读取接口,权限更清晰、支持SKU快照字段)。老接口逐步下线,切新接口只需改 method + 微调 fields,签名/网关/AccessToken 完全不变

一、老 vs 新接口对照

项目
老接口(逐步下线)
新接口(推荐)
Method
jingdong.ware.get/ 360buy.ware.get
jingdong.ware.read.get
网关
https://api.jd.com/routerjson
同(不变)
签名算法
MD5(AppSecret+KV_ASCII+AppSecret) 秒级timestamp
完全相同(不需改)
必传参数
wareId/ fields
同(wareId/ fields,建议补充 skus_json
返回结构
{jingdong_ware_get_response:{ware:{...}}}
{jingdong_ware_read_get_response:{ware:{...}}}
权限申请
老权限入口
应用→接口权限→申请 jingdong.ware.read.get
SKU库存可见
需 seller token
同(传 seller AccessToken 可看 stockNumin skus_json)
结论:代码中只改 method字符串 + fields补全 skus_json,stock_num,其余(Client / 签名 / 网关 / token)一行不动即可平滑迁移。

二、Python:老接口 vs 新接口调用对比 + 兼容封装

# jd_ware_migration.py
"""
京东商品接口迁移演示
old: jingdong.ware.get  →  new: jingdong.ware.read.get
同一个 JdClient 复用,仅 method + fields 不同
"""
import hashlib
import json
import requests
import time
from typing import Dict, Optional

封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
# ─────────── JOS Client (内联,与你之前用的一致) ───────────
class JdClient:
    GW = "https://api.jd.com/routerjson"

    def __init__(self, ak, ask):
        self.ak, self.ask = ak, ask

    def _sign(self, p: Dict) -> str:
        filt = sorted((k, v) for k, v in p.items()
                       if v is not None and str(v).strip() != '' and k != 'sign')
        qs = ''.join(f"{k}{v}" for k, v in filt)
        return hashlib.md5(f"{self.ask}{qs}{self.ask}".encode()
                          ).hexdigest().upper()

    def _call(self, method: str, biz: Dict, token: str = None) -> Dict:
        p = {
            "app_key": self.ak, "method": method,
            "timestamp": str(int(time.time())),   # ← 秒级!
            "format": "json", "v": "2.0", "sign_method": "md5",
            "360buy_param_json": json.dumps(biz, ensure_ascii=False,
                                             separators=(',', ':'))
        }
        if token:
            p["access_token"] = token
        p["sign"] = self._sign(p)

        r = requests.post(self.GW, data=p, timeout=15)
        r.raise_for_status()
        d = r.json()

        resp_key = method.replace(".", "_") + "_response"
        if resp_key not in d:
            for k in d:
                if k.endswith("_response"):
                    resp_key = k
                    break
        data = d.get(resp_key, d)
        if "error_response" in str(data):
            err = d.get(resp_key, {}).get("error_response") or d.get("error_response")
            if err:
                raise Exception(f"JOS [{err.get('code')}]: "
                                 f"{err.get('zh_desc') or err.get('en_desc')}")
            raise Exception(f"JOS err: {d}")
        return data

    # ─── 老接口(不推荐, 仅作对比) ───
    def get_ware_old(self, ware_id: str,
                     fields: str = None, token: str = None) -> Dict:
        fields = fields or "ware_id,title,price,jd_price,stock_num,skus_json,image_path"
        return self._call(
            "jingdong.ware.get",          # ← 老 method
            {"wareId": ware_id, "fields": fields},
            token
        ).get("ware", {})

    # ─── ✅ 新接口(推荐迁移目标) ───
    def get_ware_new(self, ware_id: str,
                     fields: str = None, token: str = None) -> Dict:
        fields = fields or (
            "ware_id,title,brand_name,cid,category_name,"
            "price,jd_price,market_price,stock_num,"
            "skus_json,image_path,desc,outer_id"
        )
        return self._call(
            "jingdong.ware.read.get",     # ← 新 method
            {"wareId": ware_id, "fields": fields},
            token
        ).get("ware", {})
封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex

# =========================================================
# 使用示例
# =========================================================
if __name__ == "__main__":
    cli = JdClient("YOUR_JD_APP_KEY", "YOUR_JD_APP_SECRET")
    WARE_ID = "100012345678"      # ← 替换真实 wareId
    SELLER_TOKEN = None           # 查自己店铺SKU库存传卖家AccessToken

    try:
        # ★ 迁移后只用这一行 ★
        ware = cli.get_ware_new(WARE_ID, token=SELLER_TOKEN)

        print("✅ [新接口] 商品标题:", ware.get("title"))
        print("   京东价:", ware.get("jd_price"))
        print("   SPU库存:", ware.get("stock_num"))

        # skus_json 解析
        import json as _json
        skus_raw = ware.get("skus_json") or ""
        if skus_raw:
            skus = _json.loads(skus_raw)
            print(f"   SKU数:{len(skus)}")
            for s in skus[:2]:
                print(f"     skuId:{s.get('skuId')} 价:{s.get('jdPrice')} "
                      f"库:{s.get('stockNum')} 商家码:{s.get('outerId','')}")

        print("\n→ 迁移完成!仅需改 method='jingdong.ware.read.get' + fields补skus_json")

    except Exception as e:
        print("❌", e)
        print("→ 确认: AppKey/Secret正确、接口 jingdong.ware.read.get 已申请、wareId有效")

三、迁移 Checklist(照着做)

  1. 应用后台申请新权限
    → 接口权限 → 勾选 jingdong.ware.read.get→ 提交(通常即时生效)

  2. 代码改动
    - method = "jingdong.ware.get"
    + method = "jingdong.ware.read.get"
    - fields = "ware_id,title,price"
    + fields = "ware_id,title,price,jd_price,stock_num,skus_json,image_path"
    wareId参数名不变(驼峰,同老接口)

  3. 回归测试

    • 沙箱调通签名 ✓

    • 生产比对新旧返回字段一致性(标题/价格/SKU数应一致)

    • 自家店铺查 SKU 库存需传 access_token(同旧逻辑)

  4. 下线老调用
    确认所有环境切新 method 后,删除 get_ware_old()分支


四、避坑

现象
解决
新接口返回 403
未申请 jingdong.ware.read.get
应用→接口权限→申请
skus_json
公开查询别人商品 / 未传 token
查自己店铺商品须传卖家 AccessToken
老代码 wareId写成 ware_id
部分SDK自动映射,推荐用 wareId(首字母大写)
与文档保持一致
返回结构 key 变
jingdong_ware_get_responsejingdong_ware_read_get_response
解析用 .get("ware")不依赖外层 key
timestamp毫秒
Invalid Timestamp
JOS用秒级 int(time.time())

五、面试/方案一句话

京东商品查询老接口 jingdong.ware.getjingdong.ware.read.get只改 method 字符串 + fields 补 skus_json,stock_num,网关/签名/AccessToken 完全不变;应用需申请新接口权限,返回值结构外层key变但内层 ware节点字段一致,解析取 .get("ware")即兼容。
需要我补 京东订单增量同步(jingdong.pop.order.search) APScheduler断点续跑京东库存快照定时校正脚本 吗?


群贤毕至

访客