<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ROAE-Blog &#187; Guide</title>
	<atom:link href="http://blog.root-of-all-evil.com/tag/guide/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.root-of-all-evil.com</link>
	<description>Studium, Codeing und Gedachtes</description>
	<lastBuildDate>Mon, 30 Jan 2012 22:58:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Das Zend Framework und die eBay trading API – Teil 4</title>
		<link>http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/</link>
		<comments>http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 16:09:35 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Codeschnipsel]]></category>
		<category><![CDATA[Guides]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekt]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[eBay]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[trading API]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=370</guid>
		<description><![CDATA[Wir werden einen Prozess schaffen, der es dem Nutzer erlaubt den eBay User Consent Flow mit Hilfe unserer Webapplikation zu durchschreiten. Dieser Prozess soll möglichst unkompliziert, direkt und intuitiv bedienbar sein. Ich empfehle also die Verwendung von Ajax-Methoden um das User Interface und den darzustellenden Prozess zu visualisieren. Wie das Zend Framework mit Ajax Anfragen umgehen kann wird hier also auch Thema sein.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/" title="Das Zend Framework und die eBay trading API – Teil 4"></a><p>Die ersten drei Teile dieser Reihe hatten sich mit der theoretischen und praktischen Implementierung des User Consent Flow Prozesses, der für die Authentifizierung des Nutzers mit und der Verwendung der eBay Trading API notwendig ist, befasst. Im vierten und letzten Teil sollen die Implementierungen der letzten drei Teile (<a title="Zum ersten Teil dieses Guides" href="http://blog.root-of-all-evil.com/?p=131" target="_self">Teil 1</a>, <a title="Teil zwei dieser Reihe" href="http://blog.root-of-all-evil.com/?p=161" target="_self">Teil 2</a>, <a title="Der dritte Teil dieser Reihe" href="http://blog.root-of-all-evil.com/?p=205" target="_self">Teil 3</a>) dieser Reihe in die Controller und Views umgesetzt und so ein visueller Anmelde- und Authentifizierungsprozess geschaffen werden.</p>
<h3>Was wird Teil 4 dieses Guides zeigen?</h3>
<p>Wir werden einen Prozess schaffen, der es dem Nutzer erlaubt den eBay User Consent Flow mit Hilfe unserer Webapplikation zu durchschreiten. Dieser Prozess soll möglichst unkompliziert, direkt und intuitiv bedienbar sein. Ich empfehle also die Verwendung von Ajax-Methoden um das User Interface und den darzustellenden Prozess zu visualisieren. Wie das Zend Framework mit Ajax Anfragen umgehen kann wird hier also auch Thema sein.<span id="more-370"></span></p>
<h3>Warum Ajax?</h3>
<p>Wenn wir uns eben an den Ablauf des (<a title="Teil 1" href="http://blog.root-of-all-evil.com/?p=131" target="_blank">in Teil 1 ausführlich beschriebenen</a>) Consent Flow Prozesses erinnern: Der Benutzer muss selbst nur wenige Klicks und Eingaben machen &#8211; namentlich die Anmeldung auf der eBay Login-Seite zu der er weitergeleitet wird. Im Hintergrund muss unsere Applikation allerdings zwei Anfragen machen. (1) Eine SessionID von der eBay trading API anfragen und (2) nach der Rückkehr des Benutzers<a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow.jpg" rel="lightbox[370]"><img class="alignright size-thumbnail wp-image-139" title="eBayUserConsentFlow" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow-150x150.jpg" alt="Der eBay User Consent Flow" width="150" height="150" /></a> zur Applikation den mit der SessionID verknüpften Auth-Token anfragen.</p>
<p>Hier empfehle ich Ajax: Dem Benutzer soll visualisiert werden, dass sich hinter den Kulissen etwas tut und nicht lange auf den Seitenaufbau warten müssen (die API-Anfragen dauern ein paar wenige Sekunden). Wir werden also die Seite ausliefern, und von dieser eine Ajax-Anfrage starten, die die getSessionID und später die fetchToken Actionen anstoßen wird. Der Benutzer wird ein Lade-Grafik sehen und damit merken, dass sich etwas tut. Die Weiterleitung soll vollautomatisch erfolgen. Das Ergebnis sieht also keinerlei Actionen vom Benutzer auf unserer Applikation vor. Er muss lediglich warten bis er zu eBay weiter geleitet wird und sich dort anmelden kann.</p>
<p><img class="aligncenter size-full wp-image-374" title="consentFlowGUI" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/02/consentFlowGUI.jpg" alt="" width="500" height="220" /></p>
<h3>Die benötigten Actions</h3>
<p>Wie in Teil 2 bereits aufgestellt brauchen wir neben dem Ebayauth Controller folgende fünf Actions:</p>
<ul>
<li><em>index</em> (stößt den Consent Flow an)<em><br />
</em></li>
<li><em>step1</em> (ist Ziel eines Ajax-Requests &#8211; übernimmt getSessionID)</li>
<li><em>success </em>(bei erfolgreichem Login auf eBay wird der Benutzer hierhin  weitergeleitet)</li>
<li><em>step2 </em>(ist Ziel eines Ajax-Requests &#8211; übernimmt fetchToken)</li>
<li>und <em>denied</em> (bei fehlgeschlagenem oder abgebrochenen Login)<em><br />
</em></li>
</ul>
<p>und vier Views für den Controller <em>Ebayauth</em>:</p>
<ul>
<li><em>index.phtml</em></li>
<li><em>step1.ajax.phtml</em></li>
<li><em>success.phtml<br />
</em></li>
<li><em>step2.ajax.phtml</em></li>
<li>und <em>denied.phtml</em></li>
</ul>
<h3>Ajax Requests erkennen und entsprechend handeln</h3>
<p>Um die Unterscheidung zwischen &#8216;normalem&#8217; Request und einem Ajax-Request können wir einen Context-Switcher verwenden, den uns das Zend Framework zur Verfügung stellt. Dieser muss in der init()-Methode des Controllers initialisiert werden uns sieht in unserem Fall so aus:</p>
<pre class="php" title="code">$contextSwitch = $this-&gt;_helper-&gt;getHelper('AjaxContext');
$contextSwitch-&gt;addActionContext('step1', 'html') // wir geben html zurück
              -&gt;addActionContext('step2', 'html') // möglich wäre auch xml oder json
              -&gt;initContext();

// Das übrige Layout abschalten
if($this-&gt;_request-&gt;isXmlHttpRequest()) {
     $this-&gt;_helper-&gt;layout-&gt;disableLayout();
}</pre>
<p>Unsere zwei step Actions benötigen noch eine kleine Fallunterscheidung. Wir möchten sie nur ausführen lassen, wenn es sich tatsächlich um einen Ajax-Request handelt:</p>
<pre class="php" title="code">if(!$this-&gt;_request-&gt;isXmlHttpRequest()) {
    $this-&gt;_redirect('/ebayauth/index'); // zum Start des Auth-Prozesses umleiten
}</pre>
<h3>Der Controller Ebayauth</h3>
<p>Springen wir gleich in den Code:</p>
<pre class="php" title="code">public function indexAction() {}

public function step1Action()
{
    if(!$this-&gt;_request-&gt;isXmlHttpRequest()) {
        $this-&gt;_redirect('/ebayauth/index');
    }

    // die getSessionID API-Anfrage durchführen
    $tokenAdapter = new Ebay_Auth_ConsentFlow();
    $return = $tokenAdapter-&gt;getSessionID();

    // Wir müssen die SessionID in einer Datenbank oä. zwischenspeichern
    $modelAccount = new Model_Account();

    if($return != false) {
        // zwischenspeichern - bitte durch eigenen Implementierung ersetzen
        $modelAccount-&gt;writeEbaySessionId($this-&gt;accountID, $return['sessionId']);
        if(isset($return-&gt;ShortMessage)) {
            // bei Fehler ist ShortMessage teil der API Rückgabe
            $this-&gt;view-&gt;error = (string)$return-&gt;ShortMessage;
        } else {
            $this-&gt;view-&gt;redirectURL = $return['redirectUrl'];
        }
    } else {
        $this-&gt;view-&gt;error = 'Keine Verbindung zu eBay.';
    }
}

public function successAction() {}

public function step2Action()
{
    if(!$this-&gt;_request-&gt;isXmlHttpRequest()) {
        $this-&gt;_redirect('/ebayauth/index');
    }

    // die im step1 zwischengespeicherte SessionID aus der Datenbank holen
    $modelAccount = new Model_Account();
    $sessionId = $modelAccount-&gt;getEbaySessionId($this-&gt;accountID);

    // die fetchToken API Anfrage ausführen
    $tokenAdapter = new Ebay_Auth_ConsentFlow();
    $return = $tokenAdapter-&gt;getToken($sessionId);

    if($return != false) {
        // auch hier wieder eigenen Implementierung Verwenden
        $modelAccount-&gt;writeEbayTokenId($this-&gt;accountID, $return['token'], $return['expiration']);
        if(isset($return-&gt;ShortMessage)) {
            $this-&gt;view-&gt;error = (string)$return-&gt;ShortMessage;
        } else {
            // Hier festlegen wohin umgeleitet werden soll
            $this-&gt;view-&gt;redirectURL = '/'; // zurück zur Startseiten
            $this-&gt;view-&gt;expiration = $return['expiration'];
        }
    } else {
        $this-&gt;view-&gt;error = 'Keine Verbindung zu eBay';
    }
}

public function deniedAction() {}</pre>
<p>Die drei Actions index, success und denied benötigen keine Methoden im Controller. Der JavaScript, der den Ajax-Request anstößt coden wir einfach fest in die views ein.</p>
<h3>Die Views</h3>
<p>Das hier ist der index view (<em>index.phtml</em>). Wir binden ein JavaScript ein und rufen die Funktion <em>shootAjaxHtml()</em> auf.</p>
<pre class="php" title="code">&lt;div&gt;
    &lt;div id="loader" class="redirect"&gt;&lt;img src="/images/preloader.gif" /&gt; Weiterleitung an eBay wird vorbereitet ...
        &lt;script type="text/javascript"&gt;shootAjaxHtml('/ebay/step1', 'loader')&lt;/script&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Der <em>step1.ajax.phtml</em> View:</p>
<pre class="php" title="code">&lt;?php if(isset($this-&gt;redirectURL)) { ?&gt;
&lt;p&gt;Automatische Weiterleitung zu eBay in wenigen Sekunden. &lt;a href="&lt;?php echo($this-&gt;redirectURL); ?&gt;" title="Weiterleitung"&gt;Oder hier klicken.&lt;/a&gt;&lt;/p&gt;
&lt;script type="text/javascript"&gt;window.location = '&lt;?php echo($this-&gt;redirectURL); ?&gt;';&lt;/script&gt;
&lt;?php } elseif(isset($this-&gt;error)) { ?&gt;
&lt;p class="error"&gt;&lt;strong&gt;Fehler:&lt;/strong&gt; &lt;?php echo $this-&gt;error; ?&gt;&lt;/p&gt;
&lt;?php } ?&gt;</pre>
<p><em>success.phtml</em>:</p>
<pre class="php" title="code">&lt;div&gt;
    &lt;div id="loader" class="redirect"&gt;&lt;img src="&lt;?php echo SKINPATH; ?&gt;/images/preloader.gif" /&gt; eBay Anmeldung wird abgeschlossen ...
        &lt;script type="text/javascript"&gt;shootAjaxHtml('/ebay/authgettoken', 'loader')&lt;/script&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Und <em>step2.ajax.phtml</em>:</p>
<pre class="php" title="code">&lt;?php if(isset($this-&gt;redirectURL)) { ?&gt;
&lt;p class="info"&gt;Die Verknüpfung des Benutzerkontos mit eBay verliert am &lt;?php echo date('d.m.Y', strtotime($this-&gt;expiration)); ?&gt; um &lt;?php echo date('H:m', strtotime($this-&gt;expiration)); ?&gt; Uhr seine Gültigkeit.&lt;/p&gt;
&lt;p&gt;&lt;a href="/ebay" class="black" title="Zurück zur Startseite"&gt;Weiter&lt;/a&gt;&lt;/p&gt;
&lt;?php } elseif(isset($this-&gt;error)) { ?&gt;
&lt;p class="error"&gt;&lt;strong&gt;Fehler:&lt;/strong&gt; &lt;?php echo $this-&gt;error; ?&gt;&lt;/p&gt;
&lt;?php } ?&gt;</pre>
<p>Im denied View gebe ich nur eine Fehlermeldung wie &#8220;Anmeldung fehlgeschlagen&#8221;.</p>
<h3>Der JavaScript (mit mootools):</h3>
<pre class="javascript" title="code">function shootAjaxHtml(action, loaderid)
{
    var remote = new Request.HTML({
        url: action + "?format=html",
        onSuccess: function(html) {
            $(loaderid).getParent('div').empty().adopt(html);
        },
        onFailure: function(xhr) {
            $(loaderid).getParent('div').empty().adopt(new Element('p').set('text', 'Es ist ein Fehler aufgetreten: ' +xhr.status +' ' +xhr.statusText).addClass('error'));
        }}).get();
}</pre>
<p>Und damit sind wir auch schon fertig.</p>
<p>Ich hoffe die ersten drei Teile dieser Einführung in eine Mögliche Implementierung des Consent Flows der eBay trading API in eine Webapplikation mit dem Zend Framework waren gut verständlich und konnten einen guten Überblick über die benötigten Implementierungsschritte geben. Teil vier hat anhand von Codebeispielen gezeigt, wie man den Consent Flow möglichst benutzerfreundlich umsetzen kann.</p>
<p>Empfehlungen, Anmerkungen, Verbesserungsvorschläge? Dazu sind die Kommentare da!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/02/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das Zend Framework und die eBay trading API – Teil 3</title>
		<link>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-3/</link>
		<comments>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-3/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 20:40:45 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[Projekt]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[eBay]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[trading API]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=205</guid>
		<description><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-3/" title="Das Zend Framework und die eBay trading API – Teil 3"></a>In den beiden ersten Teilen dieses Guides habe ich einen Überblick über die Funktionsweise und den Aufbau des user Consent Flow von eBay Applikationen in Verbindung mit der eBay trading API geschaffen (zum ersten Teil dieses Guides) und den Aufbau &#8230;<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-3/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-3/" title="Das Zend Framework und die eBay trading API – Teil 3"></a><p>In den beiden ersten Teilen dieses Guides habe ich einen Überblick über die Funktionsweise und den Aufbau des user Consent Flow von eBay Applikationen in Verbindung mit der eBay trading API geschaffen (<a title="Zum zweiten Teil dieses Guides" href="../?p=131" target="_self">zum ersten Teil dieses Guides</a>) und den Aufbau unseres Ebay API Adapters und die Implementierung mit Hilfe des Zend Frameworks erläutert (<a title="Zum ersten Teil dieses Guides" href="../?p=161" target="_self">zum zweiten Teil dieses Guides</a>).</p>
<h3>Was werde ich hier in Teil 3 beschreiben?</h3>
<p>Dieser Teil beschäftigt sich mit der Implementierung des Auth bzw. des Consent Flow Prozesses der eBay trading API. Wir werden uns einen Überblick über die benötigten Klassen und Methoden schaffen und diese dann mit Hilfe des Zend Frameworks in unser bereits vorhandenes Projekt implementieren. Unsere Aufmerksamkeit widmen wir der <em>Ebay_Auth_ConsentFlow</em> Klasse und deren Methoden <em>GetSessionID()</em> und <em>fetchToken()</em>. Außerdem werden wir anhand dieser zwei API-Anfragen die API-Rückgabe untersuchen.<span id="more-205"></span></p>
<h3>Die Klasse Ebay_Auth_ConsentFlow<a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow.jpg" rel="lightbox[205]"><img class="alignright size-thumbnail wp-image-139" title="eBayUserConsentFlow" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow-150x150.jpg" alt="Der eBay User Consent Flow" width="150" height="150" /></a></h3>
<p>Wir benötigen die Klasse Ebay_Auth_ConsentFlow um das Ziel, einen validen AuthToken von der eBay trading API zu erhalten. Wie in <a title="Zu Teil 1 dieses Guides" href="http://blog.root-of-all-evil.com/?p=131" target="_blank">Teil 1 dieses Guides</a> beschrieben läuft der eBay User Consent Flow in drei Schritten ab: (1) Session ID anfragen, (2) User zum eBay Anmeldeformular weiterleiten und (3) AuthToken anfragen. Erst mit dem AuthToken können wir im Namen des Nutzers Aktionen mit der eBay trading API durchführen.</p>
<p>Auf Schritt 2 haben wir mit unserer Implementierung keinen Einfluss. Viel mehr müssen wir uns um die beiden API-Anfragen <em>GetSessionID</em> (1) und <em>ConsentFlow</em> (2) kümmern. Die <em>GetSessionID </em>Anfrage implementieren wir in gleichnamiger Methode unserer <em>Ebay_Auth_ConsentFlow</em> Klasse. Die <em>FetchToken </em>Anfrage werden wir analog in der Methode <em>fetchToken()</em> unterbringen. Hier noch einmal der Ablauf:</p>
<ol>
<li><strong>Ebay_Auth_ConsentFlow-&gt;getSessionID() aufrufen</strong><br />
und bei der trading API eine sessionID anfragen</li>
<li><strong>Ebay_Auth_ConsentFlow-&gt;fetchToken($sessionID)  aufrufen</strong><br />
und &#8211; vorausgesetzt der Benutzer hat sich erfolgreich auf eBay eingelogged &#8211; den zur sessionID gehörigen AuthToken erhalten</li>
</ol>
<p>Zur Erinnerung:</p>
<ul>
<li>Die <em>getSessionID </em>Methode wird direkt vom Controller aufgerufen und muss im Erfolgsfall die eBay Signin URL &#8211; an die der Benutzer weiter geleitet werden soll &#8211; zurück geben.</li>
<li>Die <em>callApi </em>Methode erwartet die folgenden Parameter:
<pre>callApi($verb, $request, $aditionalXml = true, $requestCredentials = true, $serverUrl = null)
</pre>
<p>Die GetSessionID Anfrage benötigt keine zusätzlichen XML Paramter und auch keine requestCredentials.</li>
<li>Die <em>callApi </em>Methode gibt ein zweielementiges Array zurück. Einen Statusflag (&#8216;<em>Success</em>&#8216;) und die Originalantwort (&#8216;<em>Response</em>&#8216;) der eBay API.</li>
</ul>
<h3>Die Implementierung der getSessionID Methode</h3>
<p>Werfen wir nun einen Blick auf die <em>getSessionID()</em> Methode:</p>
<pre class="php">class Ebay_Auth_ConsentFlow extends Ebay_Abstract
{
    public function getSessionID()
    {
        $callVerb = 'GetSessionID';
        $xmlBody  = '&lt;RuName&gt;' . $this-&gt;_apiAdapter-&gt;_ruName . '&lt;/RuName&gt;';
        $response = $this-&gt;_apiAdapter-&gt;callApi($callVerb, $xmlBody, false, false);

        if($response['Success'] == false) {
            $return = $response['Response']-&gt;shortMessage;
        } else {
            $return = array(
                'redirectUrl' =&gt; $this-&gt;_apiAdapter-&gt;_signinUrl .
                                 '&amp;RuName=' . $this-&gt;_apiAdapter-&gt;_ruName .
                                 '&amp;SessID=' . $response['Response']-&gt;SessionID,
                'sessionId'   =&gt; $response['Response']-&gt;SessionID
            );
            return $return;
        }
    }
}</pre>
<p>Der Vollständigkeit halber und um die Referenz auf $this-&gt;_apiAdapter in Zeile 6 erklären zu können hier noch die rudimentäre <em>Ebay_Abstract</em> Klasse. <em>Ebay_Auth_ConsentFlow</em> und alle anderen Ebay API Request Klassen erben den folgende Konstruktor:</p>
<pre class="php">class Ebay_Abstract
{
    protected $_apiAdapter;

    public function __construct()
    {
        if(!isset($this-&gt;_apiAdapter)) {
            $this-&gt;_apiAdapter = Ebay_Api_Adapter::getInstance();
        }
    }
}</pre>
<p>Wie zu sehen ist, ist der eigentliche Aufbau des API-Request denkbar einfach.  Wir erstellen den XML-String und setzen mit <em>$callVerb</em> (Zeile 5) den korrekten Anfragen-Namen. Alles weitere macht unsere <em>CallApi </em>Methode der Klasse <em>Ebay_Api_Adapter</em>. Die getSessionID Anfrage benötigt als einzigen Paramter den ruNamen der Applikation um das mit der SessionID verknüpfte eBay Login-Formular mit dem Logo und der Beschreibung unserer Applikation zu versehen.</p>
<p>Als Rückgabe an den Controller sollte uns die <em>getSessionID()</em> Methode eine Sandbox Signin-URL der Form <em>https://signin.sandbox.ebay.com/ws/eBayISAPI.dll?SignIn&amp;RuName=ruNameDerApplikation&amp;SessID=dieAngefragteSessionID</em> zurückgeben.</p>
<p>Wie der Controller und die Views aussehen erkläre ich später in Teil 4 dieses Guides. Nur so viel vorweg: Ich muss zwangsläufig die SessionID mit dem Benutzer Account verknüpfen, damit später sichergestellt werden kann, dass die korrekte SessionID des Benutzers der Methode <em>fetchToken() </em>übergeben wird. Der Benutzer verlässt unsere Seite zwangsläufig für den Login-Prozess für einen kurzen Augenblick. Wir möchten ihn auch nicht aus den Augen verlieren und seine SessionID wieder vergessen.</p>
<h3>Die Implementierung der fetchToken Methode</h3>
<p>Steigen wir direkt ein &#8211; viel Neues gibt es hier nicht:</p>
<pre class="php">public function fetchToken($sessionID)
{
    $callVerb  = 'FetchToken';
    $xmlBody   =
        '&lt;SessionID&gt;' . $sessionID . '&lt;/SessionID&gt;';
    $response  = $this-&gt;_apiAdapter-&gt;callApi($callVerb, $xmlBody, false, false);

    if($response['Success'] == false) {
        return $response['Response']-&gt;ShortMessage;
    } else {
        return array(
            'token' =&gt; $response['Response']-&gt;eBayAuthToken,
            'expiration' =&gt; date('Y-m-d H:i:s', strtotime($response['Response']-&gt;HardExpirationTime))
        );
    }
}</pre>
<p>Auch die fetchToken() Methode rufen wir direkt aus dem Controller auf. Wir übergeben die SessionID und erhalten im Idealfall ein zweielementiges Array mit Token und Gültigkeitsdauer des Tokens zurück.</p>
<h3>Die Rückgabe der eBay trading API</h3>
<p>Anhand dieser zwei API-Anfragen möchte ich hier die beiden XML API-Rückgaben vorstellen:</p>
<h4>GetSessionID-Anfrage:</h4>
<pre>RuName =
'ruNameUnsererApplikation'</pre>
<p>Der einzige hier zu übergebende Parameter ist der ruName unserer Applikation.</p>
<h4>GetSessionID-Antwort:</h4>
<pre>Timestamp =
'2010-01-26T20:35:46.118Z'
Ack =
'Success'
Version =
637
Build =
'E637_INTL_BUNDLED_10223050_R1'
SessionID =
'b0**...*f74'</pre>
<p>Als Antwort erhalten wir die SessionID.</p>
<h4>FetchToken-Anfrage:</h4>
<pre>SessionID =
'b0**...*f74'</pre>
<p>Auch hier muss nur ein Paramter &#8211; die SessionID &#8211; übergeben werden.</p>
<h4>FetchToken-Antwort:</h4>
<pre>Timestamp =
'2010-01-26T20:31:58.283Z'
Ack =
'Success'
Version =
637
Build =
'E637_INTL_BUNDLED_10223050_R1'
eBayAuthToken =
'AuthToken'
HardExpirationTime =
'2011-07-20T20:27:32.000Z'
</pre>
<p>Die Antwort enthält den AuthToken und seine Gültigkeitsdauer.</p>
<p>Unsere Api_Adapter und User Consent Flow Implementierung ist damit fast fertig. Wie Controller und Views &#8211; und damit unser Frontend &#8211; implementiert werden, das soll Thema von <a title="Zu Teil Vier springen" href="http://blog.root-of-all-evil.com/?p=370" target="_self">Teil 4 dieses Guides</a> sein.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-%e2%80%93-teil-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das Zend Framework und die eBay trading API &#8211; Teil 2</title>
		<link>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-2/</link>
		<comments>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-2/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 22:09:47 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[Projekt]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[eBay]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[trading API]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=161</guid>
		<description><![CDATA[Dieser Teil widmet sich dem Aufbau und Implementierung der Ebay_Api_Adapter Klasse, die wir verwenden werden um Anfragen an die eBay trading API zu senden. Wir benötigen Methoden zur Generierung und Auslieferung der Anfragen und eine geeignete Fehlerbehandlung. Exemplarisch und anhand von Code-Beispielen soll das hier in Teil 2 gezeigt werden.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-2/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-2/" title="Das Zend Framework und die eBay trading API - Teil 2"></a><p><a title="Zum ersten Teil" href="http://blog.root-of-all-evil.com/?p=131" target="_blank">Im ersten Teil dieses Guides</a> hatten wir uns einen Überblick über den Consent Flow und eBay Authentifizierung unserer Nutzer geschaffen und so die Voraussetzung zur praktischen Umsetzung mit dem Zend Framework geschaffen.</p>
<h3>Was werde ich hier in Teil 2 beschreiben?</h3>
<p>Dieser Teil widmet sich dem Aufbau und Implementierung der Ebay_Api_Adapter Klasse, die wir verwenden werden um Anfragen an die eBay trading API zu senden. Wir benötigen Methoden zur Generierung und Auslieferung der Anfragen und eine geeignete Fehlerbehandlung. Exemplarisch und anhand von Code-Beispielen soll das hier in Teil 2 gezeigt werden.</p>
<p><span id="more-161"></span></p>
<p>Unsere Webapplikation muss nicht nur Anfragen an die eBay API senden, sondern auch den Überblick über SessionIDs und Tokens seiner Benutzer behalten. Wir sind also gezwungen diese &#8211; in unserem Fall in einer Datenbank &#8211; zwischen zu speichern:</p>
<p style="text-align: center;"><a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow_app1.jpg" rel="lightbox[161]"><img class="aligncenter" title="ebayCohttp://blog.root-of-all-evil.com/wp-admin/post.php?action=edit&amp;post=161nsentFlow_app" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow_app1.jpg" alt="" width="400" height="341" /></a></p>
<p>Das bedeutet sogleich, dass unsere Applikation auch ein User-System haben muss, so dass die zurückgegebenen SessionIDs und Tokens mit den korrekten Benutzern verknüpft werden können. Ich möchte dies hier nicht noch ausführlich herleiten, sondern setze dieses Feature in der Basis-Applikation voraus. Ich nutze dafür <a title="Eine Einführung in Zend_Acl" href="http://framework.zend.com/manual/de/zend.acl.introduction.html" target="_blank">Zend_Acl</a> und ein klassisches User-System mit Register-, Login- und Logout Funktionen. Um voraus zu planen und es eventuell später mehren Nutzern gleichzeitig zu ermöglichen mit einem eBay Account zu arbeiten wird es in meiner <em>Users </em>Tabelle eine <em>account_id</em> und eine n:1 Verknüpfung mit der <em>id </em>des eBay Accounts in der Tabelle <em>Accounts geben</em>. Der Controller <em>User </em>und die dazugehörigen Funktionen existieren also schon.</p>
<h3>Die benötigten Controller und Klassen</h3>
<p>Für unsere eBay Applikation brauchen wir einen neuen Controller (Ebayauth) und eine neue Library (Ebay) in der wir unsere eBay spezifischen Klassen unterbringen. Wir benötigen:</p>
<ul>
<li>Einen Controller <em>Ebayauth</em></li>
<li>Fünf Actions (<em>index</em>, <em>step1</em>, <em>step2</em>, <em>success </em>und <em>denied</em>) und fünf Views für den Controller <em>Ebayauth</em>:<em> index.phtml</em>, <em>step1.ajax.phtml</em>, <em>step2.ajax.phtml</em>, <em>success.phtml</em> und <em>denied.phtml</em></li>
<li>Eine neue Library mit Namespace <em>Ebay_ </em>(nicht vergessen einen Autoloader im bootstrap anzupassen)</li>
<li>Zwei <em>Ebay_</em> Klassen: <em>Ebay_Api_Adapter</em> und <em>Ebay_Auth_ConsentFlow</em></li>
<li>Eine <em>keys.xml</em> in der Library Ebay</li>
</ul>
<h3>Die Klasse Ebay_Api_Adapter</h3>
<p>Die keys.xml erlaubt es uns unsere API-Keys in einer schönen, ausgelagerten XML zu verwalten anstatt sie hardcoded in der Klasse zu lagern. Werfen wir zunächst einen Blick auf den Constructor, die setOptions Methode und die keys.xml:</p>
<pre name="code" class="php">class Ebay_Api_Adapter
{
    public function __construct($configfile = 'keys.xml')
    {
        $configfile = '../library/Ebay/' . $configfile;
        $configXml = new Zend_Config_Xml($configfile);
        $this-&gt;setOptions($configXml-&gt;keys-&gt;toArray());
        $this-&gt;setOptions($configXml-&gt;options-&gt;toArray());
    }

    // statische Instanz-Rückgabe
    public static function getInstance()
    {
        if (self::$_instance === null) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    private function setOptions($options = array())
    {
        if(is_array($options)) {
            foreach($options as $key =&gt; $value) {
                $key = '_' . $key;
                $this-&gt;$key = $value;
            }
        }
    }
}</pre>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;ebay&gt;
&lt;keys&gt;
    &lt;devId&gt;hier-eintragen&lt;/devId&gt;
    &lt;appId&gt;hier-eintragen&lt;/appId&gt;
    &lt;certId&gt;hier-eintragen&lt;/certId&gt;
    &lt;ruName&gt;hier-eintragen&lt;/ruName&gt;
&lt;/keys&gt;
&lt;options&gt;
    &lt;siteId&gt;77&lt;/siteId&gt;
    &lt;warningLevel&gt;High&lt;/warningLevel&gt;
    &lt;compatLevel&gt;647&lt;/compatLevel&gt;
    &lt;errorLanguage&gt;77&lt;/errorLanguage&gt;
    &lt;serverUrl&gt;&lt;![CDATA[https://api.sandbox.ebay.com/ws/api.dll]]&gt;&lt;/serverUrl&gt;
    &lt;signinUrl&gt;&lt;![CDATA[https://signin.sandbox.ebay.com/ws/eBayISAPI.dll?SignIn]]&gt;&lt;/signinUrl&gt;
&lt;/options&gt;&lt;/ebay&gt;
</pre>
<p>Zu den Optionen in der keys.xml möchte ich noch ein paar Worte loswerden:</p>
<ul>
<li>siteID 77 entspricht eBay.de und errorLanguage 77 entspricht Deutsch</li>
<li>warningLevel ist während wir mit der Sandbox arbeiten auf High gesetzt.</li>
<li>compatLevel 647 ist die aktuelle eBay trading API Version mit der wir arbeiten möchten.</li>
<li>serverURL ist unser Ansprechpartner für sämtliche API-Requests.</li>
<li>signinURL verwenden wir für die Weiterleitung des Benutzers zum Consent Flow.</li>
</ul>
<p>Für den HTTP-Request (POST) an die eBay trading API nutzen wir Zend_Http_Client. Die API möchte von uns eine Reihe HTTP-Header gesetzt sehen, bevor sie antworten wird. Dazu folgende Funktion:</p>
<pre name="code" class="php">private function setHeaders()
{
    $this-&gt;_headers = array (
        // Die eBay trading API Version, die wir unterstützen
        'X-EBAY-API-COMPATIBILITY-LEVEL: ' . $this-&gt;_compatLevel,

        // Unsere Keys und Zertifikate
        'X-EBAY-API-DEV-NAME: '    . $this-&gt;_devId,
        'X-EBAY-API-APP-NAME: '    . $this-&gt;_appId,
        'X-EBAY-API-CERT-NAME: '   . $this-&gt;_certId,

        // Der Name jeder eBay API Anfrage muss im Header noch einmal benannt werden
        'X-EBAY-API-CALL-NAME: '   . $this-&gt;_callVerb,
        'X-EBAY-API-SITEID: '      . $this-&gt;_siteId,

        // Wichtig: Den Content Type der Daten, die wir senden
        'Content-Type: text/xml; charset=utf-8'
    );
    $this-&gt;_request = new Zend_Http_Client();
    $this-&gt;_request-&gt;setUri($this-&gt;_serverUrl);
    $this-&gt;_request-&gt;setHeaders($this-&gt;_headers);
}</pre>
<p>Sind die Header gesetzt, so können wir mit dem Zend_Http_Client Object ($this-&gt;_request) eine Anfrage senden. Der eigentliche Inhalt der Anfrage wird mittels POST mitgesendet. Das eigentliche Herzstück unseres API Adapters ist die Methode callApi, die wie folgt Abläuft:</p>
<ol>
<li><strong>Die Header setzen</strong><br />
Wir übergeben der callApi Methode die Bezeichnung des Requests als Parameter und rufen damit die setHeaders() Methode auf. Diese baut die Header zusammen und erstellt ein neues Zend_Http_Client Objekt (siehe oben).</li>
<li><strong>Den Request Body zusammensetzen</strong><br />
Abhängig vom Typ der API Anfrage müssen wir den String des Request-Bodys (xml) zusammensetzen. Eine getSessionID verlangt andere (und weniger) Optionen als eine reguläre Anfrage.</li>
<li><strong>Den Http_Client mit dem Request Body versehen und absenden</strong><br />
Den zuvor in der setHeaders() Methode erstellten Http_Client übergeben wir den Request Body und senden den Request mittels POST an den API-Server. Die Rückgabe speichern wir in einer Variable.</li>
<li><strong>Die Rückgabe auswerten und Fehler abfangen</strong><br />
Die Rückgabe (xml) hat je nach API Anfrage eine bestimmte Form, die wir auswerten müssen. Hier muss auch unsere Fehlerbehandlung implementiert werden.</li>
</ol>
<p>Hier die Implementierung der callApi Methode der Klasse Ebay_Api_Adapter:</p>
<pre name="code" class="php">public function callApi($verb, $request, $aditionalXml = true, $requestCredentials = true, $serverUrl = null)
{

    if($serverUrl == null) {
        $serverUrl = $this-&gt;_serverUrl;
    }

    $this-&gt;_callVerb = $verb;

    $this-&gt;setHeaders();

    $requestBody =
        '&lt;?xml version="1.0" encoding="utf-8"?&gt;' .
        '&lt;' . $verb . ' xmlns="urn:ebay:apis:eBLBaseComponents"&gt;';

    // request Credentials werden nur bei regulären, nicht bei
    // getSessionID oder fetchToken Anfragen benötigt
    if($requestCredentials) {
        $requestBody .=
            '&lt;RequesterCredentials&gt;' .
            '&lt;eBayAuthToken&gt;&lt;![CDATA[' . $this-&gt;getToken() . ']]&gt;&lt;/eBayAuthToken&gt;' .
            '&lt;/RequesterCredentials&gt;';
    }

    // Auch diese Optionen benötigen wir nur für reguläre Anfragen
    if($aditionalXml) {
        $requestBody .=
            '&lt;ErrorLanguage&gt;' . $this-&gt;_errorLanguage . '&lt;/ErrorLanguage&gt;' .
            '&lt;WarningLevel&gt;'  . $this-&gt;_warningLevel  . '&lt;/WarningLevel&gt;';
    }

    $requestBody .=
        $request . '&lt;/' . $verb . '&gt;';

    $this-&gt;_request-&gt;setUri($serverUrl);
    $this-&gt;_request-&gt;setRawData($requestBody);
    $response = $this-&gt;_request-&gt;request('POST');

    $this-&gt;responseHeader   = $response-&gt;getHeaders();
    $this-&gt;responseBody     = $response-&gt;getBody();

    // die Rückgabe wandeln wir in ein (hoffentlich gültiges)
    // XML Element um
    $xml = @simplexml_load_string($this-&gt;responseBody);

    // Existiert in der Rückgabe kein ACK-Feld (zB. weil der ebay
    // Server nicht geantwortet hat) oder ist es nicht 'Success',
    // so ist etwas schief gelaufen
    if(!isset($xml-&gt;Ack) || $xml-&gt;Ack != 'Success') {
        $errors = 'Keine Antwort von eBay';
        if(isset($xml-&gt;Errors))
            $errors = $xml-&gt;Errors;
        return array('Success' =&gt; false, 'Response' =&gt; $errors);
    }

    return array('Success' =&gt; true, 'Response' =&gt; $xml);
}</pre>
<p>Die in Zeile 21 verwendete gettoken() Methode (siehe unten) gibt mir den mit dem User Account verknüpften Token zurück (Siehe Schaubild oben), ist aber optional und setzt ein User-Model voraus. Alternativ oder zu Testzwecken lässt sich der Token auch in der keys.xml hinterlegen und der Funktionsaufruf in Zeile 21 durch ein $this-&gt;_token() ersetzen.</p>
<pre name="code" class="php">public function getToken()
{
    $accountId        = Zend_Auth::getInstance()-&gt;getIdentity()-&gt;account_id;
    $modelAccount    = new Model_Account();
    return $modelAccount-&gt;getEbayToken($accountId);
}</pre>
<p>Mit dieser Implementierung können wir nun beliebige eBay trading API Anfragen versenden. <a title="Zum dritten Teil" href="http://blog.root-of-all-evil.com/?p=205" target="_self">Im dritten Teil dieses Guides beschreibe ich die Implementierung der Klasse Ebay_Auth_ConsentFlow</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Das Zend Framework und die eBay trading API &#8211; Teil 1</title>
		<link>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-1/</link>
		<comments>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-1/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 13:42:49 +0000</pubDate>
		<dc:creator>Philipp</dc:creator>
				<category><![CDATA[Guides]]></category>
		<category><![CDATA[Projekt]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[eBay]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[trading API]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.root-of-all-evil.com/?p=131</guid>
		<description><![CDATA[Webapplikationen, die die eBay trading API verwenden und damit für einen eBay Nutzer in seinem Namen Aktionen auf der eBay-Webseite durchführen, müssen einen Authorisationsprozess durchlaufen. Nutzer der Webapplikation müssen sich als eBay Nutzer identifizieren und die Applikation authorisieren Aktionen in ihrem Namen durchzufüren. Diesen Prozess möchte ich hier exemplarisch in einer Webapplikation mit Hilfe des Zend Framework abbilden und so den ersten Teil einer jeden eBay-Webapplikation beispielhaft beschreiben.<p class="read-more"><a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-1/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-1/" title="Das Zend Framework und die eBay trading API - Teil 1"></a><p>Erst mit guter Dokumentation macht es Sinn.</p>
<p>Und gut dokumentiert, das ist sowohl das <a title="Die umfangreiche Zend Framework Dokumentation" href="http://framework.zend.com/docs/" target="_blank">Zend Framework</a>, wie auch die <a title="Die eBay Trading API Dokumentation" href="http://developer.ebay.com/DevZone/XML/docs/WebHelp/wwhelp/wwhimpl/js/html/wwhelp.htm" target="_blank">eBay trading API</a>. Sinn macht es also beide zu kombinieren um schnell große eBay-Webapplikationen zu schaffen. Das Zend Framework erlaubt ein rapid PHP development und die eBay trading API ermöglicht es so ziemlich alles, was der Nutzer auf der eBay-Webseite sowieso schon tun kann in die eigenen Webapplikation zu klonen. Natürlich gibt es auch hier best practices &#8211; wie ich das ganze angegangen bin, dass möchte ich hier im folgenden beschreiben.</p>
<h3>Was werde ich hier in Teil 1 beschreiben?</h3>
<p>Webapplikationen, die die eBay trading API verwenden und damit für einen eBay Nutzer in seinem Namen Aktionen auf der eBay-Webseite durchführen, müssen einen Authorisationsprozess durchlaufen. Nutzer der Webapplikation müssen sich als eBay Nutzer identifizieren und die Applikation authorisieren Aktionen in ihrem Namen durchzufüren. Diesen Prozess möchte ich hier exemplarisch in einer Webapplikation mit Hilfe des Zend Framework abbilden und so den ersten Teil einer jeden eBay-Webapplikation beispielhaft beschreiben.<span id="more-131"></span></p>
<h3>Was benötigen wir um mit der eBay trading API zu arbeiten?</h3>
<ol>
<li><strong>Einen eBay Developers Program Account</strong> (<a title="Sofort beim eBay Developers Program anmelden" href="https://developer.ebay.com/join/Default.aspx" target="_blank">https://developer.ebay.com</a>)<br />
Das eBay Developers Program bietet Zugriff auf die eBay APIs und eine umfangreiche Dokumentation und Support. Es existieren Foren, Referenzen und zahlreiche Code-Beispiele. Ein solcher Account ist zwingen notwendig um die eBay trading API überhaupt ansprechen und nutzen zu können.</li>
<li><strong>Mindestens einen eBay Sandbox Account</strong> (<a title="Sofort bei der eBay Sandbox einen Account anlegen" href="https://scgi.sandbox.ebay.com/ws/eBayISAPI.dll?RegisterEnterInfo&amp;siteid=0&amp;UsingSSL=1&amp;co_partnerId=2" target="_blank">https://sandbox.ebay.com</a>)<br />
Es ist notwendig seine Applikationen in der eBay Sandbox zu entwickeln. Die Sandbox ist eine der original eBay Umgebung ähnelnde Spielwiese in der man zunächst einmal nichts kaputt machen und nach Lust und Laune seine Programme entwickeln und testen kann. Mindestens einen Account brauchen wir hier um in dessen Namen die trading API nutzen zu können. Empfehlen kann ich auch einen zweiten Account um beispielsweise und zu testzwecken Produkte des ersten Accounts zu ersteigern.</li>
<li><strong>Ein Set Sandbox API Keys</strong> (werden über den developers Account angelegt)<br />
Dazu zählen:</p>
<ul>
<li>Die <em>devID</em> &#8211; sie identifiziert uns als Entwickler beim Verwenden der eBay trading API</li>
<li>Die <em>AppID</em> &#8211; sie identifiziert unsere Applikation beim Verwenden der eBay trading API</li>
<li>Eine <em>CertID</em> &#8211; ein Zertifikat, dass wir beim Ansprechen der eBay trading API benötigen</li>
<li>Ein<em> RuName </em>- mit dem wir das eBay Anmeldeformular beim Authorisierungsprozess gestalten können<br />
Der RuName wird beim Konfigurieren des<em> Consent Flow</em> (der Authorisierungsprozess) im developers Account generiert. Uns wird beispielsweise die Möglichkeit gegeben das Anmeldeformular mit einem Logo unserer Applikation zu versehen.</li>
</ul>
</li>
</ol>
<h3>Was benötigen wir um mit dem Zend Framework zu arbeiten?</h3>
<ol>
<li>Eine aktuelle Version des <a title="Der Zend Server in der kostenlose Community Edition" href="http://www.zend.com/de/community/zend-server-ce" target="_blank">Zend Servers (Community Edition)</a> und das dazugehörige <a title="Das Zend Framework herunterladen" href="http://framework.zend.com/" target="_blank">Zend Framework</a>. Ich verwende das Zend Framework in der Version 1.9.5 und den Zend Server mit der PHP Version 5.2.11.</li>
<li>Ich empfehle das Entwicklertool <a title="Das Zend Studio Entwicklertool" href="http://www.zend.com/de/products/studio/downloads" target="_blank">Zend Studio</a> und Erfahrung, was das Arbeiten mit PHP, XML, dem Zend Framework und die Konfiguration eines Webservers angeht. Sollte das Zend Framework bis jetzt völlig unbekannt sein, dann möchte ich zunächst auf die zahlreichen Bücher zum Thema und die vielen Tutorials im Internet verweisen. Ich werde hier keine Einführung in das Framework geben.</li>
</ol>
<h3>Was benötigen wir sonst noch für unsere eBay Webapplikation?</h3>
<ol>
<li>Einen MySQL Server oder eine andere Datenbank. Ich verwende hier eine MySQL Datenbank in Verbindung mit der Zend_Db_Table Class, die eine abstraktion Layer besitzt und damit auch für andere Datenbanktypen verwendet werden kann.</li>
<li>Ein JavaScript Framework für unsere Ajax-Calls. Natürlich ist kein Framework notwendig, aber es macht die Frontendentwicklung und vor allem unsere Ajax Funktionen wunderbar einfach zu implementieren. Ich verwende <a title="Mootools JavaScript Framework" href="http://mootools.net/" target="_blank">mootools</a>, kann aber auch <a title="Das jQuery Javascript Framework" href="http://jquery.com" target="_blank">jQuery</a> empfehlen. Wichtig bei der Auswahl des Frameworks ist es, dass die Ajax-Requests ein XmlHttpRequest-Header mitsenden.</li>
<li>Eine Basis-Applikation mit einem eingerichtetem Layout, die es dem Benutzer erlaubt sich in unserer Applikation einzuloggen.</li>
</ol>
<h3>Der eBay User Consent Flow</h3>
<p>Wenn all das geklärt wurde, dann werden wir hier in Teil1 zunächst mit der Theorie beginnen: Wie sieht der User Consent Flow bei eBay aus? Dazu folgende Grafik:<a href="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow.jpg" rel="lightbox[131]"><img class="aligncenter size-full wp-image-139" title="eBayUserConsentFlow" src="http://blog.root-of-all-evil.com/wp-content/uploads/2010/01/ebayConsentFlow.jpg" alt="Der eBay User Consent Flow" width="384" height="377" /></a></p>
<ol>
<li><strong>Schritt</strong><br />
Unsere Applikation wird die eBay API nach einer SessionID beten. Dazu schicken wir den ruName unserer Applikation mit, damit eBay das konfigurierte Anmeldeformular (inklusive unseres tollen Applikationslogos und der Redirect-URLs) generieren und mit der SessionID verknüpfen kann. Als Antwort erhalten wir also eine SessionID, die wir dann verwenden um die Parameter der URL des Anmeldeformulars zu generieren und den Benutzer dann im zweiten Schritt &#8230;<span style="color: #888888;"> </span></li>
<li><strong>Schritt</strong><br />
&#8230; an diese URL weiterzuleiten. Dort gibt er sein eBay Passwort und Nutzernamen ein und bestätigt, dass er unserer Webapplikation erlaubt in seinem Namen auf eBay Aktionen durchzuführen. Hat er bestätigt, leitet eBay den Benutzer wieder zurück zu unserer Applikation, die daraufhin im dritten Schritt &#8230;</li>
<li><strong>Schritt</strong><br />
&#8230; eine fetchToken Anfrage an die eBay API senden kann. Mit der fetchToken Anfrage geben wir gleich die zuvor erhaltene SessionID mit. Wurde diese SessionID verwendet und hat sich der Nutzer mit dieser SessionID im Zuge des Schritt 2 auch korrekt angemeldet, so erhalten wir einen ca. 900 Zeichen langes Token zurück gibt. Dieses Token muss unsere Applikation bei jeder API-Anfrage mitsenden und sich so autorisieren.</li>
</ol>
<p>Wie die Theorie mit dem Zend Framework möglichst schnell und unkompliziert in die Praxis umgesetzt werden kann werde ich<a title="Zum zweiten Teil dieses Guides" href="http://blog.root-of-all-evil.com/?p=161" target="_self"> im zweiten Teil dieses Guides</a> beschreiben. Ich gehe konkret auf die benötigten Klassen ein und werde zahlreiche Code-Beispiele geben.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.root-of-all-evil.com/2010/01/das-zend-framework-und-die-ebay-trading-api-teil-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

