Alitilin automaattinen lataus (mukautettu maksupalveluntarjoaja)
Jos haluat hoitaa alitilien krediittimaksut oman palveluntarjoajasi kautta Stripin sijaan (pankkisiirrot, paikalliset maksunvälittäjät, mukautetut laskutusjärjestelmät), alusta tarjoaa webhook- ja API-parin, joiden avulla voit suorittaa koko veloitus- ja myöntämisprosessin itse. Ei-tekninen yleiskatsaus löytyy Agency Accounts -sivulta; tämä sivu käsittelee webhookin tarkkaa hyötykuormaa ja API-kutsua, jonka teet krediittien myöntämiseksi sen jälkeen.
Webhook on vain yksi tapa, jolla automaattiset täydennykset maksetaan. Jos yhdistit Stripe- tai PayPal-tilin SaaS-tilassa, alusta veloittaa asiakkaan tallennetun kortin tai PayPal-tilin automaattisesti ja myöntää krediitit, joten tällä sivulla ei ole mitään, mitä sinun tarvitsisi rakentaa. Jatka lukemista vain, jos haluat hoitaa maksun itse.
Prosessi lyhyesti
- Alitilin krediittisaldo laskee automaattisen latauksen kynnyksen alapuolelle.
- Alusta kutsuu webhook-URL-osoitettasi alitilin tiedoilla ja tiedolla siitä, kuinka monta krediittiä se tarvitsee.
- Palvelimesi veloittaa asiakasta käyttämäsi palveluntarjoajan kautta.
- Palvelimesi kutsuu Grant Credits API -rajapintaa lisätäkseen krediitit kyseiselle alitilille.
- Palvelimesi vastaa
200vahvistaakseen webhookin vastaanotetuksi.
1. Webhook: agency_sub_account_auto_recharge
Määritä webhook-URL napsauttamalla SaaS Mode pääsivupalkista, valitsemalla Use a Custom Payment Provider Instead (tai avaamalla Custom Payment Provider -kortti, kun se on määritetty) ja täyttämällä Auto-Recharge Webhook -kenttä.
Milloin se laukeaa
Kun alitilin krediittisaldo laskee määritetyn automaattisen latauksen kynnyksen alapuolelle.
Hyötykuorma
{
"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"
}
| Kenttä | Kuvaus |
|---|---|
event |
Aina agency_sub_account_auto_recharge tälle webhookille. |
sub_account_id |
Krediittejä tarvitsevan alitilin yksilöllinen ID. |
sub_account_email |
Alitilin sähköpostiosoite. |
sub_account_name |
Alitilin näyttönimi. |
agency_id |
Agency-tilisi yksilöllinen ID. |
credits_requested |
Myönnettävien krediittien määrä. Tämä on määritetty lataussummasi, mutta jos saldo on laskenut kynnysarvon alapuolelle enemmän kuin kyseinen summa kattaisi, se nostetaan automaattisesti siihen määrään, joka tarvitaan saldon nostamiseksi takaisin kynnyksen yläpuolelle yhdellä kertaa. Veloita (ja myönnä) aina hyötykuorman credits_requested-arvon mukaisesti — älä kovakoodaa lataussummaasi. |
current_balance |
Alitilin krediittisaldo webhookin lähetyshetkellä. |
threshold |
Latauksen laukaissut saldokynnys. |
price_per_credit_cents |
Määritetty hinta per krediitti sentteinä. |
price_per_credit_currency |
Hinnan valuutta (esim. usd). |
total_amount_cents |
Veloitettava kokonaissumma sentteinä (credits_requested × price_per_credit_cents). |
timestamp |
Webhookin lähetysajankohta (ISO 8601 -muoto). |
idempotency_key |
Yksilöllinen avain tätä latauspyyntöä varten. Käytä tätä estääksesi krediittien myöntämisen kahdesti, jos palvelimesi vastaanottaa saman webhookin useammin kuin kerran. |
Tärkeitä huomautuksia
- 5 minuutin jäähtymisaika — Alitilin latausyrityksen jälkeen alusta ei lähetä uutta webhookia kyseiselle alitilille vähintään 5 minuuttiin, vaikka saldo laskisi entisestään. Tämä estää päällekkäiset veloitukset käsittelyn aikana.
- Käytä idempotenssiavainta — Tarkista aina
idempotency_keyennen krediittien myöntämistä. Jos palvelimesi kaatui krediittien myöntämisen jälkeen mutta ennen vastaamista, alusta saattaa lähettää webhookin uudelleen seuraavan saldon laskun yhteydessä. - Virheet ovat turvallisia ja itsekorjautuvia — Jos webhook-URL-osoitteesi ei ole tavoitettavissa tai se palauttaa virheen, krediittejä ei myönnetä. Alusta jatkaa webhookin lähettämistä (kerran 5 minuutin jäähtymisajalla), niin kauan kuin alitili pysyy kynnyksen alapuolella — se ei vaadi, että saldon täytyisi ensin nousta kynnyksen yläpuolelle ja laskea uudelleen. Yksittäinen epäonnistunut veloitus ei voi enää jättää alitiliä pysyvästi ilman latausta.
- Aseta lataussumma kynnyksen tasolle tai sen yläpuolelle — Määritetyn lataussummasi on oltava suurempi tai yhtä suuri kuin automaattisen latauksen kynnys, jotta yksi lataus palauttaa saldon aina kynnyksen yläpuolelle. (Jos joudut korjaamaan alitilin, joka on pudonnut kauas kynnyksen alapuolelle, alusta täydentää sen automaattisesti koko vajeen verran — katso
credits_requestedyllä.)
2. Grant Credits API
Kun palvelimesi on käsitellyt maksun, kutsu tätä päätepistettä lisätäksesi krediitit alitilille.
Pyyntö
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"
}
| Kenttä | Pakollinen | Kuvaus |
|---|---|---|
email |
Kyllä | Alitilin sähköpostiosoite (täytyy vastata olemassa olevaa alitiliä agencysi alla). |
amount |
Kyllä | Myönnettävien krediittien määrä. |
description |
Ei | Huomautus, joka kuvaa krediittien lisäämisen syytä (näkyy krediittien tapahtumahistoriassa). |
Todennus: Lähetä API-avaimesi pyynnön otsikossa – joko X-API-Key: YOUR_API_KEY tai Authorization: Bearer YOUR_API_KEY. Otsikot ovat suositeltu tapa, koska URL-osoitteessa oleva avain päätyy selaimen historiaan, välityspalvelimen lokeihin ja palvelimen pääsylokeihin. ?apiKey=YOUR_API_KEY-kyselyparametri ja apiKey-kenttä JSON-rungossa toimivat myös edelleen, joten vanhemmat integraatiot jatkavat toimintaansa muuttumattomina.
Vastaus
{
"success": true,
"sub_account_id": "abc123xyz",
"credits_added": 500,
"new_balance": 542
}
Vinkki: Tallenna idempotency_key webhook-hyötykuormasta ja tarkista se ennen tämän päätepisteen kutsumista. Tämä estää hyvitysten myöntämisen vahingossa kahdesti, jos palvelimesi vastaanottaa saman webhookin useammin kuin kerran.
Mitä myönnetyille krediiteille tapahtuu kuukausittaisessa nollauksessa
Tämä riippuu siitä, miten alitili on määritetty:
- Jälleenmyynti (alitili maksaa sinulle krediiteistä): tässä myöntämäsi krediitit kirjataan ostetuiksi krediiteiksi ja ne siirtyvät joka kuukausi. Kaikki se, mitä alitili ei ole käyttänyt, jää saldoon.
- Allokointi (annat alitilille kuukausittaisen kiintiön): saldo täydennetään kuukausittaiseen kiintiöön nollauspäivänä, joten käyttämättä jäänyt osuus ei siirry eteenpäin. Tämä on tarkoituksellista – kiintiö myönnetään uudelleen joka kuukausi.
Jos haluat, että alitilin jäljelle jäänyt saldo lisätään uuden kuukausittaisen kiintiön päälle sen sijaan, että se korvattaisiin, ota krediittien siirto käyttöön:
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 }
}
Jos alitilillä – tai sen tilauspaketilla – on myös siirtojen yläraja tai vanhenemisaika, nollaus tapahtuu sillä hetkellä, kun nämä astuvat voimaan: siirrettävää saldoa karsitaan sallittujen kuukausien mukaisesti, ja vanhenemisikkunaa pidempään käyttämättä jäänyt saldo poistetaan ennen uuden saldon lisäämistä. Tämän päätepisteen kautta myönnetyt krediitit, automaattiset lataukset ja asiakkaan omat täydennykset ovat kertaluonteisia krediittejä, eikä niitä koskaan karsita. Katso Siirtojen ylärajan määrittäminen.
Päästä päähän -esimerkki
Tyypillinen käsittelijä näyttää tältä:
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