GoPay integrace
Platby zpracovává GoPay. Hráč platí přímo za VIP. Po vypořádání platby se VIP aktivuje a majiteli serveru se připíše výdělek (cena mínus poplatek za zpracování).
Tok platby
text
1. POST /api/orders
→ vytvoří se objednávka (PENDING) + náš záznam Payment (CREATED)
→ zavolá se GoPay, uloží se jeho payment id
→ vrátí se gw_url, hráč je přesměrován na bránu
2. Hráč zaplatí na bráně GoPay
3a. GoPay → GET /api/webhooks/gopay?id=N (server-to-server)
3b. Prohlížeč → /dashboard/orders/return (současně)
Obě větve: ověří platbu přes GoPay API → settleVipOrder():
├─ objednávka PENDING → PAID
├─ majiteli se připíše čistý výdělek, provozovateli poplatek
├─ aktivuje/prodlouží se VIP hráče
└─ zařadí se doručení pro plugin
(idempotentně přes unique index — proběhne právě jednou)Rozdělení platby
Z každého prodeje si provozovatel bere poplatek (výchozí 5 %, nastavitelný per majitel). Zbytek je čistý výdělek majitele:
text
fee = round(cena × poplatek_bps / 10000) → příjem provozovatele
net = cena − fee → výdělek majitele
Databázová podmínka vynucuje: cena = net + fee (žádné haléře se neztratí)Poplatek i sazba se snapshotují na objednávku, takže pozdější změna sazby nikdy nezmění, kolik už proběhlý prodej vyplatil.
Ověření webhooku
GoPay webhook nemá podpis. Je to nepodepsaný
GET ?id=N, který může zavolat kdokoli. Proto z něj bereme jen ID platby a stav si ověříme přímo u GoPay API. Podvržená notifikace nezpůsobí nic — jen si znovu ověříme platbu.Refundy
Refund objednávky vrátí majiteli výdělek zpět (naúčtuje záporný pohyb do jeho účetní knihy — může jít i do mínusu, pokud už peníze vyplatil) a označí objednávku jako REFUNDED. Samotné vrácení peněz hráči přes GoPay a odebrání VIP ve hře řeší administrátor ručně.
Konfigurace
.env
GOPAY_API_URL="https://gw.sandbox.gopay.com/api" # prod: gate.gopay.cz/api
GOPAY_GOID="8123456789"
GOPAY_CLIENT_ID="1234567890"
GOPAY_CLIENT_SECRET="..."Stavy plateb
text
CREATED / PAYMENT_METHOD_CHOSEN → čeká, nic se nevypořádává
AUTHORIZED → rezervováno, ale NEstrženo → nevypořádává se
PAID → vypořádá se objednávka, aktivuje VIP
CANCELED / TIMEOUTED → platba neproběhla
REFUNDED / PARTIALLY_REFUNDED → zaznamená se