Passer au contenu principal

Prérequis

Pour intégrer l’API Dodo Payments, vous aurez besoin de :
  • Un compte marchand Dodo Payments
  • Des identifiants API (clé API et clé secrète de webhook) depuis le tableau de bord
Pour un guide plus détaillé sur les prérequis, consultez cette section.

Intégration API

Sessions de paiement

Utilisez les sessions de paiement pour vendre des produits d’abonnement avec un paiement sécurisé et hébergé. Passez votre produit d’abonnement dans product_cart et redirigez les clients vers le checkout_url retourné.
Vous ne pouvez pas mélanger des produits d’abonnement avec des produits à paiement unique dans la même session de paiement.
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: '[email protected]',
      name: 'Jane Doe',
    },
    return_url: 'https://example.com/success',
  });

  console.log(session.checkout_url);
}

main();

Réponse API

Voici un exemple de la réponse :
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
Redirigez le client vers checkout_url.

Webhooks

Lors de l’intégration des abonnements, vous recevrez des webhooks pour suivre le cycle de vie de l’abonnement. Ces webhooks vous aident à gérer efficacement les états d’abonnement et les scénarios de paiement. Pour configurer votre point de terminaison webhook, veuillez suivre notre Guide d’intégration détaillé.

Types d’événements d’abonnement

Les événements webhook suivants suivent les changements de statut d’abonnement :
  1. subscription.active - L’abonnement est activé avec succès.
  2. subscription.updated - L’objet d’abonnement a été mis à jour (se déclenche sur tout changement de champ).
  3. subscription.on_hold - L’abonnement est mis en attente en raison d’un renouvellement échoué.
  4. subscription.failed - La création de l’abonnement a échoué lors de la création du mandat.
  5. subscription.renewed - L’abonnement est renouvelé pour la prochaine période de facturation.
Pour une gestion fiable du cycle de vie des abonnements, nous recommandons de suivre ces événements d’abonnement.
Utilisez subscription.updated pour recevoir des notifications en temps réel sur tout changement d’abonnement, maintenant l’état de votre application synchronisé sans interroger l’API.

Scénarios de paiement

Flux de paiement réussi Lorsqu’un paiement réussit, vous recevrez les webhooks suivants :
  1. subscription.active - Indique l’activation de l’abonnement
  2. payment.succeeded - Confirme le paiement initial :
    • Pour une facturation immédiate (0 jours d’essai) : Attendez-vous à recevoir dans les 2 à 10 minutes
    • Pour les jours d’essai : dès que cela se termine
  3. subscription.renewed - Indique la déduction de paiement et le renouvellement pour le prochain cycle. (En gros, chaque fois qu’un paiement est déduit pour des produits d’abonnement, vous recevrez le webhook subscription.renewed avec payment.succeeded)
Scénarios d’échec de paiement
  1. Échec d’abonnement
  • subscription.failed - La création de l’abonnement a échoué en raison d’un échec de création d’un mandat.
  • payment.failed - Indique un paiement échoué.
  1. Abonnement en attente
  • subscription.on_hold - L’abonnement est mis en attente en raison d’un échec de paiement de renouvellement ou d’un échec de frais de changement de plan.
  • Lorsqu’un abonnement est mis en attente, il ne se renouvellera pas automatiquement tant que le mode de paiement n’est pas mis à jour.
Meilleure pratique : Pour simplifier l’implémentation, nous recommandons de suivre principalement les événements d’abonnement pour gérer le cycle de vie de l’abonnement.

Gestion des abonnements en attente

Lorsqu’un abonnement entre dans l’état on_hold, vous devez mettre à jour le mode de paiement pour le réactiver. Cette section explique quand les abonnements sont mis en attente et comment les gérer.

Quand les abonnements sont mis en attente

Un abonnement est mis en attente lorsque :
  • Le paiement de renouvellement échoue : Le prélèvement automatique échoue en raison de fonds insuffisants, d’une carte expirée ou d’un refus bancaire
  • Le frais de changement de plan échoue : Un prélèvement immédiat lors de la mise à niveau/diminution du plan échoue
  • L’autorisation du mode de paiement échoue : Le mode de paiement ne peut pas être autorisé pour des prélèvements récurrents
Les abonnements dans l’état on_hold ne se renouvelleront pas automatiquement. Vous devez mettre à jour le mode de paiement pour réactiver l’abonnement.

Réactivation des abonnements en attente

Pour réactiver un abonnement depuis l’état on_hold, utilisez l’API de mise à jour du mode de paiement. Cela fait automatiquement :
  1. Crée un prélèvement pour les montants dus restants
  2. Génère une facture pour le prélèvement
  3. Traite le paiement en utilisant le nouveau mode de paiement
  4. Réactive l’abonnement à l’état active après un paiement réussi
1

Gérer le webhook subscription.on_hold

