スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/-- | スポンサー広告  TOP

PHP4 「Product Advertising API」をPHP4から使う。その4。Services/Amazon編。

リクエストがありましたので、連載第四弾となります。
1.PHP4 「Product Advertising API」をPHP4から使う。その一。HMACへの道。
2.PHP4 「Product Advertising API」をPHP4から使う。その2。HMAC-SHA256自作編。
3.PHP4 「Product Advertising API」をPHP4から使う。その3。HMAC-SHA256実装編。

本格的な利用ってことで、Services/Amazonでの実装例です。
まず、Services/Amazonの0.8.0以降のバージョンが必要になりますので、下記サイトからダウンロードをお願いします。
Services/Amazon最新
これをローカルに展開するか、PEARの従来のものと入れ替えてください。

では、実装例です。
その2で作ったHMAC-SHA256クラスを使います。

<?php
########################################################################
# アマゾン Services/Amazonの実装編
########################################################################
    
  // IDとキー。自分の情報を設定してください。
    define("SECRET_ACCESS_KEY","secret_access_key");
    define("SUBSCRIPTION_ID","subscription_id");
    define("ASSOCIATE_ID","associate-22");

    //  ライブラリ
    require_once("Services/Amazon.php");    //  Services/Amazonのインストール先に合わせて変更してください。
    require_once('hmac_sha256.php');

//----------------------------------------------
//  Services_Amazonの暗号化をオーバーライド
//----------------------------------------------
class Services_AmazonMHASH extends Services_Amazon {
    //  オーバーライド関数
    function _hash($string_to_sign, $secret_access_key)
    {
        if (function_exists('hash_hmac')) {
            echo "use hash_hmac<br>";
            return hash_hmac('sha256', $string_to_sign, $secret_access_key, true);
        } elseif (function_exists('mhash')) {
            echo "use mhash<br>";
            return mhash(MHASH_SHA256, $string_to_sign, $secret_access_key);
        }
        //  自前のハッシュ関数。
        echo "use local HMAC_SHA256<br>";
        $hmac_sha256 = new HMAC_SHA256($secret_access_key);
        return $hmac_sha256->hmac($string_to_sign);
    }
}

    //  アマゾンサービスのクラスを得る。オーバライドした方のクラスを使います。
    $amazon = new Services_AmazonMHASH(SUBSCRIPTION_ID, SECRET_ACCESS_KEY, ASSOCIATE_ID);
    $amazon->setLocale("JP");
   
    //  アマゾンで検索する。
    $item_list = $amazon->ItemSearch("VideoGames",
                array(  "BrowseNode" => "15782591",
                        "Sort" => '-releasedate',
                        "ResponseGroup" => 'Small,ItemAttributes,Images,OfferFull,Reviews,SalesRank',
                        "ItemPage" => 1));
    //  エラー?
    if (PEAR::isError($item_list)) {
        //  結果なし?
        if( FALSE !== mb_strpos($item_list->message,"リクエストに該当する結果がありません") ) {
        } else {
            //  エラー
            echo( $item_list->message );
        }
    }
    //  結果をダンプ
    $v = var_export($item_list, true);
    $v = str_replace(" "," ",$v);
    $v = str_replace("\n","<br>",$v);
    echo $v;
?>


以上です。
これで情報が取得できるはずですが、何か問題があれば教えてください。

以上です。お役に立ちましたら拍手をお願いします

スポンサーサイト

2009/06/18 | 未分類COMMENT(1)TRACKBACK(0)  TOP

PHP4 「Product Advertising API」をPHP4から使う。その3。HMAC-SHA256実装編。

連載第三弾となります。
1.PHP4 「Product Advertising API」をPHP4から使う。その一。HMACへの道。
2.PHP4 「Product Advertising API」をPHP4から使う。その2。HMAC-SHA256自作編。

順調に開発は進みましたので、いよいよ実装します。

まず、アマゾンの実装サンプルを見てください。
http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html

これと同じ結果になるようにプログラムを書きます。
前回作ったHMAC-SHA256クラスを使います。

