PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Mit PHP eine eBay-Auktion starten

with 7 comments

eBay, wie viele andere große Webseiten und Dienste bietet Entwicklern natürlich auch eine API, mit der man leicht eigene Applikationen erstellen und eBay steuern kann. Nahezu alles, was man bei eBay auf der Webseite machen kann, kann man auch via API steuern, beispielsweise Verkaufen, Kaufen, Bieten, Bewerten, Suchen usw.

Um auf die API zuzugreifen müssen wir uns als „eBay Developer“ registrieren, um danach die Application-Keys (DEVID, AppID, CertID) zu erhalten. Wir erstellen uns erst einmal Sandbox-Keys, um unser Script in einer Testumgebung zu testen und kein Geld für die Tests bezahlen zu müssen. Wenn das Script erfolgreich läuft, kann man die Sandbox-Keys durch Production-Keys austauschen und richtig loslegen.

Da wir ja eine eBay-Auktion starten möchten, müssen wir uns noch einen User-Token erstellen, damit wir „im Auftrag eines eBay-Accounts“ arbeiten können.

Wir erstellen vorerst einen Testbenutzer für die Sandbox. Später werden wir einen Produktionsaccount (einen richtigen Account) nutzen und dafür einen User-Token erstellen.

Nachdem wir einen TESTUSER angelegt haben und für diesen Testuser ein User-Token generiert haben, können wir unser Script schreiben. Das folgende Script habe ich aus den PHP-Code-Samples abgeleitet. Dort findet man auch noch sehr viele andere Beispiele der API, die aber leider veraltet sind. So musste ich diverse Änderungen an den Beispiel-Codes machen, um es überhaupt ans Laufen zu bekommen (Paperless Zahlungsmöglichkeit hinzufügen, ReturnPolicy+ShippingDetails+DispatchTimeMax hinzufügen etc.).

Diese Klasse ist nur ein Testscript, es fehlen Setter und Getter usw., aber für Euch soll es reichen 😉

<?php
$addItem = new eBayAddItem();
$addItem->callEbay();
$addItem->printResult();

class eBayAddItem
{
	private $_siteId = 77;	// default: Germany
	private $_environment = 'sandbox';   // toggle between sandbox and production
	private $_eBayApiVersion = 661;
	private $_call = 'AddItem';
	private $_keys = array(
		'production' => array(
			'DEVID' 	=> '',
			'AppID' 	=> '',
			'CertID' 	=> '',
			'UserToken'	=> '',
			'ServerUrl' => 'https://api.ebay.com/ws/api.dll'
			),
		'sandbox' => array(
			'DEVID' 	=> '6daxxxxxxxxxxxxxxxxxxxxxxxxxx1e4622',
			'AppID' 	=> 'Mixxxxxxxxxxxxxxxxxxxxxxxxxxxxxx930',
			'CertID' 	=> '68xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx00e',
			'UserToken'	=> 'AgAxxxxxxxxlaaaangxxxxxxxxxxIrGgYZ',
			'ServerUrl' => 'https://api.sandbox.ebay.com/ws/api.dll'
		)
	);

	private $_itemStartPrice = 1;
	private $_itemBuyItNowPrice = 10;
	private $_itemTitle = 'New article title2';
	private $_itemDescription = 'Description here2';
	private $_categoryId = 42511;

	private function _getRequestBody()
	{
		$apiValues = $this->_keys[$this->_environment];

		$search = array(
			'%%USER_TOKEN%%', '%%EBAY_API_VERSION%%', '%%START_PRICE%%',
			'%%BUY_IT_NOW_PRICE%%', '%%TITLE%%', '%%DESCRIPTION%%', '%%CATEGORY_ID%%'
		);
		$replace = array(
			$apiValues['UserToken'], $this->_eBayApiVersion, $this->_itemStartPrice,
			$this->_itemBuyItNowPrice, $this->_itemTitle, $this->_itemDescription, $this->_categoryId
		);

		$requestXmlBody = file_get_contents('additem2.xml');
		$requestXmlBody = str_replace($search, $replace, $requestXmlBody);

		return $requestXmlBody;
	}

