玩转SP API-亚马逊店铺授权保姆级教程

457 阅读6分钟

前言

如果你是刚申请好亚马逊的公共开发者账号,你是不是接下来也是需要使用新申请的开发者账号完成自己店铺的授权,然后拿到相关的ak、sk等等玩转整个sp api;

这篇文章能完整的告诉你如何进行店铺授权以及怎么获取sp api调用涉及的 accessKeyIdsecretKeyroleArnclientIdclientSecretrefreshToken 关键信息,助力你完成店铺授权以及sp api的使用


实践

🌹前置准备

  • 一个亚马逊的公共开发者账号
  • 一个能支持Https请求的应用(用来接收回调参数)

Tips:sp api店铺授权文档

Step1:设置参数回调地址路径

用来在授权成功后拿到一些系统关键参数信息,必须设置

1.1 登录公共开发者账号店铺后台(未使用SPP),目录路径如下:

image.png

1.2 进入到店铺后台的开发者中心 image.png

在这里你能获取到2个关键参数:clientId(应用ID)clientSecret(LWA凭证)

⚠️

  • 你需要检查你的账号是否是公共开发者账号,如果不是则不适用本文章
  • 亚马逊公共开发者账号授权分两类,网站授权和应用商店授权,如果状态是草稿应该使用网站授权并添 加特殊传参识别,如果是发布状态则不需要 1.3 编辑应用程序-编辑回调地址(身份验证URI、重定向URI)

image.png

在此处填入你接收回调的接口路径清单列表。当授权完成后会根据你传递的redirect——url(必须在上面配置的URI)中,来执行回调,返回你一些必要的数据信息。

必要参数如下(来自spapi文档): image.png

Step2 设置IAM用户角色

2.1 登录到开发者管理后台(非店铺后台)

地址(北美):us-east-1.console.aws.amazon.com/console/hom…

image.png 2.2 进入到IAM配置控制台 通过IAM快捷进入到IAM配置页面(如果没有可以自行左上方搜索IAM进入)

image.png

Tips:你需要关注的只有用户、角色两个地方(如果进来没有可以点一下左上方菜单栏展开即可)

2.3 新建用户 2.3.1 策略选择AwsSellingPartner,详见下图

image.png 2.3.2 创建成功后会在用户列表有条用户信息记录

image.png 2.3.3 点击用户名进入详情

image.png 2.3.4 创建访问秘钥-选择三方服务

image.png

记录下该秘钥,最好下载csv保存下来,后面无法再次获取!!! image.png

在这里你又能获取到2个关键参数:accessKeyId(访问密钥)secretKey(秘密访问密钥)

2.4 创建角色 2.4.1 选择aws服务,案例选择PartnerCentral,其余按照默认即可

image.png 2.4.2 返回列表页面你能看到刚创建的角色

image.png 2.4.3 这时候我们要创建内联策略

image.png 2.4.4 选择STS资源,勾选写入-Assume,资源arn选择当期role的资源信息即可

image.png 2.4.5 还需要配置信任关系,切换到信任关系tab页

image.png 2.4.6 编辑信任策略,在Principal中加入(代表对该用户信任),保存返回

image.png 在这里你又能获取到1个关键参数:roleArn(角色)


💐💐💐如果你到了这里,恭喜你,你已经成功了80%了,6个关键参数我们已经获取到了5个,我们可以回顾下:

我们在公共开发者账号的店铺后台获取到了accessKeyId(应用ID)secretKey(LWA凭证)

店铺后台地址:sellercentral.amazon.com/sellingpart…

公共开发者账号的开发后台IAM通过创建用户、访问秘钥获取到了accessKeyId(访问秘钥)secretKey(隐私访问秘钥)

开发后台用户功能地址(北美):us-east-1.console.aws.amazon.com/iam/home?re…

公共开发者账号的开发后台IAM通过创建角色(需要配置权限和信任关系)获取到了roleArn(角色arn)

开发后台角色功能地址(北美):us-east-1.console.aws.amazon.com/iam/home?re…

Step3 店铺授权地址拼接(进行授权)

3.1 地址拼接

https://sellercentral.amazon.com/apps/authorize/consent?application_id=店铺后台公共开发者账号页面应用id&redirect_uri=你需要回调的URI(在你刚才配置的URI清单里面)&state=xxx(自定义传递参数)&version=beta(如果应用程序是草稿的话,增加该条件,否则会提示找不到)

applicationId:为公共开发者账号店铺后台中应用id(参考Step1)

