Zum Hauptinhalt springen

Voraussetzungen

Um die Dodo Payments API zu integrieren, benötigen Sie:
  • Ein Dodo Payments Händlerkonto
  • API-Anmeldeinformationen (API-Schlüssel und Webhook-Geheimschlüssel) aus dem Dashboard
Für eine detailliertere Anleitung zu den Voraussetzungen, überprüfen Sie diesen Abschnitt.

API-Integration

Checkout-Sitzungen

Verwende Checkout Sessions, um Abonnementprodukte über einen sicheren, gehosteten Checkout zu verkaufen. Übergebe dein Abonnementprodukt in product_cart und leite Kunden zu dem zurückgegebenen checkout_url weiter.
Mixed Checkout: Du kannst Abonnementprodukte mit Einmalprodukten in derselben Checkout-Session kombinieren. Das ermöglicht Anwendungsfälle wie Einrichtungsgebühren mit Abonnements, Hardware-Bundles mit SaaS und mehr. Siehe den Checkout Sessions guide für Beispiele.
import DodoPayments from 'dodopayments';

const client = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode', // defaults to 'live_mode'
});

async function main() {
  const session = await client.checkoutSessions.create({
    product_cart: [
      { product_id: 'prod_subscription_monthly', quantity: 1 }
    ],
    // Optional: configure trials for subscription products
    subscription_data: { trial_period_days: 14 },
    customer: {
      email: 'subscriber@example.com',
      name: 'Jane Doe',
    },
    return_url: 'https://example.com/success',
  });

  console.log(session.checkout_url);
}

main();

API-Antwort

Die folgende ist ein Beispiel für die Antwort:
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
Leite den Kunden zu checkout_url weiter.

Webhooks

Bei der Integration von Abonnements erhalten Sie Webhooks, um den Lebenszyklus des Abonnements zu verfolgen. Diese Webhooks helfen Ihnen, Abonnementzustände und Zahlungsszenarien effektiv zu verwalten. Um Ihren Webhook-Endpunkt einzurichten, folgen Sie bitte unserem Detaillierten Integrationshandbuch.

Abonnement-Ereignistypen

Die folgenden Webhook-Ereignisse verfolgen Änderungen des Abonnementstatus:
  1. subscription.active - Das Abonnement wird erfolgreich aktiviert.
  2. subscription.updated - Das Abonnementobjekt wurde aktualisiert (tritt bei jeder Feldänderung auf).
  3. subscription.on_hold - Das Abonnement wird aufgrund eines fehlgeschlagenen Verlängerungsversuchs pausiert.
  4. subscription.failed - Die Erstellung des Abonnements schlug während der Mandatserstellung fehl.
  5. subscription.renewed - Das Abonnement wird für den nächsten Abrechnungszeitraum verlängert.
Für eine zuverlässige Verwaltung des Lebenszyklus von Abonnements empfehlen wir, diese Abonnementereignisse zu verfolgen.
Verwende subscription.updated, um Echtzeitbenachrichtigungen über Änderungen an Abonnements zu erhalten und deinen Anwendungszustand synchron zu halten, ohne die API abzufragen.

Zahlungsszenarien

Erfolgreicher Zahlungsfluss Wenn eine Zahlung erfolgreich ist, erhalten Sie die folgenden Webhooks:
  1. subscription.active - Zeigt die Aktivierung des Abonnements an
  2. payment.succeeded - Bestätigt die Erstzahlung:
    • Bei sofortiger Abrechnung (0 Tage Testzeitraum): Erwartet innerhalb von 2–10 Minuten
    • Bei Testzeitraum: Sobald dieser endet
  3. subscription.renewed - Zeigt die Abbuchung und Verlängerung für den nächsten Zyklus an. (Grundsätzlich erhältst du jedes Mal, wenn eine Zahlung für Abonnementprodukte abgebucht wird, subscription.renewed Webhook zusammen mit payment.succeeded)
Zahlungsausfallszenarien
  1. Abonnementfehler
  • subscription.failed - Die Erstellung des Abonnements schlug fehl, weil das Mandat nicht erstellt werden konnte.
  • payment.failed - Zeigt eine fehlgeschlagene Zahlung an.
  1. Abonnement pausiert
  • subscription.on_hold - Das Abonnement wird aufgrund einer fehlgeschlagenen Verlängerungszahlung oder einer fehlgeschlagenen Planänderungsabbuchung pausiert.
  • Wenn ein Abonnement pausiert ist, erneuert es sich nicht automatisch, bis die Zahlungsmethode aktualisiert wurde.
