Amazon Product Advertising APIに対応した
前提条件
- PHP4
- Services_Amazonを利用している
- pecl, pearコマンドが実行できない環境である
- コンパイルが可能であること
- Secret Access Keyを取得していること
- Amazon Web Services (AWS) - Cloud Computing Services にてAccess Key IDとSecret Access Keyの確認ができます。
PECL::Package::hashのインストール
PECLからhashの最新版をダウンロードします。(現時点での最新版は、1.5)
インストールします。
$ tar zxvf hash-1.5.tgz $ cd hash-1.5 $ phpize $ ./configure $ make # make install
インストールされたことを確認します。
$ ls -alF /usr/local/lib/php/extensions/no-debug-non-zts-20020429/ | grep hash.so -rwxr-xr-x 1 root root 273888 May 28 11:21 hash.so*
php.ini に以下の記述を追加します。
$ cat /usr/local/etc/php.ini | grep hash.so extension=hash.so
extensionの格納パスおよびphp.iniのパスは、環境によって異なります。
最後にApacheを再起動します。
# /etc/init.d/apache2 restart
念のためきちんと読み込まれていることを確認します。
$ cat check.php <?php print "extension hash.so is "; if (extension_loaded("hash")) { print "loaded!"; } else { print "NOT loaded!"; } print "\n"; ?>
きちんと読み込まれていることが確認できました。
$ php check.php extension hash.so is loaded!
Services_Amazonのインストール
PEARからServices_Amazonの最新版をダウンロードします。(現時点での最新版は、0.8.0)
既存ファイルを上書きします。
$ tar zxvf Services_Amazon-0.8.0.tgz # cp Services_Amazon-0.8.0/Amazon.php /usr/local/lib/php/Services/ # cp Services_Amazon-0.8.0/AmazonEC4.php /usr/local/lib/php/Services/
パスは、環境によって異なります。
コードの修正
最後に Services_Amazon を使ったコードを修正します。
$amazon = new Services_AmazonECS4(AWS_ACCESS_KEY_ID, ASSOCIATE_TAG);
となっている部分を
$amazon = new Services_Amazon(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, ASSOCIATE_TAG);
へ変更します。(Services_AmazonECS4 から Services_Amazon へ変更していることに注意)
詳しいコード修正内容は、こちらを参照してください。
余談
切り替え後、動作確認を行ったら、Itemがなぜか取得できず。直接、送信されているリクエストのURLへアクセスすると以下のエラーが出ていました。
<?xml version="1.0"?> <ItemSearchErrorResponse xmlns="http://ecs.amazonaws.com/doc/2009-03-31/"> <Error> <Code>SignatureDoesNotMatch</Code> <Message> The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details. </Message> </Error> <RequestID>5cc7dbe6-7c20-4078-83bc-1e1158a7a631</RequestID> </ItemSearchErrorResponse>
どうやらSignatureが正しくない様子。で、ハマっちゃいました。
結論としては、Access Key IDが正しくなかったのが問題だったんですが、以前まで使ってた Access Key ID が変わってたっぽい。今回のServices_Amazonのバージョンアップ前のバージョンが結構古かったから、それが原因かもしれないな。まっ、最初に念のために確認しておけば良かったな。