Vai al contenuto principale

Requisiti

Per integrare l’API di Dodo Payments, avrai bisogno di:
  • Un account commerciante Dodo Payments
  • Credenziali API (chiave API e chiave segreta webhook) dal dashboard
Per una guida più dettagliata sui requisiti, controlla questa sezione.

Integrazione API

Sessioni di Checkout

Utilizza le Sessioni di Checkout per vendere prodotti in abbonamento con un checkout sicuro e ospitato. Passa il tuo prodotto in abbonamento in product_cart e reindirizza i clienti all’checkout_url restituito.
Checkout Misto: Puoi combinare prodotti in abbonamento con prodotti una tantum nella stessa sessione di checkout. Questo consente casi d’uso come spese di attivazione con abbonamenti, bundle hardware con SaaS e altro. Vedi la guida alle Sessioni di Checkout per esempi.
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();

Risposta API

Di seguito è riportato un esempio della risposta:
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
Reindirizza il cliente a checkout_url.

Webhook

Quando integri gli abbonamenti, riceverai webhook per tracciare il ciclo di vita dell’abbonamento. Questi webhook ti aiutano a gestire efficacemente gli stati degli abbonamenti e gli scenari di pagamento. Per configurare il tuo endpoint webhook, segui la nostra Guida all’integrazione dettagliata.

Tipi di eventi di abbonamento

I seguenti eventi webhook tracciano le modifiche di stato dell’abbonamento:
  1. subscription.active - L’abbonamento è stato attivato con successo.
  2. subscription.updated - L’oggetto abbonamento è stato aggiornato (si attiva su qualsiasi modifica di campo).
  3. subscription.on_hold - L’abbonamento è stato messo in attesa a causa di un rinnovo non riuscito.
  4. subscription.failed - La creazione dell’abbonamento è fallita durante la creazione del mandato.
  5. subscription.renewed - L’abbonamento è stato rinnovato per il prossimo periodo di fatturazione.
Per una gestione affidabile del ciclo di vita degli abbonamenti, ti consigliamo di tracciare questi eventi di abbonamento.
Utilizza subscription.updated per ricevere notifiche in tempo reale su eventuali modifiche all’abbonamento, mantenendo lo stato della tua applicazione sincronizzato senza dover interrogare l’API.

Scenari di pagamento

Flusso di pagamento riuscito Quando un pagamento ha successo, riceverai i seguenti webhook:
  1. subscription.active - Indica l’attivazione dell’abbonamento
  2. payment.succeeded - Conferma il pagamento iniziale:
    • Per la fatturazione immediata (0 giorni di prova): Aspettati entro 2-10 minuti
    • Per i giorni di prova: ogni volta che termina
  3. subscription.renewed - Indica la deduzione del pagamento e il rinnovo per il prossimo ciclo. (Fondamentalmente, ogni volta che il pagamento viene dedotto per i prodotti in abbonamento, riceverai il webhook subscription.renewed insieme a payment.succeeded)
Scenari di pagamento non riusciti
  1. Fallimento dell’abbonamento
  • subscription.failed - La creazione dell’abbonamento è fallita a causa del fallimento nella creazione di un mandato.
  • payment.failed - Indica un pagamento non riuscito.
  1. Abbonamento in attesa
  • subscription.on_hold - L’abbonamento è stato messo in attesa a causa di un pagamento di rinnovo non riuscito o di un addebito di cambio piano non riuscito.
  • Quando un abbonamento viene messo in attesa, non si rinnoverà automaticamente fino a quando il metodo di pagamento non verrà aggiornato.
Migliore Pratica: Per semplificare l’implementazione, ti consigliamo di tracciare principalmente gli eventi di abbonamento per gestire il ciclo di vita dell’abbonamento.

Gestione dell’abbonamento in attesa

Quando un abbonamento entra nello stato di on_hold, è necessario aggiornare il metodo di pagamento per riattivarlo. Questa sezione spiega quando gli abbonamenti vengono messi in attesa e come gestirli.

Quando gli abbonamenti vengono messi in attesa

Un abbonamento viene messo in attesa quando:
  • Il pagamento di rinnovo non riesce: L’addebito di rinnovo automatico fallisce a causa di fondi insufficienti, carta scaduta o rifiuto della banca
  • Il pagamento per cambio piano non riesce: Un addebito immediato durante l’aggiornamento/downgrade del piano fallisce
  • L’autorizzazione del metodo di pagamento fallisce: Il metodo di pagamento non può essere autorizzato per addebiti ricorrenti
Gli abbonamenti nello stato di on_hold non si rinnoveranno automaticamente. Devi aggiornare il metodo di pagamento per riattivare l’abbonamento.

Riattivazione degli abbonamenti in attesa

Per riattivare un abbonamento dallo stato di on_hold, utilizza l’API Aggiorna Metodo di Pagamento. Questo automaticamente:
  1. Crea un addebito per i restanti importi dovuti
  2. Genera una fattura per l’addebito
  3. Elabora il pagamento utilizzando il nuovo metodo di pagamento
  4. Riattiva l’abbonamento nello stato di active dopo un pagamento riuscito
