跨境电商 API 对接指南:亚马逊 + 速卖通接口调用全流程

跨境电商业务中,对接亚马逊和速卖通的官方 API 是实现商品管理、订单处理、库存同步、数据采集的核心环节。亚马逊采用SP-API(Selling Partner API) 替代传统 MWS,侧重安全与权限精细化;速卖通开放平台(Aliexpress Open Platform)则采用类似淘宝的签名机制,适配中小商家快速对接。本文将分平台讲解从开发者准备到接口调用的全流程,并通过 Python 实现核心对接逻辑,帮助开发者一站式完成两大平台的 API 整合。

前提条件

在开始对接前,需完成以下基础准备,确保账号与权限合规:

  1. 亚马逊开发者准备

    • 注册亚马逊开发账号,完成卖家账户关联(需拥有亚马逊店铺);
    • 创建 SP-API 应用,获取Client IDClient Secret,并配置Redirect URI
    • 申请 API 权限(如OrdersProducts),生成Refresh Token(通过 OAuth2.0 授权流程);
    • 熟悉 SP-API 端点地址(北美:https://sellingpartnerapi-na.amazon.com,欧洲 / 远东需替换区域后缀)。
  2. 速卖通开发者准备

    • 注册速卖通开放平台账号,完成企业 / 个人认证;
    • 创建应用,获取App KeyApp Secret,并申请目标接口权限(如订单查询、商品发布);
    • 沙箱环境调试(可选):速卖通提供沙箱地址用于测试,避免影响正式数据。
  3. 技术环境

    • 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)

常见问题与优化建议

  1. 权限申请问题

    • 亚马逊 SP-API 部分接口(如订单、退款)需提交申请并通过审核,建议先从「商品查询」等基础接口调试;
    • 速卖通接口权限分「免费」和「付费」,需根据业务需求申请,避免权限不足导致调用失败。
  2. 请求频率限制

    • 亚马逊 SP-API 有速率限制(Rate Limits),超过限制会返回429 Too Many Requests,建议通过time.sleep()控制请求间隔,或监听响应头的x-amzn-RateLimit-Limit动态调整;
    • 速卖通 API 按应用维度限制调用频次(默认 100 次 / 分钟),高并发场景需申请提额。
  3. 数据格式兼容

    • 亚马逊 SP-API 返回 JSON 格式,字段采用驼峰命名;速卖通 API 返回 JSON/XML,字段采用下划线命名,需统一数据解析逻辑;
    • 跨境场景需处理多语言、多币种转换,建议封装数据格式化函数。
  4. 安全与合规

    • 切勿硬编码App SecretRefresh Token等敏感信息,建议使用环境变量或配置文件管理;
    • 遵循平台数据合规规则,禁止滥用 API 采集竞品数据或泄露用户信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值