当前位置: 首页 > news >正文

1688 包装运费尺寸接口开发实战指南

在跨境电商、供应链管理和 ERP 系统集成中,获取 1688 商品的包装、运费和尺寸信息是核心需求。本文将系统性地介绍如何通过官方 API 和第三方方案获取这些数据,并提供完整的代码实现。
一、接口体系概览
1688 的包装、运费和尺寸信息主要通过商品详情类 API 获取,而非独立接口。数据分散在不同字段中,需要根据业务场景选择合适的接入方案。

接口类型 核心接口 包装/运费/尺寸相关字段 数据覆盖度
官方开放平台 alibaba.product.get shippingInfo 中的重量、尺寸、运费模板 基础信息
第三方聚合 API 1688.item_get weight、packing、packingSize、grossWeight、post_fee 完整包装规格 + 运费
物流订单 API alibaba.trade.getLogisticsInfos.buyerView 物流单号、承运商、收发件信息 订单级物流跟踪
二、官方开放平台:商品包装信息获取
2.1 接入准备
访问 1688 开放平台 注册企业开发者账号
创建应用,获取 App Key 和 App Secret
申请 alibaba.product.get 接口权限
通过 OAuth2.0 获取 Access Token
2.2 核心请求参数

参数名 类型 必选 说明 示例值
app_key String 是 应用唯一标识 12345678
method String 是 接口方法名 com.alibaba.product.alibaba.product.get
timestamp String 是 时间戳 2026-06-17 10:00:00
v String 是 API 版本 2.0
sign String 是 MD5 签名 见下方生成逻辑
productId Long 是 1688 商品 ID 619899292404
fields String 否 指定返回字段 shippingInfo,saleInfo,attributes
2.3 签名生成算法
1688 官方 API 采用 MD5 签名,规则如下:
plain
sign = MD5(app_secret + key1value1 + key2value2 + ... + app_secret).toUpperCase()
注意:参数值需进行 URL 编码,参数按 key 升序排列。
2.4 完整调用代码(Python)
Python
import time
import hashlib
import urllib.parse
import requests
import json
from typing import Dict, Optional

class Official1688API:
"""
1688 官方开放平台 API 客户端
用于获取商品包装、运费、尺寸等基础信息
"""

GATEWAY_URL = "https://gw.open.1688.com/openapi/param2/1/com.alibaba.product/alibaba.product.get"

def init(self, app_key: str, app_secret: str, access_token: str):
self.app_key = app_key
self.app_secret = app_secret
self.access_token = access_token

def _generate_sign(self, params: dict) -> str:
"""
生成 1688 官方 API 的 MD5 签名
"""
# 过滤空值并排序
sorted_params = sorted(
[(k, v) for k, v in params.items() if v is not None and k != "sign"],
key=lambda x: x[0]
)

拼接签名字符串

sign_str = self.app_secret
for key, value in sorted_params:
encoded_value = urllib.parse.quote(str(value), safe='')
sign_str += f"{key}{encoded_value}"
sign_str += self.app_secret

MD5 加密并转大写

return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()

def get_product_shipping_info(self, product_id: str, fields: str = None) -> Dict:
"""
获取商品包装、运费、尺寸信息

:param product_id: 1688 商品 ID
:param fields: 指定返回字段,如 "shippingInfo,saleInfo,attributes"
:return: 解析后的包装信息
"""
timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

params = {
"app_key": self.app_key,
"method": "com.alibaba.product.alibaba.product.get",
"timestamp": timestamp,
"v": "2.0",
"format": "json",
"sign_method": "md5",
"access_token": self.access_token,
"productId": product_id,
}

if fields:
params["fields"] = fields

生成签名

params["sign"] = self._generate_sign(params)

try:
response = requests.post(self.GATEWAY_URL, data=params, timeout=30)
response.raise_for_status()
data = response.json()

解析包装相关字段

return self._parse_shipping_data(data, product_id)

except requests.exceptions.RequestException as e:
return {
"success": False,
"error": f"请求异常: {str(e)}",
"product_id": product_id
}

