今の時点でのLatest ReleaseのZend Framework 1.8.4 patch 1では、まだ認証付きリクエストを送ることはできないようです。(ソースコードにも$appSecretKey無いし...)なので、とりあえずは、Zend_Service_Amazonは使わずにいます。
でも、Zend_Service_Amazon_Abstractでは、secretKeyの記述があるので、詳しい方だともう実装されているかも?しれません。
そこで、[PHP] Amazon Product Advertising API で認証付きリクエストを送る方法まとめをもとに、今までのリクエストに認証をつけることにしました。
私の環境では無事、hash_hmac が使えましたので、後はhttp://ringoon.jp/さんの仰せのとおりにしました。
<?php
$secret_key = "9999999999999999999999999999999999999999";
$test_url = "http://webservices.amazon.com/onca/xml?Service=AWSECommerceServic
e&AWSAccessKeyId=00000000000000000000&Operation=ItemLookup&ItemId
=0679722769&ResponseGroup=ItemAttributes,Offers,Images,Reviews";
// リクエストURLを parse_url() で分解する
$str_url_data = parse_url($test_url);
// クエリ部分を parse_str() で分解する
parse_str($str_url_data["query"], $str_query_data);
// クエリを分解した配列に、TimestampとしてGMTのタイムスタンプを加える。
$str_query_data["Timestamp"] = gmdate("Y-m-d")."T".gmdate("H:i:s")."Z";
// クエリを分解した配列を ksort() で昇順ソート
ksort($str_query_data);
// クエリのデータの方を、 rawurlencode でRFC 3986にエンコード。クエリデータをくっつける。
$str_query ="";
foreach($str_query_data as $key => $element)
{
$str_query .= $key."=".rawurlencode($element)."&";
}
$str_query .= "Version=2009-01-06";
// 署名原文を作る。
$signeture_org ="GET\necs.amazonaws.jp\n/onca/xml\n".$str_query;
//HMAC-SHA署名を作る
$str_signeture = base64_encode( hash_hmac("sha256", $signeture_org, $secret_key, "TRUE"));
//プラスとイコールを、'%2B'と'%3D'におきかえ
$str_signeture = str_replace(array('+', '='), array('%2B', '%3D'), $str_signeture);
// 最後に、元のURLに、署名原文として作ったURLに、&Signature=hogehogeとして付加する
$url = $test_url."&Timestamp=".rawurlencode($str_query_data["Timestamp"])."&Version=2009-01-06&Signature=".$str_signeture;
?>
最初、テストした環境のシステム時間が2時間ずれていたらエラーが帰ってきました。
認証??ハッシュ?ハッシ?だったので、非常に助かりました。
引用
[PHP] Amazon Product Advertising API で認証付きリクエストを送る方法まとめ
参考
Product Advertising API