Passer au contenu principal
Le SDK TypeScript fournit un accès pratique côté serveur à l’API REST de Dodo Payments pour les applications TypeScript et JavaScript. Il propose des définitions de type complètes, la gestion des erreurs, des tentatives, des délais d’attente et une pagination automatique pour un traitement des paiements sans faille.

Installation

Installez le SDK avec le gestionnaire de paquets de votre choix:
npm install dodopayments

Démarrage rapide

Initialisez le client avec votre clé API et commencez à traiter les paiements :
import DodoPayments from 'dodopayments';

const client = new DodoPayments({
  bearerToken: process.env['DODO_PAYMENTS_API_KEY'], // This is the default and can be omitted
  environment: 'test_mode', // defaults to 'live_mode'
});

const checkoutSessionResponse = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'product_id', quantity: 1 }],
});

console.log(checkoutSessionResponse.session_id);
Stockez toujours vos clés API de manière sécurisée en utilisant des variables d’environnement. Ne les validez jamais dans le contrôle de version ni ne les exposez dans du code côté client.

Fonctionnalités principales

TypeScript First

Prise en charge complète de TypeScript avec des définitions de types exhaustives pour tous les points de terminaison de l’API

Auto-Pagination

La pagination automatique pour les réponses de listes facilite le traitement d’ensembles de données volumineux

Error Handling

Types d’erreur intégrés avec des messages détaillés pour différents scénarios d’échec

Smart Retries

Reprises automatiques configurables avec backoff exponentiel pour les erreurs transitoires

Configuration

Variables d’environnement

Définissez des variables d’environnement pour une configuration sécurisée :
.env
DODO_PAYMENTS_API_KEY=your_api_key_here

Configuration des délais d’attente

Configurez les délais d’attente des requêtes globalement ou par requête :
// Configure default timeout for all requests (default is 1 minute)
const client = new DodoPayments({
  timeout: 20 * 1000, // 20 seconds
});

// Override per-request
await client.checkoutSessions.create(
  { product_cart: [{ product_id: 'product_id', quantity: 1 }] },
  { timeout: 5 * 1000 },
);

Configuration des tentatives

Configurez le comportement de tentative automatique :
// Configure default for all requests (default is 2 retries)
const client = new DodoPayments({
  maxRetries: 0, // disable retries
});

// Override per-request
await client.checkoutSessions.create(
  { product_cart: [{ product_id: 'product_id', quantity: 1 }] },
  { maxRetries: 5 },
);
Le SDK relance automatiquement les requêtes échouées en raison d’erreurs réseau ou de problèmes serveur (réponses 5xx) avec un backoff exponentiel.

Opérations courantes

Créer une session de paiement

Générez une session de paiement pour collecter des informations de paiement :
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_123',
      quantity: 1
    }
  ],
  return_url: 'https://yourdomain.com/return'
});

console.log('Redirect to:', session.url);

Gérer les clients

Créez et récupérez des informations sur les clients :
// Create a customer
const customer = await client.customers.create({
  email: 'customer@example.com',
  name: 'John Doe',
  metadata: {
    user_id: '12345'
  }
});

// Retrieve customer
const retrieved = await client.customers.retrieve('cus_123');
console.log(`Customer: ${retrieved.name} (${retrieved.email})`);

Gérer les abonnements

Créez et gérez des abonnements récurrents :
// Create a subscription
const subscription = await client.subscriptions.create({
  customer_id: 'cus_123',
  product_id: 'prod_456',
  price_id: 'price_789'
});

// Retrieve subscription usage history
const usageHistory = await client.subscriptions.retrieveUsageHistory('sub_123', {
  start_date: '2024-01-01T00:00:00Z',
  end_date: '2024-03-31T23:59:59Z'
});

Facturation basée sur l’utilisation

Ingest Usage Events

Suivez des événements personnalisés pour la facturation basée sur l’utilisation :
await client.usageEvents.ingest({
  events: [
    {
      event_id: 'api_call_12345',
      customer_id: 'cus_abc123',
      event_name: 'api_request',
      timestamp: '2024-01-15T10:30:00Z',
      metadata: {
        endpoint: '/api/v1/users',
        method: 'GET',
        tokens_used: '150'
      }
    }
  ]
});
Les événements doivent avoir des valeurs event_id uniques pour garantir l’idempotence. Les identifiants en double au sein d’une même requête sont rejetés, et les requêtes subséquentes contenant des identifiants existants sont ignorées.

