×

1688商品详情接口(item_get)完整指南:从接入到实战

admin admin 发表于2026-04-29 17:16:23 浏览12 评论0

抢沙发发表评论

一、接口概述

1688.item_get(官方名称为 alibaba.item.get)是1688开放平台提供的核心商品详情查询接口,用于根据商品ID获取1688批发商品的全维度结构化数据
。该接口区别于淘宝等C端电商API,深度适配B2B批发场景,涵盖起订量(MOQ)、阶梯价格、供应商资质等批发专属字段

适用场景

  • 选品铺货:批量获取商品数据上架至自建商城或跨境平台
  • 价格监控:实时追踪竞品批发价与库存变动
  • ERP同步:将1688商品信息同步至企业内部采购系统
  • 供应链分析:评估供应商资质与产能信息

二、接入前置条件

1. 账号与权限准备

在调用接口前,需完成以下步骤
表格
步骤操作内容注意事项
注册认证注册开发者账号企业认证配额更高,个人开发者权限受限
创建应用在控制台创建"服务端应用"审核通过后获取 App Key 和 App Secret
申请权限申请 alibaba.item.get 接口权限2026年需提交数据使用场景说明,审核1-3个工作日
配置白名单设置服务器出口IP白名单遗漏将直接返回 403 Forbidden
获取Token通过OAuth2.0授权获取Access Token企业用户需走服务商授权流程

2. 接口版本说明

  • 稳定版2.0(2026年主推版本)
  • 1.0版本:已不返回运费、起批量等核心字段,建议升级
  • 请求地址https://gw.api.1688.com/openapi/param2/1/alibaba.item.get/2.0

三、接口参数详解

1. 公共参数(必传)

表格
参数名类型必填说明示例值
app_keyString应用唯一标识12345678
methodString接口方法名alibaba.item.get
timestampString时间戳2026-04-29 17:04:00
vStringAPI版本2.0
formatString响应格式json
sign_methodString签名方式md5
signStringMD5签名E4F2G3H4...

2. 业务参数

表格
参数名类型必填说明示例值
item_id / num_iidLong1688商品ID689712345678
fieldsString指定返回字段(优化性能)item_id,title,price,sku_list
langString返回语言cn(默认)/ en / ru
性能建议:通过 fields 参数按需指定返回字段,可显著减少响应体积和解析时间

四、签名生成规则

签名是调用1688 API的核心安全机制,生成步骤如下

Python签名实现

Python
复制
import hashlibdef generate_sign(params: dict, app_secret: str) -> str:
    """
    生成1688 API MD5签名
    """
    # 1. 过滤空值参数
    filtered_params = {k: v for k, v in params.items() if v is not None}
    
    # 2. 按参数名ASCII码升序排序
    sorted_params = sorted(filtered_params.items(), key=lambda x: x[0])
    
    # 3. 拼接字符串:AppSecret + key1value1key2value2... + AppSecret
    sign_str = app_secret + "".join([f"{k}{v}" for k, v in sorted_params]) + app_secret    
    # 4. MD5加密并转大写
    return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()

五、完整调用示例

Python实战代码

