【SP-API】【PHP】 CatalogItems(searchCatalogItems) サンプルコード

■ 概要

SP-API Catalog Items(searchCatalogItems)のPHPによる実装コードです。
こちらのコードを張り付けるだけでPHPの環境においてCatalog Items(searchCatalogItems)の結果を得ることができます。
※v2022-04-01とv2020-12-01に対応(v0には対応しておりません)

提供するメソッドとしては下記となります。

construct: 初期値設定
index: 出力
amazonRequest: Catalog Items APIリクエスト生成
getAccessToken: トークン APIリクエスト生成
httpRequest: httpリクエスト


■ コード

                                
                                    
                                    <?php

                                        namespace App\Http\Controllers;

                                        use Illuminate\Http\Request;

                                        class Code extends Controller
                                        {
                                            // 初期値設定
                                            public function __construct()
                                            {
                                                // 1.[入力してください]アプリケーション名(自分が認識しやすいもの)
                                                define('USER_AGENT'       , 'test_pg001');
                                                // 2.[入力してください]アプリケーションのLWA認証情報 クライアントID
                                                define('APP_LWA_ID'       , '');
                                                // 3.[入力してください]アプリケーションのLWA認証情報 クライアント機密情報
                                                define('APP_LWA_SECRET'   , '');
                                                // 4.[入力してください]アプリケーションのリフレッシュトークン
                                                define('APP_REFRESH_TOKEN', '');
                                                
                                                // 5.ホスト名(例 アメリカ:sellingpartnerapi-na.amazon.com, 日本:sellingpartnerapi-fe.amazon.com) 
                                                define('HOST'             , 'sellingpartnerapi-na.amazon.com');
                                                // 6.エンドポイント
                                                define('ENDPOINT'         , 'https://' . HOST);
                                                // 7.リージョン(例 アメリカ:us-east-1, 日本:ap-northeast-1) 
                                                define('REGION'           , 'us-east-1');
                                                // 8.マーケットプレイスID(例 アメリカ:ATVPDKIKX0DER, 日本:A1VC38T7YXB528) 
                                                define('MP_ID'            , 'ATVPDKIKX0DER');
                                                // 9.トークンキャッシュファイル名
                                                define('TOKEN_CACHE'      , 'token_cache_file.json');
                                                // 10.Catalog Items API URL(/catalog/2020-12-01/items or /catalog/2022-04-01/items)
                                                define('CATALOG_ITEMS_API', '/catalog/2022-04-01/items');
                                                // 11.TOKEN API URL
                                                define('TOKEN_API'        , 'https://api.amazon.com/auth/o2/token');

                                                // 12.キーワードまたはasinをセット(「,」区切りで複数検索可能)
                                                $this->keyword   = 'pen,bag';
                                                // 13.取得件数(1~20)
                                                $this->page_size = 20;
                                            }

                                            // 出力処理
                                            function index() 
                                            {
                                                $qs  = '';
                                                if ($this->keyword) {
                                                    $qs = 'keywords=' . urlencode($this->keyword);
                                                }

                                                $qs .= '&marketplaceIds=' . MP_ID . '&pageSize=' . $this->page_size;
                                                $res = $this->amazonRequest('GET', CATALOG_ITEMS_API, $qs);

                                                // 出力サンプル
                                                if ($res && !empty($res['items'])) {
                                                    foreach($res['items'] as $item) {
                                                        echo $item['asin'] . ':' . $item['summaries'][0]['itemName'] . '
'; } } else { echo 'Acquisition failure'; } } // Catalog Items APIリクエスト生成 function amazonRequest($method, $path, $qs = '', $post = '') { $accessToken = $this->getAccessToken(); $date = gmdate('Ymd\THis\Z'); $ymd = gmdate('Ymd'); $canonicalRequest = $method . "\n" . $path . "\n" . $qs . "\n" . 'host:' . HOST . "\n" . 'user-agent:' . USER_AGENT . "\n" . 'x-amz-access-token:' . $accessToken . "\n" . 'x-amz-date:' . $date . "\n" . "\n" . 'host;user-agent;x-amz-access-token;x-amz-date' . "\n" . hash('sha256', $post); $signKey = hash_hmac('sha256', $ymd, 'AWS4' . APP_LWA_SECRET, true); $signKey = hash_hmac('sha256', REGION, $signKey, true); $signKey = hash_hmac('sha256', 'execute-api', $signKey, true); $signKey = hash_hmac('sha256', 'aws4_request', $signKey, true); $stringToSign = 'AWS4-HMAC-SHA256' . "\n" . $date . "\n" . $ymd . '/' . REGION . '/execute-api/aws4_request' . "\n" . hash('sha256', $canonicalRequest); $signature = hash_hmac('sha256', $stringToSign, $signKey); $authorization = 'AWS4-HMAC-SHA256 ' . 'Credential=' . APP_LWA_ID . '/' . $ymd . '/' . REGION . '/execute-api/aws4_request,' . 'SignedHeaders=host;user-agent;x-amz-access-token;x-amz-date,' . 'Signature=' . $signature; $headers = []; $headers[] = 'authorization:' . $authorization; if ($post) $headers[] = 'content-type:application/json;charset=utf-8'; $headers[] = 'host:' . HOST; $headers[] = 'user-agent:' . USER_AGENT; $headers[] = 'x-amz-access-token:' . $accessToken; $headers[] = 'x-amz-date:' . $date; $status = ''; $fullUrl = ENDPOINT . $path . ($qs ? '?' . $qs : ''); $result = $this->httpRequest($fullUrl, $post, $headers, $status, false); if (strpos($result, 'Error:') === 0) exit($result); if (empty($result)) exit('Error: Empty response'); if ($status != 200) exit('Error: Bad Http Status: ' . $status); if (strpos($result, '{') !== 0) exit('Error: Invalid JSON: ' . $result); $json = json_decode($result, true); if (!$json) exit('Error: Problem decoding JSON: ' . $result); return $json; } // トークン APIリクエスト生成 function getAccessToken() { if (file_exists(TOKEN_CACHE)) { $file = file_get_contents(TOKEN_CACHE); $json = json_decode($file, true); if ($json && !empty($json['token'])) { if (!empty($json['expires']) && time() < $json['expires']) { return $json['token']; } } } $post = [ 'grant_type' => 'refresh_token', 'refresh_token' => APP_REFRESH_TOKEN, 'client_id' => APP_LWA_ID, 'client_secret' => APP_LWA_SECRET ]; $headers = []; $headers[] = 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8'; $headers[] = 'Host: api.amazon.com'; $headers[] = 'POST /auth/o2/token HTTP/l.l'; $headers[] = 'user-agent: ' . USER_AGENT; $status = ''; $response = $this->httpRequest(TOKEN_API, $post, $headers, $status, true); if (strpos($response, '{"access_token":') !== 0) { exit('Error: Access token response was bad: ' . $response); } if (strpos($response, 'expires_in') === false) { exit('Error: No "expires_in" found in response: ' . $response); } $json = json_decode($response, true); if (!$json || empty($json['access_token']) || empty($json['expires_in'])) { exit('Error: Access token JSON decode failure: ' . $response); } $cacheData = json_encode([ 'token' => $json['access_token'], 'expires' => time() + $json['expires_in'], ]); file_put_contents(TOKEN_CACHE, $cacheData); return $json['access_token']; } // httpリクエスト function httpRequest($url, $post = '', $header = null, &$status = null, $is_post_method = true) { $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => $is_post_method ? 'POST' : 'GET', CURLOPT_POST => $is_post_method ? 'TRUE' : 'FALSE', CURLOPT_SSL_VERIFYPEER => 'FALSE', CURLOPT_SSL_VERIFYHOST => 'FALSE', CURLOPT_RETURNTRANSFER => 'TRUE', CURLOPT_FOLLOWLOCATION => 'TRUE', CURLOPT_CONNECTTIMEOUT => 5, ]); if ($post) curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); if ($header) curl_setopt($ch, CURLOPT_HTTPHEADER, $header); $out = curl_exec($ch); if (curl_errno($ch)) exit('Error: ' . curl_error($ch)); if ($status !== null) $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); return $out; } }


■ 実装手順

STEP1.コードを張り付ける

ご自身の環境のControllerにすべてのメソッドを張り付ける

STEP2.初期値を設定する

キャプチャはコードのコンストラクタ部分
各項目に適切な値を設定してください。
各項目について解説します



1~4の情報を入力する
※1は実際のアプリケーション名でなくともよい
※2,3,4はAmazonセラーセントラルのデベロッパーセントラルから取得してください(下記キャプチャ参照)

※以降のキャプチャはAmazonセラーセントラル画面







5,7,8は利用するマーケットプレイスに応じて修正して下さい
12に検索対象となるキーワードまたはASINを入力してください( , 区切りで複数検索が可能です)
13は取得するレコード数です(20件が最大)

STEP3.カスタマイズする

出力部分を利用目的に沿ってカスタマイズしてご利用ください
catalog-items searchcatalogitemsのレスポンス内容に関しましては下記のリンクよりご確認ください。

catalog-items searchcatalogitemsの仕様を確認する
サンプルコード一覧