Lebensdauer einer Zahlungstransaktion

Hier erfahren Sie, wie Händler Zahlungs-Apps einbinden und wie Zahlungstransaktionen mit der Payment Request API funktionieren.

Web Payments APIs sind spezielle Zahlungsfunktionen, die erstmals in den Browser integriert sind. Mit Web Payments wird die Einbindung von Händlern in Zahlungs-Apps einfacher, während die Nutzerfreundlichkeit optimiert und sicherer wird.

Weitere Informationen zu den Vorteilen von Webzahlungen finden Sie im Hilfeartikel Zahlungs-Apps mit Webzahlungen optimieren.

In diesem Artikel wird eine Zahlungstransaktion auf einer Händlerwebsite veranschaulicht und die Funktionsweise der Integration von Zahlungs-Apps erläutert.

Der Prozess umfasst sechs Schritte:

  1. Der Händler veranlasst eine Zahlungstransaktion.
  2. Der Händler zeigt eine Zahlungsschaltfläche an.
  3. Der Kunde drückt auf die Zahlungsschaltfläche.

    Ein Diagramm der Website eines Käsegeschäfts mit der Schaltfläche „BobPay“ (Zahlungs-App)

  4. Der Browser startet die Zahlungs-App.

    Ein Diagramm der Website der Käsehandlung mit der BobPay-App, die in einem Modalfenster geöffnet wird. Im modalen Dialogfeld werden die Versandoptionen und die Gesamtkosten angezeigt.

  5. Wenn der Kunde Details ändert (z. B. Versandoptionen oder seine Adresse), aktualisiert der Händler die Transaktionsdetails entsprechend.

    Ein Diagramm, in dem der Kunde im Modal der BobPay App eine andere Versandoption auswählt. Ein zweites Diagramm, das zeigt, wie der Händler die in BobPay angezeigten Gesamtkosten aktualisiert.

  6. Nachdem der Kunde den Kauf bestätigt hat, validiert der Händler die Zahlung und schließt die Transaktion ab.

    Ein Diagramm, in dem der Kunde die

Schritt 1: Der Händler initiiert eine Zahlungstransaktion

Wenn ein Kunde einen Kauf abschließt, initiiert der Händler die Zahlungstransaktion, indem er ein PaymentRequest-Objekt erstellt. Dieses Objekt enthält wichtige Informationen zur Transaktion:

  • Zulässige Zahlungsmethoden und die zugehörigen Daten zur Verarbeitung der Transaktion.
  • Details wie der Gesamtpreis (erforderlich) und Informationen zu den Artikeln.
  • Optionen, mit denen Händler Versandinformationen wie eine Versandadresse und eine Versandoption anfordern können.
  • Händler können auch die Rechnungsadresse, den Namen, die E-Mail-Adresse und die Telefonnummer des Zahlungspflichtigen anfordern.
  • Händler können auch einen optionalen Versandtyp (shipping, delivery oder pickup) in die PaymentRequest aufnehmen. Die Zahlungs-App kann dies als Hinweis verwenden, um die richtigen Labels in der Benutzeroberfläche anzuzeigen.
const request = new PaymentRequest([{
  supportedMethods: 'https://bobpay.xyz/pay',
  data: {
    transactionId: '****'
  }
}], {
  displayItems: [{
    label: 'Anvil L/S Crew Neck - Grey M x1',
    amount: { currency: 'USD', value: '22.15' }
  }],
  total: {
    label: 'Total due',
    amount: { currency: 'USD', value : '22.15' }
  }
}, {
  requestShipping: true,
  requestBillingAddress: true,
  requestPayerEmail: true,
  requestPayerPhone: true,
  requestPayerName: true,
  shippingType: 'delivery'
});

Bei einigen Zahlungs-Handlern muss der Händler die Transaktions-ID angeben, die er im Voraus als Teil der Transaktionsinformationen ausgegeben hat. Eine typische Integration umfasst die Kommunikation zwischen dem Server des Händlers und dem des Zahlungsabwicklers, um den Gesamtpreis zu reservieren. So wird verhindert, dass böswillige Kunden den Preis manipulieren und den Händler am Ende der Transaktion mit einer Validierung betrügen.

Der Händler kann eine Transaktions-ID als Teil der data-Eigenschaft des PaymentMethodData-Objekts übergeben.

Wenn die Transaktionsinformationen vorliegen, führt der Browser anhand der Zahlungsmethoden-IDs einen Discovery-Prozess für die in der PaymentRequest angegebenen Zahlungs-Apps durch. Auf diese Weise kann der Browser die Zahlungs-App bestimmen, die gestartet werden soll, sobald der Händler bereit ist, mit der Transaktion fortzufahren.

Ausführliche Informationen zur Funktionsweise des Erkennungsprozesses findest du unter Zahlungsmethode einrichten.

Schritt 2: Der Händler zeigt eine Zahlungsschaltfläche an

Händler können viele Zahlungsmethoden unterstützen, sollten aber nur die Zahlungsschaltflächen für diejenigen anzeigen, die ein Kunde tatsächlich verwenden kann. Eine unbrauchbare Zahlungsschaltfläche ist eine schlechte User Experience. Wenn ein Händler voraussehen kann, dass eine im PaymentRequest-Objekt angegebene Zahlungsmethode für den Kunden nicht funktioniert, kann er eine Fallback-Lösung anbieten oder diese Schaltfläche gar nicht anzeigen.

Mit einer PaymentRequest-Instanz kann ein Händler abfragen, ob ein Kunde die Zahlungs-App hat.

Ist die Zahlungs-App für den Kunden verfügbar?

Die Methode canMakePayment() von PaymentRequest gibt true zurück, wenn auf dem Gerät des Kunden eine Zahlungs-App verfügbar ist. „Verfügbar“ bedeutet, dass eine Zahlungs-App gefunden wurde, die die Zahlungsmethode unterstützt, und dass die plattformspezifische Zahlungs-App installiert ist oder die webbasierte Zahlungs-App registriert werden kann.

const canMakePayment = await request.canMakePayment();
if (!canMakePayment) {
  // Fallback to other means of payment or hide the button.
}

Schritt 3: Der Kunde drückt die Schaltfläche „Bezahlen“

Wenn der Kunde auf die Zahlungsschaltfläche klickt, ruft der Händler die show()-Methode der PaymentRequest-Instanz auf, wodurch sofort die Zahlungsoberfläche gestartet wird.

Wenn der endgültige Gesamtpreis dynamisch festgelegt wird (z. B. von einem Server abgerufen), kann der Händler die Anzeige der Zahlungsoberfläche so lange verzögern, bis der Gesamtpreis bekannt ist.

Einführung der Zahlungsoberfläche verschieben

Demo der Benutzeroberfläche für die Zahlung aufschieben, bis der endgültige Gesamtpreis ermittelt wurde.

Um die Zahlungsoberfläche zu verschieben, gibt der Händler ein Versprechen an die show()-Methode weiter. Im Browser wird ein Ladeindikator angezeigt, bis das Promise aufgelöst wurde und die Transaktion gestartet werden kann.

const getTotalAmount = async () => {
  // Fetch the total amount from the server, etc.
};

try {
  const result = await request.show(getTotalAmount());
  // Process the result…
} catch(e) {
  handleError(e);
}

Wenn kein Versprechen als Argument für show() angegeben ist, startet der Browser sofort die Zahlungsoberfläche.

Schritt 4: Browser startet die Zahlungs-App

Der Browser kann eine plattformspezifische oder eine webbasierte Zahlungs-App starten. Weitere Informationen dazu, wie Chrome bestimmt, welche Zahlungs-App gestartet wird

Wie die Zahlungs-App aufgebaut wird, bleibt größtenteils dem Entwickler überlassen. Die vom und an den Händler ausgegebenen Ereignisse sowie die Struktur der mit diesen Ereignissen übergebenen Daten sind jedoch standardisiert.

Wenn die Zahlungs-App gestartet wird, erhält sie die Transaktionsinformationen, die in Schritt 1 an das PaymentRequest-Objekt übergeben wurden. Dazu gehören:

  • Daten zur Zahlungsmethode
  • Gesamtpreis
  • Zahlungsoptionen

Die Zahlungs-App verwendet die Transaktionsinformationen, um ihre Benutzeroberfläche zu beschriften.

Schritt 5: So kann ein Händler die Transaktionsdetails je nach Aktion des Kunden aktualisieren

Kunden haben die Möglichkeit, die Transaktionsdetails wie Zahlungsmethode und Versandoption in der Zahlungs-App zu ändern. Während der Kunde Änderungen vornimmt, erhält der Händler die Änderungsereignisse und aktualisiert die Transaktionsdetails.

Es gibt vier Arten von Ereignissen, die ein Händler empfangen kann:

  • Ereignis „Zahlungsmethode ändern“
  • Ereignis „Änderung der Versandadresse“
  • Ereignis „Versandoption ändern“
  • Ereignis „Händlerüberprüfung“

Ereignis „Zahlungsmethode ändern“

Eine Zahlungs-App kann mehrere Zahlungsmethoden unterstützen und ein Händler kann je nach Auswahl des Kunden einen speziellen Rabatt anbieten. Um diesen Anwendungsfall abzudecken, kann der Händler durch das Ereignis zur Änderung der Zahlungsmethode über die neue Zahlungsmethode informiert werden, damit er den Gesamtpreis mit dem Rabatt aktualisieren und ihn an die Zahlungs-App zurücksenden kann.

request.addEventListener('paymentmethodchange', e => {
  e.updateWith({
    // Add discount etc.
  });
});

Ereignis „Änderung der Versandadresse“

