Vai al contenuto principale

Panoramica

Quando una richiesta non va a buon fine, l’API Dodo Payments restituisce un codice di stato HTTP e un corpo JSON che identifica l’errore. Usa questa pagina per scoprire cosa ha causato un errore e come risolverlo. Ogni risposta di errore include:
  • Un codice di stato HTTP che indica la categoria generale dell’errore.
  • Un code che identifica l’errore esatto, ad esempio UNSUPPORTED_COUNTRY.
  • Un message che spiega l’errore in linguaggio semplice. L’message può essere null, ad esempio per gli errori interni del server.
Basa la gestione degli errori su code, non su message. Diversi codici restituiscono più di un messaggio, a seconda della causa. Usa questi codici di errore per:
  • Eseguire il debug dei problemi di integrazione.
  • Gestire correttamente gli errori nella tua applicazione.
  • Mostrare ai clienti un feedback significativo.
  • Mantenere affidabile l’elaborazione dei pagamenti.
Questi sono errori API e di logica di business. Per i motivi dei rifiuti delle carte restituiti per un pagamento non riuscito (come INSUFFICIENT_FUNDS o CARD_DECLINED), consulta invece il riferimento Transaction Failures.

Codici di errore API standard

L’API usa questi codici di stato HTTP per gli errori:

Formato della risposta di errore

Il corpo di una risposta di errore contiene due campi, code e message:

Riferimento dei codici di errore

I codici di errore riportati di seguito sono raggruppati in base all’area dell’API a cui si riferiscono. Ogni voce elenca la condizione che attiva l’errore e il messaggio restituito dall’API. I placeholder come {id} rappresentano valori compilati dall’API.

Autenticazione e account

  • UNAUTHORIZED
    • Trigger: La richiesta non contiene una chiave API o ne contiene una non valida (HTTP 401), oppure la chiave API non dispone del ruolo richiesto dall’azione (HTTP 403)
    • Messaggio: Non sei autorizzato a eseguire questa azione
  • MERCHANT_NOT_LIVE
    • Trigger: Una richiesta in modalità live per un’azienda che non ha abilitato i pagamenti live (HTTP 403). Questo include un’azienda che ha usato solo la modalità test e un’azienda i cui pagamenti live non sono ancora abilitati perché la verifica non è completa. Le richieste in modalità test non sono interessate.
    • Messaggio: Pagamenti live non abilitati per il merchant
  • BUSINESS_ARCHIVED
    • Trigger: Qualsiasi richiesta rivolta al cliente per un’azienda archiviata (HTTP 403). Include il checkout, i link di pagamento, lo storefront, il Customer Portal e l’attivazione delle chiavi di licenza.
    • Messaggio: Questa azienda è archiviata e non accetta più richieste

