通过亚马逊API获取客户订单详细信息步骤

1. 官方API文档

核心文档都在这里:

  • SP-API 官方文档主页: Selling Partner API

  • 订单 API 参考文档 (最关键):

    • Orders 部分:包含获取订单列表、单个订单详情的主要接口 getOrders 和 getOrder。

    • Order Items 部分:获取订单中具体商品信息的接口 getOrderItems 和 getOrderItemsBuyerInfo (含买家敏感信息,需额外权限)。

  • API 模型定义: 文档中详细列出了请求参数、响应数据结构,这对你编程解析数据至关重要。


2. 解决方案步骤

步骤 1: 注册为亚马逊开发者 & 创建应用
  1. 拥有亚马逊卖家账户: 这是前提。

  2. 注册开发者账户: 访问 亚马逊开发者中心 用卖家账户登录并注册开发者身份。

  3. 创建 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 配合,且权限审核更严格,涉及买家隐私需充分说明理由)。

  4. 提交审核: 提交应用和权限申请,等待亚马逊审核批准(时间不定,需耐心)。

步骤 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#等)实现以下流程:

  1. 获取访问令牌 (Access Token):

    • 使用你的 Client IdentifierClient 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 (通常不变,但有时会变,按文档处理)。

  2. 调用订单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: 逗号分隔的订单状态(可选,如 PendingUnshippedPartiallyShippedShippedInvoiceUnconfirmedCanceled)。

      • 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(不推荐,易出错)。

  3. 解析响应:

    • 成功响应码为 200 OK

    • 响应体是JSON格式,包含 payload 对象。payload.Orders 是一个订单对象数组。

    • 每个订单对象 (Order) 包含:

      • AmazonOrderId (订单ID)

      • PurchaseDate (购买日期)

      • OrderStatus (订单状态)

      • MarketplaceId (商城ID)

      • BuyerInfo (买家信息,如邮箱 - 可能需要额外权限)

      • ShippingAddress (配送地址 - 可能需要额外权限)

      • OrderTotal (订单总额)

      • PaymentMethod (支付方式)

      • FulfillmentChannel (履行渠道)

      • ShipmentServiceLevelCategory (配送服务等级)

      • OrderType (订单类型,如标准单/换货单)

      • 等众多字段(详见文档)。

    • 如果结果很多,响应中会包含 NextToken,用于获取下一页。

  4. 获取订单商品详情 (调用 getOrderItems):

    • 拿到 AmazonOrderId 后,调用 https://sellingpartnerapi-{区域代码}.amazon.com/orders/v0/orders/{orderId}/orderItems

    • 请求方法:GET

    • 请求头同上(含 x-amz-access-token 和签名)。

    • 响应 payload.OrderItems 包含商品列表,每个商品有 ASINSellerSKUTitleQuantityOrderedItemPrice 等关键信息。

步骤 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. 关键注意事项与建议

  1. 权限申请: 清晰描述你需要订单数据的目的(如:内部库存管理、订单履行自动化、财务对账、客户服务)。申请敏感数据权限(如买家电话/地址)时理由需充分且合规。

  2. 沙盒环境 (Sandbox): 开发阶段务必使用沙盒环境 (https://sandbox.sellingpartnerapi-...) 进行测试,避免影响生产数据或触发生产环境限流。沙盒数据是模拟的。

  3. AWS SDK 利用: 强烈推荐使用AWS SDK(如Python的boto3)处理SigV4签名和HTTP请求。这会节省你大量时间和避免低级错误。配置好AWS凭证文件或环境变量。

  4. Token 安全: Refresh Token 和 Client Secret 是最高机密,绝对不能暴露在客户端代码或版本控制中。使用安全的存储方式(如环境变量、密钥管理服务)。

  5. 数据延迟: API返回的订单数据可能有短暂延迟(几分钟到几十分钟),非完全实时。

  6. 文档版本: 注意你使用的API版本(如 /orders/v0/orders),新版本可能有更新。文档是权威。

  7. 替代方案 (不推荐长期使用):

    • 卖家平台报告: 手动或定时下载订单报告(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)和权限申请流程相对复杂,但提供了最完整和自动化的数据访问能力。作为程序员,理解并实现这个流程是完全可行的。重点在于:

  1. 仔细阅读官方文档。

  2. 成功注册开发者、创建应用并通过权限审核。

  3. 正确获取并安全存储 Refresh Token 和 AWS IAM 密钥。

  4. 使用 AWS SDK (如 boto3) 简化 SigV4 签名过程。

  5. 在代码中妥善处理分页 (NextToken)、API限速 (429 错误及重试) 和各种异常。

建议从沙盒环境开始开发和测试。祝你集成顺利!如果遇到具体的技术问题(如签名错误、特定API调用问题),可以再提出来探讨。

   猜你喜欢

工地视频考勤打卡(电子工牌)数据结构

跑团小程序带来的意外收益...

我是怎样让校车运营收入翻倍的

记录开发蓝牙充电宝小程序的历程

网约巴士旅游专线平台搭建历程