Platobná brána prostredníctvom odkazu
Ako generovať odkaz na platbu v e-maile (bez rizika expirácie platby)?
E-shopy často potrebujú zákazníkovi poslať odkaz na zaplatenie e-mailom. Zákazník si však môže e-mail prečítať až po dlhšom časovom odstupe. Keby e-shop vytvoril platbu v systéme Comgate už pri odoslaní e-mailu, platba by už mala nastavenú expiráciu. Mohla by nastať situácia, že zákazník e-mail otvorí neskoro a platbu už nestihne zaplatiť. Preto by mal e-shop posielať e-mailom odkaz, ktorý platbu založí až v momente, keď naň zákazník klikne.
Typickými príkladmi zaslania odkazu na úhradu sú:
- zaslanie faktúry
- pripomenutie nezaplatenej objednávky
- ručné vytvorenie objednávky operátorom
- obnovenie zrušenej alebo neúspešnej platby
Správne riešenie: Generovanie platby až pri kliknutí zákazníka v e-maile
Namiesto priameho odkazu na platobnú bránu sa do e-mailu vloží odkaz na skript vášho e-shopu, napríklad:
<a href="www.eshop.cz/generuj-platbu.php?objednavka=112233&token=we498xvrgh4b9we">Zaplatiť objednávku</a>
Tento skript: Ak e-shop založí platbu okamžite pri odoslaní e-mailu:
- Overí parametre (ID objednávky + kontrolný kód), aby prípadný útočník nemohol iterovať čísla objednávok.
- Skontroluje, či objednávka existuje a nie je už zaplatená.
- Vytvorí novú platbu cez Comgate API.
- Uloží väzbu medzi objednávkou a vytvorenou platbou.
- Presmeruje zákazníka na platobnú bránu.
Platba tak vzniká v presnom momente, keď zákazník klikne na odkaz v e-maile.
- V e-maile pošlete odkaz na váš endpoint.
<?php
// Vytvorte ID objednávky a bezpečný token
$order_id = 112233;
$secure_token = bin2hex(random_bytes(16)); // Minimálny token, v praxi dlhší a uložený v DB
// Zostavenie odkazu
$link = "https://eshop.cz/pay?order={$order_id}&token={$secure_token}";
// Odoslanie e-mailu (pre produkciu použite lepšiu knižnicu než mail())
mail(
"zakaznik@priklad.cz",
"Platba za objednávku 112233",
"Zaplaťte tu: " . $link,
"From: Obchod <odesilatel@eshop.cz>"
);
- Po príchode zákazníka na endpoint
https://eshop.cz/pay?order=<id>&token=<secureToken>
<?php
// Získanie parametrov z URL
$order_id = intval($_GET['order']) ?? null;
$secure_token = $_GET['token'] ?? null;
// Načítanie objednávky z DB
$orderData = $this->db->query(
"SELECT amount, currency, email, secure_token, status FROM objednavka WHERE id = :order_id AND token = :token",
['order_id' => $order_id, 'token' => $secure_token]
);
// napr. použitie PHP SDK https://github.com/comgate-payments/sdk-php
$comgateSDKclient = Comgate::defaults()
->setMerchant('123456')
->setSecret('foobarbaz')
->createClient();
$payment = new Payment();
$payment
->setPrice(Money::ofInt($orderData['amount']))
->setCurrency($orderData['currency'])
->setEmail($orderData['email'])
->setFullName(...)
...
try {
$createPaymentResponse = $comgateSDKclient->createPayment($payment);
if ($createPaymentResponse->getCode() === RequestCode::OK) {
$this->db->query("INSERT INTO platba_objednavky (objednavka_id, kod_platby, ...) VALUES ...");
// Presmerovanie zákazníka na platobnú bránu
Helpers::redirect($createPaymentResponse->getRedirect()); // header("Location: " . $redirect_url)
} else {
var_dump($createPaymentResponse->getMessage());
}
} catch (ApiException $e) {
var_dump($e->getMessage());
}
Ďalšie informácie k metóde create.
Sekvenčný diagram procesu
- E-shop odošle e-mail
- Nezakladá platbu.
- Obsahuje iba bezpečný odkaz na vlastný skript.
- Zákazník klikne na odkaz
- Overí sa objednávka.
- Vytvorí sa platba cez API.
- API vráti URL platby.
-
Expirácia platby od tohto momentu beží
-
Zákazník zaplatí
- Objednávka sa označí ako zaplatená.
Bezpečnostné opatrenia
Aby ste zabránili situácii, keď by si útočník chcel prezerať všetky vaše objednávky iba zmenou ID objednávky v URL, pridajte kontrolný token.
- Nepoužívajte iba samotné ID objednávky.
- Vždy používajte kontrolný kód, token alebo podpísaný odkaz.
- Token by mal byť:
- náhodný,
- dostatočne dlhý,
- časovo neobmedzený alebo s jasne definovanou platnosťou.
Problém: Platba vytvorená príliš skoro
Ak e-shop založí platbu okamžite pri odoslaní e-mailu:
- platba má obmedzenú dobu platnosti (napr. niekoľko dní),
- zákazník si môže e-mail prečítať neskoro,
- platba už môže byť neplatná,
- doba expirácie platby začína plynúť okamžite od jej vytvorenia.