Pagamenti e checkout

  • CHECKOUT_SESSION_CONSUMED
    • Trigger: La sessione di checkout ha già generato un pagamento (HTTP 403). Crea invece una nuova sessione di checkout.
    • Messaggio: È già stato generato un pagamento con la sessione di checkout indicata.
  • MANUAL_RETRY_ALREADY_PAID
    • Trigger: Nuovo tentativo manuale di una fattura di rinnovo per la quale un pagamento è già riuscito. Un nuovo invio addebiterebbe due volte il cliente.
    • Messaggio: Un pagamento per questa fattura è già riuscito
  • MANUAL_RETRY_HARD_DECLINE
    • Trigger: Nuovo tentativo manuale quando l’ultimo errore sulla fattura è un rifiuto definitivo o non contiene un codice di errore classificato. Un altro addebito sulla stessa carta non può riuscire, quindi aggiorna il metodo di pagamento.
    • Messaggio: L’ultimo pagamento di questa fattura è stato rifiutato definitivamente, quindi il nuovo tentativo non può riuscire (oppure) L’ultimo errore di questa fattura non può essere classificato, quindi non è possibile ripetere il tentativo
  • MANUAL_RETRY_IN_FLIGHT
    • Trigger: Nuovo tentativo manuale mentre un pagamento sulla fattura è processing o non ha ancora uno stato registrato. Attendi l’esito di quel pagamento invece di inviarlo nuovamente.
    • Messaggio: Un pagamento per questa fattura è ancora in corso
  • MANUAL_RETRY_LIMIT_REACHED
    • Trigger: Nuovo tentativo manuale dopo aver esaurito tutti e 3 gli invii della fattura o prima che sia trascorso il periodo di attesa (HTTP 429). Il secondo invio attende 1 ora dopo il primo e il terzo attende 3 ore dopo il secondo. Il corpo contiene solo code e message. Per sapere quando è consentito il prossimo invio, leggi retry_available_at da GET /payments/{payment_id}/retry.
    • Messaggio: Sono stati utilizzati tutti i tentativi manuali per questa fattura (oppure) Riprova ora non è ancora disponibile per questa fattura
  • NO_ELIGIBLE_PAYMENT_METHODS
    • Trigger: Dopo il filtraggio non è disponibile alcun metodo di pagamento per il pagamento (HTTP 422)
    • Messaggio: Non sono stati trovati metodi di pagamento idonei
  • PAYMENT_NOT_PERMITTED
    • Trigger: Un checkout o un tentativo di pagamento effettuato da un cliente presente nella blocklist del merchant (HTTP 403). Il codice e il messaggio non indicano volutamente alcuna causa.
    • Messaggio: Questo pagamento non può essere elaborato.
  • PAYMENT_NOT_RETRYABLE
    • Trigger: Nuovo tentativo manuale di un pagamento non coperto dai nuovi tentativi manuali. Il pagamento non ha una fattura, la fattura non è un rinnovo di abbonamento aperto, nessun pagamento sulla fattura è ancora fallito, l’abbonamento non ha una fatturazione ricorrente configurata (ad esempio, un abbonamento on-demand) oppure il cliente è nella blocklist.
    • Messaggio: Varia in base al motivo, ad esempio: È possibile ripetere il tentativo solo per i pagamenti dei rinnovi di abbonamento
  • PAYMENT_NOT_SUCCEEDED
    • Trigger: Un tentativo di rimborsare o elaborare un pagamento che non è riuscito
    • Messaggio: Il pagamento fornito non è riuscito
  • PREVIOUS_PAYMENT_PENDING
    • Trigger: Un tentativo di creare un addebito mentre il pagamento precedente si trova in uno stato non terminale. Restituito anche per un nuovo tentativo manuale quando il pagamento più recente sulla fattura non è né failed né in corso, ad esempio requires_customer_action o cancelled.
    • Messaggio: Impossibile creare un nuovo addebito perché il pagamento precedente non è ancora riuscito (oppure) Il pagamento più recente su questa fattura non è fallito
  • UNSUCCESSFUL_PAYMENT_ID
    • Trigger: L’ID del pagamento fa riferimento a un pagamento che non è riuscito
    • Messaggio: L’ID del pagamento ha uno stato non riuscito.

Connettori e BYOP

Questi errori riguardano i connettori di pagamento di proprietà del merchant (Bring Your Own Processor o BYOP).
  • BYOP_CONNECTOR_DISABLED
    • Trigger: Aggiornamento del metodo di pagamento di un abbonamento instradato tramite un connettore BYOP disabilitato. Dodo Payments non utilizza i propri connettori come fallback, quindi riabilita prima il connettore.
    • Messaggio: L’abbonamento è instradato tramite il connettore del merchant (BYOP), attualmente disabilitato
  • BYOP_CUSTOM_INVOICE_ADDRESS_MISSING
    • Trigger: Un pagamento instradato tramite il connettore del merchant (BYOP) non ha un indirizzo di fatturazione personalizzato
    • Messaggio: L’indirizzo di fatturazione personalizzato BYOP è obbligatorio quando un pagamento è instradato tramite il connettore del merchant
  • CONNECTOR_LABEL_ALREADY_EXISTS
    • Trigger: Creazione di un connettore con un’etichetta già esistente
    • Messaggio: Esiste già un connettore con questa etichetta. Scegli un’etichetta diversa.

