?
在電商開發的修羅場里摸爬滾打這些年,和京東商品詳情API接口的 “較量” 堪稱一部跌宕起伏的奮斗史。從申請權限時的層層關卡,到數據解析時的各種 “暗礁”,今天就把這段實戰經歷掰開揉碎,配上親測有效的代碼,給大伙避避雷!

還記得第一次對接京東API,天真地以為和其他平臺大同小異。結果光是申請開發者權限就碰了一鼻子灰 —— 京東對企業資質審核極為嚴格,營業執照、ICP 備案、應用場景說明反復修改了三輪,整整一周才收到通過通知。好不容易拿到App Key和App Secret,簽名算法又成了攔路虎。京東采用的HMAC-SHA256加密方式,對參數拼接順序、URL 編碼要求近乎苛刻,稍有差錯就返回10001簽名錯誤。那段時間熬夜翻看官方文檔、GitHub 示例,終于啃出了簽名生成函數:
運行
import hashlib import hmac import time import urllib.parse def generate_signature(params, app_secret): sorted_params = sorted(params.items(), key=lambda x: x[0]) query_str = "" for k, v in sorted_params: if isinstance(v, list): v = ",".join(map(str, v)) query_str += f"{k}{v}" sign_str = f"{app_secret}{query_str}{app_secret}" return hmac.new( app_secret.encode('utf-8'), sign_str.encode('utf-8'), hashlib.sha256 ).hexdigest().upper() # 使用示例 api_params = { "method": "jd.union.open.goods.query", "app_key": "your_app_key", "keyword": "手機", "timestamp": str(int(time.time())) } signed_params = generate_signature(api_params, "your_app_secret")

解決了簽名問題,新的 “坑” 接踵而至。京東對 API 調用頻率限制十分嚴格,不同接口還有差異化限流策略。為了避免觸發封禁,我用 Python 的asyncio結合信號量,實現了異步請求與限流控制:
python
運行
import asyncio import aiohttp class ???????RateLimiter: def __init__(self, rate_limit): self.semaphore = asyncio.Semaphore(rate_limit) async def limit(self): async with self.semaphore: yield async def fetch_product_detail(session, sku_id, signed_params): async with RateLimiter(10).limit(): url = "https://api.jd.com/routerjson" params = {**signed_params, "sku_id": sku_id} async with session.get(url, params=params) as response: return await response.json() async def main(sku_ids, signed_params): async with aiohttp.ClientSession() as session: tasks = [fetch_product_detail(session, sku, signed_params) for sku in sku_ids] results = await asyncio.gather(*tasks) return results # 示例調用 sku_ids = ["123456789", "987654321"] signed_params = {...} # 已簽名參數 asyncio.run(main(sku_ids, signed_params))

