Auf dieser Seite
Gehosteter Checkout
Auf den gehosteten Checkout weiterleiten oder die Zahlungsseite als Iframe einbetten und Bestellungen erst nach dem signierten Bestätigungs-Webhook ausführen.
Nutzen Sie die von POST /v1/invoices zurückgegebene payment_url als kanonische Checkout-URL. Dieselbe URL unterstützt zwei Darstellungsarten — Weiterleitung auf die volle Seite und eingebettetes Iframe.
Beide Darstellungsarten gelten für jeden Kanal außer Telegram-Bot. Dort öffnet dieselbe payment_url den Paymos-Bot — eine gehostete Seite, die sich weiterleiten oder einbetten ließe, gibt es nicht.
Weiterleitung
Die Weiterleitung ist die einfachste Anbindung. Schicken Sie den Kunden auf die payment_url, nachdem Ihr Server die Rechnung erstellt hat:
<a href="https://checkout.paymos.io/invoice/inv_xxx">Rechnung bezahlen</a>
Der Kunde schließt die Zahlung auf der von Paymos gehosteten Seite ab. Ihr Server führt die Bestellung erst aus, nachdem er das signierte Webhook-Ereignis empfangen und geprüft hat.
Einbettung
Die Einbettung nutzt dieselbe payment_url mit ?embed=true. Verwenden Sie sie, wenn Ihr Server Rechnungen bereits erstellt und Sie nur die Oberfläche des gehosteten Checkouts in Ihrer eigenen Seite haben möchten:
<iframe
src="https://checkout.paymos.io/invoice/inv_xxx?embed=true"
title="Paymos checkout"
allow="clipboard-write"
sandbox="allow-scripts allow-same-origin allow-forms"
style="display:block;width:100%;max-width:460px;height:min(90vh,900px);border:0;"
></iframe>
Ereignisse der Einbettung
Das Checkout-Iframe sendet Transport-Ereignisse per postMessage an die übergeordnete Seite:
| Ereignis | Bedeutung |
|---|---|
paymos:succeeded |
Der Checkout hat paid oder paid_over erreicht. |
paymos:failed |
Der Checkout hat einen Endzustand mit Fehlschlag erreicht, etwa underpaid, expired oder cancelled. |
paymos:close |
Der Kunde hat im eingebetteten Checkout auf Schließen oder Zurück geklickt. |
Die übergeordnete Seite muss sowohl die Herkunft des Absenders als auch die Quelle des Iframes prüfen:
const iframe = document.querySelector('#paymos-checkout');
window.addEventListener('message', (event) => {
if (event.origin !== 'https://checkout.paymos.io') return;
if (event.source !== iframe.contentWindow) return;
if (!event.data || typeof event.data !== 'object') return;
switch (event.data.type) {
case 'paymos:succeeded':
console.log('Payment UI succeeded:', event.data.invoice_id);
break;
case 'paymos:failed':
console.warn('Payment UI failed:', event.data.reason);
break;
case 'paymos:close':
iframe.remove();
break;
}
});
Behandeln Sie diese Ereignisse als Hinweise für die Oberfläche, nicht als Zahlungsnachweis. Steuern Sie damit Ladeanzeigen, Weiterleitungen und Auswertung — aber liefern Sie niemals Ware aus, schreiben Sie kein Guthaben gut und markieren Sie keine Bestellung als bezahlt aufgrund eines postMessage. Ein postMessage lässt sich trivial fälschen: Jede Seite mit derselben Herkunft wie der Kunde kann ein falsches paymos:succeeded senden. Die Abrechnung bestätigt allein der signierte serverseitige Webhook — die einzige verlässliche Quelle für die Auslieferung.
Sicherheitsmodell
Die empfohlene Sandbox für das Iframe ist bewusst knapp gehalten:
- —
allow-scriptsist nötig für die Interaktivität des Checkouts, API-Aufrufe, Timer, Kopier-Buttons und Statusaktualisierungen in Echtzeit. - —
allow-same-originlässt den von Paymos gehosteten Checkout mit eigener Herkunft laufen statt in einer undurchsichtigen Sandbox-Herkunft. - —
allow-formserlaubt normale Formularinteraktionen im Checkout. - —
allow-top-navigationfehlt bewusst, damit das Iframe die Händlerseite nicht wegnavigieren kann. - —
allow-popupsfehlt, weil der Checkout keine zusätzlichen Browserfenster öffnen muss.
Wann stattdessen das Low-Code SDK
Nutzen Sie das Low-Code SDK, wenn Paymos Rechnungen aus einer Konfiguration im Browser erstellen, den Bezahl-Button darstellen, den Lebenszyklus des Overlays verwalten, Iframe-Nachrichten prüfen und paymos:*-CustomEvents für Sie auslösen soll.
Nutzen Sie die manuelle Iframe-Einbettung, wenn Ihr Backend die Rechnungserstellung bereits besitzt und Sie nur die Oberfläche des gehosteten Checkouts in Ihrer Seite platzieren möchten.