ノラプログラマーの技術メモ

ネットで調べても出てこなかった情報を載せていきたい技術系ブログ。

Amazon MWS、注文管理APIのPHPサンプルを書いてみた

Amazon MWSとは

Amazon MWSとは、Amazonが提供するマーケットプレイス向けAPI群のことで、APIを利用すると商品管理や注文管理を自動化できるアプリケーションが作れるようになる。

MWSの利用は無料だが、大口出品者しか利用できない。またAPIの利用回数に制限がある(スロットリング)。利用回数が上限に達した場合、時間を置くことで再び使用できるようになる。

MWSの登録方法

  1. Amazonにログインしてユーザー権限ページを開き、Amazon出品用アカウントの管理者としてログインする。
  2. 開発者を承認ボタンをクリックする。
  3. 開発者の名前テキストボックスに、承認するアプリケーション開発者の名前を入力する。
  4. 開発者IDテキストボックスに開発者IDを入力し、開発者を承認をクリックする。
  5. MWS認証トークンが表示できることを確認する。

f:id:kawai_norimitsu:20180204100554j:plain

f:id:kawai_norimitsu:20180204100602j:plain

PHPサンプル

AmazonMWSはJavaC#PHPでアプリケーションが作成されることを想定しているらしく、PHPのクライアントライブラリも存在する。

しかし今回はライブラリを使用せず、必要最低限のシンプルなソースコードを書くことにした。

PHPプログラムのサンプルは次の通り。

<?php
  // ----------------------------------------------------- パラメータ設定
  $MWSAuthToken = "<ここにあなたの秘密キー>";  // (3)秘密キー

  $params = array();
  $params['AWSAccessKeyId'] = "<ここにあなたのAWSアクセスキーID>";  // (2)AWSアクセスキーID
  $params['SellerId'] = "<ここにあなたの出品者ID>";  // (1)出品者ID
  $params['MarketplaceId.Id.1'] = "A1VC38T7YXB528";
  $params['SignatureMethod'] = "HmacSHA256";
  $params['SignatureVersion'] = "2";
  $params['Version'] = "2013-09-01";
  $params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
  $params['Action'] = "ListOrders";
  $params['LastUpdatedAfter'] = gmdate('Y-m-d\T00:00:00\Z', strtotime("-1 days"));
  ksort($params);

  // ----------------------------------------------------- 署名作成
  $sign_str = "GET\nmws.amazonservices.jp\n/Orders/2013-09-01\n";
  foreach($params as $key => $value) {
  	$sign_str .= "{$key}=" . rawurlencode($value) . "&";
  }
  $sign_str = substr($sign_str, 0, -1);
  $Signature = base64_encode(hash_hmac('sha256', $sign_str, $MWSAuthToken, true));

  // ----------------------------------------------------- リクエスト
  $url = "https://mws.amazonservices.jp/Orders/2013-09-01?";
  foreach($params as $key => $value) {
  	$url .= "{$key}=" . rawurlencode($value) . "&";
  }
  $url .= "Signature=" . rawurlencode($Signature);
  $xml = file_get_contents($url);

  // ----------------------------------------------------- データ解析
  $xmlObject = simplexml_load_string($xml);
  var_dump($xmlObject);
?>

ポイントは署名の作り方で、リクエストのキーをksort関数で昇順にしている点だろう。

ドキュメントには載ってないが、キーを昇順にして署名・送信しないと、サーバー側で署名が一致せずエラーになってしまうのだ。

上記のサンプルは1日前の注文情報を取得するものだが、カスタマイズしたい場合は注文管理APIのドキュメントを参照のこと。

あと必須パラメータなど、APIを使いこなすのに読んでおいた方がいい関連ドキュメントを以下にまとめておいた。

以上、お疲れ様でした。