Amazon Product Advertising API ab Sommer signiert

Ab dem 15. August müssen Anfragen an die Amazon Product Advertising API (ehemals Amazon Associates Web Service / Amazon E-Commerce Service) signiert geschehen. Die Dokumentation dazu ist aus meiner Sicht etwas dürftig, deshalb musste ich ein bisschen suchen, um den Vorgang für meine Seite anzupassen. Folgender PHP-Code berechnet die Signatur für einen Aufruf:

function sign ( $url )
{
	$key = 'your Secret Access Key';
	$query = parse_url ( $url, PHP_URL_QUERY );
	parse_str ( $query, $queryArray );
	$queryArrayNew = array();
	foreach ( $queryArray as $arrayKey => $arrayValue ) {
		$queryArrayNew[] = $arrayKey . '=' . urlencode ( $arrayValue );
	}
	sort ( $queryArrayNew );
	$queryStringNew = implode ( '&', $queryArrayNew );
	$stringToSign = "GET\n" . parse_url ( $url, PHP_URL_HOST )
		 . "\n" . parse_url ( $url, PHP_URL_PATH )
		 . "\n" . $queryStringNew;
	$signature = base64_encode (
		 hash_hmac ( 'sha256', $stringToSign, $key, true )
	 );
	return $signature;
}

Wichtiger Tipp: Vor dem Signieren muss die URL um den Timestamp-Parameter erweitert sein. Das geht simpel über:

$url .= '&Timestamp=' . urlencode ( date ( 'c' ) );

Nachtrag 30. Juli 2009: Umbenennung der Variablen in der foreach-Schleife

8 Gedanken zu „Amazon Product Advertising API ab Sommer signiert“

  1. Wundert mich eigentlich, dass es da von Amazon keine ausreichende Dokumentation zur Verfügung stellt. Normalerweise machen die das doch immer ganz gut. Umso mehr Dank für den Hinweis hier. Wird sicherlich vielen Leuten helfen!

  2. Mir hat es auch jeden Fall weitergeholfen und ärgern tut es mich trotzdem, dass man in solchen Fällen nicht auf eine ausreichende Dokumentation zugreifen kann.

  3. Vielen Dank. Stundenlang gesucht, riesige PHP-Classes und Plugins für jedes CMS gefunden, z.T. kommerziell (Nieder mit Ioncube!).

    Vielleicht noch einen Usage-Hinweis:
    Die Funktion „sign“ gibt nicht die signierte URL für den Request zurück (d.h. sie signiert nicht die URL), sondern erzeugt eine Signatur, die dann noch an die ursprüngliche URL angehängt werden muss.

    Usage:

    $signature=sign($url);
    $request=“$url&Signature=$signature“;

  4. ..ach so das ist neu! ich dachte das ich bei der anmeldung bei den amazonen was übersehen hätte.

    danke für den code, muss ich mir net selbst den kopf zerbrechen 😉

  5. In dem Code ist $key einerseits für den amazon secret key und anderseits in der foreach-Schleife als Key-Variable verwendet. Ungut ist das.

  6. Pingback: MKUHFUSS

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.