Rimborsi

  • EXISTING_REFUND_REQUEST_PROCESSING
    • Trigger: Una richiesta di rimborso precedente è ancora in fase di elaborazione
    • Messaggio: È ancora in fase di elaborazione una richiesta di rimborso con stato “Pending”
  • LINE_ITEM_FULLY_REFUNDED
    • Trigger: Un tentativo di rimborsare una voce già completamente rimborsata
    • Messaggio: La voce {id} è stata completamente rimborsata e non può essere rimborsata ulteriormente.
  • LINE_ITEM_NOT_FOUND
    • Trigger: L’ID dell’articolo non fa parte del pagamento indicato
    • Messaggio: Voce {id} non trovata nel pagamento
  • LINE_ITEM_PRORATED
    • Trigger: Un rimborso o aggiornamento tentato su una voce con importo ripartito
    • Messaggio: La voce {id} non può essere rimborsata perché il suo importo è ripartito
  • LINE_ITEM_REFUND_AMOUNT_TOO_HIGH
    • Trigger: L’importo del rimborso, incluse le imposte, è superiore all’importo pagato
    • Messaggio: L’importo del rimborso richiesto per la voce {id}, incluse le imposte, è {amount}, superiore all’importo pagato {amount}
  • LINE_ITEM_REFUND_AMOUNT_TOO_LOW
    • Trigger: L’importo del rimborso è inferiore alla soglia minima
    • Messaggio: L’importo del rimborso richiesto per la voce {id} è {amount}, un valore troppo basso
  • NOTHING_TO_REFUND
    • Trigger: Non rimane alcun importo rimborsabile perché tutte le voci positive sono già state completamente rimborsate
    • Messaggio: Non rimane alcun importo rimborsabile. Tutte le voci positive sono state completamente rimborsate.
  • PARTIAL_REFUND_NOT_ALLOWED
    • Trigger: Un rimborso parziale tentato con un metodo di pagamento che supporta solo rimborsi completi
    • Messaggio: I rimborsi parziali non sono consentiti per questo metodo di pagamento
  • PAYMENT_ALREADY_REFUNDED
    • Trigger: Un rimborso duplicato
    • Messaggio: Questo pagamento è già stato rimborsato
  • PAYMENT_HAS_BEEN_REFUNDED
    • Trigger: Il pagamento è stato completamente rimborsato
    • Messaggio: L’ID del pagamento è stato completamente rimborsato.
  • REFUND_AMOUNT_EXCEEDS_PAID_AMOUNT
    • Trigger: L’importo totale del rimborso è superiore all’importo pagato
    • Messaggio: L’importo del rimborso calcolato è superiore all’importo pagato
  • REFUND_WINDOW_EXPIRED
    • Trigger: Il rimborso viene richiesto oltre il periodo consentito
    • Messaggio: Non è possibile avviare rimborsi {days} giorni dopo la creazione del pagamento. Contatta support@dodopayments.com.
  • ZERO_AMOUNT_PAYMENT_REFUND_NOT_ALLOWED
    • Trigger: Un tentativo di rimborsare un pagamento di importo zero
    • Messaggio: Impossibile rimborsare un pagamento con importo monetario pari a zero

Abbonamenti e componenti aggiuntivi

  • ADDONS_IN_USAGE_BASED_BILLING_NOT_SUPPORTED
    • Trigger: Un tentativo di aggiungere componenti aggiuntivi a un abbonamento con fatturazione basata sull’utilizzo
    • Messaggio: I componenti aggiuntivi negli abbonamenti non sono supportati per la fatturazione basata sull’utilizzo
  • ADDONS_NOT_ALLOWED_FOR_ON_DEMAND
    • Trigger: Un tentativo di aggiungere componenti aggiuntivi a un abbonamento on-demand
    • Messaggio: I componenti aggiuntivi non sono consentiti per gli abbonamenti on-demand
  • CANCEL_SCHEDULED_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • Trigger: Il Customer Portal tenta di annullare una modifica di piano programmata mentre l’azienda ha disabilitato questa azione
    • Messaggio: L’annullamento della modifica di piano programmata è disabilitato per il Customer Portal.
  • CHARGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION
    • Trigger: Un tentativo di addebitare un abbonamento programmato per l’annullamento
    • Messaggio: Abbonamento programmato per l’annullamento
  • CUSTOMER_HAS_EXISTING_SUBSCRIPTION
    • Trigger: Creazione di un abbonamento per un cliente che ne possiede già uno, quando l’azienda non consente più abbonamenti per cliente
    • Messaggio: Il cliente {id} ha già un abbonamento. Per consentire più abbonamenti per cliente, modifica le impostazioni dell’azienda
  • DO_NOT_BILL_NOT_ALLOWED_IN_CUSTOMER_PORTAL
    • Trigger: La modalità di ripartizione do_not_bill viene usata in una modifica di piano del Customer Portal
    • Messaggio: La modalità di ripartizione do_not_bill non è consentita nel Customer Portal
  • DUPLICATE_ADDON_IDS_IN_REQUEST
    • Trigger: Lo stesso addon_id compare più di una volta nella richiesta
    • Messaggio: Non sono consentiti ID di componenti aggiuntivi duplicati
  • INACTIVE_SUBSCRIPTION_PLAN_CHANGE_NOT_SUPPORTED
    • Trigger: Una modifica di piano su un abbonamento inattivo
    • Messaggio: La modifica dei piani non è supportata per gli abbonamenti inattivi
  • INVALID_PRORATION_MODE_WITH_NEXT_BILLING_DATE
    • Trigger: Una modalità di ripartizione diversa da full_immediately usata con effective_at: next_billing_date
    • Messaggio: Con effective_at: next_billing_date è consentita solo la modalità di ripartizione full_immediately
  • MISSING_ADDON_IDS
    • Trigger: L’elenco addon_id è vuoto o contiene ID sconosciuti
    • Messaggio: Uno o più ID prodotto non esistono: {id}
  • ON_DEMAND_PLAN_CHANGE_NOT_SUPPORTED
    • Trigger: Una modifica di piano su un abbonamento on-demand
    • Messaggio: La modifica dei piani non è supportata per gli abbonamenti on-demand
  • ON_DEMAND_USAGE_BASED_BILLING_NOT_SUPPORTED
    • Trigger: Un tentativo di usare un abbonamento on-demand con la fatturazione basata sull’utilizzo
    • Messaggio: Gli abbonamenti on-demand non sono supportati per la fatturazione basata sull’utilizzo
  • ONE_TIME_PRODUCTS_NOT_ALLOWED_FOR_ON_DEMAND
    • Trigger: Un prodotto una tantum aggiunto a un abbonamento on-demand
    • Messaggio: I prodotti una tantum non sono consentiti per gli abbonamenti on-demand
  • PENDING_PLAN_CHANGE_EXISTS
    • Trigger: È stata richiesta una nuova modifica del piano mentre una modifica precedente è ancora in attesa di pagamento. Per sostituire una modifica con payment-link in sospeso, imposta cancel_older_payment_link: true.
    • Message: Esiste già una modifica del piano in sospeso per questo abbonamento. Attendi il completamento del pagamento corrente.
  • PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • Trigger: Una modifica di piano tramite il Customer Portal mentre l’azienda l’ha disabilitata
    • Messaggio: La modifica del piano dell’abbonamento per il Customer Portal è disabilitata.
  • PLAN_CHANGE_LINK_CANCEL_FAILED
    • Trigger: Una modifica del piano con cancel_older_payment_link: true non ha potuto annullare il payment link precedente. Non è cambiato nulla, quindi puoi riprovare la richiesta.
    • Message: Non è stato possibile annullare il payment link precedente. Riprova.
  • PLAN_CHANGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION
    • Trigger: Una modifica del piano per un abbonamento programmato per la cancellazione
    • Message: Abbonamento programmato per la cancellazione
  • PLAN_CHANGE_PAYMENT_ALREADY_COMPLETED
    • Trigger: Una modifica del piano con cancel_older_payment_link: true mentre il cliente ha già pagato la modifica del piano precedente. Tale modifica viene applicata, quindi non riprovare.
    • Message: Il cliente ha già pagato la modifica del piano precedente. Verrà applicata a breve.
  • PLAN_CHANGE_PAYMENT_IN_PROGRESS
    • Trigger: Una modifica del piano con cancel_older_payment_link: true mentre il cliente sta pagando la modifica del piano precedente, ad esempio durante 3D Secure. Riprova dopo che il pagamento è stato completato o non è andato a buon fine.
    • Message: Il cliente sta pagando ora la modifica del piano precedente. Riprova più tardi.
  • SCHEDULE_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • Trigger: Programmazione di una modifica del piano tramite il Customer Portal mentre l’azienda l’ha disabilitata
    • Message: La programmazione delle modifiche del piano è disabilitata per questa azienda.
  • SCHEDULED_PLAN_CHANGE_EXISTS
    • Trigger: Creazione di una modifica del piano programmata quando ne esiste già una
    • Message: Esiste già una modifica del piano programmata per questo abbonamento. Annulla la modifica programmata esistente prima di crearne una nuova.
  • SCHEDULED_PLAN_CHANGE_NOT_FOUND
    • Trigger: Riferimento o annullamento di una modifica del piano programmata che non esiste
    • Message: Nessuna modifica del piano programmata trovata per questo abbonamento.
  • SUBSCRIPTION_EXPIRED
    • Trigger: Addebito di un abbonamento dopo la data expires_at
    • Message: L’abbonamento è scaduto, non è possibile creare nuovi addebiti
  • SUBSCRIPTION_HAS_NO_PAYMENT_METHOD
    • Trigger: Nuovo tentativo manuale per un abbonamento che non dispone di un metodo di pagamento salvato per l’addebito off-session
    • Message: Questo abbonamento non dispone di un metodo di pagamento salvato per l’addebito
  • SUBSCRIPTION_INACTIVE
    • Trigger: Lo stato dell’abbonamento non è active
    • Message: L’abbonamento non è attivo (oppure) Questo abbonamento non è attivo, quindi non è possibile programmare una cancellazione
  • SUBSCRIPTION_NOT_ON_DEMAND
    • Trigger: Un’azione on-demand su un abbonamento con addebito a intervallo fisso
    • Message: L’abbonamento non è già on-demand
  • SUBSCRIPTION_PAYMENT_RETRY_LIMIT_EXCEEDED
    • Trigger: I nuovi tentativi di pagamento dell’abbonamento hanno superato il numero massimo di tentativi
    • Message: Limite massimo di 10 tentativi superato per questo abbonamento

Clienti e blocklist

  • CUSTOMER_ALREADY_BLOCKED
    • Trigger: Blocco di un cliente già presente nella blocklist e che non ha più abbonamenti attivi da cancellare (HTTP 409)
    • Message: Questo cliente è già nella blocklist
  • PORTAL_ACTION_NOT_PERMITTED
    • Trigger: Un cliente bloccato chiama una route di scrittura del Customer Portal: cancellazione, pausa, ripresa, modifica del piano o aggiornamento del metodo di pagamento (HTTP 403). Le route di lettura rimangono disponibili. Il codice e il messaggio non indicano deliberatamente alcuna causa.
    • Message: Questa azione non è disponibile.

Prodotti, carrello e brand

  • BRAND_ALREADY_ARCHIVED
    • Trigger: Archiviazione di un brand già archiviato
    • Message: Il brand è già archiviato
  • BRAND_ARCHIVED
    • Trigger: Aggiornamento di un brand archiviato, invio per la verifica o assegnazione di un nuovo prodotto, raccolta di prodotti o abbonamento
    • Message: Il brand è archiviato (oppure) Il brand è archiviato e non può essere aggiornato (oppure) Il brand è archiviato e non può essere inviato per la verifica
  • BRAND_ARCHIVE_TARGET_REQUIRED
    • Trigger: Archiviazione di un brand che contiene ancora prodotti, abbonamenti attivi o raccolte di prodotti senza una destinazione move_products_to
    • Message: Il brand contiene {count} prodotto/i. Imposta move_products_to su un brand di destinazione per riassegnarli. Il messaggio indica invece gli abbonamenti attivi o le raccolte di prodotti quando sono questi a impedire l’archiviazione.
  • BRAND_MISMATCH
    • Trigger: Gli articoli del carrello appartengono a brand diversi
    • Message: Tutti gli articoli nel carrello dei prodotti devono appartenere allo stesso brand
  • BRAND_NOT_ENABLED
    • Trigger: Il brand è disabilitato o non è attivo
    • Message: Il brand fornito non è abilitato
  • BRAND_SUBMISSION_NOT_ENABLED
    • Trigger: La funzionalità di reinvio della verifica del brand non è abilitata
    • Message: Brand verificatin resubmission is not enabled (scritto esattamente come restituito dall’API)
  • CANNOT_ARCHIVE_PRIMARY_BRAND
    • Trigger: Archiviazione del brand principale, il cui ID del brand corrisponde all’ID dell’azienda
    • Message: Il brand principale non può essere archiviato
  • FILE_IN_USE
    • Trigger: Eliminazione di un file di prodotto digitale ancora referenziato da concessioni di entitlement attive
    • Message: Il file digitale è referenziato da concessioni attive
  • INVALID_BRAND_ARCHIVE_TARGET
    • Trigger: move_products_to indica il brand da archiviare, un brand archiviato o un brand di un’altra azienda
    • Message: move_products_to deve essere un brand di questa azienda che non sia archiviato (oppure) move_products_to non può essere il brand da archiviare
  • INVALID_SUGGESTED_PRICE
    • Trigger: Un prezzo suggerito Pay What You Want è inferiore al prezzo minimo
    • Message: Il prezzo suggerito non può essere inferiore al prezzo minimo. Nel caso di pay what you want, il prezzo è considerato l’importo minimo accettato
  • LOCALIZED_PRICE_ALREADY_EXISTS
    • Trigger: Esiste già un prezzo localizzato per questo prodotto e paese o valuta
    • Message: Esiste già un prezzo localizzato per questo prodotto e paese/valuta
  • LOCALIZED_PRICE_DUPLICATES_BASE
    • Trigger: Il prezzo localizzato duplica la valuta o il paese di base del prodotto
    • Message: Il prezzo localizzato duplica la valuta/il paese di base del prodotto
  • LOCALIZED_PRICE_SHAPE_MISMATCH
    • Trigger: La struttura del prezzo localizzato non corrisponde a pricing_mode del prodotto
    • Message: La struttura del prezzo localizzato non corrisponde a pricing_mode del prodotto
  • MISSING_PRODUCT_INFORMATION
    • Trigger: Il prodotto esiste, ma mancano informazioni obbligatorie
    • Message: Il prodotto {id} esiste, ma mancano altre informazioni obbligatorie o non sono valide
  • PAY_AS_YOU_WANT_AMOUNT_REQUIRED
    • Trigger: Manca l’importo per un prodotto Pay What You Want
    • Message: L’importo è obbligatorio per un prodotto pay as you want
  • PRODUCT_CART_EMTPY
    • Trigger: Viene inviato un carrello di prodotti vuoto
    • Message: product_cart è vuoto (il codice di errore è scritto intenzionalmente EMTPY per corrispondere al valore esatto restituito dall’API)
  • PRODUCT_COLLECTION_IS_DELETED
    • Trigger: Operazione su una raccolta di prodotti che è stata eliminata
    • Message: Nessun messaggio
  • PRODUCT_COLLECTION_MUST_HAVE_PRODUCTS
    • Trigger: Rimozione dell’ultimo prodotto o dell’ultimo gruppo con prodotti da una raccolta
    • Message: Non è possibile eliminare l’ultimo prodotto di una raccolta. Archivia invece la raccolta. (oppure) Non è possibile eliminare l’ultimo gruppo con prodotti. Archivia invece la raccolta.
  • PRODUCT_IS_DELETED
    • Trigger: Il prodotto è stato eliminato
    • Message: Nessun messaggio
  • PRODUCT_PRICING_MODE_REQUIRED
    • Trigger: Aggiunta di prezzi localizzati prima che pricing_mode del prodotto sia impostato
    • Message: pricing_mode del prodotto deve essere impostato prima di aggiungere prezzi localizzati
  • SLUG_ALREADY_TAKEN
    • Trigger: Lo slug o lo short URL del prodotto richiesto è già in uso
    • Message: Lo slug è già utilizzato
  • UNABLE_TO_EDIT_PRIMARY_BRAND
    • Trigger: Tentativo di aggiornare il brand principale tramite la normale API dei brand
    • Message: Il brand principale non può essere aggiornato tramite questo endpoint API.

