Gig*_*iga 6 java api amazon-web-services
我正在使用Amazon SP api 和生成的 Java SDK。我的测试应用程序正在检查订单和送货地址。据亚马逊称,这应该是一项受限操作。但目前,我可以在不使用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();
}
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,收到此错误: “message”:“我们计算的请求签名与您提供的签名不匹配。请检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。
似乎仅设置 x-amz-access-token 并不是添加 RDP 的正确操作。但我也看不到ordersApi 或ordersApi.getApiClient 上的任何其他操作似乎是正确的。而且我也不清楚,为什么当我完全不使用 tokens-api 时它还能工作。
根据 RDT 令牌流程和 Amazon SP-API Java SDK,我想指出这个官方示例工作流程。
不幸的是,亚马逊提供的 ApiClient 的使用
ordersApi.getApiClient().addDefaultHeader("x-amz-access-token", token);
被破坏了,需要一些自定义调整才能使其工作。
如果当 x-amz-access-token 丢失时请求仅由 LwaAuthorizationSigner 签名,请为我修复流程。比较此PR
像这样更改 ApiClient.java:
- request = lwaAuthorizationSigner.sign(request);
+ if (!defaultHeaderMap.containsKey("x-amz-access-token")) {
+ request = lwaAuthorizationSigner.sign(request);
+ }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4077 次 |
| 最近记录: |