Amazon SP-APIを使ってみる

ショコラ
ショコラ

Amazon SP-APIを使ってみる

2023年10月8日の情報です。どのサイトよりも最新の情報です。
インターネットの情報は古い。古いので、セラーセントラルやAWSと画面が違うんです。
初心者には、その違いが辛いです。

【SP-API開発者ガイド】
https://github.com/amzn/selling-partner-api-docs/blob/main/guides/ja-JP/developer-guide/SellingPartnerApiDeveloperGuide(%E6%97%A5%E6%9C%AC%E8%AA%9E).md

【SP-API リリースノート】
https://developer-docs.amazon.com/sp-api/docs/sp-api-release-notes

「Selling Partner APIには、本番データに影響を与えたり、実際のイベントをトリガーしたりすることなく、アプリケーションをテストできる2つのサンドボックス環境が用意されています。(https://developer-docs.amazon.com/sp-api/docs/the-selling-partner-api-sandbox?ld=NSGoogle)」ということで、サンドボックスで開発できるらしいけど。。。

もっさん先輩
もっさん先輩

アマゾンにAPIを使って商品を出品するには、セリングパートナーAPI(SP-API)を使うことが分かった。
(昔はMWSを使いましたが、2023年12月31日に廃止になるようです。)

SP-APIを使うには、大口出品者にならないと使えないことが分かった。(開発するだけでも必要みたい)
※大口出品者になるには毎月4900円。10%税込で5,390円を支払わなければなりません。

大口出品者の契約は行いました。

あとは

Selling PartnerAPI開発者に登録すること。

「Selling Partner APIアプリケーションを登録する前に、Selling PartnerAPI開発者として登録する必要があります。(https://developer.amazonservices.com/ja-jp-register)」とありますので、開発者として登録しようと思います。
「メインメニュー > アプリとサービス」と進み、アプリの開発 を選択して開発者コンソールにアクセスします。

↓小口出品者だと、「アプリの開発」がありませんので気をつけてください。

「開発者プロフィールに進む」ボタンを押します。(この「開発者プロフィールに進む」ボタンは初回のみ表示されます)

「開発者プロフィール」の入力で超重要なのが「開発者ID」の欄です。ここで AWSのユーザー と Selling PartnerAPI開発者 を結び付けます。
(と思いますが、AWSユーザーなくてもSP-API使えます)

「ロール」
「商品の出品」、「価格」、「Amazonから発送」、「購入者とのコミュニケーション」、「購入者にフィードバックを依頼」、「販売パートナーのインサイト」、「財務会計」、「在庫と注文の追跡」、「ブランド分析」をチェックします。

「セキュリティ管理」

「ネットワーク制御を使用して、Amazon情報への不正アクセスを防止していますか?」
社内にある PC は MACアドレス が ルーター に登録されていないと外部に出ることはできないという制御がはいっているので「YES」。
Amazon の受け側で接続元の IP の制限はできないようです。

「ユーザーの職務や業務に基づいて、Amazon情報へのアクセスを制限していますか?」
アマゾンにアクセスできる情報を制限しているので「YES」でしょう。

「Amazon情報を送信中に暗号化していますか?」
通信は https で暗号化されるので「YES」でしょう。

「潜在的な脅威やセキュリティインシデントの監視、検知、対応についてのインシデント対応計画はありますか?」
セキュリティインシデントとは、マルウェアの感染や不正アクセス、あるいは機密情報の流出など、セキュリティ上の脅威となる事象」でこれについては各マシンにマクロソフトのアンチウイルスソフトを導入しているので「YES」でしょう。

「そのインシデント対応計画には、Amazon情報に関連するセキュリティインシデントを3p-security@amazon.comに報告することが含まれていますか?」
少し外れるかもしれませんが、社内に「緊急時対策基準(個人データ事故発生時) 」マニュアルがありましたので、そちらにアマゾンを追加しました。これで「YES」としましょうか。

「人員とシステムに対して最低限のパスワード要件が設定されていますか?」
これは「YES」でしょう。

「認証情報(パスワード、暗号化キー、秘密アクセスキー)は安全に保管されていますか? つまり、認証情報を公開リポジトリに保存したり、認証情報を共有したり、認証情報をアプリケーションにハードコーディングしたりしていない、ということです。」
公開リポジトリは使用していないし、認証情報はDBに持つ予定なので「YES」です。

「Amazon情報を共有するすべての外部第三者を記載して、貴組織がこの情報を共有する方法を説明してください。」
今回は自社で私が開発するので、外部第三者と情報の共有はしません。

「Amazonの情報を取得するAmazon MWS以外のソースをすべて記載してください。」
SP-APIを使用して〇〇すると書きました。

その後。。。
「SP-API開発者プロフィールの作成」メールが送られてきた。

「新しいアプリクライアントを追加」ボタンを押してアプリの登録を行いました。

デベロッパーセントラルの「LWA認証情報」の「表示」をクリックすると「クライアントID」と「クライアントシークレット(クライアント機密情報)」を取得することができます。
「アプリの編集」から「承認」すると「リフレッシュトークン」を発行することができます。

APIを使うための情報が揃いました。
・クライアントID
・クライアントシークレット
・リフレッシュトークン
・アクセスキー(AWSのユーザー)
・シークレットアクセスキー(AWSのユーザー)

アクセストークンを取得してみる

↓このPHPのプログラムでアクセストークンを取得することができます。アクセストークンの有効期限は1時間です。

#!/usr/local/bin/php
<?php
// アクセストークンを取得する

// post
$post = array(
  'client_id'    => '[クライアントID]',
  'client_secret'=> '[クライアントシークレット]',
  'refresh_token'=> '[リフレッシュトークン]',
  'grant_type'   => 'refresh_token',
);

$options = array(
  CURLOPT_POST            => true,
  CURLOPT_RETURNTRANSFER  => true,
  CURLOPT_URL             => 'https://api.amazon.com/auth/o2/token',
  CURLOPT_HTTPHEADER      => array(
    'Host: api.amazon.com',
    'Content-Type: application/x-www-form-urlencoded;charset=UTF-8',
  ),
  CURLOPT_POSTFIELDS      => http_build_query($post),
  CURLOPT_SSL_VERIFYPEER  => false,
  CURLOPT_SSL_VERIFYHOST  => false,
);

// プロクシを使う場合
if (false) {
  $options[CURLOPT_HTTPPROXYTUNNEL] = true;
  $options[CURLOPT_PROXY]           = '[プロクシホスト]';
  $options[CURLOPT_PROXYPORT]       = '[プロクシポート]';
}

$curl = curl_init();
curl_setopt_array($curl,$options);
$resp = curl_exec($curl);
curl_close($curl);
$json = json_decode($resp);

file_put_contents('access_token',$json->access_token);

上で取得した アクセストークン を使って、商品情報を取得することができます。(署名って必要ないのでしょうか???)

#!/usr/local/bin/php
<?php
// ASIN から商品情報を取得する

$access_token   = file_get_contents('access_token');
$Host           = 'sellingpartnerapi-fe.amazon.com';
$asin           = 'B004Y9IZDC'; // コカ・コーラ
$marketplaceIds = 'A1VC38T7YXB528';
$url = "https://{$Host}/catalog/2022-04-01/items/{$asin}?marketplaceIds={$marketplaceIds}&includedData=attributes,productTypes";

$options = array(
  CURLOPT_HTTPGET        => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_URL            => $url,
  CURLOPT_HTTPHEADER     => array(
    "Host: {$Host}",
    "x-amz-access-token: {$access_token}",
    'Content-Type: application/x-www-form-urlencoded;charset=UTF-8',
  ),
  CURLOPT_SSL_VERIFYPEER => false,
  CURLOPT_SSL_VERIFYHOST => false,
);

$curl = curl_init();
curl_setopt_array($curl,$options);
$resp = curl_exec($curl);
curl_close($curl);
$json = json_decode($resp,true);

mb_convert_variables('EUC-JP','UTF-8',$json);
var_dump($json);

サンドボックスから商品情報を取得してみます。
↓下を参考
https://github.com/amzn/selling-partner-api-models/blob/main/models/catalog-items-api-model/catalogItemsV0.json

#!/usr/local/bin/php
<?php
// ASIN から商品情報を取得する

$access_token   = file_get_contents('access_token');
$Host           = 'sandbox.sellingpartnerapi-fe.amazon.com';
$asin           = 'ASIN_200';
$MarketplaceIds = 'TEST_CASE_200';
$url = "https://{$Host}/catalog/v0/items/{$asin}?MarketplaceId={$MarketplaceIds}";

$options = array(
  CURLOPT_HTTPGET        => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_URL            => $url,
  CURLOPT_HTTPHEADER     => array(
    "Host: {$Host}",
    "x-amz-access-token: {$access_token}",
    'Content-Type: application/x-www-form-urlencoded;charset=UTF-8',
  ),
  CURLOPT_SSL_VERIFYPEER => false,
  CURLOPT_SSL_VERIFYHOST => false,
);

$curl = curl_init();
curl_setopt_array($curl,$options);
$resp = curl_exec($curl);
curl_close($curl);
$json = json_decode($resp,true);

mb_convert_variables('EUC-JP','UTF-8',$json);
var_dump($json);

以上

Scroll to Top