def _parse_shipping_data(self, raw_data: dict, product_id: str) -> Dict:
"""
从官方 API 返回数据中解析包装、运费、尺寸信息
"""
product_info = raw_data.get("productinfo", {})
shipping = product_info.get("shippingInfo", {})
sale_info = product_info.get("saleInfo", {})
attributes = product_info.get("attributes", [])

从 attributes 中提取包装相关属性

packaging_attrs = {}
for attr in attributes:
attr_name = attr.get("attributeName", "")
if any(kw in attr_name for kw in ["包装", "重量", "体积", "尺寸", "运费"]):
packaging_attrs[attr_name] = attr.get("value")

return {
"success": True,
"source": "official_api",
"product_id": product_id,
"product_title": product_info.get("subject"),

核心包装/尺寸字段

"unit_weight_kg": shipping.get("unitWeight"), # 单位重量(千克)
"package_size_cm": shipping.get("packageSize"), # 包装尺寸(长x宽x高)
"volume_cm3": shipping.get("volume"), # 体积(立方厘米)

运费相关

"freight_template_id": shipping.get("freightTemplateID"), # 运费模板 ID
"send_goods_address": shipping.get("sendGoodsAddress"), # 发货地址

销售信息

"min_order_quantity": sale_info.get("minOrderQuantity"), # 最小起订量
"unit": sale_info.get("unit"), # 计量单位
"price_ranges": sale_info.get("priceRanges"), # 阶梯价格

扩展属性

"packaging_attributes": packaging_attrs,
"raw_data": raw_data
}

==================== 使用示例 ====================

if name == "main":
api = Official1688API(
app_key="your_app_key",
app_secret="your_app_secret",
access_token="your_access_token"
)

result = api.get_product_shipping_info(
product_id="619899292404",
fields="productID,subject,shippingInfo,saleInfo,attributes"
)

print(json.dumps(result, ensure_ascii=False, indent=2))
2.5 官方 API 返回字段说明
表格
字段路径 含义 示例值 应用场景
shippingInfo.unitWeight 单位重量(kg) 1.5 计算单品运费、仓储规划
shippingInfo.packageSize 包装尺寸(cm) 10x20x50 物流计费、货架规划
shippingInfo.volume 体积(立方厘米) 10000 体积重计算
shippingInfo.freightTemplateID 运费模板 ID 11754104 查询运费规则
shippingInfo.sendGoodsAddress 发货地址 {"province":"浙江","city":"杭州"} 计算运输距离
saleInfo.priceRanges 阶梯价格 [{"startQuantity":3,"price":8.0}] 采购成本核算
注意:官方 API 的包装字段较为基础,详细的包装方式(如独立包装、彩盒、纸箱等)通常需要在 attributes 或 description 中解析。
三、第三方聚合 API:完整包装规格获取
由于官方 API 对包装信息的限制,实际开发中更推荐使用第三方聚合 API,它们整合了完整的包装规格、运费和尺寸数据。
3.1 常见第三方 API 字段映射
表格
通用含义 AliPrice VV-Tool 其他常见命名
商品净重 weight unitWeight item_weight、netWeight
商品毛重 grossWeight - gross_weight、totalWeight
包装方式 packing - packagingType、packageStyle
单品包装尺寸 packingSize packageSize item_size、unitSize
外箱尺寸 cartonSize - outerCartonSize、boxSize
每箱数量 cartonQty - quantityPerCarton
体积 - volume cubicVolume
邮费 post_fee - shipping_fee
快递费 express_fee - express_fee
EMS 费用 ems_fee - ems_fee
3.2 第三方 API 封装代码
Python
import requests
import re
from typing import Dict, Optional

class ThirdParty1688API:
"""
1688 第三方聚合 API 客户端
支持 AliPrice、VV-Tool 等多种数据源
"""

def init(self, api_key: str, provider: str = "aliprice"):
self.api_key = api_key
self.provider = provider

不同提供商的 API 端点