Sconti

  • DISCOUNT_ALREADY_USED_ON_SUBSCRIPTION
    • Trigger: Applicazione nuovamente di uno sconto già utilizzato per questo abbonamento
    • Message: Questo sconto è già stato utilizzato per questo abbonamento
  • DISCOUNT_CODE_ALREADY_EXISTS
    • Trigger: Creazione di un codice sconto già esistente
    • Message: Il codice sconto esiste già
  • DISCOUNT_CODE_EXPIRED
    • Trigger: Il codice sconto ha superato la data expires_at
    • Message: Il codice sconto è scaduto
  • DISCOUNT_CODE_USAGE_LIMIT_EXCEEDED
    • Trigger: Il codice sconto viene utilizzato dopo il raggiungimento di usage_limit
    • Message: Il limite di utilizzo non può essere inferiore a times_used (oppure) Il codice sconto ha raggiunto il limite di utilizzo
    • Note: Terminale. Il codice è esaurito, quindi non riprovare.
  • DISCOUNT_CONCURRENT_REDEMPTION
    • Trigger: Un’altra redemption dello stesso codice ha mantenuto troppo a lungo il lock del limite di utilizzo (HTTP 503)
    • Message: Lo sconto è in fase di redemption simultanea; riprova
    • Note: Temporaneo. Il codice potrebbe avere ancora disponibilità, quindi la richiesta può essere ripetuta senza rischi. Non mostrare questo messaggio al cliente come se il codice fosse esaurito.
  • DISCOUNT_CURRENCY_OPTION_INVALID
    • Trigger: currency_options non valido durante la creazione o l’aggiornamento
    • Message: Uno sconto flat richiede almeno un’opzione di valuta con un valore predefinito risolvibile (oppure) Non sono consentite opzioni di valuta duplicate (oppure) È possibile contrassegnare come predefinita una sola opzione di valuta
  • DISCOUNT_CUSTOMER_NOT_ELIGIBLE
    • Trigger: Il cliente non soddisfa customer_eligibility del codice (first_time, existing o non è presente nella allow list di un codice specific)
    • Message: Il cliente non è idoneo per questo codice sconto
  • DISCOUNT_MINIMUM_SUBTOTAL_NOT_MET
    • Trigger: Il subtotale del carrello è inferiore a minimum_subtotal configurato per la valuta del checkout
    • Message: Il subtotale del carrello è inferiore al subtotale minimo richiesto dallo sconto
  • DISCOUNT_NOT_YET_ACTIVE
    • Trigger: Il codice viene utilizzato prima della data starts_at
    • Message: Il codice sconto non è ancora attivo (starts_at è nel futuro)
  • DISCOUNT_PER_CUSTOMER_USAGE_LIMIT_EXCEEDED
    • Trigger: Il cliente ha già utilizzato il codice per_customer_usage_limit volte
    • Message: Limite di utilizzo per cliente superato per questo codice sconto
  • DISCOUNT_NOT_APPLICABLE_TO_NEW_PRODUCT
    • Trigger: Modifica del piano a un prodotto a cui lo sconto esistente non si applica
    • Message: Lo sconto non è applicabile al prodotto del nuovo piano
  • DISCOUNT_NOT_AVAILABLE_FOR_ON_DEMAND
    • Trigger: Il codice viene applicato a un abbonamento on-demand
    • Message: Il coupon sconto non è disponibile per gli abbonamenti on-demand
  • DISCOUNT_NOT_AVAILABLE_FOR_PRODUCT
    • Trigger: Il codice viene applicato a prodotti che non copre
    • Message: Il coupon sconto non è disponibile per questo prodotto
  • INVALID_DISCOUNT_CODE
    • Trigger: Il codice non esiste oppure non si applica ad alcun prodotto nel carrello
    • Message: Codice sconto non valido (oppure) Il codice sconto non può essere applicato ad alcun prodotto nel carrello
  • INVALID_PERCENTAGE
    • Trigger: La percentuale è superiore al 100% (10.000 punti base)
    • Message: L’importo percentuale non può essere superiore a 10000 (oppure) L’importo del codice sconto non può essere superiore al 100%
  • UNSUPPORTED_DISCOUNT_TYPE
    • Trigger: Un tipo di sconto non supportato. percentage e flat sono entrambi supportati; gli sconti con importo per unità non lo sono.
    • Message: Sono supportati solo i codici sconto percentuali e flat (oppure) Al momento sono supportati solo i codici sconto percentuali

