Das Zend Framework und die eBay trading API – Teil 3

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 unseres Ebay API Adapters und die Implementierung mit Hilfe des Zend Frameworks erläutert (zum zweiten Teil dieses Guides).

Was werde ich hier in Teil 3 beschreiben?

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 Ebay_Auth_ConsentFlow Klasse und deren Methoden GetSessionID() und fetchToken(). Außerdem werden wir anhand dieser zwei API-Anfragen die API-Rückgabe untersuchen.

Die Klasse Ebay_Auth_ConsentFlowDer eBay User Consent Flow

Wir benötigen die Klasse Ebay_Auth_ConsentFlow um das Ziel, einen validen AuthToken von der eBay trading API zu erhalten. Wie in Teil 1 dieses Guides 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.

Auf Schritt 2 haben wir mit unserer Implementierung keinen Einfluss. Viel mehr müssen wir uns um die beiden API-Anfragen GetSessionID (1) und ConsentFlow (2) kümmern. Die GetSessionID Anfrage implementieren wir in gleichnamiger Methode unserer Ebay_Auth_ConsentFlow Klasse. Die FetchToken Anfrage werden wir analog in der Methode fetchToken() unterbringen. Hier noch einmal der Ablauf:

  1. Ebay_Auth_ConsentFlow->getSessionID() aufrufen
    und bei der trading API eine sessionID anfragen
  2. Ebay_Auth_ConsentFlow->fetchToken($sessionID)  aufrufen
    und – vorausgesetzt der Benutzer hat sich erfolgreich auf eBay eingelogged – den zur sessionID gehörigen AuthToken erhalten

Zur Erinnerung:

  • Die getSessionID Methode wird direkt vom Controller aufgerufen und muss im Erfolgsfall die eBay Signin URL – an die der Benutzer weiter geleitet werden soll – zurück geben.
  • Die callApi Methode erwartet die folgenden Parameter:
    callApi($verb, $request, $aditionalXml = true, $requestCredentials = true, $serverUrl = null)
    

    Die GetSessionID Anfrage benötigt keine zusätzlichen XML Paramter und auch keine requestCredentials.

  • Die callApi Methode gibt ein zweielementiges Array zurück. Einen Statusflag (‘Success‘) und die Originalantwort (‘Response‘) der eBay API.

Die Implementierung der getSessionID Methode

Werfen wir nun einen Blick auf die getSessionID() Methode:

class Ebay_Auth_ConsentFlow extends Ebay_Abstract
{
    public function getSessionID()
    {
        $callVerb = 'GetSessionID';
        $xmlBody  = '<RuName>' . $this->_apiAdapter->_ruName . '</RuName>';
        $response = $this->_apiAdapter->callApi($callVerb, $xmlBody, false, false);

        if($response['Success'] == false) {
            $return = $response['Response']->shortMessage;
        } else {
            $return = array(
                'redirectUrl' => $this->_apiAdapter->_signinUrl .
                                 '&RuName=' . $this->_apiAdapter->_ruName .
                                 '&SessID=' . $response['Response']->SessionID,
                'sessionId'   => $response['Response']->SessionID
            );
            return $return;
        }
    }
}

Der Vollständigkeit halber und um die Referenz auf $this->_apiAdapter in Zeile 6 erklären zu können hier noch die rudimentäre Ebay_Abstract Klasse. Ebay_Auth_ConsentFlow und alle anderen Ebay API Request Klassen erben den folgende Konstruktor:

class Ebay_Abstract
{
    protected $_apiAdapter;

    public function __construct()
    {
        if(!isset($this->_apiAdapter)) {
            $this->_apiAdapter = Ebay_Api_Adapter::getInstance();
        }
    }
}

Wie zu sehen ist, ist der eigentliche Aufbau des API-Request denkbar einfach.  Wir erstellen den XML-String und setzen mit $callVerb (Zeile 5) den korrekten Anfragen-Namen. Alles weitere macht unsere CallApi Methode der Klasse Ebay_Api_Adapter. 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.

Als Rückgabe an den Controller sollte uns die getSessionID() Methode eine Sandbox Signin-URL der Form https://signin.sandbox.ebay.com/ws/eBayISAPI.dll?SignIn&RuName=ruNameDerApplikation&SessID=dieAngefragteSessionID zurückgeben.

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 fetchToken() ü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.

Die Implementierung der fetchToken Methode

Steigen wir direkt ein – viel Neues gibt es hier nicht:

public function fetchToken($sessionID)
{
    $callVerb  = 'FetchToken';
    $xmlBody   =
        '<SessionID>' . $sessionID . '</SessionID>';
    $response  = $this->_apiAdapter->callApi($callVerb, $xmlBody, false, false);

    if($response['Success'] == false) {
        return $response['Response']->ShortMessage;
    } else {
        return array(
            'token' => $response['Response']->eBayAuthToken,
            'expiration' => date('Y-m-d H:i:s', strtotime($response['Response']->HardExpirationTime))
        );
    }
}

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.

Die Rückgabe der eBay trading API

Anhand dieser zwei API-Anfragen möchte ich hier die beiden XML API-Rückgaben vorstellen:

GetSessionID-Anfrage:

RuName =
'ruNameUnsererApplikation'

Der einzige hier zu übergebende Parameter ist der ruName unserer Applikation.

GetSessionID-Antwort:

Timestamp =
'2010-01-26T20:35:46.118Z'
Ack =
'Success'
Version =
637
Build =
'E637_INTL_BUNDLED_10223050_R1'
SessionID =
'b0**...*f74'

Als Antwort erhalten wir die SessionID.

FetchToken-Anfrage:

SessionID =
'b0**...*f74'

Auch hier muss nur ein Paramter – die SessionID – übergeben werden.

FetchToken-Antwort:

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'

Die Antwort enthält den AuthToken und seine Gültigkeitsdauer.

Unsere Api_Adapter und User Consent Flow Implementierung ist damit fast fertig. Wie Controller und Views – und damit unser Frontend – implementiert werden, das soll Thema von Teil 4 dieses Guides sein.

Share

Leave a Comment