S7
zurück
30.10.2019
Thema: APIsTYPO3

Die Bezahlschnittstelle von Wirecard

Dies ist ein Tutorial zur Integration von Kreditkartenzahlung auf einer Website mithilfe der Bezahlschnittstelle von Wirecard.

Zunächst einmal brauchen wir für den Testmodus zwei von Wirecard zur Verfügung gestellte Testdaten. Einen für eine Kreditkarte, die mit 3D Secure geschützt ist und einen, für eine Kreditkarte, die dies nicht ist.

Diese sind für eine Kreditkarte, die 3D Secure ist:

Kreditkarte: Visa
Kartennummer: 4012000300001003
Gültig bis: 01/2023
CVV: 003

und für eine Kreditkarte ohne 3D Secure:

Kreditkarte: Visa
Kartennummer: 4012000100000007
Gültig bis: 01/2023
CVV: 007

Als nächstes brauchen wir die Daten, die uns ermöglichen, uns mit der Wirecard API zu verbinden.
Für den Testmodus sind dies:

$config = [
  'baseUrl' => 'https://api-test.wirecard.com/engine/rest/payments/',
  'httpUser' => '70000-APILUHN-CARD',
  'httpPass' => '8mhwavKVb91T',
  'merchantAccountId' => 'cad16b4a-abf2-450d-bcb8-1725a4cef443',
  'authenticationBearer' => 'Authorization: Basic NzAwMDAtQVBJTFVITi1DQVJEOjhtaHdhdktWYjkxVA==',
];

und für den Livemodus:

$config = [
  'baseUrl' => 'https://api.wirecard.com/engine/rest/payments/',
  'httpUser' => '[...]',
  'httpPass' => '[...]',
  'merchantAccountId' => '[...]',
  'authenticationBearer' => 'Authorization: Basic [...]',
];

Die Parameter httpUser, httpPass und merchantAccountId bekommt man mit dem Account bei Wirecard und der Bearer ist

base64_encode($config['httpUser'] . ':' . $config['httpPass'])

Check Enrollment Request

Der Bezahlvorgang beginnt mit einem Check Enrollment Request. Hier wird von Wirecard überprüft, ob die vom Kunden angegebene Kreditkarte mit 3D Secure geschützt ist. Dazu wird zunächst eine Request-Id benötigt. Dies ist eine 32-stellige Hexadezimalzahl, die man sich zufällig generieren kann.

Danach werden folgende Daten im XML-Format per Curl an die Wirecard-API gesendet (im Header muss der AuthenticationBearer mitgeschickt werden):

<?xml version="1.0"?>
<payment xmlns="http://www.elastic-payments.com/schema/payment">
  <merchant-account-id>[siehe oben]</merchant-account-id>
  <request-id>[siehe oben]</request-id>
  <locale>DE</locale>
  <transaction-type>check-enrollment</transaction-type>
  <three-d><version>2.1</version></three-d>
  <account-holder>
    <last-name>[kommt aus dem Formular, das der User ausfüllt]</last-name>
    <email>[kommt aus dem Formular, das der User ausfüllt]</email>
  </account-holder>
  <card>
    <account-number>[kommt aus dem Formular, das der User ausfüllt]</account-number>
    <expiration-month>[kommt aus dem Formular, das der User ausfüllt]</expiration-month>
    <expiration-year>[kommt aus dem Formular, das der User ausfüllt]</expiration-year>
    <card-type>[kommt aus dem Formular, das der User ausfüllt]</card-type>
    <card-security-code>[kommt aus dem Formular, das der User ausfüllt]</card-security-code>
  </card>
  <ip-address>127.0.0.1</ip-address>
  <payment-methods>
    <payment-method name="creditcard"/>
  </payment-methods>
  <descriptor>[Irgendeine Beschreibung der Transaktion]</descriptor>
  <requested-amount currency="EUR">[kommt aus dem Formular, das der User ausfüllt]</requested-amount>
</payment>

Wenn die Antwort einen HTTP Status Code 200 enthält, ist die Kreditkarte des Users 3D Secure, ansonsten nicht.
In der Antwort sind außerdem unter anderem enthalten:

  • Eine Transaktions-ID
  • Ein Parameter PaReq (wenn die Kreditkarte 3D Secure ist)
  • Die URL acs-url, um Daten an die Bank zu senden (wenn die Kreditkarte 3D Secure ist)

Als nächstes wird ein HTML-Formular automatisch per Javascript versendet. Entweder um Daten an die Bank zu senden (bei 3D Secure) oder auf die Unterseite der eigenen Website zu gelangen, auf der die Bezahlung stattfindet.

Bei 3D Secure:

<form name="downloadForm" action="[acs-url]" method="POST">
  <input type="hidden" name="PaReq" value="[PaReq]" />
  <input type="hidden" name="TermUrl" value="[termUrl]" />
  <input type="hidden" name="MD" value="[md]" />
  <script type="text/javascript">
    document.downloadForm.submit();
  </script>
  <input type="submit" name="continue" value="" />
</form>

Ohne 3D Secure:

<form name="downloadForm" action="[termUrl]" method="POST">
  <input type="hidden" name="MD" value="[md]" />
  <input type="hidden" name="3dsecure" value="false" />
  <script type="text/javascript">
    document.downloadForm.submit();
  </script>
  <input type="submit" name="continue" value="" />
</form>

Dabei ist [termUrl] die URL der Webseite, auf der die Bezahlung stattfindet. In der Variable MD können Informationen mitgenommen werden, die später gebraucht werden. Ich gebe damit die Transaktions-ID weiter.

Alles folgende findet auf der für termUrl eingetragenen Seite statt.

Check Payer Response

Wenn die Kreditkarte 3D Secure ist, muss überprüft werden, dass der User die Transaktion verifiziert hat.
Dazu werden folgende Daten via Curl an die Wirecard-API geschickt:

<?xml version="1.0"?>
<payment xmlns="http://www.elastic-payments.com/schema/payment">
  <transaction-type>check-payer-response</transaction-type>
  <request-id>[erneut eine zufällig generierte Request-ID]</request-id>
  <parent-transaction-id>[Transaktions-ID]</parent-transaction-id>
  <three-d><pares>[PaRes]</pares></three-d>
</payment>

Die Parameter PaRes und Transaktions-ID erhält man als POST-Parameter.

Abschließender Bezahlvorgang

Im letzten Schritt werden im abschließenden Bezahlvorgang folgende Daten per Curl an die Wirecard-API geschickt:

<?xml version="1.0"?>
<payment xmlns="http://www.elastic-payments.com/schema/payment">
  <transaction-type>purchase</transaction-type>
  <request-id>[erneut eine zufällig generierte Request-ID]</request-id>
  <parent-transaction-id>
    [Die als letztes zurückerhaltene Transaktions-ID, abhängig davon, ob die Kreditkarte 3D Secure ist]
  </parent-transaction-id>
  <three-d><pares>[PaRes]</pares></three-d>
</payment>

Wenn dieser Request den HTTP-Status 200 zurückgibt, war die Transaktion erfolgreich.