PHP

PEAR の Services_AmazonECS4-0.9.0 を 2011.10.26 の仕様変更以降のProduct Advertising APIに対応させる

More than 3 years have passed since last update.

PEAR の Services_AmazonECS4-0.9.0 を 2011.10.26 の仕様変更以降の Product Advertising API に対応させる方法のメモ

PEAR の Services_Amazon パッケージの v0.9.0 が現状の Product Advertising API に対応していないようだったので、その修正内容のメモ。
API側で廃止されたOperationに対応するメソッド(SellerLookup等)はもちろん使用できないが、
それ以外のOperationの認証と検索はできるようになる。

AmazonECS4.php:85行目を修正

AmazonECS4.php
// define('SERVICES_AMAZON_BASEURL', 'http://webservices.amazon.com/onca/xml?Service=AWSECommerceService');
define('SERVICES_AMAZON_BASEURL', 'http://webservices.amazon.com/onca/xml');

AmazonECS4.php:133行目下あたりにメンバ変数を追加

AmazonECS4.php
    var $_service = 'AWSECommerceService';

AmazonECS4.php:313~318行目を修正

AmazonECS4.php
            /*
            'US' => 'http://webservices.amazon.com/onca/xml?Service=AWSECommerceService',
            'UK' => 'http://webservices.amazon.co.uk/onca/xml?Service=AWSECommerceService',
            'DE' => 'http://webservices.amazon.de/onca/xml?Service=AWSECommerceService',
            'JP' => 'http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService',
            'FR' => 'http://webservices.amazon.fr/onca/xml?Service=AWSECommerceService',
            'CA' => 'http://webservices.amazon.ca/onca/xml?Service=AWSECommerceService',
            */
            'US' => 'http://webservices.amazon.com/onca/xml',
            'UK' => 'http://webservices.amazon.co.uk/onca/xml',
            'DE' => 'http://webservices.amazon.de/onca/xml',
            'JP' => 'http://webservices.amazon.co.jp/onca/xml',
            'FR' => 'http://webservices.amazon.fr/onca/xml',
            'CA' => 'http://webservices.amazon.ca/onca/xml',

AmazonECS4.php:1046~1056行目の_buildUrlメソッドを次のように修正

AmazonECS4.php
    function _buildUrl($params)
    {
        $params['AWSAccessKeyId'] = $this->_keyid;
        $params['AssociateTag'] = $this->_associd;
        $params['Service'] = $this->_service;
        $params['Version'] = $this->_version;
        $params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
        ksort($params);
        $canonical_string = '';
        foreach ($params as $k => $v) {
            $canonical_string .= '&'.str_replace('%7E', '~', rawurlencode($k)).'='.str_replace('%7E', '~', rawurlencode($v));
        }
        $canonical_string = substr($canonical_string, 1);
        $parsed_url = parse_url($this->_baseurl);
        $string_to_sign = "GET\n{$parsed_url['host']}\n{$parsed_url['path']}\n{$canonical_string}";
        $signature = base64_encode(hash_hmac('sha256', $string_to_sign, SECRET_KEY, true));
        $url = $this->_baseurl.'?'.$canonical_string.'&Signature='.str_replace('%7E', '~', rawurlencode($signature));
        return $url;
    }

以上