self.endpoints = {
"aliprice": "https://www.aliprice.com/items/itemDetail",
"vv_tool": "http://api.vv-tool.com/tool/erps/product1688get",
"o0b_cn": "https://o0b.cn/ibrad/1688/item_get/"
}

def get_full_packaging_info(self, product_id: str) -> Dict:
"""
获取完整的包装、运费、尺寸信息
"""
try:
if self.provider == "aliprice":
data = self._call_aliprice(product_id)
elif self.provider == "vv_tool":
data = self._call_vv_tool(product_id)
else:
data = self._call_generic(product_id)

return self._normalize_packaging_data(data, product_id)

except Exception as e:
return {
"success": False,
"error": str(e),
"product_id": product_id
}

def _call_aliprice(self, product_id: str) -> dict:
"""调用 AliPrice API"""
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
payload = {
"offerId": product_id,
"includePackaging": True,
"includeSku": True
}
response = requests.post(
self.endpoints["aliprice"],
headers=headers,
json=payload,
timeout=30
)
response.raise_for_status()
return response.json()

def _call_vv_tool(self, product_id: str) -> dict:
"""调用 VV-Tool API"""
headers = {"Authorization": f"Bearer {self.api_key}"}
params = {"productId": product_id}
response = requests.get(
self.endpoints["vv_tool"],
headers=headers,
params=params,
timeout=30
)
response.raise_for_status()
return response.json()

def _normalize_packaging_data(self, raw_data: dict, product_id: str) -> Dict:
"""
标准化不同来源的包装数据
"""
# 适配不同响应结构
item = raw_data.get("item", raw_data)

提取重量(统一转换为 kg)

net_weight = self._extract_weight(item.get("weight") or item.get("unitWeight"))
gross_weight = self._extract_weight(item.get("grossWeight"))

提取尺寸

unit_size = item.get("packingSize") or item.get("packageSize")
carton_size = item.get("cartonSize")

提取运费

post_fee = item.get("post_fee", 0)
express_fee = item.get("express_fee", 0)
ems_fee = item.get("ems_fee", 0)

计算物流指标

logistics = {}
if carton_size and gross_weight:
logistics = self._calculate_logistics_metrics(carton_size, gross_weight)

return {
"success": True,
"source": f"third_party_{self.provider}",
"product_id": product_id,
"title": item.get("title"),

重量信息

"net_weight_kg": net_weight,
"gross_weight_kg": gross_weight,

尺寸信息

"unit_package_size": unit_size, # 单品包装尺寸,如 "10205cm"
"carton_dimensions": carton_size, # 外箱尺寸,如 "504030cm"
"volume_cm3": item.get("volume"),

包装方式

"packing_type": item.get("packing") or item.get("packagingType"),
"quantity_per_carton": item.get("cartonQty"),

运费信息

"shipping_fees": {
"post_fee": post_fee, # 普通邮费
"express_fee": express_fee, # 快递费
"ems_fee": ems_fee, # EMS 费用
"shipping_to": item.get("shipping_to") # 发货至
},

物流分析

"logistics_analysis": logistics,

"raw_data": raw_data
}

@staticmethod
def _extract_weight(weight_val) -> Optional[float]:
"""从字符串中提取数值型重量,统一为 kg"""
if not weight_val:
return None
if isinstance(weight_val, (int, float)):
return float(weight_val)

处理字符串如 "0.8kg"、"1.2KG"、"800g"

match = re.search(r'(\d+.?\d*)', str(weight_val))
if not match:
return None

value = float(match.group(1))
weight_str = str(weight_val).lower()

if 'g' in weight_str and 'kg' not in weight_str:
value = value / 1000 # 克转千克

return round(value, 3)

@staticmethod
def _calculate_logistics_metrics(carton_size: str, actual_weight: float) -> Dict:
"""
基于包装尺寸和重量计算物流指标
"""
try:
# 解析尺寸(格式:504030cm 或 50x40x30)
dims = [float(x) for x in re.split(r'[xX*×]', carton_size.replace('cm', '').strip())]
if len(dims) != 3:
return {}

length, width, height = dims

