2010-04-09 4 views
1

CodeIgniter에서 PHP를 사용하여 amazon 웹 서비스를 검색하는 데 문제가 있습니다. InvalidParameter 타임 스탬프가 서버의 ISO-8601 형식 응답에 없습니다. 그러나 나는 주어진 시간 형식을 http://associates-amazon.s3.amazonaws.com/signed-requests/helper/index.html과 비교하려고 시도했기 때문에 타임 스탬프가 문제라고 생각하지 않습니다. 아무도 도와 줄 수 있습니까? 여기 내 코드는 다음과 같습니다.Codeigniter 또는 PHP Amazon API 도움말

   $private_key = 'XXXXXXXXXXXXXXXX'; // Took out real secret key 
       $method = "GET"; 
       $host = "ecs.amazonaws.com"; 
       $uri = "/onca/xml"; 

       $timeStamp = gmdate("Y-m-d\TH:i:s.000\Z"); 
       $timeStamp = str_replace(":", "%3A", $timeStamp); 
       $params["AWSAccesskeyId"] = "XXXXXXXXXXXX"; // Took out real access key 
       $params["ItemPage"] = $item_page; 
       $params["Keywords"] = $keywords; 
       $params["ResponseGroup"] = "Medium2%2525COffers"; 
       $params["SearchIndex"] = "Books"; 
       $params["Operation"] = "ItemSearch"; 
       $params["Service"] = "AWSECommerceService"; 
       $params["Timestamp"] = $timeStamp; 
       $params["Version"] = "2009-03-31"; 

       ksort($params); 

       $canonicalized_query = array(); 
       foreach ($params as $param=>$value) 
       { 
        $param = str_replace("%7E", "~", rawurlencode($param)); 
        $value = str_replace("%7E", "~", rawurlencode($value)); 
        $canonicalized_query[] = $param. "=". $value; 
       } 
       $canonicalized_query = implode("&", $canonicalized_query); 

       $string_to_sign = $method."\n\r".$host."\n\r".$uri."\n\r".$canonicalized_query; 

       $signature = base64_encode(hash_hmac("sha256",$string_to_sign, $private_key, True)); 

       $signature = str_replace("%7E", "~", rawurlencode($signature)); 

       $request = "http://".$host.$uri."?".$canonicalized_query."&Signature=".$signature; 

       $response = @file_get_contents($request); 

       if ($response === False) 
       { 
        return "response fail"; 
       } 
       else 
       { 
        $parsed_xml = simplexml_load_string($response); 
        if ($parsed_xml === False) 
        { 
         return "parse fail"; 
        } 
        else 
        { 
         return $parsed_xml; 
        } 
       } 

P.S. 개인적으로 나는 그것을 해싱 할 때 $ string_to_sign에서 세대가 잘못되었다고 생각한다.

답변

3

이 작업을 시도 할 수 있습니다 :

// some paramters 
$method = "GET"; 
$host = "ecs.amazonaws.".$region; 
$uri = "/onca/xml"; 

// additional parameters 
$params["Service"] = "AWSECommerceService"; 
$params["AWSAccessKeyId"] = $public_key; 
// GMT timestamp 
$params["Timestamp"] = gmdate("Y-m-d\TH:i:s\Z"); 
// API version 
$params["Version"] = "2009-03-31"; 

// sort the parameters 
ksort($params); 

// create the canonicalized query 
$canonicalized_query = array(); 
foreach ($params as $param=>$value) 
{ 
    $param = str_replace("%7E", "~", rawurlencode($param)); 
    $value = str_replace("%7E", "~", rawurlencode($value)); 
    $canonicalized_query[] = $param."=".$value; 
} 
$canonicalized_query = implode("&", $canonicalized_query); 

// create the string to sign 
$string_to_sign = $method."\n".$host."\n".$uri."\n".$canonicalized_query; 

// calculate HMAC with SHA256 and base64-encoding 
$signature = base64_encode(hash_hmac("sha256", $string_to_sign, $private_key, True)); 

// encode the signature for the request 
$signature = str_replace("%7E", "~", rawurlencode($signature)); 

// create request 
$request = "http://".$host.$uri."?".$canonicalized_query."&Signature=".$signature; 

// do request 
$response = @file_get_contents($request); 

if ($response === False) 
{ 
    return False; 
} 
else 
{ 
    // parse XML 
    $pxml = simplexml_load_string($response); 
    if ($pxml === False) 
    { 
     return False; // no xml 
    } 
    else 
    { 
     return $pxml; 
    } 
} 

// public and private keys 
$public_key = "xxxxxxxxxxxxxxxxxxxxxxxx"; 
$private_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"; 

// the request 
$pxml = aws_signed_request("com", array("Operation"=>"ItemLookup", 
         "ItemId"=>"B000X9FLKM", 
         "ResponseGroup"=>"Small"), 
         $public_key, 
         $private_key);