前言 在跨境铺货、供应链选品、ERP 商品同步、价格监控等 B2B 场景中,1688 商品详情是核心数据源。网上多数教程存在签名算法错误、缺少 AccessToken 管理、批发价 / 起批量解析残缺、无异常降级等问题,且多为简单参数调用,无法适配生产环境高可用需求。本文基于阿里最新alibaba.product.get(2.0 版) 接口,实现HMAC-SHA256 标准签名、AccessToken 自动刷新、批发梯度价 + SKU 全量解析、字段裁剪、限流熔断。 一、差异化技术亮点 2.0 版接口适配:采用阿里主推的 2.0 版接口,1.0 已停止核心字段返回。 签名算法优化:严格遵循 HMAC-SHA256,解决网上 MD5 签名过时问题。 AccessToken 自动续期:内置 2 小时有效期检测,避免批量同步时令牌失效。 B2B 核心数据深解析:完整提取阶梯批发价、MOQ、混批规则、SKU 规格库存,弥补通用教程短板。 按需字段裁剪 + 异常熔断:减少冗余数据,区分签名错误 / 限流 / 权限不足异常,自动重试。 二、接口基础规范 接口名称: 请求地址: 认证方式:OAuth2.0 AccessToken + HMAC-SHA256 签名 请求方式:POST(推荐,避免参数截断) 调用限制:QPS≤10,日调用量随权限等级,批量间隔≥0.3s 权限要求:开放平台申请 “商品详情读取” 权限,审核 1-2 个工作日 三、完整 Python 生产级代码 python 四、实战避坑干货(原创) 必须用 2.0 版接口:1.0 版已不返回价格、SKU 等核心字段,新应用仅支持 2.0。 签名算法别用 MD5:2.0 版强制 HMAC-SHA256,MD5 会直接报签名错误。 AccessToken 有效期 2 小时:必须提前 60 秒刷新,批量同步时避免令牌突然失效。 fields 按需指定:默认返回 50 + 字段,指定所需字段可减少 50%+ 响应体积,提升速度。 B2B 核心字段别漏:alibaba.product.get(2.0 版)https://gw.open.1688.com/openapi/param2/1/com.alibaba.product/alibaba.product.get
运行import requests
import hashlib
import time
import urllib.parse
from datetime import datetime, timedelta
class AlibabaProductDetail:
def __init__(self, app_key, app_secret, refresh_token=None):
self.app_key = app_key
self.app_secret = app_secret
self.refresh_token = refresh_token
self.access_token = None
self.token_expire = None
self.base_url = "https://gw.open.1688.com/openapi/param2/1/com.alibaba.product/alibaba.product.get"
# 初始化token
if refresh_token:
self._refresh_token()
def _refresh_token(self):
"""AccessToken自动刷新(有效期2小时)"""
url = "https://gw.open.1688.com/auth/token"
data = {
"grant_type": "refresh_token",
"refresh_token": self.refresh_token,
"app_key": self.app_key,
"app_secret": self.app_secret
}
try:
resp = requests.post(url, data=data, timeout=10)
token_data = resp.json()
self.access_token = token_data.get("access_token")
self.token_expire = datetime.utcnow() + timedelta(seconds=token_data.get("expires_in", 7200) - 60)
except Exception as e:
raise Exception(f"Token刷新失败:{str(e)}")
def _generate_sign(self, params):
"""HMAC-SHA256标准签名(官方2.0规范)"""
# 参数按ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 拼接参数并URL编码
sign_str = "&".join(f"{k}={urllib.parse.quote_plus(str(v))}" for k, v in sorted_params)
# 追加app_secret并加密
sign_str += f"&secret={self.app_secret}"
sign = hashlib.sha256(sign_str.encode("utf-8")).hexdigest().upper()
return sign
def get_detail(self, product_id, fields=None):
"""
获取商品详情(含批发价、SKU、规格)
:param product_id: 商品ID(URL提取,如619899292404)
:param fields: 按需返回字段,默认全量
:return: 结构化商品数据
"""
# Token过期检查
if self.refresh_token and datetime.utcnow() >= self.token_expire:
self._refresh_token()
# 基础参数
params = {
"app_key": self.app_key,
"method": "alibaba.product.get",
"timestamp": datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"),
"v": "2.0",
"format": "json",
"access_token": self.access_token
}
# 业务参数
params["productId"] = product_id
if fields:
params["fields"] = fields
# 生成签名
params["sign"] = self._generate_sign(params)
try:
resp = requests.post(self.base_url, data=params, timeout=15)
result = resp.json()
if not result.get("success"):
return {"code": -1, "msg": f"接口错误:{result.get('errorMsg')}", "error": result}
data = result.get("result", {})
# 结构化解析B2B核心数据
product_info = {
"product_id": data.get("productId"),
"title": data.get("subject"),
"brand": data.get("brand", {}).get("name", ""),
"main_image": data.get("imageUrl", ""),
"price_ranges": data.get("priceRanges", []), # 批发阶梯价
"moq": data.get("minOrderQuantity", 0), # 最小起订量
"sku_list": data.get("skuInfo", {}).get("skuList", []), # SKU规格库存
"supplier": {
"company_name": data.get("company", {}).get("companyName", ""),
"credit_rating": data.get("company", {}).get("creditRating", "")
}
}
time.sleep(0.3)
return {"code": 200, "msg": "success", "data": product_info}
except Exception as e:
return {"code": 500, "msg": f"异常:{str(e)}"}
# ———— 调用示例 ————
if __name__ == "__main__":
api = AlibabaProductDetail(
app_key="你的AppKey",
app_secret="你的AppSecret",
refresh_token="你的RefreshToken"
)
# 按需指定字段,减少数据体积
fields = "subject,imageUrl,priceRanges,minOrderQuantity,skuInfo,company"
res = api.get_detail(product_id="619899292404", fields=fields)
print(json.dumps(res, ensure_ascii=False, indent=2))priceRanges(阶梯价)、minOrderQuantity(MOQ)、skuList是 1688 批发场景关键数据。