| 

.NET C# Java Javascript Exception

2
Hallo Leute,

habe ein Problem mit der Amazon-MWS-Signatur.

Ich bekomme immer die Fehlermeldung: SignatureDoesNotMatch
The 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.


Wüsste aber leider nicht was nicht stimmen sollte, kann mir jemand helfen?

Gerne dürft ihr das Script auch selbst einmal ausprobieren, eine die Variablen mit ### entsprechend mit euren Daten anpassen.

<?php

function amazonEncode($text) {
$encodedText = "";
$j = strlen($text);
for ($i = 0; $i < $j; $i++) {
$c = substr($text, $i, 1);
if (!preg_match("/[A-Za-z0-9\-_.~]/", $c)) {
$encodedText .= sprintf("%%%02X", ord($c));
} else {
$encodedText .= $c;
}
}
return $encodedText;
}

function marketPlaceWebServicesSign($stringToSign, $secretAccessKey) {
$timeStamp = gmdate("Y-m-d\TH:i:s.000\Z");
$timeStamp = urlencode($timeStamp);
$parsedString = parse_url($stringToSign);
$stringToSign = "POST"."\n";
$stringToSign .= $parsedString['host']."\n";
$stringToSign .= $parsedString['path']."\n";
$stringToSign .= $parsedString['query'];
$stringToSign .= "&Timestamp=".$timeStamp;
$stringToSign .= "&Version=2011-01-01";
echo '<p><b>StringToSign:</b> '.nl2br($stringToSign).'</p>';
$hmac = hash_hmac("sha256", $stringToSign, $secretAccessKey, true);
$hmacBase64 = base64_encode($hmac);
$hmacBase64 = amazonEncode($hmacBase64);
$url = $parsedString['scheme']."://".$parsedString['host'].$parsedString['path']."?".$parsedString['query']."&Signature=".$hmacBase64."&Timestamp=".$timeStamp."&Version=2011-01-01";
return $url;
}

$config['amazon_SecretKey'] = '###YOUR_SECRET-KEY###';
$config['amazon_AWSAccessKeyId'] = '###YOUR_AWS_ACCESS-KEY-ID###';
$config['amazon_SellerId'] = '###YOUR_MERCHANT-ID###';
$config['amazon_MarketplaceId'] = '###YOUR_MARKETPLACE-ID###';

$url = "https://mws-eu.amazonservices.com/Products/2011-10-01?AWSAccessKeyId=".$config['amazon_AWSAccessKeyId']."&Action=GetMatchingProduct&MarketplaceId=".$config['amazon_MarketplaceId']."&ASINList.ASIN.1=B002KT3XRQ&SellerId=".$config['amazon_SellerId']."&SignatureMethod=HmacSHA256&SignatureVersion=2";
$url = marketPlaceWebServicesSign($url, $config['amazon_SecretKey']);

echo '<p><b>URL:</b> '.$url.'</p>';

parse_str($url, $httpPost);
$ch = curl_init() or die(curl_error());;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $httpPost);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
$resultXML = simplexml_load_string($result);
curl_close($ch);
echo '<p><b>Result XML:</b> <pre>'.print_r($resultXML,true).'</pre></p>';

?>


Wäre bestimmt auch für viele andere hilfreich!

Vielen Dank!
16.07.2012
marwebdes 1 1 1
1 Antwort
0
Die Frage ist zwar schon etwas älter, aber vielleicht hilft meine Antwort ja irgendwem weiter.

Die Fehlermeldung bezüglich der falschen Signatur hat nicht zwingend etwas mit der Signatur zu tun. Ich habe heute die gleiche Fehlermeldung erhalten, und zwar in Verbindung mit dem Request "CreateFulfillmentOrderRequest".
Nach einigem Suchen und Testen habe ich festgestellt, dass es an einem Umlaut in den übermittelten Daten lag (Feld: DestinationAddress.City, Wert: Köln). Nachdem ich den Wert mit utf8_encode() bearbeitet hatte, funktionierte es einwandfrei.

Bill
19.12.2012

Stelle deine Php-Frage jetzt!