Översikt
On-demand prenumerationer låter dig auktorisera en kunds betalningsmetod en gång och sedan ta ut variabla belopp när du behöver, istället för på ett fast schema. Använd denna guide för att:- Skapa en on-demand prenumeration (auktorisera ett mandat med valfritt initialt pris)
- Utlösa efterföljande avgifter med anpassade belopp
- Spåra resultat med hjälp av webhooks
Förutsättningar
- Dodo Payments handelskonto och API-nyckel
- Webhook-hemlighet konfigurerad och en slutpunkt för att ta emot händelser
- En prenumerationsprodukt i din katalog
Hur on-demand fungerar
- Du skapar en prenumeration med
on_demandobjektet för att auktorisera en betalningsmetod och eventuellt samla in en initial avgift. - Senare skapar du avgifter mot den prenumerationen med anpassade belopp via den dedikerade avgiftsslutpunkten.
- Du lyssnar på webhooks (t.ex.
payment.succeeded,payment.failed) för att uppdatera ditt system.
Skapa en on-demand prenumeration
Slutpunkt: POST /subscriptions Nyckelfält i begäran (kropp):Begäran Kropp Parametrar
Begäran Kropp Parametrar
Produkt-ID för prenumerationen.
Antal enheter. Minst 1.
Faktureringsadress för kunden.
Antingen koppla en befintlig kund eller tillhandahålla kundinformation.
Om sant, skapar en hostad kassa-länk för mandatauktorisering och valfri initial betalning.
Var kunden ska omdirigeras efter att ha slutfört den hostade kassan.
Om sant, auktoriserar betalningsmetoden utan att ta ut avgift från kunden vid skapandet.
Initial avgiftsbelopp (i den minsta valutanheten). Om angivet, åsidosätter detta värde produktens ursprungliga pris som ställts in vid produktens skapande. Om utelämnat, används produktens lagrade pris. Exempel: för att ta ut $1.00, skicka
100.Valfritt valöverskridande för den initiala avgiften. Standardinställning är produktens valuta.
Valfritt beskrivningsöverskridande för fakturering och linjeposter.
Om sant, inkluderar adaptiva valutavgifter inom
product_price. Om falskt, läggs avgifterna till ovanpå. Ignoreras när adaptiv prissättning är inaktiverad.Skapa en on-demand prenumeration
- Node.js SDK
- Python SDK
- Go SDK
- cURL
Ställ in
payment_link: true, omdirigera kunden till payment_link för att slutföra mandatauktoriseringen.Success
Ta ut en on-demand prenumeration
Efter att mandatet har auktoriserats, skapa avgifter vid behov. Slutpunkt: POST /subscriptions/{subscription_id}/charge Nyckelfält i begäran (kropp):Avgiftsbegäran kropp parametrar
Avgiftsbegäran kropp parametrar
Belopp att ta ut (i den minsta valutanheten). Exempel: för att ta ut $25.00, skicka
2500.Valfritt valöverskridande för avgiften.
Valfritt beskrivningsöverskridande för denna avgift.
Om sant, inkluderar adaptiva valutavgifter inom
product_price. Om falskt, läggs avgifterna till ovanpå.Ytterligare metadata för betalningen. Om utelämnat, används prenumerationens metadata.
- Node.js SDK
- Python SDK
- Go SDK
- cURL
Success
Betalningsåterföringar
Vårt bedrägeridetekteringssystem kan blockera aggressiva återföringsmönster (och kan flagga dem som potentiell korttestning). Följ en säker återföringspolicy.Principer för säkra återföringspolicyer
- Backoff-mekanism: Använd exponentiell backoff mellan återföringar.
- Återföringsgränser: Sätt ett tak för totala återföringar (3–4 försök max).
- Intelligent filtrering: Återför endast vid återföringsbara fel (t.ex. nätverks-/utfärdarfel, otillräckliga medel); återför aldrig hårda avslag.
- Förhindra korttestning: Återför inte fel som
DO_NOT_HONOR,STOLEN_CARD,LOST_CARD,PICKUP_CARD,FRAUDULENT,AUTHENTICATION_FAILURE. - Variera metadata (valfritt): Om du upprätthåller ditt eget återföringssystem, särskilj återföringar via metadata (t.ex.
retry_attempt).
Föreslagen återföringsschema (prenumerationer)
- 1:a försök: Omedelbart när du skapar avgiften
- 2:a försök: Efter 3 dagar
- 3:e försök: Efter ytterligare 7 dagar (10 dagar totalt)
- 4:e försök (slutgiltigt): Efter ytterligare 7 dagar (17 dagar totalt)
Undvik burst-återföringar; justera till auktoriseringstid
- Ankare återföringar till den ursprungliga auktoriseringstidsstämpeln för att undvika “burst”-beteende över din portfölj.
- Exempel: Om kunden startar en provperiod eller mandat klockan 13:10 idag, schemalägg uppföljande återföringar klockan 13:10 på följande dagar enligt din backoff (t.ex. +3 dagar → 13:10, +7 dagar → 13:10).
- Alternativt, om du lagrar den senaste framgångsrika betalningstiden
T, schemalägg nästa försök vidT + X daysför att bevara tidsjusteringen.
Tidszon och sommartid: använd en konsekvent tidsstandard för schemaläggning och konvertera endast för visning för att upprätthålla intervall.
Avslag koder du inte bör återföras
STOLEN_CARDDO_NOT_HONORFRAUDULENTPICKUP_CARDAUTHENTICATION_FAILURELOST_CARD
För en omfattande lista över avslagsskäl och huruvida de kan rättas av användaren, se dokumentationen för
Transaktionsfel.
Implementeringsriktlinjer (ingen kod)
- Använd en schemaläggare/kö som bevarar exakta tidsstämplar; beräkna nästa försök vid exakt tid-of-day-offset (t.ex.
T + 3 daysvid samma HH:MM). - Upprätthåll och referera till den senaste framgångsrika betalningstidsstämpeln
Tför att beräkna nästa försök; gruppera aldrig flera prenumerationer vid samma ögonblick. - Utvärdera alltid den senaste avslagsskäl; stoppa återföringar för hårda avslag i ovanstående hoppa-lista.
- Sätt ett tak för samtidiga återföringar per kund och per konto för att förhindra oavsiktliga toppar.
- Kommunicera proaktivt: e-posta/SMS:a kunden för att uppdatera sin betalningsmetod innan nästa schemalagda försök.
- Använd metadata endast för observabilitet (t.ex.
retry_attempt); försök aldrig att “undvika” bedrägeri/risk-system genom att rotera oväsentliga fält.
Spåra resultat med webhooks
Implementera webhook-hantering för att spåra kundresan. Se Implementera Webhooks.- subscription.active: Mandat auktoriserat och prenumeration aktiverad
- subscription.failed: Skapande misslyckades (t.ex. mandatfel)
- subscription.on_hold: Prenumeration placerad på håll (t.ex. obetald status)
- payment.succeeded: Avgift lyckades
- payment.failed: Avgift misslyckades
Testning och nästa steg
1
Skapa i testläge
Använd din test-API-nyckel för att skapa prenumerationen med
payment_link: true, öppna sedan länken och slutför mandatet.2
Utlösa en avgift
Anropa avgifts-slutpunkten med en liten
product_price (t.ex. 100) och verifiera att du får payment.succeeded.3
Gå live
Byt till din live API-nyckel när du har validerat händelser och interna tillståndsuppdateringar.
Felsökning
- 422 Ogiltig begäran: Se till att
on_demand.mandate_onlytillhandahålls vid skapande ochproduct_pricetillhandahålls för avgifter. - Valuta fel: Om du åsidosätter
product_currency, bekräfta att den stöds för ditt konto och kund. - Inga webhooks mottagna: Verifiera din webhook-URL och signaturhemlighetskonfiguration.