Přeskočit na hlavní obsah

Platební brána v e-shopu

Platební brána umožňuje zobrazení optimalizované pro iframe. Tato funkcionalita je vhodná v případě, že nechcete plátce přesměrovávat na platební bránu, ale zobrazit ji v rámci svého systému. Aby se platební brána zobrazila v iframu, je potřeba při založení platby použít parametr "embedded" = true. Platební URL je vygenerována standardním způsobem, ale místo přesměrování zákazníka na bránu se zobrazí na stránce e-shopu iframe s platební URL.

Pro zobrazení jsou dvě možnosti. Jednak je možné platební bránu zobrazit přímo v košíku nebo pomocí vyskakovacího okna nad vaší webovou stránkou. Implementace iframu vyžaduje znalost webových technologií. Iframe je možné použít pouze pro platbu kartou. U ostatních platebních metod dojde vždy k přesměrování plátce na novou stránku.

Upozornění

V případě, že používáte na svém webu hlavičku Content-Security-Policy, je třeba povolit všechny externí kontexty v iframe. O této konfiguraci píšeme v sekci Zabezpečení.

Pro správné zobrazení platební brány v iframu na webové stránce doporučujeme provést následující úpravu vašich webových stránek.

HTML kód

<div id="comgate-container">
<!-- Atribut allow=payment je pro zobrazení brány v iframe nezbytný -->
<iframe id='comgate-iframe' allow="payment" src="[platební URL]" frameborder="0px"></iframe>
</div>

CSS styly

#comgate-container {
display: none;
position:absolute;
z-index: 9999;
left: 50%;
top: 30px;
overflow: auto;
margin-left: -250px;
}
#comgate-iframe {
width: 504px;
height: 679px;
}
@media (max-height: 700px) {
#comgate-iframe {
top: 0px;
}
}

Javascriptový kód

// funkce pro otevření iframu s bránou
function comgateOpen() {
let comgate_container = document.getElementById("comgate-container");
comgate_container.style.display = "block";
}
// funkce pro zavření iframu s bránou
function comgateClose() {
let comgate_container = document.getElementById("comgate-container");
comgate_container.style.display = "none";

// bude odstraněno z DOM - již nepůjde zobrazit znovu pomocí comgateOpen
// let comgate_iframe = document.getElementById("comgate-iframe");
// comgate_iframe.remove();
}

Pro zobrazení iframu je třeba zavolat funkci comgateOpen(). Například navázáním na uživatelskou akci (kliknutí na tlačítko apod.). Funkce comgateClose() pak slouží pro případné skrytí iframu.

Příklad zavolání funkce pro zobrazení iframu kliknutím na tlačítko "Zaplatit":

<button id="comgate-open" onclick="comgateOpen()">Zaplatit</button>

Přesměrování zákazníka po dokončení platby

Po dokončení platby zákazníkem dochází (pouze v čase do 1 hodiny od založení) k jeho automatickému přesměrování do e-shopu na URL, která byla nastavena v klientském portálu (do 5 minut od založení platby je vyřízeno více než 97 % plateb).

Doporučujeme provést jednu z následujících úprav, která zajistí, že zákazník bude přesměrován přímo na návratovou URL a nezůstane tak uvnitř iframu.

1. Přesměrování vnější stránky na vámi určenou URL

Tímto dojde k obnovení celé stránky a zákazník neuvázne v iframu otevřeném na stránce. Dnes se již ale nejedná o doporučovaný způsob.

Javascriptový kód pro vnitřní stránku

window.top.location = window.self.location

2. Zaslání vlastní zprávy z iframu na svou vnější stránku

Poté co zákazníka přesměrujeme do eshopu, je v iframe duplicitně zobrazena stránka vášeho e-shopu. Z této stránky uvnitř iframu si můžete poslat jednoduchou javascriptovou zprávu své vnější stránce a v té ji zpracovat. Nemusí tedy dojít k obnovení celé stránky.

Upozornění

Skutečný výsledek platby, který nedorazil pomocí push notifikace je vždy třeba ověřit standardním způsobem na našem API. Z bezpečnostních důvodů nelze spoléhat na výsledek předaný zprávou z iframe nebo v URL při přesměrování (informace může být snadno podvržena).

Javascriptový kód pro vnitřní stránku, který pošle vnější stránce zprávu s ID platby a stavem platby, např. pro zaplacenou platbu:

// ID platby získáte z URL adresy, na kterou je zákazník přesměrován po dokončení platby
// výchozí parametry URL: id=${id}&refId=${refId} (lze si přidat vlastní parametr s pevnou hodnotou očekávaného stavu)
// více informací viz propojení obchodu v klientském portálu
window.parent.postMessage({ id: 'id-platby', status: 'PAID' /* refId, ... */ }, '*');

Javascriptový kód pro vnější stránku, který zpracuje příchozí zprávu z iframu:

// odchycení zprávy poslané z iframu pomocí postMessage
if (window.addEventListener) {
window.addEventListener('message', function (e) {
// validace, že message obsahuje data
if (!e || !(e !== null && e !== void 0 && e.data)) return;
const { id, status /* refId, ... */ } = e.data;
if (['PAID', 'AUTHORIZED'].includes(status)) {
// obsloužení stavu PAID / AUTHORIZED
console.log(id)
} else {
// obsloužení dalších stavů, atd ...
}
}, false);
}

