Подпись запроса Amazon не совпадает с подписью, которую вы указали

Я пытаюсь получить обзоры продуктов от Amazon, но получаю эту ошибку,

Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой секретный ключ доступа AWS и метод подписи. Обратитесь к сервисной документации для деталей.

Ниже мой код,

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 ответов

Другие вопросы по тегам