Skip to main content

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:

  1. Overí parametre (ID objednávky + kontrolný kód), aby prípadný útočník nemohol iterovať čísla objednávok.
  2. Skontroluje, či objednávka existuje a nie je už zaplatená.
  3. Vytvorí novú platbu cez Comgate API.
  4. Uloží väzbu medzi objednávkou a vytvorenou platbou.
  5. Presmeruje zákazníka na platobnú bránu.

Platba tak vzniká v presnom momente, keď zákazník klikne na odkaz v e-maile.

  1. 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>"
);
  1. 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

Sekvenčný diagram
  1. E-shop odošle e-mail
  • Nezakladá platbu.
  • Obsahuje iba bezpečný odkaz na vlastný skript.
  1. Zákazník klikne na odkaz
  • Overí sa objednávka.
  • Vytvorí sa platba cez API.
  • API vráti URL platby.
  1. Expirácia platby od tohto momentu beží

  2. 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

Sekvenčný diagram

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.