【问题标题】:How to use Restricted Data Token (RDT) in Amazon SP Api for Java如何在 Amazon SP Api for Java 中使用受限数据令牌 (RDT)
【发布时间】: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


【解决方案1】:

根据 RDT Token Flow 和 Amazon SP-API Java SDK 我想指向this official example workflow

不幸的是,使用 ordersApi.getApiClient().addDefaultHeader("x-amz-access-token", token); 在 Amazon 提供的 ApiClient 中出现故障,需要进行一些自定义调整才能使其正常工作。

【讨论】:

    猜你喜欢
    • 2022-10-20
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2021-02-03
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多