2009年5月16日土曜日

Amazon Product Advertising APIの署名認証をPHPでやってみる

Pythonに続いて(Amazon Product Advertising APIの署名認証をPythonでやってみる) アマゾンのProduct Advertising APIの署名認証をPHPで行うためのメモ。
PHP5を前提としています。

require_once 'Zend/Http/Client.php';

class ProductAdvertising
{
private $_access_key;
private $_secret_key;
private $_version;
private $_tracking_id;
private $_amazon_base_url;
private $_uri;
private $_end_point;
private $_base_url;

public function __construct($access_key, $secret_key, $tracking_id="", $version='2009-03-31')
{
$this->_service = 'AWSECommerceService';
$this->_access_key_id = $access_key;
$this->_secret_key = $secret_key;
$this->_version = $version;
$this->_tracking_id = $tracking_id;
$this->_uri = "webservices.amazon.co.jp";
$this->_end_point = "/onca/xml";
$this->_base_url = 'http://' . $this->_uri . $this->_end_point;
}

/**
* アイテムを返す
* @param string $asin アマゾンのASIN
* @param array $options ItemLookupのオプション
* @return mixed
*/
public function itemLookup($asin, $options=array())
{
$options['Operation'] = "ItemLookup";
$options['ItemId'] = $asin;

$item = $this->_sendRequest($options);

if(isset($item->Items->Item)) {
return $item->Items->Item;
}
return false;
}

/**
* リクエストを送信する
* @param array $options
* @return mixed
*/
private function _sendRequest($options=array())
{
$options['Service'] = $this->_service;
$options['AWSAccessKeyId'] = $this->_access_key;
$options['AssociateTag'] = $this->_tracking_id;
$options['Version'] = $this->_version;

// タイムスタンプをセットする
$options['Timestamp'] = gmdate('c');

// オプションをアルファベット順にソートする
ksort($options);

// 署名作成
// (2009/05/17修正) $canonical_string = http_build_query($options);
// http_build_queryは内部でurlencode()を使用しているようです。
// urlencode()は空白文字をプラス(+)に変換し、そのままだとアマゾンが受け付けてくれないようです。
// ですので、rawurlencode()でURLエンコードを行うように修正しました
foreach($options as $key => $val) {
$canonical_string .= "&" . $key . "=" . rawurlencode($val);
}
$canonical_string = substr($canonical_string, 1);

$string_to_sign = "GET\n{$this->_uri}\n{$this->_end_point}\n{$canonical_string}";
$signature = base64_encode(
hash_hmac('sha256', $string_to_sign, $this->_secret_key, true)
);

$url = $this->_amazon_base_url . '?' . $canonical_string . '&Signature=' . rawurlencode($signature);
$client = new Zend_Http_Client($url);
$response = $client->request();

if($response->isError()) {
// エラー処理
}

$body = $response->getBody();
$results = simplexml_load_string( $body );

if(isset( $results->Error)) {
throw new Exception('CODE :: ' . $results->Error->Code . '\n Message :: ' . $results->Error->Message);
}

return $results;
}
}


使い方はこんな感じ
$access_key = "Your Access Key";
$secret_key = "Your Secret Key";
$asin = "ASIN";

$pa = new ProductAdvertising($access_key, $secret_key);
$item = $pa->itemLookup($asin);

0 件のコメント: