Amazon Product API 5.0 Umstellung

Amazon Product Advertising API 5.0 Umstellung – Wie kann man die alte 4er Version der API auf Version 5.0 umstellen? Funktionierender Programmcode zum Abruf der Produktdaten.

Dokumentation

Hier die Dokumentation über alle möglichen API Anfragen:

https://webservices.amazon.com/paapi5/documentation/

Beispiel: Offer Anfrage um Savings herauszufinden (Preisnachlässe) / Unverbindliche Preisempfehlung (UVP) berechnen oder aktuelle Produktpreise zu beziehen

https://webservices.amazon.com/paapi5/documentation/offers.html

Mapping von 4.0 auf 5.0

Auf der folgenden Seite sind alle 4.0 Anfragen mit den neuen 5.0 Begriffen aufgelistet.

https://webservices.amazon.com/paapi5/documentation/migration-guide/pa-api-40-to-50-mapping.html

Beispiel: Statt ItemAttributes (4.0) sollte man nun ItemInfo verwenden (5.0)

Alle alten Begriffe müssen durch neue ersetzt werden.

Amazon Product API 5.0 Umstellung 1

Ersetzung auf ItemInfo in meinem Domain Parking Programm.

Amazon Product API 5.0 Umstellung 2

Programmcode

Den originalen Quellcode bekommt ihr von der offiziellen Amazon Seite:

https://webservices.amazon.com/paapi5/scratchpad/index.html

In meinem Fall habe ich die Datei api.php genannt.

Verarbeitung

Um die Daten zu verarbeiten müsst ihr zuerst in PHP die JSON Antwort der Amazon API decodieren. Am besten macht ihr das in einer extra Datei, wo ihr die api.php inkludiert. Beispiel: amazon.php

include("api.php");

$response = json_decode($response);

foreach ($response->SearchResult->Items as $product) {

        // Debug Variables
        /*
        echo "<pre>";
        var_dump($product);
        echo "</pre>";
        */
  
}

Alternativ könnt ihr auch durch einen Online JSON Formatter, die echo Ausgabe formatieren:

http://jsonviewer.stack.hu/

Amazon Product Advertising API 5.0 Umstellung

Der Zugriff auf die einzelnen Produktdaten müsst ihr nach der Dokumentation anpassen. In der Payload Variable im Demo Code werden die einzelnen Daten angefragt. Beispiel: Offers.Listings.Price soll den aktuellen Preis ausgeben, ItemInfo.Title den Produktnamen. (api.php). Je nach dem welche Daten ihr verwenden wollt, müsst ihr diese Definitionen im Payload einstellen.

$payload="{"
         ." \"Keywords\": \"$Keyword\","
         ." \"PartnerTag\": \"domainparking1337-21\","
         ." \"PartnerType\": \"Associates\","
         ." \"Marketplace\": \"www.amazon.de\","
         ." \"Resources\": ["
         ." \"Offers.Listings.Price\","
         ." \"Images.Primary.Medium\","
         ." \"ItemInfo.Title\","
         ." \"ItemInfo.ByLineInfo\","
         ." \"ItemInfo.Features\""
         ." ]"
         ."}";

Beispiel: Ausgabe der Produktbeschreibung als HTML Liste in Form einer Schleife (amazon.php)

echo "<ul>";
foreach ($product->ItemInfo->Features->DisplayValues as $key => $value) {       
  echo "$value";   
}   
echo "</ul>";

Beispiel: Ausgabe des Produktpreises eines bestimmten Produkts (amazon.php)

if($product->Offers->Listings[0]->Price->Amount) {
  echo ("<span class='preis'>Preis: ".$product->Offers->Listings[0]->Price->DisplayAmount."</span><br>"); 
}

Demo Programm

Dieses Demo Programm funktioniert einwandfrei (Stand 21.05.2020). Ihr müsst lediglich den $accessKey, $secretKey und PartnerTag innerhalb der ersten paar Zeilen einstellen. Sonst müsst ihr nichts anpassen.

Der Access und Secret Key findet ihr im Amazon Partnernet unter dem Menüpunkt Tools -> Product Advertising API -> Verwalte deine Zugangsdaten.

Am Besten erstellt ihr komplett neue Keys für das Programm.

