Hosted Checkout
Erstellen Sie eine Checkout-Session, leiten Sie den Kunden weiter und verifizieren Sie die Zahlung von Ihrem Server aus.
Leiten Sie den Kunden auf eine von Tapaya gehostete Zahlungsseite für Karten, Apple Pay und Google Pay weiter und verifizieren Sie das Ergebnis anschließend auf Ihrem Server. Ihre Seite verarbeitet nie Kartendaten, und Sie fügen Ihrem Shop keine Kartenfelder hinzu.
- 1. Your backend to Tapaya: Create session.
- 2. Tapaya to Your backend: Session ID and URL.
- 3. Your backend to Your frontend: Redirect to Checkout.
- 4. Your frontend to Tapaya: Open Checkout and pay.
- 5. Tapaya to Your frontend: Return to your shop.
- 6. Your backend to Tapaya: Retrieve session.
- 7. Tapaya to Your backend: Payment status.
- 8. Your backend to Your frontend: Show verified result.
Bevor Sie beginnen
Wählen Sie den Schlüssel, der dazu passt, wer Ihr Backend betreibt. Bewahren Sie jeden der beiden Schlüssel auf Ihrem Server auf; die serverseitigen Regeln listet die Checkout-Sicherheit auf.
Ein Shop
Verwenden Sie einen Checkout-Händlerschlüssel. Er bestimmt seinen Händler, und die Beispiele hier verwenden ihn.
Viele Händler
Verwenden Sie den Secret key der Organisation und senden Sie bei jeder Anfrage ein Händler-Token.
Gehen Sie dann unter Checkout in der Tapaya Platform wie folgt vor:
- Fügen Sie Ihren Händler hinzu und prüfen Sie, ob er Ready anzeigt. Siehe Checkout-Einstellungen.
- Registrieren Sie Ihren Shop als erlaubte Website mit Standard-URLs für Erfolg und Abbruch, und zwar für den gewählten Schlüssel. Die
Beispiele verwenden
https://shop.example.
Rückkehr-URLs richten sich nach dem Schlüssel
Sessions mit Händlerschlüssel verwenden die Rückkehr-URLs des Händlers. Sessions, die mit dem Secret key der Organisation erstellt werden, verwenden stattdessen die Rückkehrziele der Organisation. Die beiden werden nie kombiniert.
Eine Zahlung annehmen
Alle drei Optionen erstellen dieselben Checkout-Sessions mit denselben Zugangsdaten. Wählen Sie eine aus; jeder Schritt unten folgt Ihrer Wahl.
Server einrichten
Setzen Sie TAPAYA_CHECKOUT_API_URL auf https://api.sandbox.tapaya.com und speichern Sie Ihren Schlüssel in TAPAYA_CHECKOUT_API_KEY.
Rufen Sie die API mit dem fetch Ihrer Serverlaufzeit auf, niemals aus dem Browser des Kunden. Die Beispiele lesen diese Werte
über process.env; passen Sie diesen Zugriff an, wenn Ihre Laufzeitumgebung eine andere Schnittstelle für Secrets verwendet.
Erstellen Sie eine Hilfsfunktion, die HTTP-Fehler prüft, bevor sie den Body der Antwort zurückgibt:
const apiUrl = process.env.TAPAYA_CHECKOUT_API_URL;
const apiKey = process.env.TAPAYA_CHECKOUT_API_KEY;
async function checkoutRequest(path, options = {}) {
const response = await fetch(new URL(path, apiUrl), {
...options,
headers: {
...options.headers,
Authorization: `Bearer ${apiKey}`,
},
redirect: 'error',
cache: 'no-store',
signal: AbortSignal.timeout(8000),
});
if (!response.ok) {
throw new Error(`Checkout request failed (${response.status})`);
}
return response.json();
}Session erstellen
Berechnen Sie den Gesamtbetrag der Bestellung auf Ihrem Server, einschließlich Steuern und Versand. Speichern Sie die Bestellung und einen eindeutigen
checkoutAttemptKey, bevor Sie die Anfrage stellen, und laden Sie order aus diesem gespeicherten Snapshot. merchantOrderId
ist erforderlich.
const session = await checkoutRequest('/merchant/checkout-sessions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Idempotency-Key': order.checkoutAttemptKey,
},
body: JSON.stringify({
merchantOrderId: order.id,
amount: order.totalInMinorUnits,
currency: order.currency,
successUrl: 'https://shop.example/checkout/return',
cancelUrl: 'https://shop.example/checkout/cancel',
}),
});Die Antwort enthält die id der Session und die gehostete url. Positionsübersichten, Steueraufschlüsselungen, Kundendaten
und alle Felder der Antwort beschreibt Checkout-Session erstellen.
Wenn die Anfrage fehlschlägt oder in ein Timeout läuft, wiederholen Sie sie mit demselben Schlüssel und unverändertem Body. Erzeugen Sie für ein unsicheres Ergebnis nie einen neuen Schlüssel: Ein geänderter Body mit demselben Schlüssel gibt HTTP 409 zurück.
| Option | Automatische Wiederholung |
|---|---|
| HTTP (fetch), cURL | Nein. Wiederholen Sie die Anfrage selbst. Siehe Idempotenz und Fehler. |
| Node.js SDK | Bis zu zweimal nach einem Verbindungsfehler, einem Timeout oder HTTP 429, 502, 503 oder 504, mit demselben Schlüssel und Body. Siehe Idempotenz und Wiederholungsversuche. Übergeben Sie über getrennte Aufrufe oder Neustarts hinweg Ihren gespeicherten Schlüssel: Wenn Sie ihn weglassen, wird pro Aufruf ein neuer erzeugt. |
Kunden weiterleiten
Speichern Sie session.id mit Ihrer Bestellung als deren checkoutSessionId und leiten Sie den Browser dann mit HTTP
303 auf session.url weiter. Verwenden Sie die URL unverändert, statt sie selbst zusammenzusetzen.
// First persist session.id as the order's checkoutSessionId.
return Response.redirect(session.url, 303);Wenn Ihr Framework eine andere API für Antworten verwendet, senden Sie HTTP 303 mit session.url im Header Location. Öffnen Sie bei
cURL die zurückgegebene url in Ihrem Browser, um die Zahlung von Hand zu testen.
Zahlung verifizieren
Ermitteln Sie in Ihrem Rückkehr-Handler die Bestellung aus dem authentifizierten Checkout-Kontext Ihrer Anwendung und rufen Sie ihre gespeicherte Session von Ihrem Server ab. Tun Sie dies auch bei der Abbruch-URL: Ein Aufruf einer der beiden URLs beweist nichts.
const current = await checkoutRequest(
`/merchant/checkout-sessions/${encodeURIComponent(order.checkoutSessionId)}`,
);
if (
current.id !== order.checkoutSessionId ||
current.merchantOrderId !== order.id ||
current.amount !== order.totalInMinorUnits ||
current.currency !== order.currency
) {
throw new Error('Checkout session does not match the order');
}
const paid = current.paymentStatus === 'successful';Nur einmal abwickeln und nur, wenn bezahlt
Verbuchen Sie die Zahlung und wickeln Sie die Bestellung nur ab, wenn die Session mit Ihrer gespeicherten Bestellung übereinstimmt und paymentStatus
successful ist, und halten Sie dies atomar fest, damit es genau einmal geschieht. Wenn der Abruf fehlschlägt oder die Zahlung ungeklärt ist, behalten Sie
die Session-ID und prüfen Sie erneut. Siehe Zahlungsstatus.
Zahlungsergebnisse behandeln
Die Checkout-Sicherheit beschreibt, was Sie verifizieren sollten und wie Sie ein unbekanntes Ergebnis wiederholen, ohne eine zweite Session zu erstellen.
| Ergebnis | Was die Session zeigt | Was zu tun ist |
|---|---|---|
| Abgelehnt | open, mit paymentStatus: failed | Nichts. Der Kunde kann auf derselben Seite eine andere Karte oder Wallet versuchen. |
| Noch unbekannt | open und unpaid, während Tapaya das Ergebnis bestätigt | Rufen Sie die Session später erneut ab. |
| Neue Session für dieselbe Bestellung | Die vorherige unbezahlte Session meldet expired | Verwenden Sie die neue Session. Eine bezahlte Bestellung oder eine Bestellung mit laufender Zahlung gibt HTTP 409 zurück. Siehe Eine Zahlung pro Bestellung. |
| Abgelaufen | Nimmt 30 Minuten nach der Erstellung keine neuen Zahlungen mehr an | Erstellen Sie eine neue Session, wenn die Bestellung noch unbezahlt ist. Eine vor dem Ablauf abgesendete Zahlung wird trotzdem abgeschlossen. |
Noch keine Webhooks
Es gibt noch keine Checkout-Webhooks. Betreiben Sie einen serverseitigen Abgleichsjob, der die Sessions von Bestellungen abruft, deren Kunden nie zurückkehren.
Integration prüfen
Testkarten
Spielen Sie jedes Zahlungsergebnis in der Sandbox durch.
QA-Checkliste
Decken Sie Wiederholungsversuche, unterbrochene Checkouts und den Ablauf ab, bevor Sie live gehen.