@dodopayments/nextjs stellt deinem Next.js-App-Router-Projekt drei Route-Handler bereit. Checkout gibt Checkout-URLs zurück, CustomerPortal leitet Kunden zum Customer Portal weiter und Webhooks verifiziert Webhook-Ereignisse und leitet sie an deinen Code weiter. Das Paket unterstützt Next.js 14, 15 und 16.
Checkout Handler
Erstelle Checkout-URLs mit statischen, dynamischen und Checkout-Session-Abläufen.
Customer Portal
Ermögliche Kunden, ihre Abonnements und Daten zu verwalten.
Webhooks
Empfange und verarbeite Dodo Payments Webhook-Ereignisse.
Installation
1
Install the Package
Führe diesen Befehl im Stammverzeichnis deines Projekts aus:Das Paket benötigt außerdem Zod 3.25 oder Zod 4 als Peer-Dependency.
2
Set Up Environment Variables
Erstelle im Stammverzeichnis deines Projekts eine Datei
.env. Erstelle den API-Key unter Developer → API Keys und das Webhook-Secret unter Developer → Webhooks im Dashboard:DODO_PAYMENTS_RETURN_URL ist das Ziel, zu dem Kunden nach dem Checkout gelangen. Wenn du keine Umgebung übergibst, verwenden die Handler live_mode.Beispiele für Route-Handler
Alle Beispiele setzen voraus, dass du den Next.js App Router verwendest.
- Checkout Handler
- Customer Portal Handler
- Webhook Handler
Verwende diesen Handler, um Dodo Payments Checkout zu deiner App hinzuzufügen. Ein
GET-Handler stellt statischen Checkout bereit. Ein POST-Handler stellt Checkout-Sessions bereit oder dynamischen Checkout, wenn du type: "dynamic" setzt.Checkout-Route-Handler
Der Checkout-Handler unterstützt alle drei Möglichkeiten, Zahlungen mit Dodo Payments entgegenzunehmen:- Statische Payment Links: Teilbare URLs, die Zahlungen ohne Code erfassen.
- Dynamische Payment Links: Payment Links, die du mit benutzerdefinierten Daten erzeugst. Sie verwenden veraltete Endpoints.
- Checkout-Sessions: Gehosteter Checkout mit einem Produkt-Warenkorb, Kundendaten und Anpassungsoptionen. Dies ist der empfohlene Ablauf.
Static Checkout (GET)
Static Checkout (GET)
Unterstützte Query-Parameter
string
erforderlich
Produktkennung, zum Beispiel
?productId=pdt_123.integer
Standard:"1"
Menge des Produkts.
string
Vollständiger Name des Kunden. Wird ignoriert, wenn
firstName oder lastName angegeben ist.string
Vorname des Kunden.
string
Nachname des Kunden.
string
E-Mail-Adresse des Kunden.
string
Land des Kunden als ISO-3166-1-Alpha-2-Code.
string
Adresszeile des Kunden.
string
Ort des Kunden.
string
Bundesland oder Provinz des Kunden.
string
ZIP-Code oder Postleitzahl des Kunden.
boolean
Auf
true setzen, um das Feld für den vollständigen Namen zu deaktivieren.boolean
Auf
true setzen, um das Vornamenfeld zu deaktivieren.boolean
Auf
true setzen, um das Nachnamenfeld zu deaktivieren.boolean
Auf
true setzen, um das E-Mail-Feld zu deaktivieren.boolean
Auf
true setzen, um das Länderfeld zu deaktivieren.boolean
Auf
true setzen, um das Adresszeilenfeld zu deaktivieren.boolean
Auf
true setzen, um das Ortsfeld zu deaktivieren.boolean
Auf
true setzen, um das Bundeslandfeld zu deaktivieren.boolean
Auf
true setzen, um das ZIP-Code-Feld zu deaktivieren.string
Zahlungswährung, zum Beispiel
USD.boolean
Standard:"true"
Währungsselektor ein- oder ausblenden.
number
Legt den berechneten Betrag in den Haupteinheiten der Währung fest, zum Beispiel
12.5 für $12.50. Funktioniert nur mit Pay What You Want-Produkten und wird ignoriert, wenn der Betrag unter dem Mindestpreis des Produkts liegt.boolean
Standard:"true"
Rabattbereich ein- oder ausblenden.
string
Jeder Query-Parameter, der mit
metadata_ beginnt, wird als Metadaten übergeben.returnUrl aus seiner Konfiguration als redirect_url zum Link hinzu.Antwortformat
Statischer Checkout gibt eine JSON-Antwort mit der Checkout-URL zurück. Im Testmodus verwendet die URLtest.checkout.dodopayments.com.Dynamic Checkout (POST)
Dynamic Checkout (POST)
- Sende die Parameter als JSON-Body in einer POST-Anfrage.
- Unterstützt sowohl einmalige als auch wiederkehrende Zahlungen.
billingundcustomersind erforderlich.- Eine Übersicht aller unterstützten Body-Felder findest du unter:
Antwortformat
Dynamischer Checkout gibt eine JSON-Antwort mit der Checkout-URL zurück:Checkout Sessions (POST)
Checkout Sessions (POST)
Checkout-Sessions erstellen einen gehosteten Checkout für einmalige Käufe und Abonnements mit vollständiger Kontrolle über die Anpassung.
product_cart ist das einzige erforderliche Feld. Wenn der Body kein return_url enthält, verwendet der Handler returnUrl aus seiner Konfiguration.Weitere Informationen und eine Übersicht aller unterstützten Felder findest du im Checkout Sessions Integration Guide.Eine mit payment_method_id erstellte Session gibt keine Checkout-URL zurück, daher antwortet der Handler mit 400. Um eine gespeicherte Zahlungsmethode zu belasten, erstelle die Session stattdessen mit dem SDK.Antwortformat
Checkout-Sessions geben eine JSON-Antwort mit der Checkout-URL zurück:Customer-Portal-Route-Handler
Der Customer-Portal-Route-Handler erstellt eine Customer-Portal-Session für den von dir übergebenen Kunden und leitet den Browser dorthin weiter.Query-Parameter
string
erforderlich
Die Kunden-ID für die Portal-Session, zum Beispiel
?customer_id=cus_123.boolean
Wenn auf
true gesetzt, sendet Dodo Payments dem Kunden zusätzlich den Portal-Link per E-Mail.customer_id fehlt, und 500, wenn die Portal-Session nicht erstellt werden kann.
Webhook-Route-Handler
Der Webhook-Route-Handler verifiziert jede Anfrage, bevor er deinen Code ausführt:- Methode: Es werden nur POST-Anfragen unterstützt. Andere Methoden geben 405 zurück.
- Signaturverifizierung: Verifiziert den rohen Anfrage-Body anhand der Header
webhook-id,webhook-timestampundwebhook-signaturemitwebhookKey. Gibt 401 zurück, wenn die Verifizierung fehlschlägt. - Payload-Validierung: Parst den verifizierten Body als JSON und validiert ihn mit Zod. Gibt 400 zurück, wenn ein geparster Payload nicht dem Webhook-Schema entspricht.
- Fehlerbehandlung:
- 401: Ungültige Signatur
- 400: Ungültiger Payload
- 500: Unerwartete Verifizierungsfehler, fehlerhaftes JSON oder von deinen Callbacks ausgelöste Fehler
- Ereignis-Routing: Ruft für jedes Ereignis
onPayloadund anschließend den Handler für den Ereignistyp auf und gibt 200 zurück.