Amazon Product Advertising APIに対応した

前提条件

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のバージョンアップ前のバージョンが結構古かったから、それが原因かもしれないな。まっ、最初に念のために確認しておけば良かったな。