簡體   English   中英

Codeigniter或PHP Amazon API幫助

[英]Codeigniter or PHP Amazon API help

我在CodeIgniter中使用PHP搜索亞馬遜網絡服務時遇到問題。 我從服務器收到InvalidParameter時間戳記不是ISO-8601格式的響應。 但是我不認為時間戳是問題,因為我試圖與http://associates-amazon.s3.amazonaws.com/signed-requests/helper/index.html中的給定日期格式進行比較精細。 有人可以幫忙嗎? 這是我的代碼:

                $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;
                    }
                }

PS-我個人認為散列時從$ string_to_sign生成時出現了問題。

您可以嘗試以下方法:

// 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM