Kategorien
Amazon MWS PHP PHP 7 Projekte Symfony

Amazon automatische Preisanpassung Tool

Für einen Kunden habe ich gerade ein Tool entwickelt, mit dem man die Preise der eigenen Waren bei Amazon automatisch anpassen kann.Dabei werden die Angote der Konkurrenz analysiert nach Zustand der Ware und nach Seller Seriösität und dadurch ein fairer Preis bestimmt für die Ware. Es werden alle Daten, die über die API verfügbar sind für die Preisbestimmung mit herangezogen, wie z.B. Seller Feedback (Bewertungen des Händlers), ob Amazon selber verschickt, Versanddauer und vieles mehr.

Das Tool vergleicht optional die Preise zwischen den verschiedenen Amazon Plattformen in Europa (DE, UK, IT, ES, FR) aber auch Plattformen außerhalb Europas, wie Japan oder Amerika und händelt die unterschiedlichen Währungen.

Das Ergebnis kann direkt zu Amazon mittels der API geschickt werden und die Preise werden sofort geupdatet.

Amazon Preisanpassung
Screenshot Preisanpassungs Tool

 

Die Anwendung ist in PHP mit Symfony 3 geschrieben und hat ein Frontend mit Twitter Bootstrap 3 und eine MySQL Datenbank. Außerdem gibt es eine Vagrant Umgebung für die Entwicklung mit PHP7.1 und nginx. Ausgeführt werden kann das ganze mit einer einfachen Xampp Umgebung oder Vagrant Virtual Box beim Kunden lokal auf einem PC.

Falls sie auch Interesse an einem solchen Tool haben, könnne sie gern Kontakt aufnehmen.

Kategorien
Amazon MWS PHP

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.

 

Kategorien
Amazon MWS PHP Shopware XT-Commerce

Vergleich der Popularität von Shopsystem

<script type="text/javascript" src="//www.google.com/trends/embed.js?hl=de&q=magento,+shopware,+xt+commerce,+presta,+oxid&geo=DE&cmpt=q&content=1&cid=TIMESERIES_GRAPH_0&export=5&w=800&h=330"></script>

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
Kategorien
Amazon MWS PHP

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
Kategorien
Amazon MWS PHP

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();
                }
Kategorien
Amazon MWS

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.

Kategorien
Amazon MWS PHP

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');
Kategorien
Amazon MWS PHP

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.

Kategorien
Amazon MWS

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.

 

Kategorien
Amazon MWS

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}