	public function callEbay()
	{
		$apiValues = $this->_keys[$this->_environment];

		$connection = curl_init();
		curl_setopt($connection, CURLOPT_URL, $apiValues['ServerUrl']);
		curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, 0);
		curl_setopt($connection, CURLOPT_SSL_VERIFYHOST, 0);

		$headers = array (
			'X-EBAY-API-COMPATIBILITY-LEVEL: ' . $this->_eBayApiVersion,
			'X-EBAY-API-DEV-NAME: ' . $apiValues['DEVID'],
			'X-EBAY-API-APP-NAME: ' . $apiValues['AppID'],
			'X-EBAY-API-CERT-NAME: ' . $apiValues['CertID'],
			'X-EBAY-API-CALL-NAME: ' . $this->_call,
			'X-EBAY-API-SITEID: ' . $this->_siteId,
		);

		curl_setopt($connection, CURLOPT_HTTPHEADER, $headers);
		curl_setopt($connection, CURLOPT_POST, 1);

		$requestBody = $this->_getRequestBody();

		curl_setopt($connection, CURLOPT_POSTFIELDS, $requestBody);
		curl_setopt($connection, CURLOPT_RETURNTRANSFER, 1);
		$responseXml = curl_exec($connection);
		curl_close($connection);
		$this->_responseXml = $responseXml;
	}

	public function printResult()
	{
		//Xml string is parsed and creates a DOM Document object
		$responseDoc = new DomDocument();
		$responseDoc->loadXML($this->_responseXml);

		//get any error nodes
		$errors = $responseDoc->getElementsByTagName('Errors');

		//if there are error nodes
		if($errors->length > 0)
		{
			echo '<P><B>eBay returned the following error(s):</B>';
			//display each error
			//Get error code, ShortMesaage and LongMessage
			$code     = $errors->item(0)->getElementsByTagName('ErrorCode');
			$shortMsg = $errors->item(0)->getElementsByTagName('ShortMessage');
			$longMsg  = $errors->item(0)->getElementsByTagName('LongMessage');
			//Display code and shortmessage
			echo '<P>', $code->item(0)->nodeValue, ' : ', str_replace(">", "&gt;", str_replace("<", "&lt;", $shortMsg->item(0)->nodeValue));
			//if there is a long message (ie ErrorLevel=1), display it
			if(count($longMsg) > 0) {
				echo '<BR>', str_replace(">", "&gt;", str_replace("<", "&lt;", $longMsg->item(0)->nodeValue));
			}

		} else { //no errors
			//get results nodes
			$responses = $responseDoc->getElementsByTagName("AddItemResponse");
			foreach ($responses as $response) {
				$acks = $response->getElementsByTagName("Ack");
				$ack   = $acks->item(0)->nodeValue;
				echo "Ack = $ack <BR />\n";   // Success if successful

				$endTimes  = $response->getElementsByTagName("EndTime");
				$endTime   = $endTimes->item(0)->nodeValue;
				echo "endTime = $endTime <BR />\n";

				$itemIDs  = $response->getElementsByTagName("ItemID");
				$itemID   = $itemIDs->item(0)->nodeValue;
				echo "itemID = $itemID <BR />\n";

				$linkBase = "http://cgi.sandbox.ebay.com/ws/eBayISAPI.dll?ViewItem&item=";
				echo "<a href=$linkBase" . $itemID . ">$this->_itemTitle</a> <BR />";

				$feeNodes = $responseDoc->getElementsByTagName('Fee');
				foreach($feeNodes as $feeNode) {
					$feeNames = $feeNode->getElementsByTagName("Name");
					if ($feeNames->item(0)) {
						$feeName = $feeNames->item(0)->nodeValue;
						$fees = $feeNode->getElementsByTagName('Fee');  // get Fee amount nested in Fee
						$fee = $fees->item(0)->nodeValue;
						if ($fee > 0.0) {
							if ($feeName == 'ListingFee') {
								printf("<B>$feeName : %.2f </B><BR>\n", $fee);
							} else {
								printf("$feeName : %.2f <BR>\n", $fee);
							}
						}
					}
				}
			}
		}
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<AddItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
	<RequesterCredentials>
		<eBayAuthToken>%%USER_TOKEN%%</eBayAuthToken>
	</RequesterCredentials>
	<DetailLevel>ReturnAll</DetailLevel>
	<ErrorLanguage>en_US</ErrorLanguage>
	<Version>%%EBAY_API_VERSION%%</Version>
	<Item>
		<BuyItNowPrice currencyID="EUR">%%BUY_IT_NOW_PRICE%%</BuyItNowPrice>
		<Country>DE</Country>
		<Currency>EUR</Currency>
		<Description><![CDATA[%%DESCRIPTION%%]]></Description>
		<DispatchTimeMax>1</DispatchTimeMax>
		<ListingDuration>Days_7</ListingDuration>
		<ListingType>Chinese</ListingType>
		<Location><![CDATA[Oelde, NRW]]></Location>
		<PaymentMethods>PayPal</PaymentMethods>
		<PayPalEmailAddress>mypaypal@domain.de</PayPalEmailAddress>
		<PrimaryCategory>
			<CategoryID>%%CATEGORY_ID%%</CategoryID>
		</PrimaryCategory>
		<Quantity>1</Quantity>
		<RegionID>0</RegionID>
		<ReturnPolicy>
			<ReturnsAcceptedOption>ReturnsNotAccepted</ReturnsAcceptedOption>
		</ReturnPolicy>
		<StartPrice>%%START_PRICE%%</StartPrice>
		<ShippingDetails>
			<ShippingServiceOptions>
				<ShippingService>DE_SonstigeDomestic</ShippingService>
				<ShippingServicePriority>1</ShippingServicePriority>
				<FreeShipping>true</FreeShipping>
			</ShippingServiceOptions>
		</ShippingDetails>
		<Site>Germany</Site>
		<Title><![CDATA[%%TITLE%%]]></Title>
	</Item>
</AddItemRequest>

Eine riesen Hilfe war die API-Dokumentation zur AddItem Funktion. Dort ist ein XML-Beispiel, alle Tags sind anklickbar, man erhält für jedes Tag eine Beschreibung und die möglichen und erlaubten Werte.

Vielleicht schreibe ich bald noch einen Artikel darüber, wie man seine Auktionen überwacht (Höchstgebote auflisten) und den Auktionsgewinner automatisch per Email kontaktiert.

Written by Michael Kliewe

März 30th, 2010 at 9:01 am

Posted in PHP

Tagged with , , ,

7 Responses to 'Mit PHP eine eBay-Auktion starten'

Subscribe to comments with RSS or TrackBack to 'Mit PHP eine eBay-Auktion starten'.

  1. Ich habe mich mit der eBay-API bislang noch nicht beschäftigt, aber interessant finde ich es auf jeden Fall. Habe ich die Möglichkeit direkt auf Ereignisse reagieren zu können z.B. ein neues Gebot oder muss ich regelmäßig nachschauen?

    Daniel

    31 Mrz 10 at 18:01

  2. Die API ist ein normaler Webservice, du mußt also in guter alter HTTP-Manier alle x Sekunden anfragen ob irgendetwas passiert ist.

    Michael Kliewe

    31 Mrz 10 at 22:47

  3. […] Mit PHP eine eBay-Auktion starten. […]

  4. […] dem letzten Artikel über die eBay-API und das Erstellen von Auktionen wollen wir nun unsere Auktionen beobachten und Informationen periodisch abfragen. Damit können wir […]

  5. Ich bin seit 2 Tagen nun am PHP vs. Ebay API recherchieren und hab hier nun endlich 2 gute Artikel gefunden, besten Dank!

    Marc S.

    24 Nov 10 at 20:20

  6. […] und mit einem entsprechenden Developer-Account ist das kein Problem. Hier mal die Links….. 1. Mit PHP eine eBay-Auktion starten 2. Mit der eBay-API seine Auktionen beobachten Ach ja… nicht vom Namen abschrecken lassen!! 🙂 […]

  7. […] Netz & auf Ebay steht auf den ersten Blick alles drin was man braucht. Stichworte: ebay api Mit PHP eine eBay-Auktion starten | PHP Gangsta – Der PHP Blog mit Praxisbezug https://go.developer.ebay.com/develo…-sample/219177 Wenn du programmieren kannst, solltest du […]

    Anonymous

    28 Mai 14 at 20:05

Leave a Reply

You can add images to your comment by clicking here.