Hallo,
Amazon hat ja gerade seine Webservices umgestellt und erwartet beim Aufruf der Webservices nun eine Signature.
Mit REST ist mir die Verbindung gelungen, bei SOAP beschwert sich Amazon aber mit einem netten:
(Nicht wundern, die Variablen die Übergeben werden... werden in der Version nicht genutzt, bzw. stammen noch aus einem früherem Stand der Methode).
Encodierung des Timestamps hatte ich auch schon auf verschiedene Weisen getestet, führte aber immer zum gleichen Ergebnis (auch die drei "000" hatte ich weggelassen, auch keine Änderung).
Signaturübergabe im Array "params" wird nicht erkannt, im Header scheint das schon richtig zu sein.
Momentan fehlen mir die Ideen, zumal ich bei der Suche kreuz und quer durchs Netz feststellen musste, dass die meisten es dann mit REST lösen. Da wir aber bereits SOAP an mehreren Stellen nutzen, wäre es wünschtenswert das wir das auch hier wieder schaffen.
Hat jemand vielleicht eine Idee oder noch besser eine Lösung?
Amazon hat ja gerade seine Webservices umgestellt und erwartet beim Aufruf der Webservices nun eine Signature.
Mit REST ist mir die Verbindung gelungen, bei SOAP beschwert sich Amazon aber mit einem netten:
SoapFault exception: [aws:Client.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.
PHP-Code:
function getSOAPAmazon ($str_url, $arr_signature)
{
$function = "ItemSearch";
$client = new SoapClient("https://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl", array('exceptions' => 0));
$timestamp = gmdate("Y-m-d\TH:i:s.000\Z");
//$timestamp_encoded = str_replace(":","%3A",str_replace(",","%2C",$timestamp));
$timestamp_encoded = urlencode($timestamp);
$string = 'AWSECommerceService'.$function.$timestamp_encoded;
$signature = base64_encode(hash_hmac("sha256", $string, SECRETACCESSSKEY, true));
$header_arr = array(
new SoapHeader("http://security.amazonaws.com/doc/2007-01-01/", "AWSAccessKeyId", ACCESSKEYID),
new SoapHeader("http://security.amazonaws.com/doc/2007-01-01/", "Signature", $signature),
new SoapHeader("http://security.amazonaws.com/doc/2007-01-01/", "Timestamp", $timestamp),
);/**/
$client->__setSoapHeaders($header_arr);
$params = array( 'Service' => 'AWSECommerceService',
'AssociateTag' => ASSOCTAG,
#'AWSAccessKeyId' => ACCESSKEYID,
#'Signature' => $signature,
'Request' => array('Operation' => 'ItemSearchRequest',
'ItemPage' => 3,
'SearchIndex' => 'DVD',
'ResponseGroup' => 'Large',
'Keywords' => 'Karate')
);
return $client->__soapCall($function, array($params));
}
Encodierung des Timestamps hatte ich auch schon auf verschiedene Weisen getestet, führte aber immer zum gleichen Ergebnis (auch die drei "000" hatte ich weggelassen, auch keine Änderung).
Signaturübergabe im Array "params" wird nicht erkannt, im Header scheint das schon richtig zu sein.
Momentan fehlen mir die Ideen, zumal ich bei der Suche kreuz und quer durchs Netz feststellen musste, dass die meisten es dann mit REST lösen. Da wir aber bereits SOAP an mehreren Stellen nutzen, wäre es wünschtenswert das wir das auch hier wieder schaffen.
Hat jemand vielleicht eine Idee oder noch besser eine Lösung?
Kommentar