A API do produto Amazon retorna “SignatureDoesNotMatch”

Quero escrever um aplicativo para obter capas de livros através do ISBN (para programa de caridade). Então eu decidi usar a API do produto Amazon. Eu tenho chave de access e chave secreta. Eu recebi um código para gerar chave secreta Eu passei o URL, mas isso retorna assim

  SignatureDoesNotMatchThe request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details. 6c60b8b7-8b78-4f21-bb7c-3d5d3a26dc48  

esse é o código

  

Qual o problema desse código?

Atualizar:

Eu tentei usar o mesmo carimbo de tempo. Ainda não há sorte. Esse é o código de exemplo.

 $method = "GET"; $host = "ecs.amazonaws.".$region; $uri = "/onca/xml"; // additional parameters $params["Service"] = "AWSECommerceService"; $params["AWSAccessKeyId"] = $public_key; // GMT timestamp $params["Timestamp"] = gmdate("Ymd\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)); 

Crie uma variável do timestamp para usá-lo dentro de $ string_to_sign e do parâmetro url, caso contrário, pode acontecer que ambos os timestamps sejam diferentes. Para fornecer mais ajuda, você precisará mostrar a criação de $ string_to_sign.

Além disso: o parâmetro Timestamp também precisa ser codificado.

Talvez isso seja útil para você: http://mierendo.com/software/aws_signed_query/

A “assinatura” para o pedido inclui o parâmetro de “operação” de solicitação e um carimbo de data / hora. Aqui está uma function que deve funcionar para criar uma assinatura:

 function createSignature($operation,$timestamp){ $the_string=$operation.$timestamp; return base64_encode(hash_hmac("sha256",$the_string,$this->secret_key,true)); } 

O timestamp que você envia no pedido deve ser o mesmo que o passado para a function createSignature. Em outras palavras, não gere um carimbo de data / hora duas vezes. Salve-o em uma variável e use-o para ambos.

Além disso, aqui é uma class de PHP que eu criei para simplificar o processo de fazer solicitações para a API: https://github.com/traviswimer/AmazonProductAPI_SOAPer/blob/master/AmazonApi.php