后面的詳細流程可以自行百度,文章也較多,填好資料提交等待amazon官方審核就行了。

下面是重點內容,因為代碼中所涉及的一些核心屬性字段都是由下面幾步產生的。

2.創建AWS賬戶

具體創建流程在amazon官方文檔中有給到具體鏈接,可以點擊進去查看(亞馬遜AWS海外區域賬戶免費套餐_免費云服務-AWS云服務)。

3.創建IAM的用戶,角色,策略

官方地址:https://console.aws.amazon.com/iam/home?#/users注意這里很重要,說一句,用戶是用戶,角色是角色,這倆其實是2種不同的接入方式,只不過都要和策略相關聯罷了,如果你采用角色的方式去實現數據拉取的話,那么在后續平臺的其他配置或者是代碼中的參數都必須是用role,而不是user,切記,混用的話就會出現403 forbidden,具體的可以參考下面這篇文章(Amazon Selling Partner API 開發筆記:https://www.icode9.com/content-4-834205.html)創建IAM用戶(User)

生成AWS訪問密鑰編碼:accessKeyId以及AWS訪問密鑰:secretKey),注意這2個值必須在創建好了之后立馬記錄下來,后面要用到。

創建IAM策略,按下圖步驟進行

創建成功之后可按下圖查看剛剛創建的策略:

創建IAM職權,其實就是角色(role)

看官方的文檔,其實這里寫的也是很詳細的,按步驟一步步走下去創建就好。點擊角色

這里有個角色ARN:RoleArn, copy下來,后面代碼里面要用。
向 IAM 用戶添加 AWS 安全令牌服務策略

在選擇操作的時候,為了圖省事的話直接勾選“所有STS策略”:

點開下面的資源,這里的示例是配置role ARN的,下面的user ARN也是相同的配法(這里的user應該可以不配置,因為我這邊是用的role方式)

4.注冊應用程序并授權

從這里開始在官方文檔里就寫的有點讓人難以理解了,說了好幾種授權,而且文檔感覺有點亂,我這里采用的是后面的“自行授權”。官方地址:Amazon Sign-In:https://sellercentral.amazon.com/home點擊“應用商店”–>”開發應用程序”

點擊“添加新的APP客戶端”,如果這里是置灰的需要發郵件到亞馬遜去申請開通。

注意:這里的IAM ARN千萬不要寫成user的,開頭有說到,采用角色的方式,而不是用戶的方式,所以這里的ARN必須是role的,且后面代碼里面也必須是role的。另外,因為是自行授權,這里的登陸URL和重定向URL都不要填。

在開發者中心給應用程序授權:

點擊授權,點擊生成刷新令牌,注意這里就是后面代碼里面要用到的refreshToken,很重要

多次授權生成的多個令牌,每個都是有效的,反正官方文檔是這樣講的

在開發者中心,點擊查看:

注意:

這里有2個值很重要也是后面編程要用到的,即客戶端編碼:ClientId,客戶端秘鑰:ClientSecret。到這里,平臺配置基本上是OK的了,總結下后續編碼需要從平臺拿的幾個值如下:

中文解釋英文名稱英文說明來源
AWS訪問密鑰編碼accessKeyIdAWS access key Id創建新的IAM用戶之后
AWS訪問密鑰secretKeyAWS secret access key創建新的IAM用戶之后
IAM職權ARNroleArnARN of the IAM role創建IAM role的時候生成
LWA客戶端編碼clientIdLWA client identifier在注冊應用程序時生成
LWA客戶端秘鑰clientSecretLWA client secret在注冊應用程序時生成
LWA客戶端令牌refreshTokenLWA refresh token在給應用程序授權時生成

編碼還需要用到的幾個值,在后面會講到,一般都是根據region來決定的,不是平臺生成的。


上面是在平臺上的一些申請步驟,下面是代碼開發相關的內容。開發語言是JAVA,采用的是api調用的方式,找了好久最后找到一個比較優秀的,自己打包生成了一個jar,上傳到自己公司私服了,也算方便后來人吧SDK:https://github.com/penghaiping/amazon-sp-api

下面直接來看代碼吧,已經親測可以從Amazon獲取到我司的訂單數據和訂單詳情了。配置DTO:

public class AmazonAuthorConfigDTO {
/**
* AWS訪問密鑰編碼
*/
private String accessKeyId;
/**
* AWS訪問密鑰
*/
private String secretKey;
/**
* 區域
*/
private String region;
/**
* IAM職權ARN
*/
private String roleArn;
/**
* IAM職權名稱
*/
private String roleSessionName;
/**
* LWA客戶端編碼
*/
private String clientId;
/**
* LWA客戶端秘鑰
*/
private String clientSecret;
/**
* LWA客戶端令牌
*/
private String refreshToken;
/**
* LWA授權服務器的節點地址
*/
private String lwaEndpoint;
/**
* SP授權服務器節點地址
*/
private String spEndPoint;

這里主要是獲取OrdersV0Api實例,供后面使用

public OrdersV0Api amazonAuthorizationGrant(AmazonAuthorConfigDTO authorConfigDTO) throws ApiException {
AWSAuthenticationCredentials awsAuthenticationCredentials;
AWSAuthenticationCredentialsProvider awsAuthenticationCredentialsProvider;
LWAAuthorizationCredentials lwaAuthorizationCredentials;
//注意這個地方的region分北美,歐洲,遠東三個AWS區域
awsAuthenticationCredentials = AWSAuthenticationCredentials.builder()
//注冊成為開發者時生成的AWS訪問密鑰ID
.accessKeyId(authorConfigDTO.getAccessKeyId())
//注冊成為開發者時生成的AWS訪問密鑰
.secretKey(authorConfigDTO.getSecretKey())
//注意,這里的region分北美(us-east-1),歐洲(eu-west-1),遠東(us-west-2)
.region(authorConfigDTO.getRegion())
.build();
awsAuthenticationCredentialsProvider = AWSAuthenticationCredentialsProvider.builder()
//創建IAM職權的時候會生成這個ARN
.roleArn(authorConfigDTO.getRoleArn())
//唯一值,可以使用UUID
.roleSessionName(authorConfigDTO.getRoleSessionName())
.build();
lwaAuthorizationCredentials = LWAAuthorizationCredentials.builder()
//查看開發者信息的時候可看到LWA的客戶端編碼
.clientId(authorConfigDTO.getClientId())
//查看開發者信息的時候可看到LWA的客戶端秘鑰
.clientSecret(authorConfigDTO.getClientSecret())
//根據上面的客戶端編碼和客戶端秘鑰請求客戶端令牌
.refreshToken(authorConfigDTO.getRefreshToken())
//"https://api.amazon.com/auth/o2/token"
.endpoint(authorConfigDTO.getLwaEndpoint())
.build();
OrdersV0Api ordersV0Api = new OrdersV0Api.Builder()
.awsAuthenticationCredentials(awsAuthenticationCredentials)
.lwaAuthorizationCredentials(lwaAuthorizationCredentials)
.awsAuthenticationCredentialsProvider(awsAuthenticationCredentialsProvider)
//注意,這里的endpoint分北美,歐洲,遠東三個地域,每個區域的鏈接是不一樣的
//北美,https://sellingpartnerapi-na.amazon.com
//歐洲,https://sellingpartnerapi-eu.amazon.com
//遠東,https://sellingpartnerapi-fe.amazon.com
.endpoint(authorConfigDTO.getSpEndPoint())
.build();
//授權失敗,未獲取到API實例的話拋出異常,進行重試
if(null == ordersV0Api) {
throw new RuntimeException();
}
return ordersV0Api;
}

此方法是調amazon獲取數據的:方法的傳參請參考老的MWS開發文檔:ListOrders注意這里有個坑:這個getOrders方法中的參數有2個是必填的,但是又不能同時使用,傳參的時候需要注意。

public OrderList getAmazonOrders(OrdersV0Api ordersV0Api, List<String> marketplaceIds, AmazonAuthorConfigDTO authorConfigDTO) throws ApiException {
List<String> fulfillmentChannels = new ArrayList<>();
fulfillmentChannels.add("MFN");
List<String> orderStatuses = new ArrayList<>();
orderStatuses.add("Unshipped");
GetOrdersResponse response = ordersV0Api.getOrders(marketplaceIds,"2021-03-17T18:00:00","2021-03-18T18:00:00",null,
null,null,null,null,null,null,10,
null,null,null);
if(null == response) {
throw new RuntimeException();
}
System.out.println(response.getPayload().getOrders());
return response.getPayload().getOrders();
}

注意下面的幾個屬性,要么是剛剛上面說了是從平臺獲取到的,要么是上面方法上注解說了,根據你的店鋪所在國家的所在區域來定的,不要寫錯了哈,region以及spEndPoint可以在官方文檔里找下,表格寫的很清楚的。

public static void main(String[] args) throws ApiException {
AmazonAuthorConfigDTO dto = new AmazonAuthorConfigDTO();
dto.setAccessKeyId("XXXXXXXXX");
dto.setSecretKey("XXXXXXXXXXX");
dto.setRoleArn("arn:aws:iam::XXXXXXXXX:role/XXXXXX");
dto.setRoleSessionName("UUID");
dto.setClientId("amzn1.application-oa2-client.XXXXXXXXXXXXXXXXX");
dto.setClientSecret("XXXXXXXXXXXXXXXXXXXX");
dto.setRefreshToken("XXXXXXXXXXXX");
dto.setRegion("eu-west-1");//根據區域確定
dto.setSpEndPoint("https://sellingpartnerapi-eu.amazon.com");//根據區域確定
dto.setLwaEndpoint("https://api.amazon.com/auth/o2/token");//寫死
OrdersV0Api ordersV0Api = 實例類名.amazonAuthorizationGrant(dto);
List<String> marketplaceIds = new ArrayList<>();
marketplaceIds.add("A1PA6795UKMFR9");//根據國家確定
OrderList orderList = authorGrantService.getAmazonOrders(ordersV0Api,marketplaceIds, dto);
System.out.println(orderList.toString());
}

以上的話就可以實現抓單了,親測OK的。下面說下遇到的幾個問題吧。1.大家遇到最多的應該就是403 forbidden注意這里的roleArn對應的值必須是:arn:aws:iam::XXXXXXXXX:role/XXXXX 的,不能是user

另外就是在創建應用程序的時候需要是role的,如圖:

即你的接入方式是role的必須統一。2.Region,marketplaceId,SpEndPoint,LwaEndpoint這幾個值必須正確,就是根據你的店鋪所在國家的所在區域,另外LwaEndpoint是寫死的”https://api.amazon.com/auth/o2/token”,而SpEndPoint也是根據你的店鋪所在國家的所在區域來決定的,別和SpEndPoint寫反了哈。3.ClientId這個值是amzn1.application-oa2-client.XXXXXX這個樣式的,不是amzn1.sp.solution.XXXXXXXXXXX4.還遇到了一個bad request,就是上面說的,入參有2個是不能同時存在又必須要傳一個的,當時傳了2個,就報400 bad request,移除一個就好了。上面是這2天的總結,搞完了,可以輕松下了祝各位有需要的碼友能順利接入吧,good luck to everyone!

本文章轉載微信公眾號@卡佩希科技

上一篇:

API生成完整指南

下一篇:

kfp-server-api:一個省時高效的 Python 庫
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費