QR Pay
Přihlásit seZačít zdarma

Jak to funguje

Od QR kódu k potvrzení
za méně než 60 sekund

Technický popis celého procesu — od vygenerování SPD QR kódu přes polling Fio API až po webhook notifikaci.

Krok 1

Fio read-only token

V Fio Internet Bankingu vygenerujete read-only API token. Token umožňuje pouze čtení výpisů z účtu přes REST API — žádné odchozí platby nejsou možné.

Token zadáte do QR Pay dashboardu jednou. My jej uložíme šifrovaně přes Supabase Vault (pgsodium / AES-256-GCM) — nikdo ho nemůže přečíst v plaintextu.

Token expirace: Fio token platí 180 dní od posledního přihlášení do IB. QR Pay vás upozorní emailem 14 dní před expirací.

Fio API endpoint

GET /v1/rest/periods/{token}/{dateFrom}/{dateTo}/transactions.json

// Rate limit: min. 30 sekund mezi requesty
// Response: { accountStatement: { transactionList: [...] } }
// column5 = VS, column1 = částka

Krok 2

SPD QR kód a widget

Widget vložíte do e-shopu dvěma řádky JavaScriptu. Při vytvoření objednávky zavoláte naše API a dostanete URL widgetu.

Widget zobrazí QR kód ve formátu SPD (Short Payment Descriptor) — standardu pro QR platby v ČR. Zákazník zaplatí přes mobilní banku jedním skenem.

Každá platba má unikátní variabilní symbol (VS) — 10místné číslo generované z timestampu. Při ověření kontrolujeme VS i částku zároveň.

SPD formát

SPD*1.0*
ACC:CZ6520100000002000160517+FIOBCZPPXXX*
AM:1299.00*
CC:CZK*
X-VS:2024061203*
MSG:Objednavka 1234

Embed snippet

<script src="https://cdn.qrpay.cz/widget.js"></script>
<div data-qrpay-order="ord_abc123"></div>

Krok 3

Polling a ověření platby

QR Pay periodicky volá Fio API (každých 30 sekund — minimální interval Fio). Pro každou příchozí transakci ověřujeme:

  • VS (variabilní symbol) se shoduje s čekající objednávkou
  • Částka se shoduje přesně (tolerance 0,001 Kč)
  • Transakce přišla po vzniku objednávky

Objednávka expiruje po 2 hodinách. Pokud platba nedorazí včas, stav se změní na expired.

Matching logika

// Oba parametry musí souhlasit
if (tx.column5?.value === order.vs &&
    Math.abs(tx.column1.value - amountCzk) < 0.001) {
  // ✓ Platba ověřena
  await markOrderPaid(order.id, tx.transactionId);
}

Audit log: Každý polling pokus je zaznamenán v tabulce poll_attempts pro případné ladění.

Krok 4

Webhook notifikace

Jakmile je platba potvrzena, zavoláme váš webhook URL. Notifikace obsahuje HMAC-SHA256 podpis v hlavičce X-QRPay-Signature.

Webhook se opakuje max. 5 krát s exponenciálním backoffem, pokud váš server nevrátí HTTP 2xx.

Zobrazit dokumentaci webhooků →

Webhook payload

POST https://vas-eshop.cz/webhook/qrpay
X-QRPay-Signature: sha256=abc123...

{
  "event": "payment.confirmed",
  "order_id": "ord_abc123",
  "vs": "2024061203",
  "amount_czk": 1299.00,
  "paid_at": "2026-06-09T14:32:11Z"
}

Připraveni integrovat?

Celá integrace trvá méně než 5 minut. Začněte s dokumentací.

Přečíst dokumentaciZačít zdarma