一、接口概述
1688.item_get(官方名称为 alibaba.item.get)是1688开放平台提供的核心商品详情查询接口,用于根据商品ID获取1688批发商品的全维度结构化数据 。该接口区别于淘宝等C端电商API,深度适配B2B批发场景,涵盖起订量(MOQ)、阶梯价格、供应商资质等批发专属字段 。
适用场景
- 选品铺货:批量获取商品数据上架至自建商城或跨境平台
- 价格监控:实时追踪竞品批发价与库存变动
- ERP同步:将1688商品信息同步至企业内部采购系统
- 供应链分析:评估供应商资质与产能信息
二、接入前置条件
1. 账号与权限准备
在调用接口前,需完成以下步骤 :
| 步骤 | 操作内容 | 注意事项 |
|---|
| 注册认证 | 访问1688 注册开发者账号 | 企业认证配额更高,个人开发者权限受限 |
| 创建应用 | 在控制台创建"服务端应用" | 审核通过后获取 App Key 和 App Secret |
| 申请权限 | 申请 alibaba.item.get 接口权限 | 2026年需提交数据使用场景说明,审核1-3个工作日 |
| 配置白名单 | 设置服务器出口IP白名单 | 遗漏将直接返回 403 Forbidden |
| 获取Token | 通过OAuth2.0授权获取Access Token | 企业用户需走服务商授权流程 |
2. 接口版本说明
- 稳定版:2.0(2026年主推版本)
- 1.0版本:已不返回运费、起批量等核心字段,建议升级
- 请求地址:注册账户获取key
三、接口参数详解
1. 公共参数(必传)
| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|---|
app_key | String | 是 | 应用唯一标识 | 12345678 |
method | String | 是 | 接口方法名 | alibaba.item.get |
timestamp | String | 是 | 时间戳 | 2026-04-29 17:04:00 |
v | String | 是 | API版本 | 2.0 |
format | String | 是 | 响应格式 | json |
sign_method | String | 是 | 签名方式 | md5 |
sign | String | 是 | MD5签名 | E4F2G3H4... |
2. 业务参数
| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|---|
item_id / num_iid | Long | 是 | 1688商品ID | 689712345678 |
fields | String | 否 | 指定返回字段(优化性能) | item_id,title,price,sku_list |
lang | String | 否 | 返回语言 | cn(默认)/ en / ru |
性能建议:通过 fields 参数按需指定返回字段,可显著减少响应体积和解析时间 。
四、签名生成规则
签名是调用1688 API的核心安全机制,生成步骤如下 :
Python签名实现
Python复制
import hashlib
def 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实战代码
import requests
import time
import 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调用示例
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_id | String | 商品唯一ID | "689712345678" |
title | String | 商品标题(含起批/定制信息) | "2026夏季纯棉T恤 10件起批 可定制" |
price | String | 基础批发价 | "19.90" |
pic_url | String | 主图URL | https://cbu01.alicdn.com/xxx.jpg |
item_imgs | Array | 商品图集列表 | 包含多张图片URL |
status | String | 商品状态 | on_sale / off_sale |
2. B2B批发专属字段
| 字段 | 类型 | 说明 | 示例 |
|---|
min_order_quantity | Integer | 最小起订量(MOQ) | 10 |
max_order_quantity | Integer | 最大订购量 | 9999 |
trade_type | String | 交易类型 | wholesale(批发)/ retail(零售) |
price_ranges | Array | 阶梯价格表 | [{"startQuantity":10,"price":18.0},{"startQuantity":100,"price":15.0}] |
3. SKU规格信息
{
"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的包装字段较为基础,详细的包装方式(如独立包装、彩盒、纸箱等)通常需要在 attributes 或 description 中解析 。
七、高频异常与解决方案
| 错误码/现象 | 原因 | 解决方案 |
|---|
403 Forbidden | IP白名单未配置或配置错误 | 检查开放平台控制台中的IP白名单设置 |
400 Invalid Signature | 签名生成错误 | 检查参数排序、编码、AppSecret是否正确 |
401 Unauthorized | Access 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. 数据获取策略
# 推荐:搜索+详情组合调用流程
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. 生产环境建议
- 异步处理:使用消息队列(RabbitMQ/Kafka)削峰填谷
- 异常重试:网络超时自动重试3次,指数退避
- 数据校验:对接口返回的关键字段做非空校验
- 日志监控:记录API调用耗时、成功率、错误码分布
九、相关接口扩展
| 接口名称 | 功能 | 配合场景 |
|---|
1688.item_search | 关键词搜索商品列表 | 选品时先搜索再逐个获取详情 |
1688.item_search_img | 以图搜商品 | 找同款/竞品分析 |
alibaba.item.sku.get | 单独获取SKU详情 | 精细化库存监控 |
alibaba.item.detail.get | 获取详情页富文本 | 内容解析与展示 |
seller_info | 获取店铺/供应商详情 | 供应商资质评估 |
十、总结
1688.item_get 是连接1688批发生态与第三方系统的核心技术通道。其核心价值不仅在于获取商品表面信息,更在于深入B2B供应链层面,提供批发价梯度、起订量、供应商资质等专属数据 。
开发者在接入时需注意:
- 权限先行:企业认证+接口权限申请是必经之路
- 签名正确:MD5签名生成是调用成功的关键
- 按需取数:通过 fields 参数优化响应性能
- 合规调用:遵守频率限制,避免触发风控
- 通过合理运用该接口,可高效实现选品、铺货、比价、ERP同步等B2B电商核心场景的数据自动化处理。