【发布时间】:2021-04-14 13:15:08
【问题描述】:
我正在使用Amazon SP api with generated Java SDK。我的测试应用程序正在检查订单以及送货地址。根据亚马逊的说法,这应该是restricted operation。但目前,我可以在不使用 RDT 的情况下获取信息。我尝试使用如下所示的 RDT,但它不起作用。
// Build orders-api
OrdersV0Api ordersApi = new OrdersV0Api.Builder()
.awsAuthenticationCredentials(awsAuthenticationCredentials)
.lwaAuthorizationCredentials(lwaAuthorizationCredentials)
.awsAuthenticationCredentialsProvider(awsAuthenticationCredentialsProvider)
.endpoint("https://sellingpartnerapi-eu.amazon.com")
.build();
List<String> orderStatuses = new ArrayList<String>();
orderStatuses.add(OrderStatusEnum.UNSHIPPED.getValue());
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -3);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String tmp = sdf.format(new Date());
try {
// Get orders
GetOrdersResponse respOrders = ordersApi.getOrders(Marketplaces.getAllMarketplaces(), sdf.format(cal.getTime()), null, null, null, orderStatuses, null, null, null, null, 100, null, null, null);
OrderList orders = respOrders.getPayload().getOrders();
Order ord = orders.get(0);
// Restricted Data Token
RestrictedResource rr = new RestrictedResource();
rr.setMethod(MethodEnum.GET);
rr.setPath("/orders/v0/orders/" + ord.getAmazonOrderId() + "/address");
CreateRestrictedDataTokenRequest req = new CreateRestrictedDataTokenRequest();
req.addRestrictedResourcesItem(rr);
TokensApi tokensApi = new TokensApi.Builder()
.awsAuthenticationCredentials(awsAuthenticationCredentials)
.lwaAuthorizationCredentials(lwaAuthorizationCredentials)
.awsAuthenticationCredentialsProvider(awsAuthenticationCredentialsProvider)
.endpoint("https://sellingpartnerapi-eu.amazon.com")
.build();
CreateRestrictedDataTokenResponse resp3 = tokensApi.createRestrictedDataToken(req);
String token = resp3.getRestrictedDataToken();
// Add token to Header ?
ordersApi.getApiClient().addDefaultHeader("x-amz-access-token", token);
// Get delivery adress
GetOrderAddressResponse respAdress = ordersApi.getOrderAddress(ord.getAmazonOrderId());
Address adr = respAdress.getPayload().getShippingAddress();
} catch (ApiException e) {
e.printStackTrace();
}
当我执行此操作时,我收到此错误: "message": "我们计算的请求签名与您提供的签名不匹配。请检查您的 AWS Secret Access Key 和签名方法。有关详细信息,请参阅服务文档。
似乎只设置 x-amz-access-token 不是添加 RDP 的正确操作。但我也看不到在 ordersApi 或 ordersApi.getApiClient 上似乎是正确的任何其他操作。 而且我也不清楚,为什么当我完全不使用 token-api 时它会起作用。
【问题讨论】:
-
我记得我们最近有类似的事情。您需要确保您的 AWS IAM AccessKey/Secret 来自与您发出请求相同的区域。因此,如果您致电 sellpartnerapi-eu.amazon.com,则区域为 eu-west1。所有凭据也需要是 eu-west1。关键字“凭据范围”在我们的案例中很重要,文档的这一部分有所帮助:github.com/amzn/selling-partner-api-docs/blob/main/guides/en-US/…
-
在 2022 年 7 月左右,此访问将需要受限数据令牌。因此,虽然它现在有效,但将来不会。你有没有让受限资源端点工作?现在正在苦苦挣扎。
-
老实说,我认为 API 被破坏了......它发送两个 x-amz-access-tokens 而不是一个导致它破坏 postman 工作正常的 x-amz-access-tokens 没有任何意义。 .. 但这些 java 类没有那么多。
-
@Giga 我有一个非常相似的问题。你能设法用Java SDK解决它吗?谢谢。
标签: java amazon-web-services api