亚马逊请求签名与您提供的签名不匹配

时间:2014-10-18 17:55:52

标签: php api amazon-web-services amazon

我正在尝试从亚马逊获得产品评论,但收到此错误,

我们计算的请求签名与您提供的签名不符。检查您的AWS Secret Access Key和签名方法。有关详细信息,请参阅服务文档。

以下是我的代码,

define('AMAZON_URL','http://webservices.amazon.com/onca/xml?');
define('AMAZON_ACCESS_KEY',--access_key--);
define('AMAZON_SECRET_KEY',--secret_key--);
define('AMAZON_ASSOCIATE_TAG',--tag--);

    $dr['model_no'] = --model_no--;
    $dr['manufacturer'] = --manufacturer--;


    //get amazon data
    $timestamp = gmdate("Y-m-d\TH:i:s\Z");//rawurlencode(gmdate("Y-m-d\TH:i:s\Z"));

    $url = "AWSAccessKeyId=".AMAZON_ACCESS_KEY;
    $url .= "&AssociateTag=".AMAZON_ASSOCIATE_TAG;
    $url .= "&IncludeReviewsSummary=True";
    $url .= '&Keywords='.$dr['model_no'];
    $url .= "&Manufacturer=".$dr['manufacturer'];
    $url .= "&Operation=ItemSearch";
    $url .= "&ResponseGroup=Reviews";
    $url .= "&ReviewSort=HelpfulVotes";
    $url .= "&SearchIndex=Electronics";
    $url .= "&Service=AWSECommerceService";
    $url .= "&Timestamp=".$timestamp;
    $url .= "&Version=2013-05-31";

    $prepend = "GET\nwebservices.amazon.com\n/onca/xml\n";
    $prepend_string = $prepend . $url;

    $signature = base64_encode(hash_hmac("sha256", $prepend_string, AMAZON_SECRET_KEY, True));  
    $signature = str_replace("+", "%2B", $signature);
    $signature = str_replace("=", "%3D", $signature);

    // $signature = base64_encode(hash_hmac("sha256", $prepend_string, AMAZON_SECRET_KEY, True));  
    $url = $url.'&Signature=' .$signature;
    // $url = $url.'&Signature=' .rawurlencode($signature);

    echo "$url\n";
    $result = $this->data_api->call_amazon($url);

我的call_amazon功能

public function call_amazon($url)
{
    $url = AMAZON_URL.$url;         
    //initialize curl
            echo "Caalling url: \n" . $url . "\n";
    $ch = curl_init();
    //initilize url to set which servvice to call       
    curl_setopt($ch, CURLOPT_URL, $url);        
    //to tell curl that post method is used
    //tell that retrun value as string
    curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1);
    //execute service now
    $result = curl_exec($ch);
    if(empty($result) || $result===FALSE){
        return '<customError>
                    <status>400</status>
                    <response>false</response>
                </customError>';
    } else {
                    echo "$result \n";
        //return response
        return $result;
    }       
}

我检查了文档和示例,签名对我来说没问题。有什么建议吗?

0 个答案:

没有答案