速卖通(AliExpress)作为阿里巴巴旗下的跨境电商平台,其开放平台提供了丰富的 API 接口,支持开发者对接商品管理、订单处理、物流跟踪等核心业务。以下从 API 特性分析和 Python 脚本实现两方面进行说明。
一、速卖通 API 接口核心特性分析
- 接口体系与功能范围
速卖通 API 基于开放平台架构,主要覆盖六大业务领域(参考速卖通开放平台文档):
商品管理:创建 / 编辑商品、获取商品列表、库存更新等(如aliexpress.product.redefining.findproductbyid查询商品详情);
订单管理:订单查询、订单状态更新、发货操作等(如aliexpress.trade.redefining.findorderlistbypage分页查询订单);
营销活动:店铺优惠券、限时折扣等活动管理(如aliexpress.promotion.coupon.redefining.querycoupon查询优惠券);
物流服务:物流模板查询、物流信息跟踪(如aliexpress.logistics.redefining.getlogisticstrackinginfo获取物流跟踪);
店铺运营:店铺信息查询、评价管理等;
数据分析:商品销售数据、流量分析等(需特殊权限)。 - 认证与授权机制
速卖通 API 采用AppKey + AppSecret + Access Token的三层认证体系:
开发者注册并创建应用,获取AppKey(应用标识)和AppSecret(密钥);
通过 OAuth 2.0 流程获取Access Token(访问令牌,有效期 24 小时),用于接口调用;
每次请求需携带AppKey、Access Token及签名参数,确保身份合法性。 - 接口规范与签名机制
请求格式:
协议:HTTPS;
方法:以 POST 为主(部分查询接口支持 GET);
数据格式:请求参数需封装为 JSON,响应为 JSON 格式。
签名规则(核心防篡改机制):
收集所有请求参数(包括公共参数和接口私有参数);
按参数名 ASCII 升序排序;
拼接为key1=value1&key2=value2格式,末尾拼接app_secret;
对拼接字符串进行 MD5 加密,生成 32 位小写签名(sign参数)。
公共参数:所有接口必须携带app_key、access_token、timestamp(时间戳,毫秒级)、format(固定为json)、sign(签名)。 - 限流与错误处理
限流策略:按应用维度限流,默认 QPS 为 10(不同接口可能有差异),超限返回429错误;
错误码体系:通过响应code字段标识错误(如401表示令牌无效,500表示服务端异常),message字段提供错误详情。
二、Python 脚本实现:速卖通 API 调用示例
以下以 “查询商品详情” 和 “分页查询订单” 为例,实现速卖通 API 的调用,包含签名生成、请求发送、响应处理及异常处理。 - 准备工作
注册速卖通开发者账号,创建应用,获取AppKey和AppSecret;
完成 OAuth 授权流程,获取Access Token(可通过开放平台的 “测试工具” 临时获取)。 - 脚本实现
python
运行
import requests
import json
import time
import hashlib
import logging
from requests.exceptions import RequestException
配置日志
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
class AliExpressAPI:
def init(self, app_key, app_secret, access_token):
self.app_key = app_key
self.app_secret = app_secret
self.access_token = access_token
self.base_url = "https://api-sg.aliexpress.com/openapi" # 速卖通API网关(新加坡节点)
self.format = "json" # 固定为json
def _generate_sign(self, params):
"""生成签名(按速卖通API规则)"""
# 1. 按参数名ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接为key=value&key=value格式
sign_str = "&".join([f"{k}={v}" for k, v in sorted_params])
# 3. 末尾拼接app_secret
sign_str += self.app_secret
# 4. MD5加密并转为小写
return hashlib.md5(sign_str.encode()).hexdigest().lower()
def _get_common_params(self, method):
"""生成公共参数"""
return {
"app_key": self.app_key,
"access_token": self.access_token,
"timestamp": str(int(time.time() * 1000)), # 毫秒级时间戳
"format": self.format,
"method": method, # 接口方法名(如aliexpress.product.redefining.findproductbyid)
"v": "2.0" # API版本
}
def call_api(self, method, biz_params=None):
"""
调用速卖通API的通用方法
:param method: 接口方法名(完整名称)
:param biz_params: 业务参数(字典,接口私有参数)
:return: 接口返回的业务数据(字典)或None
"""
# 1. 合并公共参数与业务参数
common_params = self._get_common_params(method)
all_params = {**common_params,** (biz_params or {})}
# 2. 生成签名并添加到参数中
sign = self._generate_sign(all_params)
all_params["sign"] = sign
# 3. 发送POST请求
try:
response = requests.post(
self.base_url,
data=json.dumps(all_params),
headers={"Content-Type": "application/json"},
timeout=15
)
response.raise_for_status() # 检查HTTP状态码
# 4. 解析响应
result = response.json()
logging.info(f"接口调用成功:{method},响应:{json.dumps(result, ensure_ascii=False)}")
# 5. 检查业务错误(速卖通API的code=200表示成功)
if result.get("code") != 200:
logging.error(f"业务错误:{result.get('message')}(错误码:{result.get('code')})")
return None
return result.get("result") # 返回业务数据部分
except RequestException as e:
logging.error(f"请求异常:{str(e)},接口:{method}")
return None
except json.JSONDecodeError:
logging.error(f"响应格式错误:{response.text},接口:{method}")
return None
def get_product_detail(self, product_id):
"""
查询商品详情(接口:aliexpress.product.redefining.findproductbyid)
:param product_id: 商品ID(速卖通商品唯一标识)
:return: 商品详情字典
"""
method = "aliexpress.product.redefining.findproductbyid"
biz_params = {"product_id": product_id}
return self.call_api(method, biz_params)
def get_order_list(self, start_time, end_time, page=1, page_size=20):
"""
分页查询订单(接口:aliexpress.trade.redefining.findorderlistbypage)
:param start_time: 订单创建开始时间(格式:yyyy-MM-dd HH:mm:ss)
:param end_time: 订单创建结束时间(格式:yyyy-MM-dd HH:mm:ss)
:param page: 页码(默认1)
:param page_size: 每页条数(默认20,最大100)
:return: 订单列表字典
"""
method = "aliexpress.trade.redefining.findorderlistbypage"
biz_params = {
"create_time_from": start_time,
"create_time_to": end_time,
"page": page,
"page_size": page_size
}
return self.call_api(method, biz_params)
示例调用
if name == "main":
# 替换为你的实际参数(从速卖通开放平台获取)
APP_KEY = "your_app_key"
APP_SECRET = "your_app_secret"
ACCESS_TOKEN = "your_access_token"
# 初始化API客户端
ae_api = AliExpressAPI(APP_KEY, APP_SECRET, ACCESS_TOKEN)
# 1. 查询商品详情(替换为实际商品ID)
product_id = "1234567890" # 示例商品ID
product_detail = ae_api.get_product_detail(product_id)
if product_detail:
print(f"商品标题:{product_detail.get('subject')}")
print(f"商品价格:{product_detail.get('original_price')} {product_detail.get('currency_code')}")
print(f"库存数量:{product_detail.get('stock_quantity')}")
# 2. 查询订单列表(查询最近1天的订单)
import datetime
end_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
start_time = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime("%Y-%m-%d %H:%M:%S")
order_list = ae_api.get_order_list(start_time, end_time, page=1)
if order_list:
print(f"\n订单总数:{order_list.get('total_count')}")
for order in order_list.get('order_list', [])[:3]: # 打印前3条订单
print(f"订单号:{order.get('order_id')},金额:{order.get('pay_amount')},状态:{order.get('order_status')}")
三、关键注意事项
签名生成的准确性:
签名是速卖通 API 调用的核心,需严格按照 “参数排序→拼接→MD5 加密” 流程实现,任何步骤错误都会导致401签名无效错误。建议用单元测试验证签名逻辑(对比开放平台 “签名工具” 的结果)。
Access Token 的管理:
Token 有效期为 24 小时,需在脚本中实现自动刷新机制(调用aliexpress.oauth.redefining.refreshtoken接口),避免手动更新。
时间格式与时区:
接口中时间参数(如create_time_from)需用yyyy-MM-dd HH:mm:ss格式,且需与速卖通服务器时区(UTC+8)一致,避免因时间偏差导致数据查询异常。
限流与重试:
若触发限流(429错误),需在call_api方法中添加重试逻辑(如使用tenacity库实现指数退避重试)。
权限申请:
部分接口(如订单修改、支付相关)需单独申请权限,调用前需在开放平台确认应用已获得对应权限,否则返回403权限不足错误。
四、扩展方向
封装更多业务接口(如商品上架、订单发货);
实现数据持久化(将商品 / 订单数据存入 MySQL 或 MongoDB);
集成定时任务(如每小时同步一次订单数据);
开发监控面板(可视化展示 API 调用成功率、错误分布)。
通过上述脚本,可快速实现速卖通 API 的对接,适用于跨境电商 ERP 系统、多平台店铺管理工具等场景。实际开发中需结合具体业务需求和接口文档进行扩展