Přeskočit na obsah

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