Eine Zahlungs-App kann optional die Versandadresse des Kunden angeben. Das ist praktisch für Kunden, da sie keine Details manuell in ein Formular eingeben müssen und ihre Versandadresse in ihren bevorzugten Zahlungs-Apps speichern können, anstatt auf mehreren verschiedenen Händlerwebsites.

Wenn ein Kunde seine Versandadresse in einer Zahlungs-App aktualisiert, nachdem die Transaktion initiiert wurde, wird ein 'shippingaddresschange'-Ereignis an den Händler gesendet. Anhand dieses Ereignisses kann der Händler die Versandkosten anhand der neuen Adresse ermitteln, den Gesamtpreis aktualisieren und an die Zahlungs-App zurückgeben.

request.addEventListener('shippingaddresschange', e => {
  e.updateWith({
    // Update the details
  });
});

Wenn der Händler nicht an die aktualisierte Adresse versenden kann, kann er eine Fehlermeldung senden, indem er den Transaktionsdetails, die an die Zahlungs-App zurückgegeben werden, einen Fehlerparameter hinzufügt.

Ereignis zur Änderung der Versandoption

Ein Händler kann dem Kunden mehrere Versandoptionen anbieten und diese Auswahl an die Zahlungs-App delegieren. Die Versandoptionen werden als Liste mit Preisen und Dienstnamen angezeigt, aus denen der Kunde auswählen kann. Beispiel:

  • Standardversand – kostenlos
  • Expressversand – 5 €

Wenn ein Kunde die Versandoption in einer Zahlungs-App aktualisiert, wird ein 'shippingoptionchange'-Ereignis an den Händler gesendet. Der Händler kann dann die Versandkosten festlegen, den Gesamtpreis aktualisieren und die Zahlung an die Zahlungs-App zurückgeben.

request.addEventListener('shippingoptionchange', e => {
  e.updateWith({
    // Update the details
  });
});

Der Händler kann die Versandoptionen auch dynamisch an die Versandadresse des Kunden anpassen. Das ist nützlich, wenn ein Händler unterschiedliche Versandoptionen für inländische und internationale Kunden anbieten möchte.

Ereignis „Händlerbestätigung“

Für zusätzliche Sicherheit kann eine Zahlungs-App eine Händlerbestätigung durchführen, bevor mit dem Zahlungsvorgang fortgefahren wird. Die Ausgestaltung des Validierungsmechanismus liegt in der Verantwortung der Zahlungs-App. Das Ereignis „Händlerüberprüfung“ dient jedoch dazu, den Händler über die URL zu informieren, über die er sich selbst bestätigen kann.

request.addEventListener('merchantvalidation', e => {
  e.updateWith({
    // Use `e.validateURL` to validate
  });
});

Schritt 6: Der Händler bestätigt die Zahlung und schließt die Transaktion ab

Wenn der Kunde die Zahlung autorisiert hat, gibt die show()-Methode ein Versprechen zurück, das zu einer PaymentResponse führt. Das PaymentResponse-Objekt enthält die folgenden Informationen:

  • Details zum Zahlungsergebnis
  • Versandadresse
  • Versandoption
  • Kontaktdaten

An diesem Punkt wird in der Browser-UI immer noch ein Ladeindikator angezeigt. Das bedeutet, dass die Transaktion noch nicht abgeschlossen ist.

Wenn die Zahlungs-App aufgrund eines Zahlungsfehlers oder -ausfalls beendet wird, wird das von show() zurückgegebene Promise abgelehnt und der Browser beendet die Zahlungstransaktion.

Zahlung wird verarbeitet und bestätigt

Die details in PaymentResponse ist das Objekt mit den Anmeldedaten für Zahlungen, das von der Zahlungs-App zurückgegeben wird. Der Händler kann die Anmeldedaten verwenden, um die Zahlung zu verarbeiten oder zu validieren. Wie dieser kritische Prozess funktioniert, bleibt dem Zahlungs-Handler überlassen.

Abschließen oder Wiederholen der Transaktion

Nachdem der Händler festgestellt hat, ob die Transaktion erfolgreich war oder fehlgeschlagen ist, hat er folgende Möglichkeiten:

  • Rufe die Methode .complete() auf, um die Transaktion abzuschließen und den Ladebalken zu schließen.
  • Bitte den Kunden, es noch einmal zu versuchen, indem er die Methode retry() aufruft.
async function doPaymentRequest() {
  try {
    const request = new PaymentRequest(methodData, details, options);
    const response = await request.show();
    await validateResponse(response);
  } catch (err) {
    // AbortError, SecurityError
    console.error(err);
  }
}

async function validateResponse(response) {
  try {
    const errors = await checkAllValuesAreGood(response);
    if (errors.length) {
      await response.retry(errors);
      return validateResponse(response);
    }
    await response.complete("success");
  } catch (err) {
    // Something went wrong…
    await response.complete("fail");
  }
}
// Must be called as a result of a click
// or some explicit user action.
doPaymentRequest();

Nächste Schritte