python數據實例
"stock": {
"skuId": "100031963708",
"realSkuId": "100031963708",
"ArrivalDate": "",
"Drd": "",
"sidDely": 182,
"promiseResult": "20:00前付款,預計明天(07月02日)送達",
"isJDexpress": false,
"StockState": 33,
"rn": -1,
"code": 1,
"weightValue": "0.055kg",
"fxgCode": "0",
"afsCode": 1,
"ir": [
{
"iconSrc": "京準達",
"iconTip": "選擇京準達服務,可指定精確時間點收貨;若京東責任超時,即時賠付",
"helpLink": "http://help.jd.com/user/issue/103-983.html",
"iconCode": "sendpay_zhun",
"resultCode": 1,
"showName": "京準達",
"picUrl": "http://m.360buyimg.com/mobilecms/jfs/t3172/266/1698067915/1634/64a0c40e/57d25fcfNd9c62bb7.png",
"iconType": 0,
"iconServiceType": 1
},
{
"iconSrc": "211限時達",
"iconTip": "上午下單,下午送達",
"helpLink": "https://help.jd.com/user/issue/91-953.html",
"iconCode": "sendpay_211",
"resultCode": 1,
"showName": "211限時達",
"picUrl": "http://static.360buyimg.com/item/assets/picon/zhongbiao.png",
"iconType": 0,
"iconServiceType": 1
},
{
"iconSrc": "明日達",
"iconTip": "指定時間前下單,最快明日達",
"helpLink": "http://help.jd.com/user/issue/103-983.html",
"iconCode": "sendpay_nextday",
"resultCode": 1,
"showName": "明日達",
"picUrl": "http://static.360buyimg.com/item/assets/picon/zhongbiao.png",
"iconType": 0,
"iconServiceType": 1
},
{
"iconSrc": "預約送貨",
"iconTip": "京東物流為該商品提供預約送貨服務",
"helpLink": "http://help.jd.com/user/issue/103-983.html",
"iconCode": "service_yysh",
"resultCode": 1,
"showName": "預約送貨",
"picUrl": "https://m.360buyimg.com/babel/jfs/t1/116316/15/7402/1031/5ec22ca4E713f857c/dd49784b20933cf5.png",
"iconType": 0,
"iconServiceType": 6
},
{
"iconSrc": "部分收貨",
"iconTip": "如果收件人收貨時發現部分貨物存在缺少配件、物流損等情形,京東物流提供訂單半收服務",
"helpLink": "https://help.jd.com/user/issue/103-983.html",
"iconCode": "service_bfsh",
"resultCode": 1,
"showName": "部分收貨",
"picUrl": "https://m.360buyimg.com/babel/jfs/t1/108073/34/18517/1071/5ec22ce0E11a3b1c5/f8ffea5f4cafa0f9.png",
"iconType": 0,
"iconServiceType": 6
},
{
"iconSrc": "送貨上門",
"iconTip": "京東快遞為您提供送貨上門服務",
"helpLink": "https://help.jd.com/user/issue/254-4130.html",
"iconCode": "service_sssm",
"resultCode": 1,
"showName": "送貨上門",
"picUrl": "https://m.360buyimg.com/babel/jfs/t1/115738/37/12143/1066/5f0c7d11E4faee520/de3879572e2b2014.png",
"iconType": 0,
"iconServiceType": 6
},
{
"iconSrc": "59元免基礎運費",
"iconTip": "所選地址自營訂單滿59元免基礎運費(20kg內),超出重量加收1元/kg續重運費。",
"helpLink": "http://help.jd.com/user/issue/103-983.html",
"iconCode": "free_delivery_zhong",
"resultCode": 1,
"showName": "59元免基礎運費",
"picUrl": "http://static.360buyimg.com/item/assets/picon/mianyunfei.png",
"iconType": 0,
"iconServiceType": 4
},
{
"iconSrc": "京東物流",
"iconTip": "京東物流為您提供倉配一體供應鏈服務",
"helpLink": "https://help.jd.com/user/issue/list-81.html",
"iconCode": "service_jdwl",
"resultCode": 1,
"showName": "京東物流",
"picUrl": "https://m.360buyimg.com/babel/jfs/t1/130756/9/11972/4289/5f8674d3Eabfebbef/bb964241bd789a72.png",
"iconType": 0,
"iconServiceType": 4
},
{
"iconSrc": "7天價保",
"iconTip": "在下單或簽收7天內,商品出現降價可享受價保服務,部分特殊場景不支持價保,可點擊”>"了解詳細規則",
"helpLink": "https://help.jd.com/user/issue/291-548.html",
"iconCode": "service_guominwuyou",
"resultCode": 1,
"showName": "7天價保",
"picUrl": "https://m.360buyimg.com/babel/jfs/t1/85923/26/10113/3475/5e144da1Ef978a914/d3d44f85b4221cf6.png",
"iconType": 0,
"iconServiceType": 3
},
{
"iconSrc": "自提",
"iconTip": "我們提供多種自提服務,包括京東自提點、自助提貨柜、京東校園派、京東星配站、京東便民站等服務",
"helpLink": "http://help.jd.com/user/issue/103-983.html",
"iconCode": "special_ziti",
"resultCode": 1,
"showName": "自提",
"picUrl": "http://static.360buyimg.com/item/assets/picon/shoutixiang.png",
"iconType": 0,
"iconServiceType": 5
}
],
"promiseYX": {
"iconSrc": "7天無理由退貨",
"iconTip": "支持7天無理由退貨",
"helpLink": "http://help.jd.com/user/issue/126-3780.html",
"iconCode": "service_qitiantuihuo",
"resultCode": 1,
"showName": "7天無理由退貨",
"picUrl": "",
"iconType": 0,
"iconServiceType": 3
},
"self_D": {
"venderId": 1000085871,
"colType": 0,
"shopId": 1000085871,
"shopName": "zippo京東自營旗艦店",
"vender": "zippo京東自營旗艦店",
"hotLine": "",
"shopWebsite": "http://zippo.jd.com",
"po": true,
"url": "http://zippo.jd.com"
},
"serviceInfo": "由京東發貨,zippo京東自營旗艦店/a?>提供售后服務",
"sid": 182,
"preStore": -1,
"unifiedServiceTag": {
"enable": true,
"freightIconCodes": [
"free_delivery",
"free_delivery_zhong",
"free_delivery_fresh",
"free_delivery_fresh_zhong",
"Free_nbaoyou",
"Free_nsxbaoyou",
"free_baoyou",
"free_sxbaoyou"
],
"iconServiceTypes": [
"1",
"5",
"6"
],
"tsfw": [
{
"code": "s26",
"desc": "在下單或簽收7天內,商品出現降價可享受價保服務(商品在消費者下單后因參與百億補貼、政府補貼等活動導致降價不支持價保),可點擊“>”了解詳細規則",
"helpUrl": "https://ihelp.jd.com/l/help/scene/getSceneDetail?id=337318",
"logoUrl": "http://m.360buyimg.com/babel/jfs/t1/166785/27/4308/10074/60113548Ea9bb7dbb/be0bac01dccf5f52.png",
"name": "7天價保",
"shortDesc": "7天內買貴退差價",
"iHelpLink": "https://ihelp.jd.com/l/help/scene/getSceneDetail?id=325798",
"ihelpLink": "https://ihelp.jd.com/l/help/scene/getSceneDetail?id=325798",
"mimgUrl": "http://m.360buyimg.com/babel/jfs/t1/222474/40/8926/4033/61de8162E9b3a5a0c/b11a4cc5342015b0.png",
"mimgUrl2": "http://m.360buyimg.com/lme/jfs/t1/222228/21/20461/3101/63048db5Ef37ece2e/83f0be5658b2f25b.png"
},
{
"code": "s141",
"desc": "由京東指定供應商提供售后服務",
"name": "供應商售后",
"shortDesc": "京東指定供應商售后"
python
運行
def parse_product_data(raw_data):
try:
return {
"product_name": raw_data.get("wareInfo", {}).get("wareName", ""),
"current_price": float(raw_data.get("wareInfo", {}).get("jdPrice", 0)),
"original_price": float(raw_data.get("wareInfo", {}).get("marketPrice", 0)),
"stock": int(raw_data.get("wareInfo", {}).get("stockNum", 0)),
"brand": raw_data.get("wareInfo", {}).get("brandName", "")
}
except KeyError as e:
print(f"字段缺失: {e}")
return {}
# 示例調用
raw_response = {...} # API返回數據
parsed_data = parse_product_data(raw_response)

最驚險的一次,幫客戶開發商品比價系統時,突然遇到京東接口升級,原本正常的 “商品副標題” 字段被替換成了 “shortTitle”。由于沒有做字段兼容性處理,導致前端頁面大量數據缺失。吃一塹長一智,后來每次調用 API 都會寫版本兼容函數,動態適配字段變化:
python
運行
def adapt_data_fields(data): if "wareName" in data.get("wareInfo", {}): data["wareInfo"]["product_title"] = data["wareInfo"].pop("wareName") if "jdPrice" in data.get("wareInfo", {}): data["wareInfo"]["current_price"] = data["wareInfo"].pop("jdPrice") return data # 示例調用 adapted_data = adapt_data_fields(raw_response)

這些年踩過的坑、寫過的代碼,都成了寶貴的經驗。如果有遇到其他問題都可以一起交流!
?審核編輯 黃宇
-
接口
+關注
關注
33文章
9454瀏覽量
156324 -
API
+關注
關注
2文章
2198瀏覽量
66344 -
京東
+關注
關注
2文章
1066瀏覽量
49898
發布評論請先 登錄
巧用京東 API,精準把握京東平臺用戶消費偏好
揭秘京東 API,讓京東店鋪商品推薦更懂用戶
京東 API 助力,京東平臺促銷活動效果實時評估
京東 API 賦能,京東店鋪廣告投放數據深度洞察

京東比價項目開發實錄:京東API接口(2025)
評論