Amazon Product Advertising APIではリクエストの認証のためパラメータとしてTimestamp、Signatureが必要になります。
Timestampは国際標準時を「YYYY-MM-DDThhssZ」で編集します。
Signatureはプログラムで作成した値をリクエストに追加する必要があります。
今回はProduct Advertising API ScratchpadのPHPコードスニペットを参考にSignatureの作成手順を確認します。
<?php
// Product Advertising APIアカウント作成後に取得するアクセスキーを設定します。
$aws_access_key_id = "アクセスキー";
// Product Advertising APIアカウント作成後に取得するシークレットアクセスキーを設定します。
$aws_secret_key = "シークレットアクセスキー";
// エンドポイントを指定します。
$endpoint = "webservices.amazon.co.jp";
$uri = "/onca/xml";
// リクエストパラメータを指定します。
// ここではISBNが4873115655の書籍の情報を取得します。
$params = array(
"Service" => "AWSECommerceService",
"Operation" => "ItemLookup",
"AWSAccessKeyId" => "アクセスキー",
"AssociateTag" => "アソシエイトタグ",
"ItemId" => "4873115655",
"IdType" => "ISBN",
"ResponseGroup" => "Images,ItemAttributes,Offers",
"SearchIndex" => "Books"
);
// タイムスタンプを追加します。
if (!isset($params["Timestamp"])) {
$params["Timestamp"] = gmdate('Y-m-d\TH:i:s\Z');
}
// キーを基準にパラメータをソートします。
ksort($params);
$pairs = array();
// パラメータを key=value の形式に編集します。
// 同時にURLエンコードを行います。
foreach ($params as $key => $value) {
array_push($pairs, rawurlencode($key)."=".rawurlencode($value));
}
// パラメータを&で連結します。
$canonical_query_string = join("&", $pairs);
// 署名に必要な文字列を先頭に追加します。
$string_to_sign = "GET\n".$endpoint."\n".$uri."\n".$canonical_query_string;
// RFC2104準拠のHMAC-SHA256ハッシュアルゴリズムの計算を行います。
// これがSignatureの値になります。
$signature = base64_encode(hash_hmac("sha256", $string_to_sign, $aws_secret_key, true));
// Siginatureの値のURLエンコードを行い、リクエストの最後に追加します。
$request_url = 'http://'.$endpoint.$uri.'?'.$canonical_query_string.'&Signature='.rawurlencode($signature);
echo "Signed URL: \"".$request_url."\"";
?>
生成される署名付きURLはこんな感じ
http://webservices.amazon.co.jp/onca/xml?
AWSAccessKeyId=アクセスキー
&AssociateTag=アソシエイトタグ
&IdType=ISBN
&ItemId=4873115655
&Operation=ItemLookup
&ResponseGroup=Images%2CItemAttributes%2COffers
&SearchIndex=Books
&Service=AWSECommerceService
&Timestamp=2015-12-09T04%3A18%3A41Z
&Signature=19NRyLoK2qnPtEAguD2FC3ZTWrtNp1C6w9zVnKRqa8Y%3D