解决Amazon SP-API getOrders接口访问被拒绝的Unauthorized报错
前置结论:初始调用
/orders/v0/orders的getOrders接口不需要RDT(Restricted Data Token)。RDT仅在调用返回买家PII、订单商品明细等受限操作时需要,且确实需要先通过getOrders拿到orderId后才能申请,你之前的判断完全正确,无需在RDT方向浪费排查时间。
你收到的报错响应如下:
{ "errors": [ { "message": "Access to requested resource is denied.", "code": "Unauthorized", "details": "" } ] }
以下是按踩坑概率从高到低排序的排查路径,覆盖所有公开文档未明确提及的隐性配置要求:
高概率根因排查项
1. 应用状态不满足生产调用要求
你当前使用Draft(草稿)状态的应用是导致该报错的最常见原因:
- 所有Draft状态的SP-API应用,默认仅拥有沙箱环境调用权限,无论IAM、签名、Token配置多么正确,都无法调用生产环境接口
- 哪怕是仅给自己账号使用的自授权私有应用,也需要完成自授权应用发布流程,将应用状态从Draft切换为
Published(已发布)后,才具备生产接口调用资格 - 自授权私有应用发布不需要经过亚马逊人工审核,只需要在开发者控制台补全应用必填信息、确认自授权使用用途,提交后状态会即时切换为Published,无等待周期
2. AWS SigV4签名配置隐性错误
即使你参照文档完成了签名流程,Postman配置中的几个高频错点会直接导致签名校验失败:
- 签名配置中的
Region字段必须和调用的SP-API端点区域完全匹配:北美站端点对应us-east-1,欧洲站端点对应eu-west-1,远东/新加坡站端点对应us-west-2,区域填错会直接返回未授权 - 签名配置中的
Service Name字段必须固定填execute-api,不要错填为sellerpartnerapi、sp-api等想当然的取值 - Postman默认的SigV4签名规则会排除自定义请求头,需要手动将存放LWA token的
x-amz-access-token头加入签名头列表,否则签名会被判定为无效 - 确认请求使用的是生产环境端点,不要误用沙箱端点调用生产接口
3. LWA Token权限或有效性问题
你可以成功拿到LWA Token不代表Token具备对应接口权限:
- 申请LWA Token时,
scope参数必须包含订单读权限,若申请时未传对应scope,即使Token正常返回,调用订单接口时也会被权限拦截 - Draft状态下生成的测试Token、非对应应用生成的Token,都不具备生产接口调用权限
- 应用转为Published状态完成自授权后,需要重新生成对应站点的Refresh Token,再用新的Refresh Token换取LWA Token,旧的Draft阶段生成的Token会直接失效
4. IAM角色配置遗漏项
你已校验IAM策略的情况下,仍需确认两个容易遗漏的配置:
- IAM角色的信任策略必须允许
sellingpartnerapi.amazonaws.com服务代入该角色,不能仅配置允许自身IAM用户代入 - 信任策略、权限策略中不要添加多余的限制条件,比如错误的源IP限制、不匹配的外部ID校验,都会导致SP-API服务无法完成角色代入鉴权
5. 自授权关系与请求参数校验
- 应用转为Published后,需要在控制台的应用授权页面手动完成自有卖家账号的自授权操作,应用不会默认获得自有账号的接口权限
- 发起
getOrders请求时,MarketplaceIds参数必须传入你卖家账号实际开通的站点ID,跨未开通站点传参也会返回未授权错误
快速验证流程
- 补全应用信息,将应用从Draft状态转为Published状态
- 完成账号自授权,获取对应站点的正式Refresh Token
- 使用正式Refresh Token申请新的LWA Access Token,确认申请时包含订单读权限scope
- 重新配置Postman SigV4签名参数,重点核对Region、Service Name取值,确认
x-amz-access-token被纳入签名范围 - 传入自身账号已开通站点的MarketplaceId发起请求,即可正常返回订单数据
内容的提问来源于stack exchange,提问作者kmcconnell
相关产品推荐
相关产品推荐