Python
复制
import requestsimport timeimport hashlib# ==================== 配置区(替换为你的凭证) ====================APP_KEY = "your_app_key"APP_SECRET = "your_app_secret"API_URL = "https://gw.api.1688.com/openapi/param2/1/alibaba.item.get/2.0"def generate_sign(params: dict, app_secret: str) -> str:
    """生成MD5签名"""
    filtered = {k: v for k, v in params.items() if v is not None}
    sorted_params = sorted(filtered.items(), key=lambda x: x[0])
    sign_str = app_secret + "".join([f"{k}{v}" for k, v in sorted_params]) + app_secret    return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()def get_item_detail(item_id: str, fields: str = None) -> dict:
    """
    调用1688商品详情接口
    """
    # 构造基础参数
    params = {
        "app_key": APP_KEY,
        "method": "alibaba.item.get",
        "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
        "format": "json",
        "v": "2.0",
        "sign_method": "md5",
        "item_id": item_id    }
    
    # 按需指定返回字段
    if fields:
        params["fields"] = fields    
    # 生成签名
    params["sign"] = generate_sign(params, APP_SECRET)
    
    try:
        response = requests.get(API_URL, params=params, timeout=15)
        response.encoding = "utf-8"
        result = response.json()
        
        # 错误处理
        if result.get("code") != 0 or "error_response" in result:
            error = result.get("error_response", {})
            raise Exception(f"API调用失败: {error.get('msg', '未知错误')} (码: {error.get('code')})")
        
        return result["data"]["item_get_response"]["item"]
        
    except requests.exceptions.Timeout:
        raise Exception("请求超时,请检查网络或稍后重试")
    except Exception as e:
        raise Exception(f"请求异常: {str(e)}")# ==================== 调用示例 ====================if __name__ == "__main__":
    # 1688商品ID(从商品链接中获取)
    test_item_id = "689712345678"
    
    # 指定需要的字段(优化性能)
    target_fields = (
        "item_id,title,price,min_order_quantity,max_order_quantity,"
        "pic_url,item_imgs,sku_list,supplier_info,logistics_info,"
        "sales_info,status,props"
    )
    
    try:
        item = get_item_detail(test_item_id, target_fields)
        
        print("=" * 50)
        print(f"【商品标题】{item.get('title')}")
        print(f"【批发价】¥{item.get('price')}")
        print(f"【起订量】{item.get('min_order_quantity')} 件")
        print(f"【最大订购量】{item.get('max_order_quantity')} 件")
        print(f"【商品状态】{'在售' if item.get('status') == 'on_sale' else '下架'}")
        
        # 解析供应商信息
        supplier = item.get('supplier_info', {})
        print(f"\n【供应商】{supplier.get('supplier_name')}")
        print(f"【所在地】{supplier.get('province')} {supplier.get('city')}")
        print(f"【店铺类型】{supplier.get('supplier_type')}")
        
        # 解析SKU信息
        sku_list = item.get('sku_list', [])
        if sku_list:
            print(f"\n【SKU规格】共 {len(sku_list)} 个规格")
            for sku in sku_list[:3]:  # 仅展示前3个
                print(f"  - {sku.get('sku_spec')}: ¥{sku.get('sku_price')} (库存: {sku.get('sku_stock')})")
        
        # 解析物流信息
        logistics = item.get('logistics_info', {})
        print(f"\n【物流】{logistics.get('delivery_time', 'N/A')}")
        print(f"【运费】¥{logistics.get('freight', '0.00')}")
        
    except Exception as e:
        print(f"获取失败: {e}")

Java调用示例

java
复制
import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;import java.io.IOException;import java.net.URLEncoder;import java.text.SimpleDateFormat;import java.util.*;public class Item1688ApiClient {
    
    private final String appKey;
    private final String appSecret;
    private static final String API_URL = 
        "https://gw.open.1688.com/openapi/param2/2/portals.open/api.item.get/%s";
    
    public Item1688ApiClient(String appKey, String appSecret) {
        this.appKey = appKey;
        this.appSecret = appSecret;
    }
    
    public JSONObject getItemDetail(String offerId, String fields) throws Exception {
        Map<String, String> params = new HashMap<>();
        params.put("app_key", appKey);
        params.put("method", "portals.open.api.item.get");
        params.put("format", "json");
        params.put("v", "1.0");
        params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        params.put("offerId", offerId);
        
        if (fields != null && !fields.isEmpty()) {
            params.put("fields", fields);
        }
        
        // 生成签名
        String sign = generateSign(params, appSecret);
        params.put("sign", sign);
        
        // 发送请求
        String response = sendPostRequest(String.format(API_URL, appKey), params);
        JSONObject result = JSON.parseObject(response);
        
        if (result.containsKey("error_response")) {
            JSONObject error = result.getJSONObject("error_response");
            throw new RuntimeException("API调用失败: " + error.getString("msg"));
        }
        
        return result.getJSONObject("item_get_response");
    }
    
    private String generateSign(Map<String, String> params, String secret) {
        List<String> keys = new ArrayList<>(params.keySet());
        Collections.sort(keys);
        
        StringBuilder sb = new StringBuilder(secret);
        for (String key : keys) {
            String value = params.get(key);
            if (value != null && !value.isEmpty()) {
                sb.append(key).append(value);
            }
        }
        sb.append(secret);
        
        return org.apache.commons.codec.digest.DigestUtils.md5Hex(sb.toString()).toUpperCase();
    }
    
    private String sendPostRequest(String url, Map<String, String> params) throws IOException {
        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost post = new HttpPost(url);
        
        StringBuilder formData = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            if (formData.length() > 0) formData.append("&");
            formData.append(entry.getKey()).append("=")
                   .append(URLEncoder.encode(entry.getValue(), "UTF-8"));
        }
        
        post.setEntity(new StringEntity(
            formData.toString(), 
            "application/x-www-form-urlencoded", 
            "UTF-8"
        ));
        
        try (CloseableHttpResponse response = client.execute(post)) {
            return EntityUtils.toString(response.getEntity(), "UTF-8");
        }
    }}

六、核心返回字段解析

1. 商品基础信息

