×

阿里巴巴 1688 商品详情接口实战:B2B 批发数据全解析 + 签名优化 + 异常熔断(Python 合规版)

Ace Ace 发表于2026-06-12 16:18:13 浏览15 评论0

抢沙发发表评论

前言

在跨境铺货、供应链选品、ERP 商品同步、价格监控等 B2B 场景中,1688 商品详情是核心数据源。网上多数教程存在签名算法错误、缺少 AccessToken 管理、批发价 / 起批量解析残缺、无异常降级等问题,且多为简单参数调用,无法适配生产环境高可用需求。本文基于阿里最新alibaba.product.get(2.0 版) 接口,实现HMAC-SHA256 标准签名、AccessToken 自动刷新、批发梯度价 + SKU 全量解析、字段裁剪、限流熔断

一、差异化技术亮点

  1. 2.0 版接口适配:采用阿里主推的 2.0 版接口,1.0 已停止核心字段返回。

  2. 签名算法优化:严格遵循 HMAC-SHA256,解决网上 MD5 签名过时问题。

  3. AccessToken 自动续期:内置 2 小时有效期检测,避免批量同步时令牌失效。

  4. B2B 核心数据深解析:完整提取阶梯批发价、MOQ、混批规则、SKU 规格库存,弥补通用教程短板。

  5. 按需字段裁剪 + 异常熔断:减少冗余数据,区分签名错误 / 限流 / 权限不足异常,自动重试。

二、接口基础规范

  • 接口名称:alibaba.product.get(2.0 版)

  • 请求地址:https://gw.open.1688.com/openapi/param2/1/com.alibaba.product/alibaba.product.get

  • 认证方式:OAuth2.0 AccessToken + HMAC-SHA256 签名

  • 请求方式:POST(推荐,避免参数截断)

  • 调用限制:QPS≤10,日调用量随权限等级,批量间隔≥0.3s

  • 权限要求:开放平台申请 “商品详情读取” 权限,审核 1-2 个工作日

点击获取key和secret

三、完整 Python 生产级代码

python

运行

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))

四、实战避坑干货(原创)


  1. 必须用 2.0 版接口:1.0 版已不返回价格、SKU 等核心字段,新应用仅支持 2.0。

  2. 签名算法别用 MD5:2.0 版强制 HMAC-SHA256,MD5 会直接报签名错误。

  3. AccessToken 有效期 2 小时:必须提前 60 秒刷新,批量同步时避免令牌突然失效。

  4. fields 按需指定:默认返回 50 + 字段,指定所需字段可减少 50%+ 响应体积,提升速度。

  5. B2B 核心字段别漏priceRanges(阶梯价)、minOrderQuantity(MOQ)、skuList是 1688 批发场景关键数据。

群贤毕至

访客