前言 大部分公开教程只演示简单调用获取商品基础信息,忽略
1688B 端核心痛点:阶梯批发价、多 SKU
规格、起订量限制、混批规则字段杂乱。同一商品会存在多档拿货价,原始接口返回字段嵌套层级深,直接拿原始 JSON
很难直接用于业务系统。本文重点不是简单请求演示,而是对接入后的数据做分层解析、脏字段过滤,适配采购、比价类业务场景。 前置准备 调用前需要在 1688 开放平台创建应用,获取 appKey、appSecret,拿到 access_token。商品详情接口需要传入商品 ID,注意部分私密商品、被下架商品会返回权限类异常,业务代码必须做兼容处理。 核心 Python 代码示例 代码逻辑解析 data_normalize 函数是整套封装的重点。接口原始返回字段繁多,很多是平台内部使用字段,全部存储会浪费存储空间。这里只提取业务需要的标题、主图、起订量、多档批发价格。 优先捕获 errorCode,处理鉴权错误、token 过期; 判断商品状态,识别下架、删除商品; 循环解析 priceRanges,把阶梯批发价整理成结构化数组,方便前端展示或者入库; 返回统一格式结构体,上层业务不需要感知原始接口字段变化。 对接过程常见问题 Token 短期有效,大批量循环获取商品详情时,要做好 token 过期捕获与自动刷新逻辑; 部分定制类商品没有阶梯价格,priceRanges 为空数组,业务上要做空判断,避免程序报错; 平台有调用频率限制,短时间大量请求会触发限流,建议增加 sleep 间隔,按批次拉取; 私密商品、分销商专属商品,即便 ID 正确也无法获取详情,代码需要标记该类异常,不要直接抛出崩溃。
import requests
import time
class Ali1688DetailClient:
def __init__(self, app_key, app_secret, access_token):
self.app_key = app_key
self.app_secret = app_secret
self.token = access_token
self.url = "https://gw.open.1688.com/openapi/param2/1/com.alibaba.trade/alibaba.trade.getProductDetail"
def get_product_detail(self, product_id):
params = {
"appKey": self.app_key,
"access_token": self.token,
"productId": product_id
}
resp = requests.get(self.url, params=params, timeout=15)
raw_data = resp.json()
result = self.data_normalize(raw_data)
return result
def data_normalize(self, raw):
"""核心:原始数据归一化,提取阶梯价格、起订量,过滤无效字段"""
res = {
"success": False,
"product_id": None,
"title": "",
"main_image": "",
"price_list": [],
"min_order": 0,
"is_off_shelf": False
}
if raw.get("errorCode"):
res["msg"] = raw.get("errorMessage")
return res
data = raw.get("result", {})
if not data or data.get("status") != "success":
res["msg"] = "商品数据为空或已下架"
res["is_off_shelf"] = True
return res
info = data.get("productInfo", {})
res["success"] = True
res["product_id"] = info.get("productId")
res["title"] = info.get("subject", "")
res["main_image"] = info.get("mainImage", "")
res["min_order"] = info.get("minOrderQuantity", 0)
# 解析批发阶梯价格
price_steps = info.get("priceRanges", [])
for p in price_steps:
res["price_list"].append({
"start_num": p.get("startQuantity"),
"price": p.get("price")
})
return res
if __name__ == "__main__":
client = Ali1688DetailClient("your_appkey","your_secret","your_token")
detail = client.get_product_detail(product_id=68******56)
print(detail)