表格
字段类型说明示例
item_idString商品唯一ID"689712345678"
titleString商品标题(含起批/定制信息)"2026夏季纯棉T恤 10件起批 可定制"
priceString基础批发价"19.90"
pic_urlString主图URLhttps://cbu01.alicdn.com/xxx.jpg
item_imgsArray商品图集列表包含多张图片URL
statusString商品状态on_sale / off_sale

2. B2B批发专属字段

表格
字段类型说明示例
min_order_quantityInteger最小起订量(MOQ)10
max_order_quantityInteger最大订购量9999
trade_typeString交易类型wholesale(批发)/ retail(零售)
price_rangesArray阶梯价格表[{"startQuantity":10,"price":18.0},{"startQuantity":100,"price":15.0}]

3. SKU规格信息

JSON
复制
{
  "sku_list": [
    {
      "sku_id": "987654321012",
      "sku_spec": "白色-L",
      "sku_price": "19.90",
      "sku_stock": 5000,
      "available_stock": 4980,
      "sku_properties": [
        {"prop_name": "颜色", "value": "白色"},
        {"prop_name": "尺码", "value": "L"}
      ]
    }
  ]}

4. 供应商信息

表格
字段说明
supplier_info.supplier_name供应商/工厂名称
supplier_info.supplier_type店铺类型:factory(工厂)/ trading(贸易商)
supplier_info.province / city所在地
supplier_info.credit_level诚信通等级

5. 物流与包装信息

表格
字段说明来源
logistics_info.freight运费金额官方API
logistics_info.delivery_time发货时效官方API
shipping_info.unitWeight单位重量(kg)官方API
shipping_info.packageSize包装尺寸(长x宽x高 cm)官方API
packing / packingSize包装方式/尺寸第三方聚合API 
注意:官方API的包装字段较为基础,详细的包装方式(如独立包装、彩盒、纸箱等)通常需要在 attributesdescription 中解析

七、高频异常与解决方案

表格
错误码/现象原因解决方案
403 ForbiddenIP白名单未配置或配置错误检查开放平台控制台中的IP白名单设置
400 Invalid Signature签名生成错误检查参数排序、编码、AppSecret是否正确
401 UnauthorizedAccess Token失效或权限未申请重新获取Token,确认接口权限已审核通过
429 Rate Limit调用频率超限个人号100次/天,企业号5000次/天 
;建议加入限流和缓存机制
item not found商品ID错误或商品已下架校验商品ID有效性,检查商品状态
返回数据缺失使用了fields参数过滤检查fields是否包含所需字段
供应商信息为空个人开发者权限不足升级为企业认证以获取完整供应商数据

八、性能优化与最佳实践

1. 调用频率控制

  • 官方限制:普通应用QPS为1,企业应用QPS为5
  • 建议策略
    • 批量调用时加入 time.sleep(1) 控制速率
    • 使用本地缓存(Redis/Memcached)减少重复请求
    • 对非实时数据设置合理缓存时间(如30分钟)

2. 数据获取策略

Python
复制
# 推荐:搜索+详情组合调用流程def batch_sync_items(keyword: str):
    # 第一步:搜索获取商品ID列表
    search_result = item_search(q=keyword, page=1)
    item_ids = [item['num_iid'] for item in search_result['items']]
    
    # 第二步:批量获取详情(带限流)
    for item_id in item_ids:
        detail = get_item_detail(item_id, fields="item_id,title,price,sku_list")
        save_to_database(detail)
        time.sleep(1.2)  # 控制QPS < 1

3. 生产环境建议

  1. 异步处理:使用消息队列(RabbitMQ/Kafka)削峰填谷
  2. 异常重试:网络超时自动重试3次,指数退避
  3. 数据校验:对接口返回的关键字段做非空校验
  4. 日志监控:记录API调用耗时、成功率、错误码分布

九、相关接口扩展

表格
接口名称功能配合场景
1688.item_search关键词搜索商品列表选品时先搜索再逐个获取详情 
1688.item_search_img以图搜商品找同款/竞品分析
alibaba.item.sku.get单独获取SKU详情精细化库存监控 
alibaba.item.detail.get获取详情页富文本内容解析与展示 
seller_info获取店铺/供应商详情供应商资质评估 

十、总结

1688.item_get 是连接1688批发生态与第三方系统的核心技术通道。其核心价值不仅在于获取商品表面信息,更在于深入B2B供应链层面,提供批发价梯度、起订量、供应商资质等专属数据
开发者在接入时需注意:
  1. 权限先行:企业认证+接口权限申请是必经之路
  2. 签名正确:MD5签名生成是调用成功的关键
  3. 按需取数:通过 fields 参数优化响应性能
  4. 合规调用:遵守频率限制,避免触发风控
通过合理运用该接口,可高效实现选品、铺货、比价、ERP同步等B2B电商核心场景的数据自动化处理。


群贤毕至

访客