PHPでAmazonの商品を検索してみたいのですが、どうしても400エラーが帰ってきてしまいます。公式にもサンプルがないのでなぜ遮断されているかわかりません。もしわかる方がいらっしゃいましたら教えてください。問い合わせコード自体は公式のものを改造したものです。公式のページを末尾に追記。公式ではSignatureは自分で用意する感じ。Signatureの生成がおかしいのでしょうか。
参考サイト
当初AmazonのAPIの使い方のコード自体はImplementing a Product Advertising API Request - Product Advertising APIを参考にし、SignatureはOAuth1.0の署名(Signature)を作成する方法を参考にしました。あと、誠に自分勝手で申し訳ないですが、勉強がてら今回は外部ライブラリを使わない方法でやってみたいとうのが目的でやっています。
実際のコード
その後、m6uさんに助けていただき、下記のコードまで成長し、Signatureの問題までこぎつけました。Amazon側のステータスコードは400から403へ変わりました。Signatureの生成に何らかの欠陥があり403は解決されません。
php
1define("AccessKey", "hoge"); 2define("AssociateTag", "hoge"); 3define("SecretKey", "hoge"); 4 5function ItemSearch($SearchIndex, $Keywords) { 6 7 $base = "http://webservices.amazon.com/onca/xml"; 8 // $base = "http://ecs.amazonaws.jp/onca/xml"; 9 10 $params = []; 11 foreach ([ 12 "Service" => 'AWSECommerceService', 13 "AssociateTag" => AssociateTag, 14 "AWSAccessKeyId" => AccessKey, 15 "Operation" => "ItemSearch", 16 "Version" => "2013-08-01", 17 "SearchIndex" => $SearchIndex, 18 "Keywords" => $Keywords, 19 "ResponseGroup" => "ItemAttributes,Offers", 20 "Timestamp" => gmdate('Y-m-d\TH:i:s\Z'), 21 "SignatureVersion" => 2, 22 "SignatureMethod" => "HmacSHA256" 23 ] as $key => $value) { 24 $params[urlEncodeRfc3986($key)] = urlEncodeRfc3986($value); 25 } 26 27 ksort($params); 28 29 $parsed = parse_url($base); 30 $sign = join("\n", ['GET', $parsed['host'], $parsed['path'], http_build_query($params, '', '&')]); 31 32 $signature = base64_encode(hash_hmac('sha256', $sign, SecretKey , true)); 33 34 $queries = []; 35 foreach ($params as $key => $value) { 36 $queries[] = $key . "=" . $value; 37 } 38 39 $request = $base . "?" . join("&", $queries) . "&Signature=" . urlEncodeRfc3986($signature); 40 41 var_dump($request); 42 43 $response = file_get_contents($request); 44 $parsed_xml = simplexml_load_string($response); 45 46 print_r($parsed_xml); 47} 48 49function urlEncodeRfc3986($str) { 50 return str_replace('%7E', '~', rawurlencode($str)); 51} 52 53ItemSearch('シーツ', 'PetSupplies');
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。