Chiavi di licenza

  • ACTIVATION_LIMIT_LESS_THAN_CURRENT_AMOUNT
    • Trigger: Il nuovo limite di attivazione di una chiave di licenza è inferiore al numero attuale di istanze
    • Message: Il nuovo limite di attivazione non può essere inferiore al numero attuale di istanze
  • INACTIVE_LICENSE_KEY
    • Trigger: Lo stato della chiave di licenza non è active
    • Message: La chiave di licenza non è attiva
  • LICENSE_KEY_LIMIT_REACHED
    • Trigger: Il numero di attivazioni ha raggiunto il limite di attivazione
    • Message: Limite di attivazione della chiave di licenza raggiunto
  • LICENSE_KEY_NOT_FOUND
    • Trigger: L’ID dell’istanza o l’ID della chiave di licenza non è valido
    • Message: L’istanza della chiave di licenza non è stata trovata oppure non appartiene a questa chiave di licenza
  • NO_EXPIRY_ON_SUBSCRIPTION_LICENSE_KEYS
    • Trigger: Tentativo di impostare una data di scadenza su una chiave di licenza basata su abbonamento
    • Message: Non è possibile impostare una data di scadenza per una chiave di licenza basata su abbonamento

Fatturazione basata sull’utilizzo e meter

  • DUPLICATE_METER_IDS_IN_REQUEST
    • Trigger: Lo stesso ID del meter compare più di una volta nella richiesta
    • Message: Non sono consentiti Meter Id duplicati
  • INVALID_QUANTITY
    • Trigger: Una quantità diversa da 1 per un prodotto con pricing basato sull’utilizzo
    • Message: È consentita solo la quantità 1 nei prodotti con prezzo basato sull’utilizzo
  • METER_IS_DELETED
    • Trigger: Tentativo di utilizzare un meter eliminato
    • Message: Il meter è già stato eliminato
  • MISSING_METER_IDS
    • Trigger: L’elenco degli ID dei meter è vuoto o contiene ID non validi
    • Message: Uno o più ID dei meter non esistono: {id}

Fatturazione basata sui crediti

  • CREDIT_ENTITLEMENT_IS_DELETED
    • Trigger: Operazione su un entitlement di crediti che è stato eliminato
    • Message: L’entitlement di crediti è già stato eliminato
  • CREDIT_ENTITLEMENT_NAME_ALREADY_EXISTS
    • Trigger: Creazione di un entitlement di crediti con un nome già esistente
    • Message: Esiste già un entitlement di crediti con questo nome
  • OVERAGE_LIMIT_EXCEEDED
    • Trigger: Un utilizzo o una detrazione di crediti supererebbe il limite di overage configurato
    • Message: Limite di overage superato

Wallet

  • INSUFFICIENT_WALLET_FUNDS
    • Trigger: Il saldo del wallet è inferiore all’importo del debito
    • Message: Fondi insufficienti nel wallet
  • NEGATIVE_BALANCE_ADJUSTMENT
    • Trigger: Tentativo di rendere negativo il saldo del wallet
    • Message: Non è consentito rendere negativo il saldo del wallet

