スポンサーサイト

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

--/--/-- | スポンサー広告  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

コメント

素晴らしいー。

>Services/Amazonへの組み込み編は需要あるかな?

レンサバなどでphp4で使ってるがpeclへの自由度が無い。
でも、Services/Amazonは使っている。
という人間は沢山居ると思いますので、組み込まれた形があるとすごく便利かと。

私もその一人です ^^;

No:10 2009/06/18 17:00 | ken1 #- URL [ 編集 ]

了解です。

分かりました。
それでは掲載いたします。

No:11 2009/06/18 18:44 | ソフト屋 巣 #- URL [ 編集 ]

とても助かりました

Amazonの仕様が変わって困っておりました。
とても参考になりました。
ありがとうございます。

No:21 2009/08/26 22:10 | YOU #- URL編集 ]

コメントの投稿



管理者にだけ表示を許可する

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