Lorsque vous recevez un webhook subscription.on_hold, mettez à jour l’état de votre application et informez le client :
// 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

Mettre à jour le mode de paiement

Lorsque le client est prêt à mettre à jour son mode de paiement, appelez l’API de mise à jour du mode de paiement :
// 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
}
Vous pouvez également utiliser un ID de mode de paiement existant si le client a des modes de paiement enregistrés :
await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'existing',
  payment_method_id: 'pm_abc123'
});
3

Surveiller les événements webhook

Après avoir mis à jour le mode de paiement, surveillez ces événements webhook :
  1. payment.succeeded - Le prélèvement pour les montants dus restants a été réussi
  2. subscription.active - L’abonnement a été réactivé
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.'
  });
}

Exemple de charge utile d’événement d’abonnement


PropriétéTypeRequisDescription
business_idstringOuiL’identifiant unique pour l’entreprise
timestampstringOuiL’horodatage de l’événement (pas nécessairement le même que celui de la livraison)
typestringOuiLe type d’événement. Voir Types d’événements
dataobjectOuiLa charge utile principale des données. Voir Objet de données

Changer de plans d’abonnement

Vous pouvez mettre à niveau ou rétrograder un plan d’abonnement en utilisant le point de terminaison de l’API de changement de plan. Cela vous permet de modifier le produit de l’abonnement, la quantité et de gérer la proratisation.

Référence API Changer de plan

Pour des informations détaillées sur le changement de plans d’abonnement, veuillez consulter notre documentation sur l’API Changer de plan.

Options de proratisation

Lors du changement de plans d’abonnement, vous avez deux options pour gérer le prélèvement immédiat :

1. prorated_immediately

  • Calcule le montant proratisé en fonction du temps restant dans le cycle de facturation actuel
  • Prélève uniquement la différence entre l’ancien et le nouveau plan
  • Pendant une période d’essai, cela passera immédiatement l’utilisateur au nouveau plan, prélevant le client immédiatement

2. full_immediately

  • Prélève le montant total de l’abonnement pour le nouveau plan
  • Ignore tout temps restant ou crédits de l’ancien plan
  • Utile lorsque vous souhaitez réinitialiser le cycle de facturation ou prélever le montant total indépendamment de la proratisation

3. difference_immediately

  • Lors de la mise à niveau, le client est immédiatement prélevé de la différence entre les deux montants de plan.
  • Par exemple, si le plan actuel est de 30 Dollars et que le client passe à un plan de 80 Dollars, il est prélevé de 50 Dollars instantanément.
  • Lors de la rétrogradation, le montant non utilisé du plan actuel est ajouté en tant que crédit interne et appliqué automatiquement aux renouvellements d’abonnement futurs.
  • Par exemple, si le plan actuel est de 50 Dollars et que le client passe à un plan de 20 Dollars, les 30 Dollars restants sont crédités et utilisés pour le prochain cycle de facturation.

Comportement

  • Lorsque vous invoquez cette API, Dodo Payments initie immédiatement un prélèvement basé sur votre option de proratisation sélectionnée
  • Si le changement de plan est une rétrogradation et que vous utilisez prorated_immediately, les crédits seront automatiquement calculés et ajoutés au solde de crédit de l’abonnement. Ces crédits sont spécifiques à cet abonnement et ne seront utilisés que pour compenser les paiements récurrents futurs du même abonnement
  • L’option full_immediately contourne les calculs de crédit et prélève le montant total du nouveau plan
Choisissez votre option de proratisation avec soin : Utilisez prorated_immediately pour une facturation équitable qui tient compte du temps non utilisé, ou full_immediately lorsque vous souhaitez prélever le montant total du nouveau plan indépendamment du cycle de facturation actuel.

Traitement des prélèvements

  • Le prélèvement immédiat initié lors du changement de plan se termine généralement en moins de 2 minutes
  • Si ce prélèvement immédiat échoue pour une raison quelconque, l’abonnement est automatiquement mis en attente jusqu’à ce que le problème soit résolu

Abonnements à la demande

Les abonnements à la demande vous permettent de facturer les clients de manière flexible, pas seulement selon un calendrier fixe. Contactez le support pour activer cette fonctionnalité.
Pour créer un abonnement à la demande : Pour créer un abonnement à la demande, utilisez le point de terminaison API POST /subscriptions et incluez le champ on_demand dans le corps de votre requête. Cela vous permet d’autoriser un mode de paiement sans prélèvement immédiat, ou de définir un prix initial personnalisé. Pour facturer un abonnement à la demande : Pour les prélèvements suivants, utilisez le point de terminaison POST /subscriptions/charge et spécifiez le montant à facturer au client pour cette transaction.
Pour un guide complet, étape par étape—y compris des exemples de requêtes/réponses, des politiques de réessai sécurisées et la gestion des webhooks—voir le Guide des abonnements à la demande.