Best Practice: Um die Implementierung zu vereinfachen, empfehlen wir, hauptsächlich Abonnementereignisse zur Verwaltung des Abonnementlebenszyklus zu verfolgen.

Umgang mit Abonnements auf Hold

Wenn ein Abonnement den Zustand on_hold erreicht, musst du die Zahlungsmethode aktualisieren, um es wieder zu aktivieren. Dieser Abschnitt erklärt, wann Abonnements pausieren und wie du damit umgehst.

Wann Abonnements auf Hold gehen

Ein Abonnement wird auf Hold gesetzt, wenn:
  • Erneuerungszahlung schlägt fehl: Die automatische Erneuerungsgebühr schlägt aufgrund unzureichender Mittel, abgelaufener Karte oder Bankablehnung fehl
  • Planänderungsgebühr schlägt fehl: Eine sofortige Gebühr während des Upgrades/Downgrades des Plans schlägt fehl
  • Zahlungsmethodenautorisierung schlägt fehl: Die Zahlungsmethode kann für wiederkehrende Gebühren nicht autorisiert werden
Abonnements im Zustand on_hold erneuern sich nicht automatisch. Du musst die Zahlungsmethode aktualisieren, um das Abonnement wieder zu aktivieren.

Reaktivierung von Abonnements aus dem Hold-Zustand

Um ein Abonnement aus dem Zustand on_hold wieder zu aktivieren, verwende die Update Payment Method API. Diese führt automatisch Folgendes aus:
  1. Erstellt eine Belastung für ausstehende Beträge
  2. Generiert eine Rechnung für die Belastung
  3. Verarbeitet die Zahlung mit der neuen Zahlungsmethode
  4. Reaktiviert das Abonnement in den Zustand active bei erfolgreicher Zahlung
1

Handle subscription.on_hold webhook

Wenn du einen subscription.on_hold Webhook erhältst, aktualisiere den Anwendungszustand und benachrichtige den Kunden:
// Webhook handler
app.post('/webhooks/dodo', async (req, res) => {
  const event = req.body;
  
  if (event.type === 'subscription.on_hold') {
    const subscription = event.data;
    
    // Update subscription status in your database
    await updateSubscriptionStatus(subscription.subscription_id, 'on_hold');
    
    // Notify customer to update payment method
    await sendEmailToCustomer(subscription.customer_id, {
      subject: 'Payment Required - Subscription On Hold',
      message: 'Your subscription is on hold. Please update your payment method to continue service.'
    });
  }
  
  res.json({ received: true });
});
2

Update payment method

Wenn der Kunde bereit ist, seine Zahlungsmethode zu aktualisieren, rufe die Update Payment Method API auf:
// Update with new payment method
const response = await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'new',
  return_url: 'https://example.com/return'
});

// For on_hold subscriptions, a charge is automatically created
if (response.payment_id) {
  console.log('Charge created for remaining dues:', response.payment_id);
  // Redirect customer to response.payment_link to complete payment
}
Du kannst auch eine vorhandene Zahlungsarten-ID verwenden, wenn der Kunde Zahlungsarten gespeichert hat:
await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'existing',
  payment_method_id: 'pm_abc123'
});
3

Monitor webhook events

Nachdem du die Zahlungsmethode aktualisiert hast, überwache diese Webhook-Ereignisse:
  1. payment.succeeded - Die Belastung der ausstehenden Beträge war erfolgreich
  2. subscription.active - Das Abonnement wurde reaktiviert
if (event.type === 'payment.succeeded') {
  const payment = event.data;
  
  // Check if this payment is for an on_hold subscription
  if (payment.subscription_id) {
    // Wait for subscription.active webhook to confirm reactivation
  }
}

if (event.type === 'subscription.active') {
  const subscription = event.data;
  
  // Update subscription status in your database
  await updateSubscriptionStatus(subscription.subscription_id, 'active');
  
  // Restore customer access
  await restoreCustomerAccess(subscription.customer_id);
  
  // Notify customer of successful reactivation
  await sendEmailToCustomer(subscription.customer_id, {
    subject: 'Subscription Reactivated',
    message: 'Your subscription has been reactivated successfully.'
  });
}

Beispiel für das Abonnementereignis-Payload


EigenschaftTypErforderlichBeschreibung
business_idstringJaDie eindeutige Kennung des Unternehmens
timestampstringJaDer Zeitstempel, wann das Ereignis stattfand (nicht unbedingt identisch mit dem Lieferzeitpunkt)
typestringJaDie Art des Ereignisses. Siehe Event Types
dataobjectJaDie Hauptdaten. Siehe Data Object