1

Gestisci il webhook subscription.on_hold

Quando ricevi un webhook subscription.on_hold, aggiorna lo stato della tua applicazione e notifica il cliente:
// 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

Aggiorna il metodo di pagamento

Quando il cliente è pronto per aggiornare il proprio metodo di pagamento, chiama l’API Aggiorna Metodo di Pagamento:
// 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
}
Puoi anche utilizzare un ID di metodo di pagamento esistente se il cliente ha metodi di pagamento salvati:
await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'existing',
  payment_method_id: 'pm_abc123'
});
3

Monitora gli eventi webhook

Dopo aver aggiornato il metodo di pagamento, monitora questi eventi webhook:
  1. payment.succeeded - L’addebito per i restanti importi dovuti è stato effettuato con successo
  2. subscription.active - L’abbonamento è stato riattivato
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.'
  });
}

Payload dell’evento di abbonamento di esempio


ProprietàTipoRichiestoDescrizione
business_idstringL’identificatore unico per l’azienda
timestampstringIl timestamp di quando si è verificato l’evento (non necessariamente lo stesso di quando è stato consegnato)
typestringIl tipo di evento. Vedi Tipi di eventi
dataobjectIl payload principale dei dati. Vedi Oggetto Dati

Cambiare i piani di abbonamento

Puoi aggiornare o ridurre un piano di abbonamento utilizzando l’endpoint API di cambio piano. Questo ti consente di modificare il prodotto dell’abbonamento, la quantità e gestire la proration.

Riferimento API Cambio Piano

Per informazioni dettagliate su come cambiare i piani di abbonamento, ti preghiamo di consultare la nostra documentazione API Cambio Piano.

Opzioni di Prorata

Quando cambi i piani di abbonamento, hai due opzioni per gestire l’addebito immediato:

1. prorated_immediately

  • Calcola l’importo prorato in base al tempo rimanente nel ciclo di fatturazione attuale
  • Addebita al cliente solo la differenza tra il vecchio e il nuovo piano
  • Durante un periodo di prova, questo cambierà immediatamente l’utente al nuovo piano, addebitando il cliente subito

2. full_immediately

  • Addebita al cliente l’importo totale dell’abbonamento per il nuovo piano
  • Ignora qualsiasi tempo rimanente o crediti dal piano precedente
  • Utile quando vuoi ripristinare il ciclo di fatturazione o addebitare l’importo totale indipendentemente dalla proration

3. difference_immediately

  • Quando si aggiorna, al cliente viene immediatamente addebitata la differenza tra i due importi del piano.
  • Ad esempio, se il piano attuale è di 30 Dollari e il cliente passa a un piano di 80 Dollari, viene addebitato $50 immediatamente.
  • Quando si riduce, l’importo non utilizzato dal piano attuale viene aggiunto come credito interno e applicato automaticamente ai futuri rinnovi dell’abbonamento.
  • Ad esempio, se il piano attuale è di 50 Dollari e il cliente passa a un piano di 20 Dollari, i restanti $30 vengono accreditati e utilizzati per il prossimo ciclo di fatturazione.

Comportamento

  • Quando invochi questa API, Dodo Payments avvia immediatamente un addebito in base all’opzione di proration selezionata
  • Se il cambio piano è una riduzione e utilizzi prorated_immediately, i crediti verranno calcolati automaticamente e aggiunti al saldo di credito dell’abbonamento. Questi crediti sono specifici per quell’abbonamento e verranno utilizzati solo per compensare i futuri pagamenti ricorrenti dello stesso abbonamento
  • L’opzione full_immediately salta i calcoli di credito e addebita l’intero importo del nuovo piano
Scegli attentamente la tua opzione di proration: Usa prorated_immediately per una fatturazione equa che tiene conto del tempo non utilizzato, oppure full_immediately quando vuoi addebitare l’intero importo del nuovo piano indipendentemente dal ciclo di fatturazione attuale.

Elaborazione degli addebiti

  • L’addebito immediato avviato al momento del cambio piano di solito completa l’elaborazione in meno di 2 minuti
  • Se questo addebito immediato fallisce per qualsiasi motivo, l’abbonamento viene automaticamente messo in attesa fino a quando il problema non viene risolto

Abbonamenti On-Demand

Gli abbonamenti on-demand ti consentono di addebitare i clienti in modo flessibile, non solo secondo un programma fisso. Contatta il supporto per abilitare questa funzionalità.
Per creare un abbonamento on-demand: Per creare un abbonamento on-demand, utilizza l’endpoint API POST /subscriptions e includi il campo on_demand nel corpo della tua richiesta. Questo ti consente di autorizzare un metodo di pagamento senza un addebito immediato o impostare un prezzo iniziale personalizzato. Per addebitare un abbonamento on-demand: Per addebiti successivi, utilizza l’endpoint POST /subscriptions/charge e specifica l’importo da addebitare al cliente per quella transazione.
Per una guida completa, passo dopo passo—compresi esempi di richiesta/riposta, politiche di ripetizione sicura e gestione dei webhook—vedi la Guida agli Abbonamenti On-Demand.