redirect_uri:为公共开发者账号店铺后台中配置回调地址路径(参考Step1)

state:自定义参数,拼接在浏览器中,可以用来传递鉴权信息

version:如果你的应用没有发布,则应该增加version=beta

3.2 跳转地址(请使用你打开店铺后台的浏览器,否则访问可能不通)

image.png 3.3 这里你勾选同意后确认,页面等待亚马逊授权完成会回调你链接中的地址接口

state(请求状态)

selling_partner_id(店铺唯一标识)

spapi_oauth_code(短期授权码,⚠️五分钟有效)

image.png

Step4. 获取refreshToken(api调用标志,最后一个参数)

请求接口地址:

GET https://api.amazon.com/auth/o2/token

接口入参

字段名说明示例值
grant_type固定值:authorization_code/
codestep3获取到的spapi_oauth_code(5分钟有效期)ANNmFoPHAvkHIDmeWyjC
client_idstep1中店铺后台的应用idamzn1.application-oa2-client.xxxxxxx
client_secretstep1中店铺后台的LWA凭证编码amzn1.oa2-cs.v1.

响应示例

{
    "access_token": "Atza|IwEBIMrxxxxxx",
    "refresh_token": "Atzr|IwEBIHEPZxxxx",
    "token_type": "bearer",
    "expires_in": 3600
}

其中refreshToken就是我们需要的token信息。截止当下,我们6个参数都获取成功了🎉🎉🎉


Step5. 测试SP API接口

这里,我们选取订单的api来测试

附代码:


static String REFRESH_TOKEN = "Atzr|IwEBIHEPZxxxx";

static String SELLER_ID = "xxxxxxx";

static AWSAuthenticationCredentials awsAuthenticationCredentials = AWSAuthenticationCredentials.builder()
        .accessKeyId(AmazonConstants.ACCESS_KEY_ID)
        .secretKey(AmazonConstants.SECRET_KEY)
        .region("us-east-1")//请求地区
        .build();


static AWSAuthenticationCredentialsProvider awsAuthenticationCredentialsProvider = AWSAuthenticationCredentialsProvider.builder()
        .roleArn(AmazonConstants.ROLE_ARN)
        .roleSessionName(UUID.randomUUID().toString().replace("-", ""))
        .build();


static LWAAuthorizationCredentials lwaAuthorizationCredentials = LWAAuthorizationCredentials.builder()
        .clientId(AmazonConstants.CLIENT_ID)
        .clientSecret(AmazonConstants.CLIENT_SECRET)
        .refreshToken(REFRESH_TOKEN)
        .endpoint(AmazonConstants.LWA_ENDPOINT)
        .build();


static OrdersV0Api ordersV0Api = new OrdersV0Api.Builder().awsAuthenticationCredentials(awsAuthenticationCredentials)
        .awsAuthenticationCredentialsProvider(awsAuthenticationCredentialsProvider)
        .lwaAuthorizationCredentials(lwaAuthorizationCredentials)
        .endpoint("https://sellingpartnerapi-na.amazon.com")//请求地区
        .build();


static FinancesApi financesApi = new FinancesApi.Builder().awsAuthenticationCredentials(awsAuthenticationCredentials)
        .awsAuthenticationCredentialsProvider(awsAuthenticationCredentialsProvider)
        .lwaAuthorizationCredentials(lwaAuthorizationCredentials)
        .endpoint("https://sellingpartnerapi-na.amazon.com")//请求地区
        .build();


/**
 * 查询40天内的订单
 */
@RequestMapping("/get/order")
public void listFulfillmentOrder() {
    String format = LocalDateTime.now().plusDays(-40).format(DateTimeFormatter.ISO_DATE_TIME);
    try {
        GetOrdersResponse orders = ordersV0Api.getOrders(Lists.newArrayList("ATVPDKIKX0DER"), format, null, null,
                null, null, null, null, null, "",
                null, null, null, null, null, null, null);
        System.out.println(orders.getPayload().getOrders().size());
    } catch (ApiException e) {
        System.out.println(e.getResponseBody());
    }

}

输出结果:

2025-03-13 13:27:54.755  INFO 89947 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2025-03-13 13:27:54.758  INFO 89947 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 3 ms
61

可以看到输出了61个订单的数据,说明这些参数是有效的。


至此整个店铺授权的链路都分享完了,包含后面得api验证。 由于上面的都是个人的经验得到的,如果存在错误,希望大家多多指正,也欢迎大家留言沟通交流!

qrcode_for_gh_6b1c51d0aab8_344.jpg