zzxworld

如何使用 Amazon SP-API 接口上传产品

接上周《Amazon SP-API 卖家接口对接指北》这篇文章,继续 Amazon 卖家接口折腾之旅。经过本周不懈的尝试,终于把产品上传的功能给打通了。本文是对整个操作流程的一个简单回溯。

在开始之前,要先吐槽一下 Amazon 的沙箱环境,也就是俗称的 Sandbox。理论上来说,开发者可以通过使用这个来模拟正式环境下的接口请求,开发出需要对接的功能后,就可以无缝切换到正式环境来使用。但 Amazon SP-API 提供的沙盒是一个纯静态的模拟,除了能测试指定参数下的返回数据结构,完全就是个鸡肋。迫于无奈,我只能选择使用正式环境来做开发。

基础流程

亚马逊的文档做的还算细致,访问地址:Amazon Selling Partner API。通过查看文档中 Listing items on Amazon 这部分内容,可以看出要在亚马逊上传一个产品的大致流程:

listing item to amazon flow 上传产品到亚马逊的流程图

结合以上流程图,经过自己的尝试,得出在 Amazon 完成产品上传的步骤具体如下:

  1. 使用 searchCatalogItems 接口查找要上传的产品信息是否存在。有的话可以直接使用现有的产品信息。
  2. 如果产品信息不存在,就要走新产品流程,需要使用 searchDefinitionsProductTypes 接口先确定产品类型。
  3. 拿到产品类型后,接下来使用 getDefinitionsProductType 去取产品类型的定义数据。也就是该类型的产品需要提供哪些字段,以及该如何提供这些字段值。
  4. 有了产品需要提供的字段和值后,按要求准备好数据,就可以调用 putListingltem 来向 Amazon 提交产品信息。这个接口如果返回 ACCEPTED 响应,就表示数据提交成功。
  5. 因为 Amazon 对产品数据的处理不是实时的,最后可以对接事件通知接口来获取产品的后续状态信息。

注意上面第 4 步中上传产品接口返回的是 ACCEPTED,它只是表示数据格式无误,并不代表产品已经上架。这时你去亚马逊商家后台会看不到刚提交的产品,需要等上一两分钟,如果在后台出现了刚提交的产品数据,才代表上传成功。这也是为什么还需要通过第 5 步对接事件通知接口来获取后续状态信息的原因。

以上流程给我的感觉非常繁琐。但 1 至 3 也不是必须的,如果产品类型可控,可以把相关的字段固定下来,然后直接通过第 4 步来提交产品数据。

产品图片

Amazon SP-API 没有提供专门的产品图片接口,所以需要自己解决产品图片存储和访问需求。如果要对接的系统部署在公网,那就省事了,直接把图片的公网访问地址提供给 Amazon 即可,它会自动复制过去。但需要注意的是,地址只支持 https 协议。

我这边因为系统部署在内网,所以只能额外的花钱购买云存储来中转需要上传的产品图片。为了省事,直接使用了亚马逊的 S3 存储服务。因为除了 https,产品上传接口还支持 s3:// 这种格式的资源地址。使用这种格式可以让我在不暴露产品图片地址的情况下,把图片提供给 Amazon 上传的产品使用。目前唯一担心的是价格,这个需要靠后续的使用来验证。

图文描述

Amazon 默认的产品描述字段只支持 <br><b> 标签,这基本就等同于没有可美化产品描述的空间。如果想要放点图片到产品描述,或是整点不一样的布局,就需要用到图文描述功能。在 Amazon 卖家后台,这个功能叫 A+ Content,位于广告菜单下。

虽然在广告菜单下,但并不是一个付费功能,而且还提供了相关接口。作为能丰富产品展现形式的功能,自然也是需要对接到系统的。

Amazon 的图文描述功能对接并不复杂,它提供了 15 种布局模块。使用时只要根据自己的需求选择并安排模块位置,然后按照模块的格式填写数据即可。唯一的难点就是模块图片的处理。图文模板的图片不接受外部地址,需要用 SP-API 提供的上传接口来处理,整个流程如下:

  1. 使用 createUploadDestinationForResource 接口先申请上传资源,接口会返回一个文件路径和上传地址。
  2. 使用上面返回的上传地址完成图片上传操作,返回 20X 类型的状态码就表示上传成功。官方文档说的是返回 200,我实测会返回 204,但也是有效的。
  3. 确认成功后,就可以把第一步中返回的文件路径拿来作为图文描述的图片地址使用。

和产品接口一样,图文描述创建完并不代表立马就可以显示在产品详情页,还需要通过亚马逊的审核后才会显示。

总结

使用亚马逊接口需要耐心。通过实测,使用接口成功提交一条产品信息后,需要几分钟才会出现在卖家的商品列表,然后再需要十多分钟甚至几个小时才会从「未完成」状态变为「在售」,后续还需要更多时间产品图片才会呈现出来。所以在调用完一个亚马逊的接口后,如果没有看到响应的变更,不用急躁,耐心等待一段时间即可。

总体来说,我还是更喜欢 eBay 的接口,更完善,也更符合直觉。只是目前各种类型的接口太多了,有点太混乱。后面有机会了再分享一下关于 eBay 的接口对接经验。

6 条评论

  1. fitz
    hello,请问对这个还有印象吗,图片如果是https的话就可以用自己服务器的嘛,这里收到一个错误: Unable to Retrieve Media Content for URL \u0027Media Content is Not Hosted by Amazon or Amazon Web Services (such as AWS S3 or AWS CloudFront)\u0027: https://mycompanyname.com/dg9-hrqCRePNnovO/cat0322frotest.jpg.
    • zzxworld
      我用的是 S3 云存储,看文档说是可以使用 https 地址,但没有提到只能用亚马逊自己的。通过你提供的这个错误信息来看,还是只能使用亚马逊自己的云服务资源才行。
  2. Yuqi Cheng
    请问下你有尝试过批量上传产品吗?有没有遇到过不同子类目的产品一起上传,如何填写Item Type Keyword 的问题?也就是选定不同的子类目
    • zzxworld
      暂时没有,目前我这边在亚马逊平台走的是入驻 FBA 的方式,所以 SKU 不多,不太需要批量操作。至于你提到的 item type keyword,目前是手动填写。但如果是需要批量处理,感觉可以通过预先设置到产品分类的方式来自动分配给不同的产品。
  3. jack
    你好,请教一下发布一个变体商品,也是走这个逻辑吗?变体商品子体要填写sku 和子体属性相关的信息,这些都是通过getDefinitionsProductType 可以获得的吗?getDefinitionsProductType 只是获取一个类别,具体的商品属性是不是可能不一定对呢?
    • zzxworld
      多属性变体商品这块我暂未涉及,没法给你提供实践经验,抱歉哈。依据我之前的对接过程应该是需要根据具体产品类型用 getDefinitionsProductType 接口提供的数据结构来确定相关属性的。