Amazon MWS PHP: Compile Error: Redefinition of parameter $quotaMax

Die Amazon MWS Library hat zu Recht Probleme in PHP7.1 mit der Datei: /MarketplaceWebServiceProducts/Model/ResponseHeaderMetadata.php (line 31)

Vorher:

class MarketplaceWebServiceProducts_Model_ResponseHeaderMetadata {

...

  public function __construct($requestId = null, $responseContext = null, $timestamp = null,
                              $quotaMax = null, $quotaMax = null, $quotaResetsAt = null) {
    $this->metadata[self::REQUEST_ID] = $requestId;
    $this->metadata[self::RESPONSE_CONTEXT] = $responseContext;
    $this->metadata[self::TIMESTAMP] = $timestamp;
    $this->metadata[self::QUOTA_MAX] = $quotaMax;
    $this->metadata[self::QUOTA_REMAINING] = $quotaMax;
    $this->metadata[self::QUOTA_RESETS_AT] = $quotaResetsAt;
  }

Nach dem Fix:

public function __construct($requestId = null, $responseContext = null, $timestamp = null,
                            $quotaMax = null, $quotaMaxRemain = null, $quotaResetsAt = null) {
  $this->metadata[self::REQUEST_ID] = $requestId;
  $this->metadata[self::RESPONSE_CONTEXT] = $responseContext;
  $this->metadata[self::TIMESTAMP] = $timestamp;
  $this->metadata[self::QUOTA_MAX] = $quotaMax;
  $this->metadata[self::QUOTA_REMAINING] = $quotaMaxRemain;
  $this->metadata[self::QUOTA_RESETS_AT] = $quotaResetsAt;
}

Grund ist, dass die Variable $quotaMax doppelt benutzt wird in der Kontrultor Definition.

 

Vergleich der Popularität von Shopsystem

Für ein kleines bis mittelgroßes deutsches Unternehemen ist Shopware aktuell nach meiner Meinung die beste Lösung, weil

  • Shopware von Hause aus spezialisiet ist auf den deutschen E-Commerce Markt und den dortigen Datenschutz und steuerlichen Eigenheiten
  • die Popularität steigend ist laut Google Trends
  • unter der Haube Symfony 2 und Zend 2 und im Backend ExtJS läuft in Version 4
  • die Preise sich auch für die professional Versionen unter denen von Magento bewegen
  • die Systemanforderungen anspruchsvoll, aber modern sind

PHP überprüfen, ob ein String eine valide Asin ist

Um zu überprüfen, ob ein String eine valide Asin ist, muss man die 2 möglichen Regeln für Asins überprüfen:

  • ein “B” gefolgt von 2 Zahlen und 7 alphanumerischen Werten
  • eine spezial ISBN-Vairiante: 9 Zahlen und am Ende entweder ein “X” oder eine weitere Zahl (sehr selten)

Der passende reguläre Ausdruck in einer Funktion gekapselt in PHP ist:

function isAsin($string){
    $ptn = "/B[0-9]{2}[0-9A-Z]{7}|[0-9]{9}(X|0-9])/";
    if(preg_match($ptn, $string, $matches)){
        return true;
    }
}

Zum Testen habe ich folgenden Code verwendet:

$testAsins = array("B223213FCF","232342342X", "A223213FCF");
foreach ($testAsins as $testAsin)
{
    if(isAsin($testAsin)){
        echo $testAsin." is ASIN"."<br>";
    }
}

Ausgabe des Skripts ist:

B223213FCF is ASIN
232342342X is ASIN

Products API gibt keine richtigen Fehlermledungen nur Fatal Error

Um aus Amazon die richtigen Fehlermeldungen heraus zu kitzeln, müssen die Fatals gefangen werden und ausgegeben, sonst kann man lange suchen:

                try
                {
                    $this->getListMatchingProductsForEanOrQueryData($ean, $country);
                }
                catch(MarketplaceWebServiceProducts_Exception $e)
                {
                    var_dump($e);
                    die();
                }

MWS Products API wird ersetzt durch Amazon Product Advertising API (PA-API)

Am 6. Februar gab es diese Email von Amazon:

Amazon Marketplace Web Service (Amazon MWS) is pleased to announce the availability of the new Amazon MWS Products API section. The Amazon MWS Products API section will replace the Amazon Product Advertising API (PA-API) as the means for sellers to obtain sourcing, listing matching, and pricing information for offering products on Amazon marketplace sites. PA-API will be discontinued for Amazon sellers use on August 31, 2012.

Das bedeutet, dass alle Operationen umgestellt werden müssen, die mit der alten Products Advertising API für Sellers zu tun haben. Davon unbeeindruckt ist die Amazon Product Advertising API (PA-API) für Affiliate User, d.h. diejenigen, die Werbung damit schalten un Geld verdienen. Daran wird sich auch so schnell nichts mehr ändern, weil Amazon ein Interesse hat, diese Benutzer nicht zu verlieren.

Eine sehr gute Übersicht über die Unterschiede von Seller und Affiliate gibt es hier.

Amazon MWS: SellerSKUList failed a validation check: Extraneous whitespace for input value

Bei folgender Fehler Meldung bei  der Amazon MWS API:

Fatal error: Uncaught exception 'MarketplaceWebServiceProducts_Exception' with message 'parameter SellerSKUList.SellerSKU.x failed a validation check: Extraneous whitespace for input value: "64145345473 "' in foo\\MarketplaceWebServiceProducts\Client.php on line 533
MarketplaceWebServiceProducts_Exception: parameter SellerSKUList.SellerSKU.x failed a validation check: Extraneous whitespace for input value: "64145345473 " in foo\MarketplaceWebServiceProducts\Client.php on line 533

War die Lösung, wie die Fehlermeldung schon sagt, die Whitespaces zu entfernen mit trim:

                for($i = 0; $i < count($skus); $i++)
                {
                    $skus[$i] = trim($skus[$i]);
                }

Komischerweise funktioniert das nicht in PHP mit:

array_walk($skus, "trim");

oder

function trim_value(&$value) 
{ 
    $value = trim($value); 
}
array_walk($skus, 'trim_value');

Amazon MWS Products API Request Limit

Amazon hat ein nicht ganz einfaches Request Limit eingebaut für die ganze MWS API. Allgemein gilt, dass nicht mehr als 10000 Requests pro Stunde getätigt werden können.

Amazon hat den so genannten Leaky Bucket-Algorithmus gewählt, um den Webservice zu entlasten.

Für die MWS Products API, mit der Artikel Informationen von Amazon bezogen werden können gelten die folgenden Limits aus der MWS Products API Referenz (Stand 6.9.2012).

Operation / Maximum Request Quota / Restore Rate
ListMatchingProducts / 20 / 1 per 5 seconds

GetMatchingProduct  / 20 / 2 Items per second

GetMatchingProductForId/ 20 / 1 Item per second (neu)

GetCompetitivePricingForSKU and  GetCompetitivePricingForASIN / 20  / 10 Items per second

GetLowestOfferListingsForSKU and GetLowestOfferListingsForASIN / 20 / 10 Items per second

GetMyPriceForSKU and GetMyPriceForASIN / 20 / 10 Items per second (neu)

GetProductCategoriesForSKU and GetProductCategoriesForASIN / 20 / 1  per 5 seconds

 maximale Requests für ListMatchingProducts proStunde

Es können 20 Requests am Anfang der Stunde gemacht werden, danach müssen die Punkte wieder aufgefüllt werden. Danach muss über die Restore Rate wieder Punkte aufgefüllt werden. Wenn sich jede Sekunde ein Request wieder auffüllt, ergibt das 3600 pro Stunde, im besten Fall, wenn sich die Requests nicht am Anfang der Stunde anfallen, sondern gleichmäßig verteilt über die ganze Stunde.

Insgesamt ergeben sich für  den ListMatchingProducts Request bei einer Restore Rate von 5 Sekunden maximal 6 * 60 = 360 Requests pro Stunde damit. Pro Request können 20 Items mitgeschickt werden, was bedeutet, dass 7200 Artikel abgefragt werden können im Optimalfall.

Amazon Product Advertising API nach AWS Products API Migration

Die nächste Änderung der Amazon Product Advertising API steht an, nachdem der wdsl Dienst abgeschaltete werden wird, wird im Ende August 2012 auch die Amazon Product Advertising API für Seller abgeschafft und durch den neuen Dienst ersetzt:  AWS Products API. Für Advertiser ist der Dienst weiterhin verfügbar.

Diese ist im Paket der neuen AWS Dienste entahlten, die Bibliothek kann hier bezogen werden. Ein Migrationsguide gibt es hier, auch wichtig die API Dokumentation.

Man kann grob sagen, dass die neue API stärker untergliedert ist und man mehr Requests über einen Artikel absetzen muss als mit der alten API, um dieselben Informationen zu bekommen.

 

Cloudfront String could not be parsed as XML

If you are using the Cloudfront library for Amazon Advertising API and you get the following error message, contact me I can help you with this issue. I got this error when I tried to retrieve amazon.fr (france) data.

exception 'Exception' with message 'String could not be parsed as XML' in cloudfusion\sdk.class.php:1209
Stack trace:
#0 \sdk.class.php(1209): SimpleXMLElement->__construct('parse_callback('pas_authenticate('ItemLookup', Array)
#3 amazonProductAdvertisingApi.php(233): AmazonPAS->item_lookup('B000091xxx', Array)
#4 amazonProductAdvertisingApi.php(90): amazonProductAdvertisingApi->getAsinData()
#5 amazonProductAdvertisingApi.php(65): amazonProductAdvertisingApi->getResult('FR')
#6 \index.php(248): amazonProductAdvertisingApi->getResults()
#7 {main}EOL#0 cloudfusion\sdk.class.php(1209): SimpleXMLElement->__construct('parse_callback('pas_authenticate('ItemLookup', Array)
#3 amazonProductAdvertisingApi.php(233): AmazonPAS->item_lookup('B000091xxx', Array)
#4 amazonProductAdvertisingApi.php(90): amazonProductAdvertisingApi->getAsinData()
#5 amazonProductAdvertisingApi.php(65): amazonProductAdvertisingApi->getResult('FR')
#6 eansuche\index.php(248): amazonProductAdvertisingApi->getResults()
#7 {main}

MarketplaceWebService Error

Wer bei Benutzung der MarketplaceWebService Bibliothek für PHP den folgenden Fehler bekommt bei Benutzung von MarketplaceWebService_Model_GetReportListByNextTokenRequest:

Fatal error: Call to undefined method MarketplaceWebService_Model_GetReportListByNextTokenResult::getReportInfo() in xxx

Der ist auf einen Fehler in den Beispiel Projekten von Amazon reingefallen.

Richtig ist:

$reportInfoList = $getReportListByNextTokenResult->getReportInfoList();

Falsch und seit Jahren von Amazon publiziert:

$reportInfoList = $getReportListByNextTokenResult->getReportInfo();