1. 官方API文档
核心文档都在这里:
-
SP-API 官方文档主页: Selling Partner API
-
订单 API 参考文档 (最关键):
-
Orders部分:包含获取订单列表、单个订单详情的主要接口 getOrders 和 getOrder。 -
Order Items部分:获取订单中具体商品信息的接口 getOrderItems 和 getOrderItemsBuyerInfo (含买家敏感信息,需额外权限)。
-
-
API 模型定义: 文档中详细列出了请求参数、响应数据结构,这对你编程解析数据至关重要。
2. 解决方案步骤
步骤 1: 注册为亚马逊开发者 & 创建应用
-
拥有亚马逊卖家账户: 这是前提。
-
注册开发者账户: 访问 亚马逊开发者中心 用卖家账户登录并注册开发者身份。
-
创建 SP-API 应用:
-
在开发者中心创建新应用。
-
选择"Selling Partner API"。
-
填写应用信息(名称、描述等)。
-
关键: 在配置应用时,选择你需要访问的卖家店铺(Marketplace) 和申请API权限范围(Scopes)。对于订单,你需要:
-
sellingpartnerapi::migration(如果账户迁移过) -
sellingpartnerapi::notifications(如果需要订阅通知) -
最重要的是:
sellingpartnerapi::orders:read(基础订单信息) -
如需要商品详情:
sellingpartnerapi::orders:read通常已足够获取商品ASIN/SKU等,但getOrderItemsBuyerInfo需要sellingpartnerapi::orderitems:read。 -
如需要买家姓名/地址/电话等:
sellingpartnerapi::orderitems:read(通过getOrderItemsBuyerInfo或getOrderAddress等接口获取,这些接口通常需要sellingpartnerapi::orders:read配合,且权限审核更严格,涉及买家隐私需充分说明理由)。
-
-
-
提交审核: 提交应用和权限申请,等待亚马逊审核批准(时间不定,需耐心)。
步骤 2: 获取身份验证所需凭证 (关键且复杂)
SP-API 使用 IAM Role + OAuth 2.0 (Login with Amazon - LWA) 进行严格认证。你需要收集以下信息:
-
IAM User ARN: 在AWS IAM控制台创建一个用户,授予其访问SP-API的权限策略,记录其ARN。
-
IAM User 的访问密钥 (Access Key ID 和 Secret Access Key): 用于签名请求。
-
应用程序客户端标识符 (Client Identifier): 创建SP-API应用后获得。
-
应用程序客户端密钥 (Client Secret): 创建SP-API应用后获得。
-
刷新令牌 (Refresh Token): 这是最难的一步。需要通过OAuth授权流程获取:
-
方案A (推荐给独立开发者/卖家):使用“Self Authorization”。在开发者中心你的应用设置里生成一个授权链接,用你的卖家账户登录并授权该应用访问你的卖家数据。授权成功后,你会得到一个授权码(Authorization Code),再用这个授权码交换得到刷新令牌(Refresh Token)。这个Token极其重要且需要安全保存,用于获取访问令牌(Access Token)。
-
方案B (适用于服务商):标准的OAuth流程,需要构建授权URL让卖家用户登录亚马逊并授权,然后接收授权码回调,再用授权码交换刷新令牌。
-
步骤 3: 编写代码调用订单API
使用你熟悉的编程语言(Python, Java, Node.js, C#等)实现以下流程:
-
获取访问令牌 (Access Token):
-
使用你的
Client Identifier,Client Secret和Refresh Token调用SP-API的https://api.amazon.com/auth/o2/token端点。 -
请求方法:
POST -
请求体 (
x-www-form-urlencoded):grant_type=refresh_token
&refresh_token={你的Refresh Token} &client_id={你的Client Identifier} &client_secret={你的Client Secret} -
响应中会包含
access_token(有效期1小时) 和新的refresh_token(通常不变,但有时会变,按文档处理)。
-
-
调用订单API (示例:
getOrders):-
API 端点:
https://sellingpartnerapi-{区域代码}.amazon.com/orders/v0/orders(例如北美:na, 欧洲:eu) -
请求方法:
GET -
必需请求头:
-
x-amz-access-token: {上一步获取的Access Token} -
Host: sellingpartnerapi-{区域代码}.amazon.com
-
-
重要查询参数 (Query Parameters):
-
MarketplaceIds:逗号分隔的商城ID列表(例如北美:ATVPDKIKX0DER)。必须至少指定一个。 -
CreatedAfter:或LastUpdatedAfter:ISO 8601 格式的时间戳(例如2023-10-01T00:00:00Z)。用于筛选订单时间范围。强烈建议使用分页并基于时间增量获取。 -
OrderStatuses:逗号分隔的订单状态(可选,如Pending,Unshipped,PartiallyShipped,Shipped,InvoiceUnconfirmed,Canceled)。 -
FulfillmentChannels:逗号分隔的履行渠道(可选,如MFN- 卖家自发货,AFN- 亚马逊物流)。 -
NextToken:当响应中有NextToken时,用于获取下一页结果(分页查询)。
-
-
签名: 所有SP-API请求必须使用 Signature Version 4 对请求进行签名。这是最复杂的部分。建议:
-
使用AWS SDK: AWS为多种语言提供了SDK(如 Python 的
boto3),其中包含SigV4签名工具,能大大简化签名过程。你需要配置AWS凭证(Access Key ID和Secret Access Key)和区域。 -
手动实现SigV4(不推荐,易出错)。
-
-
-
解析响应:
-
成功响应码为
200 OK。 -
响应体是JSON格式,包含
payload对象。payload.Orders是一个订单对象数组。 -
每个订单对象 (
Order) 包含:-
AmazonOrderId(订单ID) -
PurchaseDate(购买日期) -
OrderStatus(订单状态) -
MarketplaceId(商城ID) -
BuyerInfo(买家信息,如邮箱 - 可能需要额外权限) -
ShippingAddress(配送地址 - 可能需要额外权限) -
OrderTotal(订单总额) -
PaymentMethod(支付方式) -
FulfillmentChannel(履行渠道) -
ShipmentServiceLevelCategory(配送服务等级) -
OrderType(订单类型,如标准单/换货单) -
等众多字段(详见文档)。
-
-
如果结果很多,响应中会包含
NextToken,用于获取下一页。
-
-
获取订单商品详情 (调用
getOrderItems):-
拿到
AmazonOrderId后,调用https://sellingpartnerapi-{区域代码}.amazon.com/orders/v0/orders/{orderId}/orderItems -
请求方法:
GET -
请求头同上(含
x-amz-access-token和签名)。 -
响应
payload.OrderItems包含商品列表,每个商品有ASIN,SellerSKU,Title,QuantityOrdered,ItemPrice等关键信息。
-
步骤 4: 处理分页、限流和错误
-
分页 (Pagination): 始终检查
getOrders响应中的NextToken。循环调用直到NextToken为空。getOrderItems可能也有分页。 -
限速 (Rate Limits / Quota): SP-API有严格的请求速率限制(Restore Rate和Burst)。具体配额在开发者中心你的应用设置里查看(
Quota标签页)。务必在代码中实现:-
监控响应头中的
x-amzn-RateLimit-Limit(配额) 和x-amzn-RequestId。 -
遇到
429 TooManyRequests错误时,必须根据响应头x-amzn-RateLimit-Limit和Retry-After(如果有) 实现指数退避重试策略。暴力重试会导致账号受限。
-
-
错误处理: 完善处理各种HTTP状态码(401未授权/过期,403禁止访问/权限不足,404未找到,429限速,500服务器错误等)和SP-API返回的错误消息。记录错误和请求ID (
x-amzn-RequestId) 便于排查。
3. 关键注意事项与建议
-
权限申请: 清晰描述你需要订单数据的目的(如:内部库存管理、订单履行自动化、财务对账、客户服务)。申请敏感数据权限(如买家电话/地址)时理由需充分且合规。
-
沙盒环境 (Sandbox): 开发阶段务必使用沙盒环境 (
https://sandbox.sellingpartnerapi-...) 进行测试,避免影响生产数据或触发生产环境限流。沙盒数据是模拟的。 -
AWS SDK 利用: 强烈推荐使用AWS SDK(如Python的
boto3)处理SigV4签名和HTTP请求。这会节省你大量时间和避免低级错误。配置好AWS凭证文件或环境变量。 -
Token 安全:
Refresh Token和Client Secret是最高机密,绝对不能暴露在客户端代码或版本控制中。使用安全的存储方式(如环境变量、密钥管理服务)。 -
数据延迟: API返回的订单数据可能有短暂延迟(几分钟到几十分钟),非完全实时。
-
文档版本: 注意你使用的API版本(如
/orders/v0/orders),新版本可能有更新。文档是权威。 -
替代方案 (不推荐长期使用):
-
卖家平台报告: 手动或定时下载订单报告(Flat File)。自动化程度低,实时性差。
-
MWS API (已弃用): 亚马逊已停止新用户注册MWS,并鼓励迁移到SP-API。老用户也应尽快迁移。
-
4. 简单 Python 伪代码示例 (使用 boto3 简化签名)
import boto3
import requests
from datetime import datetime, timedelta, timezone# 配置 - 从安全的地方获取这些值!
CLIENT_ID = "your_sp_api_client_id"
CLIENT_SECRET = "your_sp_api_client_secret"
REFRESH_TOKEN = "your_refresh_token"
AWS_ACCESS_KEY = "your_iam_user_access_key_id"
AWS_SECRET_KEY = "your_iam_user_secret_access_key"
REGION = "us-east-1" # SP-API网关所在区域,通常是us-east-1
MARKETPLACE_ID = "ATVPDKIKX0DER" # 例如北美# 1. 获取 Access Token (使用 requests)
token_url = "https://api.amazon.com/auth/o2/token"
token_data = {"grant_type": "refresh_token","refresh_token": REFRESH_TOKEN,"client_id": CLIENT_ID,"client_secret": CLIENT_SECRET
}
token_response = requests.post(token_url, data=token_data)
token_response.raise_for_status()
access_token = token_response.json()["access_token"]# 2. 创建 session 并配置签名 (使用 boto3)
session = boto3.Session(aws_access_key_id=AWS_ACCESS_KEY,aws_secret_access_key=AWS_SECRET_KEY,region_name=REGION
)
# 创建 SigV4 签名器
sigv4 = session.client('s3')._request_signer # 或者使用专门的签名库如 aws_requests_auth# 3. 构建请求 (示例:获取过去24小时创建的订单)
endpoint = f"https://sellingpartnerapi-na.amazon.com/orders/v0/orders" # 北美网关
created_after = (datetime.now(timezone.utc) - timedelta(hours=24)).strftime('%Y-%m-%dT%H:%M:%SZ')
params = {"MarketplaceIds": MARKETPLACE_ID,"CreatedAfter": created_after,# "OrderStatuses": "Unshipped", # 可选过滤# "NextToken": "..." # 用于分页
}# 4. 创建并签名请求 (伪代码,实际签名过程需用 sigv4 对象处理)
# 这里简化,实际需用 sigv4 生成签名头 (Authorization, X-Amz-Date, X-Amz-Security-Token等)
headers = {"x-amz-access-token": access_token,"User-Agent": "MyApp/1.0 (Language=Python)",# ... 其他头,签名器会自动添加签名所需头
}# 使用 boto3 的 SigV4 签名一个请求对象比较繁琐。通常的做法:
# a) 使用 `aws_requests_auth` 库 (https://pypi.org/project/aws-requests-auth/) 简化
# b) 使用已封装SP-API调用的第三方开源库 (如 python-amazon-sp-api, 但需评估)
# c) 自己实现 SigV4 签名 (复杂,参考AWS文档)# 伪代码:假设 `sign_request` 函数利用 sigv4 签名器处理了签名
# signed_headers = sign_request(method='GET', url=endpoint, headers=headers, params=params)# 5. 发送请求 (伪代码,使用签名后的 headers)
response = requests.get(endpoint, headers=signed_headers, params=params)
response.raise_for_status()# 6. 处理响应
orders_data = response.json()
orders = orders_data["payload"]["Orders"]
next_token = orders_data["payload"].get("NextToken")# 7. 处理分页 (略)
# 8. 处理每个订单,获取商品详情 (调用 getOrderItems, 同样需要签名)
for order in orders:order_id = order["AmazonOrderId"]items_endpoint = f"https://sellingpartnerapi-na.amazon.com/orders/v0/orders/{order_id}/orderItems"# ... 构建、签名并发送 items_endpoint 请求 ...# items_response = requests.get(items_endpoint, headers=signed_headers)# items_data = items_response.json()# order_items = items_data["payload"]["OrderItems"]# ... 处理商品信息 ...# 9. 务必添加健壮的异常处理、限速处理 (429重试) 和日志记录
总结
获取亚马逊订单数据最正规、功能最强大的途径就是 Selling Partner API (SP-API)。虽然其身份验证(SigV4 + OAuth)和权限申请流程相对复杂,但提供了最完整和自动化的数据访问能力。作为程序员,理解并实现这个流程是完全可行的。重点在于:
-
仔细阅读官方文档。
-
成功注册开发者、创建应用并通过权限审核。
-
正确获取并安全存储
Refresh Token和 AWS IAM 密钥。 -
使用 AWS SDK (如
boto3) 简化 SigV4 签名过程。 -
在代码中妥善处理分页 (
NextToken)、API限速 (429错误及重试) 和各种异常。
建议从沙盒环境开始开发和测试。祝你集成顺利!如果遇到具体的技术问题(如签名错误、特定API调用问题),可以再提出来探讨。
猜你喜欢
工地视频考勤打卡(电子工牌)数据结构
跑团小程序带来的意外收益...
我是怎样让校车运营收入翻倍的
记录开发蓝牙充电宝小程序的历程
网约巴士旅游专线平台搭建历程