Ändern von Abonnementplänen

Sie können einen Abonnementplan über den API-Endpunkt zum Ändern des Plans upgraden oder downgraden. Dies ermöglicht es Ihnen, das Produkt des Abonnements, die Menge zu ändern und die Proratisierung zu handhaben.

Change Plan API Reference

Für detaillierte Informationen zur Änderung von Abonnementplänen konsultiere bitte unsere Change Plan API-Dokumentation.

Proratisierungsoptionen

Beim Ändern von Abonnementplänen haben Sie zwei Optionen zur Handhabung der sofortigen Gebühr:

1. prorated_immediately

  • Berechnet den anteiligen Betrag basierend auf der verbleibenden Zeit im aktuellen Abrechnungszeitraum
  • Belastet den Kunden nur für die Differenz zwischen dem alten und neuen Plan
  • Während einer Testphase wird der Nutzer sofort auf den neuen Plan umgestellt, und der Kunde wird sofort belastet

2. full_immediately

  • Belastet den Kunden mit dem vollen Abonnementbetrag für den neuen Plan
  • Ignoriert verbleibende Zeit oder Guthaben aus dem vorherigen Plan
  • Nützlich, wenn du den Abrechnungszeitraum zurücksetzen oder den vollen Betrag unabhängig von der Pro-Rata-Berechnung berechnen möchtest

3. difference_immediately

  • Beim Upgrade wird der Kunde sofort mit der Differenz zwischen den beiden Planbeträgen belastet.
  • Wenn der aktuelle Plan beispielsweise 30 Dollar kostet und der Kunde auf einen 80-Dollar-Plan upgradet, werden ihm sofort 50 Dollar belastet.
  • Beim Downgrade wird der ungenutzte Betrag aus dem aktuellen Plan als internes Guthaben hinzugefügt und automatisch bei zukünftigen Abonnementverlängerungen angerechnet.
  • Wenn der aktuelle Plan zum Beispiel 50 Dollar kostet und der Kunde auf einen 20-Dollar-Plan wechselt, werden die verbleibenden 30 Dollar gutgeschrieben und für den nächsten Abrechnungszeitraum verwendet.

Verhalten

  • Wenn du diese API aufrufst, initiiert Dodo Payments sofort eine Belastung basierend auf deiner ausgewählten Pro-rata-Option
  • Wenn die Planänderung ein Downgrade ist und du prorated_immediately verwendest, werden die Guthaben automatisch berechnet und dem Guthabenkonto des Abonnements hinzugefügt. Diese Guthaben sind spezifisch für dieses Abonnement und werden nur zur Verrechnung zukünftiger wiederkehrender Zahlungen desselben Abonnements verwendet
  • Die Option full_immediately umgeht die Guthabenberechnung und belastet den gesamten neuen Planbetrag
Wähle deine Pro-rata-Option sorgfältig: Verwende prorated_immediately für faire Abrechnung, die ungenutzte Zeit berücksichtigt, oder full_immediately, wenn du den vollständigen neuen Planbetrag unabhängig vom aktuellen Abrechnungszeitraum berechnen möchtest.

Gebührenverarbeitung

  • Die sofortige Gebühr, die bei der Planänderung initiiert wird, wird normalerweise in weniger als 2 Minuten verarbeitet
  • Wenn diese sofortige Gebühr aus irgendeinem Grund fehlschlägt, wird das Abonnement automatisch auf Hold gesetzt, bis das Problem behoben ist

On-Demand-Abonnements

On-Demand-Abonnements ermöglichen es dir, Kunden flexibel zu belasten und nicht nur nach einem festen Zeitplan. Dieses Feature ist für alle Konten verfügbar.
Um ein On-Demand-Abonnement zu erstellen: Um ein On-Demand-Abonnement zu erstellen, verwende den POST /subscriptions API-Endpunkt und füge das Feld on_demand in deinem Request-Body hinzu. Dadurch kannst du eine Zahlungsmethode autorisieren, ohne sofort zu belasten, oder einen benutzerdefinierten Einstiegspreis festlegen. Um ein On-Demand-Abonnement zu belasten: Für nachfolgende Gebühren verwenden Sie den POST /subscriptions/charge Endpunkt und geben Sie den Betrag an, den der Kunde für diese Transaktion belastet werden soll.
Für einen vollständigen, schrittweisen Leitfaden—including Request/Response-Beispiele, sichere Retry-Strategien und Webhook-Handling—siehe den On-Demand Subscriptions Guide.