Récupérer les événements d’utilisation

Récupérez des informations détaillées sur les événements d’utilisation :
// Get a specific event
const event = await client.usageEvents.retrieve('api_call_12345');

// List events with filtering
const events = await client.usageEvents.list({
  customer_id: 'cus_abc123',
  event_name: 'api_request',
  start: '2024-01-14T10:30:00Z',
  end: '2024-01-15T10:30:00Z'
});

Configuration du proxy

Configurez les paramètres du proxy pour différents environnements d’exécution :

Node.js (en utilisant undici)

import DodoPayments from 'dodopayments';
import * as undici from 'undici';

const proxyAgent = new undici.ProxyAgent('http://localhost:8888');
const client = new DodoPayments({
  fetchOptions: {
    dispatcher: proxyAgent,
  },
});

Bun

import DodoPayments from 'dodopayments';

const client = new DodoPayments({
  fetchOptions: {
    proxy: 'http://localhost:8888',
  },
});

Deno

import DodoPayments from 'npm:dodopayments';

const httpClient = Deno.createHttpClient({ proxy: { url: 'http://localhost:8888' } });
const client = new DodoPayments({
  fetchOptions: {
    client: httpClient,
  },
});

Journalisation

Contrôlez la verbosité des journaux en utilisant des variables d’environnement ou des options client :
// Via client option
const client = new DodoPayments({
  logLevel: 'debug', // Show all log messages
});
# Via environment variable
export DODO_PAYMENTS_LOG=debug
Niveaux de journalisation disponibles :
  • 'debug' - Affiche les messages de débogage, les infos, les avertissements et les erreurs
  • 'info' - Affiche les messages d’info, les avertissements et les erreurs
  • 'warn' - Affiche les avertissements et les erreurs (par défaut)
  • 'error' - Affiche uniquement les erreurs
  • 'off' - Désactive toute journalisation
Au niveau de débogage, toutes les requêtes et réponses HTTP sont journalisées, y compris les en-têtes et les corps. Certains en-têtes d’authentification sont masqués, mais des données sensibles présentes dans les corps peuvent rester visibles.

Migration depuis le SDK Node.js

Si vous mettez à niveau depuis le SDK Node.js hérité, le SDK TypeScript offre une sécurité de type améliorée et des fonctionnalités :

View Migration Guide

Apprenez comment migrer du SDK Node.js vers le SDK TypeScript

Auto-Pagination

Les méthodes de liste de l’API DodoPayments sont paginées. Vous pouvez utiliser la syntaxe for await … of pour parcourir les éléments de toutes les pages :
async function fetchAllPayments() {
  const allPayments = [];
  // Automatically fetches more pages as needed.
  for await (const paymentListResponse of client.payments.list()) {
    allPayments.push(paymentListResponse);
  }
  return allPayments;
}
Alternativement, vous pouvez demander une seule page à la fois :
let page = await client.payments.list();
for (const paymentListResponse of page.items) {
  console.log(paymentListResponse);
}

// Convenience methods are provided for manually paginating:
while (page.hasNextPage()) {
  page = await page.getNextPage();
  // ...
}

Exigences

Les environnements d’exécution suivants sont pris en charge :
  • Navigateurs Web (Chrome, Firefox, Safari, Edge à jour, et plus encore)
  • Node.js 20 LTS ou version ultérieure (non-EOL)
  • Deno v1.28.0 ou supérieur
  • Bun 1.0 ou version ultérieure
  • Cloudflare Workers
  • Vercel Edge Runtime
  • Jest 28 ou supérieur avec l’environnement "node"
  • Nitro v2.6 ou supérieur
TypeScript >= 4.9 est pris en charge.

Ressources

Support

Besoin d’aide avec le SDK TypeScript ?

Contribuer

Nous accueillons les contributions ! Consultez les directives de contribution pour commencer.