<?php

$serviceName="ProductAdvertisingAPI";
$region="eu-west-1";
$accessKey="DEINACCESSKEY";
$secretKey="DEINSECRETKEY";
$payload="{"
        ." \"Keywords\": \"computer\","
        ." \"PartnerTag\": \"DEINEPARTNERID-21\","
        ." \"PartnerType\": \"Associates\","
        ." \"Marketplace\": \"www.amazon.de\","
        ." \"Resources\": ["
        ." \"Offers.Listings.Price\","
        ." \"Images.Primary.Medium\","
        ." \"ItemInfo.Title\","
        ." \"ItemInfo.ByLineInfo\","
        ." \"ItemInfo.Features\""
        ." ]"
        ."}";
$host="webservices.amazon.de";
$uriPath="/paapi5/searchitems";
$awsv4 = new AwsV4 ($accessKey, $secretKey);
$awsv4->setRegionName($region);
$awsv4->setServiceName($serviceName);
$awsv4->setPath ($uriPath);
$awsv4->setPayload ($payload);
$awsv4->setRequestMethod ("POST");
$awsv4->addHeader ('content-encoding', 'amz-1.0');
$awsv4->addHeader ('content-type', 'application/json; charset=utf-8');
$awsv4->addHeader ('host', $host);
$awsv4->addHeader ('x-amz-target', 'com.amazon.paapi5.v1.ProductAdvertisingAPIv1.SearchItems');
$headers = $awsv4->getHeaders ();
$headerString = "";
foreach ( $headers as $key => $value ) {
    $headerString .= $key . ': ' . $value . "\r\n";
}
$params = array (
        'http' => array (
            'header' => $headerString,
            'method' => 'POST',
            'content' => $payload
        )
    );
$stream = stream_context_create ( $params );
$fp = @fopen ( 'https://'.$host.$uriPath, 'rb', false, $stream );
if (! $fp) {
    throw new Exception ( "Exception Occured" );
}
$response = @stream_get_contents ( $fp );
if ($response === false) {
    throw new Exception ( "Exception Occured" );
}

$response = json_decode($response);

foreach ($response->SearchResult->Items as $product) {
	echo "<pre>";
	var_dump($product);
	echo "</pre>";
}

