PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘PHP eBay’ tag

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 , , ,