3. Poslouchání zpráv zasílaných přímo bránou Comgate

Po dokončení platby zákazníkem (PAID, AUTHORIZED, CANCELLED) se platební brána pokusí předat informaci o stavu platby na server obchodníka (push). Následně, bezprostředně před tím, než zákazníka přesměruje zpět do e-shopu, odešle rodiči iframu (vašemu e-shopu) javascriptovou zprávu o stavu platby.

Upozornění

Není garantováno, že je tato javascriptová zpráva odeslána až poté, co dojde k úspěšnému předání stavu platby na pozadí (push). Typicky může k předčasnému odeslání této zprávy docházet po uplynutí 1 hodiny od založení platby.

Poté co vaše stránka přijme zprávu od naší brány v iframe, měl by být iframe skryt. Pokud si nepřejete, aby docházelo k duplicitnímu načtení vaší stránky přímo v iframe, je potřeba iframe ze stránky (DOMu) odebrat (k tomu není možné použít css styly display: none, visible: hidden nebo další). Všechny infromace o stavu plateb by měly být ověřovány přes Váš server. Ten by si měl v případě, že ještě nedorazila push notifikace o stavu platby tuto skutečnost ověřit přímo na našem API.

Upozornění

Skutečný výsledek platby, který nedorazil pomocí push notifikace je vždy třeba ověřit standardním způsobem na našem API. Z bezpečnostních důvodů nelze spoléhat na výsledek předaný zprávou z iframe nebo v URL při přesměrování (informace může být snadno podvržena).

Javascriptový kód pro vaši stránku, který zpracuje příchozí zprávu z iframu od brány Comgate:

// odchycení zprávy poslané z iframu pomocí postMessage
if (window.addEventListener) {
window.addEventListener('message', function (e) {
// validace, že message obsahuje data
if (!e || !(e !== null && e !== void 0 && e.data)) return;

// načtení dat z message
const { scope, action, value } = e.data;

// vyhodnocení, že je message od Comgate a je určena eshopu
// současně kontrola, že se jedná o informaci o stavu platby
// a hodnota je platná
if (scope === 'comgate-to-eshop' && action === 'status' && value) {
// id = XXXX-XXXX-XXXX
// isTest = true/false (testovací platba)
// refId = ID objednávky od klienta
// status = stav platby
const { id, isTest, refId, status } = value;
if (['PAID', 'AUTHORIZED'].includes(status)) {
// obsloužení stavu PAID/AUTHORIZED - zaplaceno/předautorizováno
} else if (status === 'CANCELLED') {
// obsloužení stavu CANCELLED - nezaplaceno
} else {
// obsloužení dalších stavů, atd (velmi krajní případ) ...
// PENDING, UNKNOWN
}
}
}, false);
}

Platební brána v iframu z pohledu plátce

Platební brána Comgate umožňuje uživatelům opakovat platbu, pokud se jim ji nepodařilo dokončit napoprvé. Pro další pokus je zobrazen výběr všech platebních metod.

Pokud dojde v jakémkoliv kroku platebního procesu k vybrání jiné metody než platby kartou, dojde k přesměrování plátce na novou stránku a tzv. vyskočení z iframe. Uživatel se již zpět do iframu nevrátí.

Vzor pro zobrazení brány v e-shopu

Pro snadnou implementaci naší platební brány do vašeho e-shopu, můžete využít níže dostupné vzorové implementace.

HTML kód

<!doctype html>

<html lang="cs">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">

<title>Comgate :: práce s iframem</title>

<style>
body,html {
background: #fff;
padding:0;
margin:0;
width: 100%;
height: 100%;
}
.page {
width: 100%;
background: #eee;
margin: 0 auto;
max-width: 800px;
}
.page .header h1 {
text-align: center;
margin: 0;
padding: 25px 15px;
font-size: 25px;
}
#comgate-iframe-box {
width: 450px; /* šířka je pomocí media automaticky nastavena na 100 % šířky obrazovky v případě malého displaye */
height: 700px; /* výšku je pro novou bránu možné dynamicky přizpůsobit Vašim potřebám */
margin: 0 auto;
}
#comgate-iframe-box .iframe {
width: 100%;
height: 100%;
}
@media (max-width: 450px) {
#comgate-iframe-box {
width: 100%;
}
}

</style>
</head>

<body>
<div class="page">
<div class="header">
<h1>Ukázka práce s&nbsp;iframem</h1>
</div>
<div id="comgate-iframe-box">
<!--
V konfiguraci iframu:
pro novou bránu použít scrolling="off"
pro starou bránu použít scrolling="on"
Pozor: URL adresa (src) založené platby se může měnit.
Vždy použijte adresu, kterou vám vrátí API, a nijak do ní nezasahujte.
Atribut allow=payment je pro zobrazení brány v iframe nezbytný
-->
<iframe
class="iframe"
src="https://pay2.comgate.cz/init?id=XXXX-XXXX-XXXX"
allow="payment"
frameborder="0px"
scrolling="off">
</iframe>
</div>
</div>
</body>
</html>