Valuta, imposte e area geografica

  • EXCHANGE_RATE_NOT_FOUND
    • Trigger: Non esiste alcun tasso di cambio per la coppia di valute
    • Message: Tasso di cambio non trovato per la conversione da {currency} a {currency}
  • INVALID_TAX_ID
    • Trigger: La verifica di VAT, GST o TIN non è riuscita
    • Message: L’ID fiscale non è valido
  • REQUEST_AMOUNT_BELOW_MINIMUM
    • Trigger: L’importo è inferiore al minimo impostato per il prodotto
    • Message: L’importo non può essere inferiore all’importo minimo specificato per il prodotto
  • TOTAL_PAYMENT_AMOUNT_BELOW_MINIMUM_AMOUNT
    • Trigger: Il totale combinato del carrello, incluse le imposte, è inferiore all’importo minimo richiesto per elaborare un pagamento. Il minimo dipende dalla valuta di fatturazione e dal fatto che il pagamento sia una tantum o un abbonamento. Per le valute diverse da USD, EUR e GBP, il totale viene verificato anche rispetto al minimo in USD. Consulta Importi minimi
    • Message: Per elaborare il pagamento è richiesto un importo minimo di {display_str}, ad esempio Minimum amount of 1.00 USD is required to process payment
  • UNSUPPORTED_BILLING_CURRENCY
    • Trigger: La valuta di fatturazione richiesta non è supportata per questo abbonamento
    • Message: Le valute di fatturazione diverse da USD non sono supportate per gli abbonamenti
  • UNSUPPORTED_COUNTRY
    • Trigger: Il paese non è supportato
    • Message: Il paese {country_name} non è attualmente supportato
  • UNSUPPORTED_CURRENCY
    • Trigger: La valuta del prodotto o dell’add-on non è una valuta in cui Dodo Payments può effettuare addebiti. I prezzi di base possono essere impostati in qualsiasi valuta addebitabile, quindi questo errore di solito indica che il codice valuta non è valido o non è supportato.
    • Message: La valuta non è attualmente supportata (oppure) Attualmente sono supportati solo prodotti in USD e INR (oppure) Per il prezzo dell’add-on sono attualmente supportati solo USD e INR (oppure) Per billing_currency è possibile richiedere solo USD o INR (oppure) Valuta non supportata (oppure) Valuta imprevista per gli abbonamenti con carta indiana
  • UNSUPPORTED_TAX_CATEGORY
    • Trigger: La categoria fiscale non è tra i valori supportati
    • Message: La categoria {category} non è attualmente supportata

Convalida e richieste

  • DUPLICATE_LINE_ITEMS_IN_REQUEST
    • Trigger: Lo stesso item_id compare più di una volta in items[]
    • Message: item_ids duplicati specificati nell’array items
  • INVALID_QUERY_PARAMS
    • Trigger: Parametri di query reciprocamente esclusivi o non validi
    • Message: I parametri di query devono contenere solo time_frame oppure (start, end) (oppure) L’inizio dell’intervallo non può essere successivo alla fine
  • INVALID_REQUEST_BODY
    • Trigger: JSON non valido o violazione dello schema
    • Message: Il body della richiesta non è valido. Controlla gli header della richiesta e l’oggetto.
  • INVALID_REQUEST_PARAMETERS
    • Trigger: Valori dei parametri formalmente validi ma semanticamente non validi, ad esempio una data nel passato
    • Message: Non è possibile impostare next_billing_date su un momento passato (oppure) Un checkout con più di un prodotto in abbonamento non può contenere prodotti una tantum (oppure) Tutti gli ID dei prodotti devono essere univoci (oppure) Gli abbonamenti on-demand non possono contenere più di un prodotto (oppure) Un checkout può contenere al massimo 20 prodotti in abbonamento (oppure) Non sono consentiti prodotti in abbonamento duplicati nello stesso checkout
  • MAXIMUM_KEYS_REACHED
    • Trigger: I metadata o i campi personalizzati superano 50 coppie chiave-valore
    • Message: Sono state superate 50 coppie chiave-valore

Generale e sistema

  • INTEGER_CONVERSION_FAILURE
    • Trigger: Una conversione lato server tra un intero e una stringa o un decimale non riesce, ad esempio quando il totale del carrello è troppo grande per essere elaborato
    • Message: Errore di conversione dell’intero (oppure) Il totale del carrello è troppo grande per essere elaborato. Riduci la quantità o seleziona una valuta di fatturazione diversa.
  • INTERNAL_SERVER_ERROR
    • Trigger: Un errore imprevisto del server. Registra i dettagli della richiesta sul tuo lato.
    • Message: Nessun messaggio pubblico (500 generico, message è solitamente null)
  • NOT_FOUND
    • Trigger: 404 generico per qualsiasi risorsa mancante
    • Message: Elemento non trovato (oppure un messaggio più specifico che indichi cosa manca)
  • TOO_MANY_REQUESTS
    • Trigger: È stato superato un rate limit (HTTP 429)
    • Message: Nessun messaggio
  • UNSUPPORTED_ACTION
    • Trigger: Un’azione non supportata dal tipo di risorsa
    • Message: La modifica dei piani per gli abbonamenti basati sull’utilizzo non è supportata

Best practice

Segui queste pratiche quando gestisci gli errori API:
  1. Gestisci ogni risposta di errore nella tua applicazione e usa code per determinare il flusso invece di message.
  2. Registra lo stato HTTP, code e message di ogni richiesta non riuscita.
  3. Mostra agli utenti finali un messaggio scritto per loro invece del valore message grezzo dell’API.
  4. Ripeti la richiesta solo per gli errori temporanei, ad esempio le risposte 429 e 5xx o DISCOUNT_CONCURRENT_REDEMPTION, dopo un intervallo.
  5. Contatta il supporto per gli errori che non riesci a risolvere.

Supporto

Per ulteriore assistenza con i codici di errore o i problemi di integrazione, contatta il team di supporto all’indirizzo support@dodopayments.com.
Ultima modifica il 8 ottobre 2026