跨境电商业务中,对接亚马逊和速卖通的官方 API 是实现商品管理、订单处理、库存同步、数据采集的核心环节。亚马逊采用SP-API(Selling Partner API) 替代传统 MWS,侧重安全与权限精细化;速卖通开放平台(Aliexpress Open Platform)则采用类似淘宝的签名机制,适配中小商家快速对接。本文将分平台讲解从开发者准备到接口调用的全流程,并通过 Python 实现核心对接逻辑,帮助开发者一站式完成两大平台的 API 整合。
前提条件
在开始对接前,需完成以下基础准备,确保账号与权限合规:
-
亚马逊开发者准备
- 注册亚马逊开发账号,完成卖家账户关联(需拥有亚马逊店铺);
- 创建 SP-API 应用,获取
Client ID、Client Secret,并配置Redirect URI; - 申请 API 权限(如
Orders、Products),生成Refresh Token(通过 OAuth2.0 授权流程); - 熟悉 SP-API 端点地址(北美:
https://sellingpartnerapi-na.amazon.com,欧洲 / 远东需替换区域后缀)。
-
速卖通开发者准备
- 注册速卖通开放平台账号,完成企业 / 个人认证;
- 创建应用,获取
App Key、App Secret,并申请目标接口权限(如订单查询、商品发布); - 沙箱环境调试(可选):速卖通提供沙箱地址用于测试,避免影响正式数据。
-
技术环境
- Python 3.7+(推荐 3.8+);
- 安装依赖库:
requests(HTTP 请求)、pyjwt(亚马逊 JWT 签名)、hmac/hashlib(签名加密)、urllib(参数编码)。
bash
运行
pip install requests pyjwt
第一部分:亚马逊 SP-API 对接全流程
亚马逊 SP-API 采用OAuth2.0 授权+AWS4-HMAC-SHA256 签名机制,核心分为「获取访问令牌」和「API 接口调用」两步。
步骤 1:获取 SP-API 访问令牌(Access Token)
SP-API 通过Refresh Token刷新获取短期有效的Access Token(有效期约 1 小时),需先完成 OAuth2.0 授权流程生成Refresh Token(首次授权需手动操作,后续可自动刷新)。
python
运行
import requests
def amazon_get_access_token(client_id, client_secret, refresh_token):
"""
获取亚马逊SP-API访问令牌
:param client_id: 应用Client ID
:param client_secret: 应用Client Secret
:param refresh_token: 授权生成的Refresh Token
:return: Access Token(有效期3600秒)
"""
url = "https://api.amazon.com/auth/o2/token"
payload = {
"grant_type": "refresh_token",
"client_id": client_id,
"client_secret": client_secret,
"refresh_token": refresh_token
}
headers = {"Content-Type": "application/x-www-form-urlencoded"}
response = requests.post(url, data=payload, headers=headers)
if response.status_code == 200:
return response.json()["access_token"]
else:
raise Exception(f"获取Token失败:{response.status_code} - {response.text}")
步骤 2:实现 AWS4-HMAC-SHA256 签名(SP-API 核心)
亚马逊 SP-API 要求请求头携带 AWS4 签名,验证请求合法性,需实现签名生成逻辑:
python
运行
import datetime
import hashlib
import hmac
from urllib.parse import urlparse
def aws4_sign(key, msg):
"""HMAC-SHA256加密"""
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
def amazon_spapi_sign(access_token, method, url, payload, region, service):
"""
生成亚马逊SP-API的AWS4签名请求头
:param access_token: SP-API访问令牌
:param method: HTTP方法(GET/POST)
:param url: API请求地址
:param payload: 请求体(POST时为JSON字符串,GET为"")
:param region: 区域(如us-east-1、eu-west-1)
:param service: 服务名(固定为"sellingpartnerapi")
:return: 签名后的请求头
"""
# 1. 解析URL
parsed_url = urlparse(url)
host = parsed_url.netloc
path = parsed_url.path or "/"
query = parsed_url.query
# 2. 时间处理(UTC时间)
t = datetime.datetime.utcnow()
amz_date = t.strftime("%Y%m%dT%H%M%SZ")
date_stamp = t.strftime("%Y%m%d")
# 3. 构造请求头
headers = {
"host": host,
"x-amz-date": amz_date,
"Authorization": "",
"x-amz-access-token": access_token,
"Content-Type": "application/json"
}
# 4. 生成Canonical Request
canonical_headers = "\n".join([f"{k.lower()}:{v.strip()}" for k, v in headers.items()]) + "\n"
signed_headers = ";".join([k.lower() for k in headers.keys()])
payload_hash = hashlib.sha256(payload.encode('utf-8')).hexdigest()
canonical_request = f"{method}\n{path}\n{query}\n{canonical_headers}\n{signed_headers}\n{payload_hash}"
# 5. 生成String to Sign
algorithm = "AWS4-HMAC-SHA256"
credential_scope = f"{date_stamp}/{region}/{service}/aws4_request"
string_to_sign = f"{algorithm}\n{amz_date}\n{credential_scope}\n{hashlib.sha256(canonical_request.encode('utf-8')).hexdigest()}"
# 6. 生成签名密钥(SP-API无需AWS Secret Key,此处签名仅用于格式验证,实际无需传入密钥)
# 注:亚马逊SP-API的AWS4签名仅做格式校验,无需真实AWS密钥,此处生成空密钥即可
signing_key = aws4_sign(("AWS4" + "").encode('utf-8'), date_stamp.encode('utf-8'))
signing_key = aws4_sign(signing_key, region.encode('utf-8'))
signing_key = aws4_sign(signing_key, service.encode('utf-8'))
signing_key = aws4_sign(signing_key, b"aws4_request")
# 7. 生成签名
signature = hmac.new(signing_key, string_to_sign.encode('utf-8'), hashlib.sha256).hexdigest()
# 8. 构造Authorization头
authorization_header = (
f"{algorithm} Credential=/\{credential_scope}, "
f"SignedHeaders={signed_headers}, Signature={signature}"
)
headers["Authorization"] = authorization_header
return headers
步骤 3:调用亚马逊 SP-API 实战(以订单查询为例)
以 ** 订单查询接口(Orders v0)** 为例,实现商品订单数据的获取:
python
运行
def call_amazon_spapi(client_id, client_secret, refresh_token, api_url, method="GET", payload="{}"):
"""
调用亚马逊SP-API
:param client_id: 应用Client ID
:param client_secret: 应用Client Secret
:param refresh_token: Refresh Token
:param api_url: API接口地址(如https://sellingpartnerapi-na.amazon.com/orders/v0/orders)
:param method: HTTP方法(GET/POST)
:param payload: 请求体(POST时传入)
:return: 接口响应结果
"""
# 1. 获取Access Token
access_token = amazon_get_access_token(client_id, client_secret, refresh_token)
# 2. 生成签名请求头(北美区域:us-east-1)
headers = amazon_spapi_sign(access_token, method, api_url, payload, "us-east-1", "sellingpartnerapi")
# 3. 发送请求
if method == "GET":
response = requests.get(api_url, headers=headers)
elif method == "POST":
response = requests.post(api_url, headers=headers, data=payload)
else:
raise Exception("仅支持GET/POST方法")
if response.status_code in [200, 201]:
return response.json()
else:
raise Exception(f"SP-API调用失败:{response.status_code} - {response.text}")
# 实战调用:查询亚马逊订单
if __name__ == "__main__":
# 替换为你的亚马逊应用信息
AMAZON_CLIENT_ID = "你的Client ID"
AMAZON_CLIENT_SECRET = "你的Client Secret"
AMAZON_REFRESH_TOKEN = "你的Refresh Token"
# 订单查询接口地址(北美区域)
ORDERS_API_URL = "https://sellingpartnerapi-na.amazon.com/orders/v0/orders?CreatedAfter=2025-01-01T00:00:00Z"
try:
result = call_amazon_spapi(AMAZON_CLIENT_ID, AMAZON_CLIENT_SECRET, AMAZON_REFRESH_TOKEN, ORDERS_API_URL)
print("亚马逊SP-API响应:", result)
except Exception as e:
print("调用失败:", e)
第二部分:速卖通 API 对接全流程
速卖通开放平台 API 采用HMAC-SHA1 签名机制,与淘宝开放平台逻辑类似,核心是参数排序后生成签名,再发送 HTTP 请求。
步骤 1:实现速卖通 API 签名函数
速卖通的签名规则为:参数按 ASCII 升序排序→拼接为key=value→前后拼接App Secret→HMAC-SHA1 加密→Base64 编码并转大写。
python
运行
import time
from urllib.parse import urlencode, quote_plus
import hmac
import hashlib
import requests
def aliexpress_sign(params, app_secret):
"""
生成速卖通API签名
:param params: 请求参数字典
:param app_secret: 应用App Secret
:return: 签名结果
"""
# 1. 按参数名ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接参数为"key=value"格式(特殊字符编码)
query_string = '&'.join([f"{k}={quote_plus(str(v), safe='')}" for k, v in sorted_params])
# 3. 拼接App Secret前后缀
sign_string = app_secret + query_string + app_secret
# 4. HMAC-SHA1加密
sign = hmac.new(sign_string.encode('utf-8'), digestmod=hashlib.sha1).digest()
# 5. Base64编码并转大写
sign_base64 = sign.hex().upper()
return sign_base64
步骤 2:编写速卖通 API 调用函数
以 ** 商品列表查询接口(aliexpress.solution.product.list.query)** 为例,实现接口调用:
python
运行
def call_aliexpress_api(app_key, app_secret, method, params=None):
"""
调用速卖通开放平台API
:param app_key: 应用App Key
:param app_secret: 应用App Secret
:param method: 接口方法名(如aliexpress.solution.product.list.query)
:param params: 业务参数
:return: 接口响应结果
"""
# 公共参数(必填)
public_params = {
'app_key': app_key,
'method': method,
'format': 'json',
'v': '2.0',
'timestamp': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()),
'sign_method': 'hmac-sha1'
}
# 合并公共参数与业务参数
all_params = {**public_params, **(params or {})}
# 生成签名
all_params['sign'] = aliexpress_sign(all_params, app_secret)
# 速卖通API网关地址(正式环境)
url = "https://openapi.aliexpress.com/router/rest"
response = requests.post(url, data=all_params)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"速卖通API调用失败:{response.status_code} - {response.text}")
# 实战调用:查询速卖通商品列表
if __name__ == "__main__":
# 替换为你的速卖通应用信息
ALI_APP_KEY = "你的App Key"
ALI_APP_SECRET = "你的App Secret"
# 接口方法名
API_METHOD = "aliexpress.solution.product.list.query"
# 业务参数(根据接口文档填写)
business_params = {
'page_no': 1,
'page_size': 10,
'status': 'ON_SALE' # 在售商品
}
try:
result = call_aliexpress_api(ALI_APP_KEY, ALI_APP_SECRET, API_METHOD, business_params)
print("速卖通API响应:", result)
except Exception as e:
print("调用失败:", e)
第三部分:亚马逊 + 速卖通 API 整合实战
为提升代码复用性,可封装跨境电商 API 统一调用类,实现多平台接口的统一管理:
python
运行
class CrossBorderEcomAPI:
def __init__(self, amazon_config, aliexpress_config):
self.amazon_client_id = amazon_config["client_id"]
self.amazon_client_secret = amazon_config["client_secret"]
self.amazon_refresh_token = amazon_config["refresh_token"]
self.ali_app_key = aliexpress_config["app_key"]
self.ali_app_secret = aliexpress_config["app_secret"]
# 亚马逊SP-API调用
def call_amazon(self, api_url, method="GET", payload="{}"):
return call_amazon_spapi(self.amazon_client_id, self.amazon_client_secret, self.amazon_refresh_token, api_url, method, payload)
# 速卖通API调用
def call_aliexpress(self, method, params=None):
return call_aliexpress_api(self.ali_app_key, self.ali_app_secret, method, params)
# 初始化并调用多平台API
if __name__ == "__main__":
# 配置多平台参数
amazon_config = {
"client_id": "你的亚马逊Client ID",
"client_secret": "你的亚马逊Client Secret",
"refresh_token": "你的亚马逊Refresh Token"
}
aliexpress_config = {
"app_key": "你的速卖通App Key",
"app_secret": "你的速卖通App Secret"
}
# 初始化统一API类
cross_border_api = CrossBorderEcomAPI(amazon_config, aliexpress_config)
# 调用亚马逊订单接口
amazon_orders = cross_border_api.call_amazon("https://sellingpartnerapi-na.amazon.com/orders/v0/orders?CreatedAfter=2025-01-01T00:00:00Z")
print("亚马逊订单:", amazon_orders)
# 调用速卖通商品接口
aliexpress_products = cross_border_api.call_aliexpress("aliexpress.solution.product.list.query", {"page_no": 1, "page_size": 10})
print("速卖通商品:", aliexpress_products)
常见问题与优化建议
-
权限申请问题
- 亚马逊 SP-API 部分接口(如订单、退款)需提交申请并通过审核,建议先从「商品查询」等基础接口调试;
- 速卖通接口权限分「免费」和「付费」,需根据业务需求申请,避免权限不足导致调用失败。

-
请求频率限制
- 亚马逊 SP-API 有速率限制(Rate Limits),超过限制会返回
429 Too Many Requests,建议通过time.sleep()控制请求间隔,或监听响应头的x-amzn-RateLimit-Limit动态调整; - 速卖通 API 按应用维度限制调用频次(默认 100 次 / 分钟),高并发场景需申请提额。
- 亚马逊 SP-API 有速率限制(Rate Limits),超过限制会返回
-
数据格式兼容
- 亚马逊 SP-API 返回 JSON 格式,字段采用驼峰命名;速卖通 API 返回 JSON/XML,字段采用下划线命名,需统一数据解析逻辑;
- 跨境场景需处理多语言、多币种转换,建议封装数据格式化函数。
-
安全与合规
- 切勿硬编码
App Secret、Refresh Token等敏感信息,建议使用环境变量或配置文件管理; - 遵循平台数据合规规则,禁止滥用 API 采集竞品数据或泄露用户信息。
- 切勿硬编码


1585

被折叠的 条评论
为什么被折叠?