<?php
########################################################################
# アマゾン Example REST Requestsのシミュレートサンプル
http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html
########################################################################
    
    //  ライブラリ。
    require_once('hmac_sha256.php');

 // Record time before hashing
    $time1 = microtime_float();

    //  1.と3.リクエストの準備。形式はアマゾンのサンプルのまま。
    $AmazonUrl = 'http://webservices.amazon.com/onca/xml';
    $params = array();
    $params['Service']        = 'AWSECommerceService';
    $params['AWSAccessKeyId'] = "00000000000000000000";
    $params['Operation']      = 'ItemLookup';
    $params['ItemId']         = '0679722769';
    $params['ResponseGroup']  = 'ItemAttributes,Offers,Images,Reviews';
    $params['Version']        = '2009-01-06';
    $params['Timestamp']      = '2009-01-01T12:00:00Z';
   
    //  2.パラメータをRFC3986に基づいてurlエンコードします。
    $UrlParams = array();
    foreach($params as $key => $val) {
        $UrlParams[RFC3986urlencode($key)] = RFC3986urlencode($key) . '=' . RFC3986urlencode($val);
    }
    //  4.urlエンコードしたパラメータの順序を昇順に並び替えます
    ksort($UrlParams);
    //  5.パラメータを結合してパラメータ文字列を作成します。
    $ParamString = join('&',$UrlParams);
   
    //  6.~7.電子認証のための文字列を用意します。
    $ParseUrl = parse_url($AmazonUrl);
    $StringToSign = "GET\n".
                    "{$ParseUrl['host']}\n".
                    "{$ParseUrl['path']}\n".
                    "{$ParamString}";
    echo "[StringToSign] : ";
    var_dump($StringToSign);
    echo "<br>";
    echo "<br>";
   
    //  8.HMAC-SHA256でハッシュメッセージ認証コードを作成します。
    $secret_key = "1234567890";//秘密鍵。
 $hmac_sha256 = new HMAC_SHA256($secret_key);
    $signature = $hmac_sha256->hmac($StringToSign);
    //  9.BASE64エンコード
    $signatureB64 = base64_encode($signature);
    echo "[signature] : ";
    var_dump( $signatureB64);
    echo "<br>";
    echo "<br>";
   
    //  10.URLを組み立てる。
    $url = $AmazonUrl.'?'.$ParamString.'&Signature='.RFC3986urlencode($signatureB64);
    echo "[URL] : ";
    var_dump( $url);
    echo "<br>";

    // Record time after hashing
    $time2 = microtime_float();

 // Display difference
    echo "<br />\nRuntime: " . ($time2 - $time1) . " seconds.";


    return;

    // RFC3986に基づいてURLエンコードする
    function RFC3986urlencode($str)
    {
        return str_replace('%7E','~',rawurlencode($str));
    }

    //  時間計測関数
    function microtime_float()
    {
        list($usec, $sec) = explode(" ", microtime());

        return (float)$usec + (float)$sec;
    }
?>






このPHPコードを実行すると、

[StringToSign] : string(250) "GET webservices.amazon.com /onca/xml AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06"

[signature] : string(44) "Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg="

[URL] : string(311) "http://webservices.amazon.com/onca/xml?AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06&Signature=Nace%2BU3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg%3D"

Runtime: 0.18074798584 seconds.





となります。signatureがアマゾンのサンプルと一致しているのが確認できるかと思います。
一応これで完成です。
あとは本物のアマゾンAPIに組み込んで使ってください。
ライセンスは特に主張しませんが、同じまま名前だけ変えて配布するのは止めてくださいね。
ではでは。

つづく?(Services/Amazonへの組み込み編は需要あるかな?)

以上です。お役に立ちましたら拍手をお願いします

2009/06/18 | 未分類COMMENT(3)TRACKBACK(0)  TOP

発売日ナビ Windows7対応&アマゾンPAA(Product Advertising API)対応

やっとPAAに対応できました。
現在私の環境でテストランニング中。
まだ、いくつか機能追加したいので今週末新バージョン公開はキビシイかも知れません。
エラー処理やらバックアップやらの対応検討中。

2009/06/08 | 開発状況COMMENT(0)TRACKBACK(0)  TOP

 | BLOG TOP | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。