计算体积重(快递行业标准:体积重 = 长高 / 5000)

volume_weight = (length * width * height) / 5000

计费重量 = max(体积重, 实际重量)

chargeable_weight = max(volume_weight, actual_weight)

return {
"carton_length_cm": length,
"carton_width_cm": width,
"carton_height_cm": height,
"carton_volume_m3": round(length * width * height / 1000000, 4),
"volume_weight_kg": round(volume_weight, 2),
"actual_weight_kg": actual_weight,
"chargeable_weight_kg": round(chargeable_weight, 2),
"dimensional_factor": "1:5000",
"suitable_shipping": "express" if chargeable_weight < 20 else "freight",
"stackable": height < 60 # 高度小于60cm适合堆叠
}
except Exception:
return {}

==================== 使用示例 ====================

if name == "main":
api = ThirdParty1688API(
api_key="your_third_party_key",
provider="aliprice"
)

result = api.get_full_packaging_info("1234567890")

if result["success"]:
print(f"商品: {result['title']}")
print(f"净重: {result['net_weight_kg']} kg")
print(f"毛重: {result['gross_weight_kg']} kg")
print(f"包装方式: {result['packing_type']}")
print(f"单品尺寸: {result['unit_package_size']}")
print(f"外箱尺寸: {result['carton_dimensions']}")
print(f"邮费: ¥{result['shipping_fees']['post_fee']}")

logistics = result.get("logistics_analysis", {})
if logistics:
print(f"\n物流分析:")
print(f" 体积重: {logistics['volume_weight_kg']} kg")
print(f" 计费重量: {logistics['chargeable_weight_kg']} kg")
print(f" 推荐运输方式: {'快递' if logistics['suitable_shipping'] == 'express' else '货运'}")
else:
print(f"获取失败: {result['error']}")
四、物流订单 API:获取实际运费和物流跟踪
对于已成交的订单,可通过 alibaba.trade.getLogisticsInfos.buyerView 接口获取实际物流信息。
4.1 接口说明
表格
参数 类型 必选 说明
orderId Long 是 1688 订单号
fields String 否 指定返回字段:company.name,sender,receiver,sendgood
webSite String 是 1688 或 alibaba
access_token String 是 买家授权令牌
_aop_signature String 是 请求签名
4.2 调用代码
Python
class LogisticsOrderAPI:
"""
1688 物流订单查询 API
用于获取已成交订单的实际物流信息
"""

GATEWAY_URL = "https://gw.open.1688.com/openapi/param2/1/com.alibaba.logistics/alibaba.trade.getLogisticsInfos.buyerView"

def init(self, app_key: str, app_secret: str, access_token: str):
self.app_key = app_key
self.app_secret = app_secret
self.access_token = access_token

def get_logistics_info(self, order_id: str, fields: str = None) -> Dict:
"""
获取订单物流详情

:param order_id: 1688 订单号
:param fields: 返回字段,如 "company.name,sender,receiver,sendgood"
"""
from official_api import Official1688API # 复用签名方法

timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

params = {
"app_key": self.app_key,
"method": "com.alibaba.logistics.alibaba.trade.getLogisticsInfos.buyerView",
"timestamp": timestamp,
"v": "1",
"format": "json",
"sign_method": "md5",
"access_token": self.access_token,
"orderId": order_id,
"webSite": "1688"
}

if fields:
params["fields"] = fields

生成签名(复用 Official1688API 的签名逻辑)

signer = Official1688API(self.app_key, self.app_secret, self.access_token)
params["sign"] = signer._generate_sign(params)

try:
response = requests.post(self.GATEWAY_URL, data=params, timeout=30)
response.raise_for_status()
data = response.json()

if data.get("success"):
return {
"success": True,
"order_id": order_id,
"logistics_list": data.get("result", []),
"raw_data": data
}
else:
return {
"success": False,
"error": data.get("errorMessage"),
"error_code": data.get("errorCode")
}

except requests.exceptions.RequestException as e:
return {
"success": False,
"error": f"请求异常: {str(e)}"
}
4.3 返回字段说明
表格
字段 含义 示例值
logisticsId 物流单号 BX111841674232006
status 物流状态 SIGN(已签收)
logisticsCompanyId 物流公司 ID 8
sendGoods 发货商品明细 含商品名称、数量、单位
receiver 收件人信息 地址、电话、姓名
sender 发件人信息 地址、电话、姓名
五、统一封装:智能运费计算引擎
将上述能力整合,构建一个支持多数据源、自动计算运费的统一接口:
Python
class SmartFreightCalculator:
"""
1688 智能运费计算引擎
整合官方 API + 第三方 API,自动选择最优数据源
"""

def init(self, official_api: Official1688API = None,
third_party_api: ThirdParty1688API = None):
self.official = official_api
self.third_party = third_party_api

def calculate_freight(self, product_id: str, quantity: int = 1,
destination: str = None) -> Dict:
"""
计算商品运费

:param product_id: 1688 商品 ID
:param quantity: 购买数量
:param destination: 目的地(用于运费模板匹配)
"""
# 优先使用第三方 API(数据更完整)
if self.third_party:
packaging = self.third_party.get_full_packaging_info(product_id)
if packaging.get("success"):
return self._calculate_from_third_party(packaging, quantity, destination)

回退到官方 API

if self.official:
shipping = self.official.get_product_shipping_info(product_id)
if shipping.get("success"):
return self._calculate_from_official(shipping, quantity, destination)

return {"success": False, "error": "无可用数据源"}

def _calculate_from_third_party(self, data: dict, quantity: int, destination: str) -> Dict:
"""基于第三方 API 数据计算运费"""
fees = data.get("shipping_fees", {})
logistics = data.get("logistics_analysis", {})

基础运费(取邮费或快递费)

base_fee = fees.get("express_fee", 0) or fees.get("post_fee", 0)

按数量计算(假设阶梯运费)

total_fee = base_fee * max(1, quantity / (data.get("quantity_per_carton") or 1))

按重量计算(快递续重)

chargeable_weight = logistics.get("chargeable_weight_kg", 0) * quantity
weight_fee = self._estimate_weight_fee(chargeable_weight)

return {
"success": True,
"product_id": data["product_id"],
"quantity": quantity,
"destination": destination,
"freight_details": {
"base_fee": round(base_fee, 2),
"weight_fee": round(weight_fee, 2),
"estimated_total": round(max(total_fee, weight_fee), 2)
},
"packaging_info": {
"unit_weight": data.get("net_weight_kg"),
"total_weight": round(data.get("gross_weight_kg", 0) * quantity, 2),
"chargeable_weight": round(chargeable_weight, 2)
}
}

@staticmethod
def _estimate_weight_fee(weight_kg: float) -> float:
"""估算续重运费(简化模型)"""
if weight_kg <= 1:
return 8.0 # 首重
return 8.0 + (weight_kg - 1) * 4.0 # 续重 4元/kg

==================== 完整使用示例 ====================

if name == "main":
# 初始化 API 客户端
official = Official1688API(
app_key="your_app_key",
app_secret="your_app_secret",
access_token="your_token"
)

third_party = ThirdParty1688API(
api_key="your_third_party_key",
provider="aliprice"
)

创建运费计算器

calculator = SmartFreightCalculator(official, third_party)

计算运费

result = calculator.calculate_freight(
product_id="1234567890",
quantity=100,
destination="广东省深圳市"
)