class AwsV4 {
    private $accessKey = null;
    private $secretKey = null;
    private $path = null;
    private $regionName = null;
    private $serviceName = null;
    private $httpMethodName = null;
    private $queryParametes = array ();
    private $awsHeaders = array ();
    private $payload = "";
    private $HMACAlgorithm = "AWS4-HMAC-SHA256";
    private $aws4Request = "aws4_request";
    private $strSignedHeader = null;
    private $xAmzDate = null;
    private $currentDate = null;
    public function __construct($accessKey, $secretKey) {
        $this->accessKey = $accessKey;
        $this->secretKey = $secretKey;
        $this->xAmzDate = $this->getTimeStamp ();
        $this->currentDate = $this->getDate ();
    }
    function setPath($path) {
        $this->path = $path;
    }
    function setServiceName($serviceName) {
        $this->serviceName = $serviceName;
    }
    function setRegionName($regionName) {
        $this->regionName = $regionName;
    }
    function setPayload($payload) {
        $this->payload = $payload;
    }
    function setRequestMethod($method) {
        $this->httpMethodName = $method;
    }
    function addHeader($headerName, $headerValue) {
        $this->awsHeaders [$headerName] = $headerValue;
    }
    private function prepareCanonicalRequest() {
        $canonicalURL = "";
        $canonicalURL .= $this->httpMethodName . "\n";
        $canonicalURL .= $this->path . "\n" . "\n";
        $signedHeaders = '';
        foreach ( $this->awsHeaders as $key => $value ) {
            $signedHeaders .= $key . ";";
            $canonicalURL .= $key . ":" . $value . "\n";
        }
        $canonicalURL .= "\n";
        $this->strSignedHeader = substr ( $signedHeaders, 0, - 1 );
        $canonicalURL .= $this->strSignedHeader . "\n";
        $canonicalURL .= $this->generateHex ( $this->payload );
        return $canonicalURL;
    }
    private function prepareStringToSign($canonicalURL) {
        $stringToSign = '';
        $stringToSign .= $this->HMACAlgorithm . "\n";
        $stringToSign .= $this->xAmzDate . "\n";
        $stringToSign .= $this->currentDate . "/" . $this->regionName . "/" . $this->serviceName . "/" . $this->aws4Request . "\n";
        $stringToSign .= $this->generateHex ( $canonicalURL );
        return $stringToSign;
    }
    private function calculateSignature($stringToSign) {
        $signatureKey = $this->getSignatureKey ( $this->secretKey, $this->currentDate, $this->regionName, $this->serviceName );
        $signature = hash_hmac ( "sha256", $stringToSign, $signatureKey, true );
        $strHexSignature = strtolower ( bin2hex ( $signature ) );
        return $strHexSignature;
    }
    public function getHeaders() {
        $this->awsHeaders ['x-amz-date'] = $this->xAmzDate;
        ksort ( $this->awsHeaders );
        // Step 1: CREATE A CANONICAL REQUEST
        $canonicalURL = $this->prepareCanonicalRequest ();
        // Step 2: CREATE THE STRING TO SIGN
        $stringToSign = $this->prepareStringToSign ( $canonicalURL );
        // Step 3: CALCULATE THE SIGNATURE
        $signature = $this->calculateSignature ( $stringToSign );
        // Step 4: CALCULATE AUTHORIZATION HEADER
        if ($signature) {
            $this->awsHeaders ['Authorization'] = $this->buildAuthorizationString ( $signature );
            return $this->awsHeaders;
        }
    }
    private function buildAuthorizationString($strSignature) {
        return $this->HMACAlgorithm . " " . "Credential=" . $this->accessKey . "/" . $this->getDate () . "/" . $this->regionName . "/" . $this->serviceName . "/" . $this->aws4Request . "," . "SignedHeaders=" . $this->strSignedHeader . "," . "Signature=" . $strSignature;
    }
    private function generateHex($data) {
        return strtolower ( bin2hex ( hash ( "sha256", $data, true ) ) );
    }
    private function getSignatureKey($key, $date, $regionName, $serviceName) {
        $kSecret = "AWS4" . $key;
        $kDate = hash_hmac ( "sha256", $date, $kSecret, true );
        $kRegion = hash_hmac ( "sha256", $regionName, $kDate, true );
        $kService = hash_hmac ( "sha256", $serviceName, $kRegion, true );
        $kSigning = hash_hmac ( "sha256", $this->aws4Request, $kService, true );
        return $kSigning;
    }
    private function getTimeStamp() {
        return gmdate ( "Ymd\THis\Z" );
    }
    private function getDate() {
        return gmdate ( "Ymd" );
    }
}

?>

Wenn ihr die Datei im Webbrowser aufruft und vorher die drei Variablen angepasst habt, erscheint folgende Ausgabe:

Amazon Product API 5.0 Umstellung 3

Fazit

Mit dieser Anpassung des PHP Codes wurde die Amazon Product Advertising API auf 5.0 umgestellt.

Mein Domain Parking Programm läuft nun also über die neue V5 API.

Amazon Product API 5.0 Umstellung 4

Überprüfung

Wie kann man überprüfen, ob die Umstellung geklappt hat?

Ihr wartet ein paar Tage und schaut im Partnernet unter eurer Tracking ID -> Linkauswertung nach den PA-API Einträgen.

Wenn dort nur die PA-API 5 aufgelistet ist, hat alles geklappt.

Amazon Product API 5.0 Umstellung 5

Wenn ich den Datumsbereich verlängere und mehr Tage anzeige, kommt die normale PA-API (4.0 Version) dazu. (Vor der Umstellung)

Amazon Product API 5.0 Umstellung 6

Umstellung Affiliate Toolkit

Wie kann man API 5.0 unter dem WordPress Plugin Affiliate Toolkit umstellen?

Affiliate Toolkit -> Shops -> Amazon -> API Version auf v5 umschalten

Zuvor stand der Wert auf Auto und hat teilweise trotz aktuellster Version immer noch v4 Anfragen gesendet.

Amazon Product API 5.0 Umstellung 7

Kommentar verfassen

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

Scroll to Top