《京东宙斯迁移公告解读老接口360buy.ware.get→jingdong.ware.read.get平滑切换附Python源码》京东早期商品查询接口曾用360buy.ware.getmethod值jingdong.ware.get现在官方统一推荐jingdong.ware.read.get新版只读商品读取接口权限更清晰、支持SKU快照字段。老接口逐步下线切新接口只需改 method 微调 fields签名/网关/AccessToken 完全不变。一、老 vs 新接口对照项目老接口(逐步下线)新接口(推荐)Methodjingdong.ware.get/360buy.ware.get✅jingdong.ware.read.get网关https://api.jd.com/routerjson同不变签名算法MD5(AppSecretKV_ASCIIAppSecret) 秒级timestamp完全相同不需改必传参数wareId/fields同wareId/fields建议补充skus_json返回结构{jingdong_ware_get_response:{ware:{...}}}{jingdong_ware_read_get_response:{ware:{...}}}权限申请老权限入口应用→接口权限→申请jingdong.ware.read.getSKU库存可见需 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 urlhttps://console.open.onebound.cn/console/?iLex # ─────────── 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_asciiFalse, separators(,, :)) } if token: p[access_token] token p[sign] self._sign(p) r requests.post(self.GW, datap, timeout15) 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(fJOS [{err.get(code)}]: f{err.get(zh_desc) or err.get(en_desc)}) raise Exception(fJOS 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 urlhttps://console.open.onebound.cn/console/?iLex # # 使用示例 # 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, tokenSELLER_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→ 迁移完成仅需改 methodjingdong.ware.read.get fields补skus_json) except Exception as e: print(❌, e) print(→ 确认: AppKey/Secret正确、接口 jingdong.ware.read.get 已申请、wareId有效)三、迁移 Checklist照着做应用后台申请新权限→ 接口权限 → 勾选jingdong.ware.read.get→ 提交通常即时生效代码改动- 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_pathwareId参数名不变驼峰同老接口回归测试沙箱调通签名 ✓生产比对新旧返回字段一致性标题/价格/SKU数应一致自家店铺查 SKU 库存需传access_token同旧逻辑下线老调用确认所有环境切新 method 后删除get_ware_old()分支四、避坑坑现象解决新接口返回 403未申请jingdong.ware.read.get应用→接口权限→申请skus_json空公开查询别人商品 / 未传 token查自己店铺商品须传卖家 AccessToken老代码wareId写成ware_id部分SDK自动映射推荐用wareId(首字母大写)与文档保持一致返回结构 key 变jingdong_ware_get_response→jingdong_ware_read_get_response解析用.get(ware)不依赖外层 keytimestamp毫秒Invalid TimestampJOS用秒级int(time.time())五、面试/方案一句话京东商品查询老接口jingdong.ware.get迁jingdong.ware.read.get只改 method 字符串 fields 补skus_json,stock_num网关/签名/AccessToken 完全不变应用需申请新接口权限返回值结构外层key变但内层ware节点字段一致解析取.get(ware)即兼容。需要我补京东订单增量同步(jingdong.pop.order.search) APScheduler断点续跑 或京东库存快照定时校正脚本 吗
[特殊字符]《京东宙斯迁移公告解读:老接口 360buy.ware.get→ jingdong.ware.read.get平滑切换(附Python源码)》
《京东宙斯迁移公告解读老接口360buy.ware.get→jingdong.ware.read.get平滑切换附Python源码》京东早期商品查询接口曾用360buy.ware.getmethod值jingdong.ware.get现在官方统一推荐jingdong.ware.read.get新版只读商品读取接口权限更清晰、支持SKU快照字段。老接口逐步下线切新接口只需改 method 微调 fields签名/网关/AccessToken 完全不变。一、老 vs 新接口对照项目老接口(逐步下线)新接口(推荐)Methodjingdong.ware.get/360buy.ware.get✅jingdong.ware.read.get网关https://api.jd.com/routerjson同不变签名算法MD5(AppSecretKV_ASCIIAppSecret) 秒级timestamp完全相同不需改必传参数wareId/fields同wareId/fields建议补充skus_json返回结构{jingdong_ware_get_response:{ware:{...}}}{jingdong_ware_read_get_response:{ware:{...}}}权限申请老权限入口应用→接口权限→申请jingdong.ware.read.getSKU库存可见需 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 urlhttps://console.open.onebound.cn/console/?iLex # ─────────── 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_asciiFalse, separators(,, :)) } if token: p[access_token] token p[sign] self._sign(p) r requests.post(self.GW, datap, timeout15) 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(fJOS [{err.get(code)}]: f{err.get(zh_desc) or err.get(en_desc)}) raise Exception(fJOS 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 urlhttps://console.open.onebound.cn/console/?iLex # # 使用示例 # 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, tokenSELLER_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→ 迁移完成仅需改 methodjingdong.ware.read.get fields补skus_json) except Exception as e: print(❌, e) print(→ 确认: AppKey/Secret正确、接口 jingdong.ware.read.get 已申请、wareId有效)三、迁移 Checklist照着做应用后台申请新权限→ 接口权限 → 勾选jingdong.ware.read.get→ 提交通常即时生效代码改动- 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_pathwareId参数名不变驼峰同老接口回归测试沙箱调通签名 ✓生产比对新旧返回字段一致性标题/价格/SKU数应一致自家店铺查 SKU 库存需传access_token同旧逻辑下线老调用确认所有环境切新 method 后删除get_ware_old()分支四、避坑坑现象解决新接口返回 403未申请jingdong.ware.read.get应用→接口权限→申请skus_json空公开查询别人商品 / 未传 token查自己店铺商品须传卖家 AccessToken老代码wareId写成ware_id部分SDK自动映射推荐用wareId(首字母大写)与文档保持一致返回结构 key 变jingdong_ware_get_response→jingdong_ware_read_get_response解析用.get(ware)不依赖外层 keytimestamp毫秒Invalid TimestampJOS用秒级int(time.time())五、面试/方案一句话京东商品查询老接口jingdong.ware.get迁jingdong.ware.read.get只改 method 字符串 fields 补skus_json,stock_num网关/签名/AccessToken 完全不变应用需申请新接口权限返回值结构外层key变但内层ware节点字段一致解析取.get(ware)即兼容。需要我补京东订单增量同步(jingdong.pop.order.search) APScheduler断点续跑 或京东库存快照定时校正脚本 吗