Documentation Index
Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
Use this file to discover all available pages before exploring further.
Panoramica
Le sottoscrizioni on-demand ti consentono di autorizzare un metodo di pagamento di un cliente una sola volta e poi addebitare importi variabili ogni volta che ne hai bisogno, invece di seguire un programma fisso. Questa funzionalità è disponibile per tutti gli account—non è necessaria alcuna approvazione. Usa questa guida per:- Creare una sottoscrizione on-demand (autorizzare un mandato con un prezzo iniziale opzionale)
- Attivare addebiti successivi con importi personalizzati
- Monitorare i risultati utilizzando i webhook
Requisiti
- Account commerciante Dodo Payments e chiave API
- Segreto del webhook configurato e un endpoint per ricevere eventi
- Un prodotto in abbonamento nel tuo catalogo
Come funziona l’on-demand
- Crei un abbonamento con l’oggetto
on_demandper autorizzare un metodo di pagamento e, facoltativamente, addebitare una somma iniziale. - Successivamente, crei addebiti contro tale abbonamento con importi personalizzati usando l’endpoint dedicato agli addebiti.
- Ascolti i webhook (es.
payment.succeeded,payment.failed) per aggiornare il tuo sistema.
Crea una sottoscrizione on-demand
Endpoint: POST /checkouts Campi chiave della richiesta (corpo):Trovali in Crea sessione di checkout
Crea una sottoscrizione on-demand
- Node.js SDK
- Python SDK
- Go SDK
- cURL
Success
Addebita una sottoscrizione on-demand
Dopo che il mandato è stato autorizzato, crea addebiti secondo necessità. Endpoint: POST /subscriptions/{subscription_id}/charge Campi chiave della richiesta (corpo):Charge request body parameters
Charge request body parameters
Importo da addebitare (nell’unità monetaria più piccola). Esempio: per addebitare $25,00, passa
2500.Sovrascrittura facoltativa della valuta per l’addebito.
Sovrascrittura facoltativa della descrizione per questo addebito.
Se true, include le commissioni in valuta adattiva all’interno di
product_price. Se false, le commissioni vengono aggiunte sopra.Metadata aggiuntivi per il pagamento. Se omessi, vengono usati i metadata dell’abbonamento.
- Node.js SDK
- Python SDK
- Go SDK
- cURL
Success
Gestione delle transazioni fallite
Quando un addebito per un abbonamento su richiesta fallisce, decidi tu cosa succede dopo. A differenza degli abbonamenti programmati — dove un rinnovo fallito interrompe ulteriori addebiti automatici — gli abbonamenti su richiesta rimangono addebitabili dopo un fallimento. Puoi richiamare l’endpoint di addebito come parte della tua logica di ripetizione.Cosa succede in caso di fallimento
Charge attempt fails
La richiesta
POST /subscriptions/{subscription_id}/charge restituisce una risposta di errore oppure si completa in modo asincrono ed emette un webhook payment.failed con il motivo del rifiuto.Subscription may transition to on_hold
L’abbonamento può passare allo stato
on_hold ed emettere un webhook subscription.on_hold (vedi Statuti degli abbonamenti → In sospeso). Questo è un segnale — non un blocco. Per gli abbonamenti su richiesta, on_hold non impedisce di effettuare nuovamente l’addebito.Retry the charge (your call)
Per i flussi su richiesta, Dodo non riprova automaticamente. Puoi richiamare
POST /subscriptions/{subscription_id}/charge in qualsiasi momento per riprovare. Applica la politica di ripetizione sicura qui sotto — utilizza esponenziale backoff, salta i rifiuti rigidi e evita schemi di burst — in modo che le ripetizioni non vengano segnalate dai nostri sistemi di frode e rischio.Optionally, ask the customer for a new payment method
Se le ripetizioni continuano a fallire perché il metodo di pagamento stesso è danneggiato (carta scaduta, conto chiuso, ecc.), usa
POST /subscriptions/{id}/payment-method per raccoglierne uno nuovo dal cliente. In caso di successo, l’abbonamento torna a active e payment.succeeded seguito da webhook subscription.active sono emessi.Su richiesta vs programmato: Per gli abbonamenti programmati, Dodo esegue i propri rinnovi e dunning. Per gli abbonamenti su richiesta, tu possiedi la politica di ripetizione perché solo tu sai quando dovrebbe avvenire il prossimo addebito (è guidato dai tuoi eventi di utilizzo, non da un calendario).
Sequenza di webhook su un addebito su richiesta fallito
| Ordine | Evento | Significato |
|---|---|---|
| 1 | payment.failed | Il tentativo di addebito su richiesta non è riuscito (include il motivo del rifiuto) |
| 2 | subscription.on_hold | L’abbonamento è stato sospeso (informativo; non blocca ulteriori addebiti) |
| 3* | payment.succeeded | Un addebito successivo — sia la tua ripetizione che dopo un aggiornamento del metodo di pagamento — è riuscito |
| 4* | subscription.active | L’abbonamento è tornato a active dopo un addebito riuscito |
Gli eventi 3 e 4 si verificano solo dopo che un addebito di follow-up ha successo.
Responsabilità della ripetizione
Gestione delle insolvenze degli abbonamenti — la sequenza di recupero tramite email incorporata — è limitata ai pagamenti di rinnovo falliti su abbonamenti programmati e cancellazioni avviate dal cliente. Non è progettata per fallimenti di addebiti su richiesta. Comunica direttamente con il cliente (ad esempio, email transazionale o prompt in-app) quando decidi che il metodo di pagamento deve essere aggiornato.Ripetizione dei pagamenti
Il nostro sistema di rilevamento delle frodi può bloccare schemi di ripetizione aggressivi (e può segnalarli come potenziale test di carte). Segui una politica di ripetizione sicura.Principi per politiche di ripetizione sicure
- Meccanismo di backoff: Usa un backoff esponenziale tra le ripetizioni.
- Limiti di ripetizione: Limita le ripetizioni totali (max 3–4 tentativi).
- Filtraggio intelligente: Ripeti solo su fallimenti ripetibili (ad esempio, errori di rete/emittente, fondi insufficienti); non riprovare mai per rifiuti rigidi.
- Prevenzione del test di carte: Non riprovare fallimenti come
DO_NOT_HONOR,STOLEN_CARD,LOST_CARD,PICKUP_CARD,FRAUDULENT,AUTHENTICATION_FAILURE. - Varietà di metadata (opzionale): Se mantieni il tuo sistema di ripetizione, differenzia le ripetizioni tramite metadata (ad esempio,
retry_attempt).
Programma di ripetizione suggerito (abbonamenti)
- 1º tentativo: Immediato quando crei l’addebito
- 2º tentativo: Dopo 3 giorni
- 3º tentativo: Dopo altri 7 giorni (10 giorni totali)
- 4º tentativo (finale): Dopo altri 7 giorni (17 giorni totali)
Evitare ripetizioni a raffica; allinea al tempo di autorizzazione
- Ancora le ripetizioni al timestamp di autorizzazione originale per evitare comportamenti a “raffica” su tutto il portafoglio.
- Esempio: Se il cliente avvia una prova o un mandato alle 13:10 di oggi, programma le ripetizioni successive alle 13:10 nei giorni successivi secondo il tuo backoff (ad esempio, +3 giorni → 13:10, +7 giorni → 13:10).
- In alternativa, se memorizzi l’ora dell’ultimo pagamento riuscito
T, programma il tentativo successivo aT + X daysper preservare l’allineamento dell’orario.
Fuso orario e DST: usa un standard di tempo coerente per la pianificazione e converti per la visualizzazione solo per mantenere gli intervalli.
Codici di declino che non dovresti riprovare
STOLEN_CARDDO_NOT_HONORFRAUDULENTPICKUP_CARDAUTHENTICATION_FAILURELOST_CARD
Per un elenco completo delle motivazioni di declino e se sono correggibili dall’utente, vedi la documentazione su
Fallimenti delle transazioni.
Linee guida per l’implementazione (senza codice)
- Utilizza un gestore di code che mantiene timestamp precisi; calcola il tentativo successivo all’esatto offset orario (ad esempio,
T + 3 daysalla stessa HH:MM). - Mantieni e riferisci il timestamp dell’ultimo pagamento riuscito
Tper calcolare il tentativo successivo; non raggruppare più abbonamenti allo stesso istante. - Valuta sempre il motivo dell’ultimo declino; interrompi le ripetizioni per declini rigidi nella lista di skip sopra.
- Limita le ripetizioni concorrenti per cliente e per account per prevenire picchi accidentali.
- Comunica proattivamente: invia email/SMS al cliente per aggiornare il metodo di pagamento prima del prossimo tentativo programmato.
- Usa metadata solo per osservabilità (ad esempio,
retry_attempt); non cercare mai di “evadere” i sistemi di frode/rischio ruotando campi irrilevanti.
Tracciare i risultati con i webhook
Implementa la gestione webhook per tracciare il percorso del cliente. Vedi Implementazione Webhook.- subscription.active: Mandato autorizzato e abbonamento attivato
- subscription.failed: Creazione fallita (ad esempio, fallimento del mandato)
- subscription.on_hold: Abbonamento sospeso (ad esempio, stato non pagato)
- payment.succeeded: Addebito riuscito
- payment.failed: Addebito fallito
Test e passaggi successivi
Create in test mode
Usa la tua chiave API di test per creare l’abbonamento con
payment_link: true, quindi apri il link e completa il mandato.Trigger a charge
Chiama l’endpoint di addebito con un piccolo
product_price (ad esempio, 100) e verifica di ricevere payment.succeeded.Risoluzione dei problemi
- 422 Richiesta non valida: Assicurati che
on_demand.mandate_onlysia fornito in fase di creazione eproduct_pricesia fornito per gli addebiti. - Errori di valuta: Se sovrascrivi
product_currency, conferma che sia supportato per il tuo account e cliente. - Nessun webhook ricevuto: Verifica la configurazione del tuo URL webhook e del segreto di firma.