Automatisk påfyllning av underkonto (anpassad betalningsleverantör)
Om du föredrar att hantera kreditbetalningar för underkonton via din egen leverantör istället för Stripe (banköverföringar, lokala betalväxlar, anpassade faktureringssystem), tillhandahåller plattformen ett par bestående av webhook + API så att du själv kan köra hela processen för debitering och tilldelning. Den icke-tekniska översikten finns på sidan Byråkonton; den här sidan täcker den exakta webhook-nyttolasten och det API-anrop du gör för att tilldela krediter efteråt.
Webbhooken är bara ett av sätten som automatiska påfyllningar betalas för. Om du har anslutit Stripe eller PayPal i SaaS-läge debiterar plattformen kundens sparade kort eller PayPal-konto direkt och tilldelar krediter, så det finns inget på den här sidan som du behöver bygga. Läs vidare endast om du vill hantera betalningen själv.
Flödet i korthet
- Ett underkontos kreditsaldo sjunker under deras tröskelvärde för automatisk påfyllning.
- Plattformen anropar din webhook-URL med underkontots uppgifter och hur många krediter de behöver.
- Din server debiterar kunden via den leverantör du använder.
- Din server anropar API:et för att tilldela krediter för att lägga till krediter på det underkontot.
- Din server svarar
200för att bekräfta webhooken.
1. Webhook: agency_sub_account_auto_recharge
Konfigurera webhook-URL:en genom att klicka på SaaS Mode i huvudsidofältet, välja Use a Custom Payment Provider Instead (eller, när den väl är konfigurerad, öppna kortet Custom Payment Provider), och fylla i fältet Auto-Recharge Webhook.
När den utlöses
När ett underkontos kreditsaldo sjunker under deras konfigurerade tröskelvärde för automatisk påfyllning.
Nyttolast
{
"event": "agency_sub_account_auto_recharge",
"sub_account_id": "<sub-account-id>",
"sub_account_email": "customer@example.com",
"sub_account_name": "John Doe",
"agency_id": "<agency-id>",
"credits_requested": 500,
"current_balance": 42,
"threshold": 100,
"price_per_credit_cents": 10,
"price_per_credit_currency": "usd",
"total_amount_cents": 5000,
"timestamp": "2026-04-13T12:00:00.000Z",
"idempotency_key": "auto_recharge_abc123_1681387200000"
}
| Fält | Beskrivning |
|---|---|
event |
Alltid agency_sub_account_auto_recharge för denna webhook. |
sub_account_id |
Det unika ID:t för underkontot som behöver krediter. |
sub_account_email |
Underkontots e-postadress. |
sub_account_name |
Underkontots visningsnamn. |
agency_id |
Ditt byråkontos unika ID. |
credits_requested |
Hur många krediter som ska tilldelas. Detta är ditt konfigurerade påfyllningsbelopp, men om saldot har fallit längre under tröskelvärdet än vad det beloppet skulle täcka, höjs det automatiskt till vad som krävs för att få upp saldot över tröskelvärdet igen på en gång. Debitera alltid för (och tilldela) värdet credits_requested från nyttolasten — hårdkoda inte ditt påfyllningsbelopp. |
current_balance |
Underkontots kreditsaldo vid tidpunkten då webhooken skickades. |
threshold |
Saldotröskeln som utlöste påfyllningen. |
price_per_credit_cents |
Ditt konfigurerade pris per kredit, i cent. |
price_per_credit_currency |
Valutan för priset (t.ex. usd). |
total_amount_cents |
Det totala beloppet att debitera, i cent (credits_requested × price_per_credit_cents). |
timestamp |
När webhooken skickades (ISO 8601-format). |
idempotency_key |
En unik nyckel för denna specifika påfyllningsbegäran. Använd denna för att förhindra att krediter tilldelas två gånger om din server tar emot samma webhook mer än en gång. |
Viktiga anteckningar
- 5 minuters nedkylning — Efter ett påfyllningsförsök för ett underkonto kommer plattformen inte att skicka en ny webhook för det underkontot på minst 5 minuter, även om deras saldo sjunker ytterligare. Detta förhindrar dubbla debiteringar under bearbetning.
- Använd idempotensnyckeln — Kontrollera alltid
idempotency_keyinnan du tilldelar krediter. Om din server kraschade efter att ha tilldelat krediter men innan den svarade, kan plattformen skicka om webhooken vid nästa kreditfall. - Fel är säkra och självläkande — Om din webhook-URL inte kan nås eller returnerar ett fel, tilldelas inga krediter. Plattformen fortsätter att skicka webhooken (en gång per 5-minuters nedkylning) så länge underkontot ligger under tröskelvärdet — det kräver inte att saldot först stiger över tröskelvärdet och sjunker igen. En missad debitering kan inte längre lämna ett underkonto permanent utan påfyllning.
- Ställ in ditt påfyllningsbelopp vid eller över tröskelvärdet — Ditt konfigurerade påfyllningsbelopp måste vara större än eller lika med tröskelvärdet för automatisk påfyllning, så att en påfyllning alltid återställer saldot över tröskelvärdet. (Om du någonsin behöver fixa ett underkonto som hamnat långt under tröskelvärdet, fyller plattformen automatiskt på hela underskottet — se
credits_requestedovan.)
2. API för att tilldela krediter
När din server har behandlat betalningen, anropa denna slutpunkt för att lägga till krediterna på underkontot.
Begäran
POST https://api.dmchamp.com/v1/subaccounts/credits
X-API-Key: YOUR_API_KEY
Content-Type: application/json
{
"email": "customer@example.com",
"amount": 500,
"description": "Auto-recharge via webhook"
}
| Fält | Krävs | Beskrivning |
|---|---|---|
email |
Ja | Underkontots e-postadress (måste matcha ett befintligt underkonto under din byrå). |
amount |
Ja | Antalet krediter som ska tilldelas. |
description |
Nej | En anteckning som beskriver varför krediter lades till (visas i kredittransaktionshistoriken). |
Autentisering: Skicka din API-nyckel i en begärandehuvud — antingen X-API-Key: YOUR_API_KEY eller Authorization: Bearer YOUR_API_KEY. Huvuden är det rekommenderade sättet, eftersom en nyckel i URL:en hamnar i webbläsarhistorik, proxyloggar och serveråtkomstloggar. Frågeparametern ?apiKey=YOUR_API_KEY och ett apiKey-fält i JSON-kroppen fungerar fortfarande, så äldre integrationer fortsätter att fungera oförändrade.
Svar
{
"success": true,
"sub_account_id": "abc123xyz",
"credits_added": 500,
"new_balance": 542
}
Tips: Spara idempotency_key från webhook-nyttolasten och kontrollera den innan du anropar denna slutpunkt. Detta förhindrar att krediter av misstag beviljas två gånger om din server tar emot samma webhook mer än en gång.
Vad händer med beviljade krediter vid den månatliga återställningen
Detta beror på hur underkontot är konfigurerat:
- Återförsäljning (underkontot betalar dig för krediter): krediter som du beviljar här registreras som köpta krediter och överförs varje månad. Det som underkontot inte har förbrukat stannar kvar på saldot.
- Tilldelning (du ger underkontot en månatlig kvot): saldot fylls på till den månatliga kvoten på återställningsdatumet, så allt som inte förbrukats överförs inte. Detta är avsiktligt – kvoten beviljas på nytt varje månad.
Om du vill att ett underkontos kvarvarande saldo ska läggas till utöver dess nya månatliga kvot istället för att ersätta den, aktivera kreditöverföring:
PUT https://api.dmchamp.com/v1/subaccounts/{subAccountUid}/limits
X-API-Key: YOUR_API_KEY
Content-Type: application/json
{
"usageLimits": { "roll_over_to_next_month": true }
}
Om underkontot – eller abonnemanget det tillhör – också har en gräns för överföring eller ett utgångsdatum, sker återställningen i det ögonblick dessa tillämpas: den överförda kvoten trimmas till det antal månader du tillåter, och kvot som lämnats oanvänd längre än utgångsperioden tas bort innan den nya kvoten läggs till. Krediter som beviljas via denna slutpunkt, automatiska påfyllningar och kundens egna påfyllningar är engångskrediter och trimmas aldrig. Se Begränsa vad som överförs.
Exempel från början till slut
En typisk hanterare ser ut så här:
on POST /your-recharge-webhook:
payload = request.body
if seen(payload.idempotency_key):
return 200 // already processed, ack and exit
charge_result = your_payment_provider.charge(
email = payload.sub_account_email,
amount_cents = payload.total_amount_cents,
currency = payload.price_per_credit_currency,
)
if not charge_result.ok:
return 500 // platform will retry on next balance drop
api.post("/v1/subaccounts/credits", {
email = payload.sub_account_email,
amount = payload.credits_requested,
description = "Auto-recharge via " + your_provider_name,
})
mark_seen(payload.idempotency_key)
return 200