print(json.dumps(result, ensure_ascii=False, indent=2))
六、常见问题与解决方案
表格
问题现象 可能原因 解决方案
官方 API 返回包装信息为空 商家未填写或字段权限不足 使用第三方 API 或联系商家补充
重量单位不一致(kg/g) 不同接口标准不同 统一转换为千克(kg)存储
尺寸格式不统一 商家录入习惯差异 正则解析并标准化为厘米
运费与实际不符 运费模板未匹配目的地 结合 freightTemplateID 查询详细运费规则
API 调用频率受限 官方 API 限流(默认 1000 次/天) 使用第三方 API 或申请提升额度
跨境包裹重量差异 1688 字段为预估重量 实际发货前称重校准
七、最佳实践建议
数据标准化:建立包装信息标准库,将"彩盒"、"color box"、"纸盒"等映射为统一编码
多源校验:官方 API + 第三方 API 双重校验,确保数据准确性
缓存策略:包装信息变更频率低,建议缓存 6-24 小时,减少 API 调用成本
异常兜底:商家未填写包装信息时,设置默认值或标记为"需人工确认"
合规注意:通过官方 API 或授权第三方获取数据,避免未经授权的爬虫导致法律风险
八、扩展应用场景
基于包装运费尺寸 API 可构建以下应用:
智能运费计算:根据重量、尺寸、目的地自动选择最优物流方案
仓储优化:基于包装尺寸计算货架空间需求,优化仓库布局
采购决策:对比不同供应商的包装规格,选择物流成本最低的方案
报关自动化:自动生成报关所需的重量、尺寸、包装类型数据
碳足迹计算:基于重量和运输距离计算碳排放量
如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系。

http://www.jsqmd.com/news/1031176/

相关文章:

  • 上海本科留学中介公司:首发 - 品牌推广大师
  • 上海闲置手表变现打分榜:实地走访 8 家门店,看似高价报价全藏猫腻 - 逸程
  • 2026深圳宝安钻石回收避坑,逸程教看荧光级 - 逸程
  • FlicFlac:基于命令行编解码器的Windows便携式音频格式转换方案
  • 2026精华水测评指南:万本精华聚焦保湿修护,改善干燥泛红屏障受损 - 博客万
  • GEO生成式搜索优化选择指南:服务商评估标准及选购误区 - 资讯快报
  • 2026 昆明黄金回收怎么选?避坑技巧 + 合规门店一次讲清 - 奢侈品回收评测
  • 终极RPCS3模拟器完全指南:从安装到高级配置的完整教程
  • ZigBee OTA升级实战:协议栈配置、事件处理与调试指南
  • 深度解析MiroFish:群体智能如何重新定义未来预测的终极工具
  • 2026襄阳瓷砖空鼓修复公司|免砸砖注浆上门维修,厨卫/客厅/外墙地砖起翘修补 - 防水空鼓维修家
  • 2026中山代办注册公司哪家好及优质代理记账公司盘点 - 栗子测评
  • 嵌入式功能安全认证实战:栈、TSI与看门狗测试原理与实现
  • 常见阵列卡型号与芯片型号对应关系
  • 终极指南:如何在5分钟内将PC游戏串流到任天堂Switch
  • 2026北京酒店设备回收公司 实测 - LYL仔仔
  • 长视频怎么自动切成短视频?2026年AI智能切片工具对比
  • 3PP防腐钢管专业厂家怎么选?4大清单参考 - 博客万
  • 合肥哪家中专升学好?2026 优选合肥腾飞职业技术学校 - 辛云教育资讯
  • 单人出海运营指南:多语种短剧轻量化项目管理教程
  • 揭阳汽车贴膜避坑要点|和兴汽车玻璃贴膜本地实操总结 - 百航
  • 商人宝移动订货系统:多语言+本地化适配,助力泰国、印尼批发商高效订货
  • 会议租车常见问题解答(2026专家版) - 资讯快报
  • 2026主流圆柱体UV打印机对比评测,源头厂家怎么选 - 博客万
  • 2026大连钻石回收门店评级|7家合规机构测评分级,钻石变现择优选择 - 薛定谔的梨花猫
  • RedPill RR引导器:三分钟实现群晖DSM在普通硬件上的高效部署
  • 南宁装修哪家靠谱?2026 口碑与施工实力参考榜单 - 装修新知
  • 面波处理方法-每日实验log
  • 企业级单点登录实战:基于SAML与Azure AD的mscso配置与排错指南
  • 2026年6月正规的乳化泵品牌推荐,乳化机/螺带混合机/卧式混合机/静态混合器/输送机/混合机,乳化泵厂家推荐分析 - 品牌推荐师