Anleitung: Produkte bei eBay über API mit PHP SDK listen – Teil 4: Aufträge löschen, Artikel aktualisieren

Posted on 13. Oktober 2014 Comments

Dieser Blog Post ist Teil der Reihe Produkte bei eBay listen.


4.1. Jobs abbrechen

Es kann immer mal vorkommen, dass es bei der Feed-Erstellung Fehler gibt. Dann wird ggf. von large-merchant-services/02-add-fixed-price-item.php ein Job erstellt. Diesen muss man erst abbrechen um einen neuen Job derselben Art zu erstellen. Dazu braucht man die jobID. Normalerweise wird diese beim Erstellen des Jobs mit angezeigt. Sollte man sie aus irgendeinem Grund nicht zur Verfügung haben, kann man sie aber auch mit large-merchant-services/01-get-jobs.php erfragen. Da hier aber alle Jobs, die jemals ausgeführt wurden, angezeigt werden, muss man noch ein paar kleine Änderungen vornehmen. Als erstes sollte man aber wie auch in Teil 3 sicherstellen, dass man auf der richtigen Plattform arbeitet (hier: Sandbox):

'authToken' => $config['sandbox']['userToken'],
'sandbox' => true

Weiter unten, in der letzten if-Abfrage, sollte man die folgende Line ändern:

$upTo = min(count($response->jobProfile), 500);

Das sollte erstmal reichen. Außerdem kann folgende Zeile hinzufügen

$job = $response->jobProfile[$x]; // alte Zeile (Z. 89 bei mir)
if ($job->jobStatus != "Completed") { // das hier einfügen
...
} // if-Abfrage weiter unten schließen

Jetzt bekommt man nur die Jobs, die noch nicht fertig gestellt sind. Allerdings sind hier auch die Abgebrochenen dabei, also könnte man auch  ein != „Aborted“ hinzufügen.

Hat man nun die jobID, kann man die Vorlage large-merchant-services/01-get-jobs.php ein bisschen abändern. Ich habe die Datei large-merchant-services/04-abort-job.php genannt. Dafür muss in Zeile 58 den richtigen Request und die jobID eingetragen.

$request = new Types\AbortJobRequest(array('jobId' => '4711'));

Eine Zeile darunter:

$response = $service->abortJob($request);

Sollte man das öfter brauchen, sollte es auch nicht allzu schwer sein, die jobID aus den Parametern zu ziehen.

4.2. Preise und Verfügbarkeit aktualisieren

Wie viele andere Marktplätze, gibt eBay auch die Möglichkeit mit einem reduzierten Feed für zuvor gelistete Produkte die Verfügbarkeit und Preise zu updaten. Eine genaue Erklärung der einzelnen Tags findet sich im ersten Teil. Der reduzierte Feed folgendermaßen aus:

<?xml version="1.0" encoding="UTF-8"?>
<BulkDataExchangeRequests>
<Header>
<Version>669</Version>
<SiteID>77</SiteID>
</Header>
<ReviseFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
<ErrorLanguage>de_DE</ErrorLanguage>
<WarningLevel>Low</WarningLevel>
<Version>619</Version>

Jetzt kommen die Informationen das Item, also der Eltern-/Parent-Artikel

<Item>
<SKU>26754</SKU>
<InventoryTrackingMethod>SKU</InventoryTrackingMethod>

Mehr ist nicht von nöten, da die Verfügbarkeiten und Preise ja auf Variationsebene festgelegt sind.

<Variations>
<Variation>
<SKU>4711</SKU>
<Quantity>23</Quantity>
<StartPrice>12.34</StartPrice>
</Variation>
<Variation>
<SKU>4712</SKU>
<Quantity>42</Quantity>
<StartPrice>56.78</StartPrice>
</Variation>
... <!-- mehr Variationen hier -->
</Variations>
</Item>
</ReviseFixedPriceItemRequest>
</BulkDataExchangeRequests>

Das war es auch schon. Für das Updaten der Angebote (revise) gibt es noch keine Vorlage von dts. Allerdings kann man das Beispiel für AddFixedPriceItem mit wenigen Änderungen auch dafür benutzen. In Zeile 75 wird statt AddFixedPriceItem einfach ReviseFixedPriceItem eingesetzt:

$createUploadJobRequest->uploadJobType = 'ReviseFixedPriceItem';

Außerdem ändern sich natürlich noch die Dateinamen der hochzuladenen Datei und der Antwort von eBay:

$uploadFileRequest->attachment(file_get_contents(__DIR__.'/ReviseFixedPriceItem.xml.gz'));
...
$tempFilename = tempnam(sys_get_temp_dir(), 'revise-fixed-price-item-responses-').'.zip';

Natürlich kann man auch jede beliebige Änderung über ReviseFixedPriceItem vornehmen. Allerdings funktioniert alles außer Verfügbarkeit und Preis nur, solange noch keine Variation des Artikels gekauft wurde. Manchmal kann es auch gut sein, den Artikel einfach ganz zu löschen und noch einmal neu hochzuladen (Achtung: in Production kann das Geld kosten!). Dafür braucht man den folgenden API Call.

4.3. EndFixedPriceItem

Möchte man ein Angebot komplett löschen, kann man einen einfachen Feed für diese Items schreiben (für Varianten reicht es die Quantity auf 0 zu setzen). Ist bei allen Varianten die Quantity auf 0, wird der Artikel automatisch entfernt (und muss ggf. mit kostenpflichtig wieder erstellt werden), außer man hat beim Einstellen, wie in Teil 1 erwähnt, die Option OutOfStockControl gesetzt. In diesem Fall wird der Artikel bloß ausgeblendet. Die SKU ist hier dementsprechend die Eltern-/Parent-SKU. Der Feed sieht wie folgt aus:

<?xml version="1.0" encoding="utf-8"?>
<BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
<Header>
<Version>659</Version>
<SiteID>77</SiteID>
</Header>
<EndFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
<EndingReason>NotAvailable</EndingReason>
<SKU>4711</SKU>
<ErrorLanguage>de_DE</ErrorLanguage>
<WarningLevel>High</WarningLevel>
<Version>859</Version>
</EndFixedPriceItemRequest>
...
<!-- Mehr EndFixedPriceItemRequests -->
</BulkDataExchangeRequests >

Das Prinzip ist dasselbe wie bei AddFixedPriceItem und ReviseFixedPriceItem: einfach die Strings im Quellcode ändern und man kann die Datei auch für EndFixedPriceItem benutzen.

Flattr this!

Comments

  1. Hallo, vielen Dank für die sehr gute Einführung in die SDK. Hat mir sehr viel gebracht. Beim Punkt 4.1 (Jobs abbrechen) erhalte ich leider einen Fehler.

    Fatal error: Class ‚BulkDataExchange\Enums\ErrorSeverity‘ not found

    Was kann ich tun?

  2. Hallo Armin,

    das ist ja ein seltsamer Fehler, weil eigentlich durch den autoload von composer die Klasse bekannt sein sollte. Versuchen kannst du aber mal die Klasse manuell zu importieren:


    require_once("vendor/dts/ebay-sdk-bulk-data-exchange/src/DTS/eBaySDK/BulkDataExchange/Enums/ErrorSeverity.php");

    Ggf. musst du den Code zu deinem Vendor Verzeichnis anpassen.

  3. Der Pfad müsste eigentlich stimmen. Kannst du mal gucken, ob die Datei dort überhaupt existiert und

    Ich weiß, dass David/dts die Pakete neulich umstrukturiert hat, beim composer update solltest du folgenden Error bekommen:

    Package dts/ebay-sdk-file-transfer is abandoned, you should avoid using it. Use dts/ebay-sdk-php instead.
    Package dts/ebay-sdk-bulk-data-exchange is abandoned, you should avoid using it. Use dts/ebay-sdk-php instead.
    Package dts/ebay-sdk-trading is abandoned, you should avoid using it. Use dts/ebay-sdk-php instead.

    Wie die neuen Pakete strukturiert sind weiß ich leider nicht (befinden uns auch gerade in der Umstrukturierung, kann noch etwas dauern, dann könnte ich den Artikel mal updaten), vielleicht befindet sich ErrorSeverity in einem anderen Namespace? Du kannst sonst testweise ja auch mal die Klasse aus der Datei kopieren und mal in deinen Code einfügen und dann versuchen zu debuggen? Wobei das eigentlich genau das ist was require_once() macht.

  4. Die Klasse ist ja eigentlich nicht das Problem. Der geht ja nur in die Klasse wenn er eine Error-Response erhält. Ich habe die get-jobs File angepasst mit:

    $request = new Types\AbortJobRequest(array(‚jobId‘ => ‚50014995027‘));
    $response = $service->abortJob($request);

    Das response Objekt bekommt jetzt eine Error Message. Die o.g. Jobid hatte ich zuvor erst erstellt. Beim Löschen des Jobs bekomme ich eine Error Response. Weiß aber nicht warum….

Pings

  1. Anleitung: Produkte bei eBay über API mit PHP SDK listen – Teil 2: XML Dateien mit PHP erstellen

Schreibe einen Kommentar

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