pejment intentTakéPaymentIntent, Payment intent objekt, platební záměrPokročilý
Definice
Payment Intent je serverový objekt platební brány, který reprezentuje jeden konkrétní záměr strhnout z platební metody zákazníka danou částku a drží si celý životní cyklus té platby ve stavovém automatu. Payment Intent vznikne na serveru obchodníka před zahájením placení, provede případné silné ověření zákazníka a skončí buď úspěchem, nebo zamítnutím.
Proč objekt místo jednoho volání API
Starší platební API fungovala jako jediné volání: pošli číslo karty a částku, dostaň odpověď zaplaceno nebo zamítnuto. Tenhle model přestal stačit ve chvíli, kdy PSD2 zavedla silné ověření zákazníka. Platba se najednou umí uprostřed zastavit, přesměrovat zákazníka do banky na 3-D Secure a vrátit se o desítky sekund později, případně z jiného zařízení. Jediné synchronní volání takový průběh neumí popsat.
Payment Intent problém řeší tím, že platbu povýší na dlouhožijící objekt s vlastním identifikátorem a stavem. Server obchodníka ho vytvoří dřív, než zákazník cokoli potvrdí, a od té chvíle se všichni účastníci odkazují na stejné ID. Když se prohlížeč zavře nebo se požadavek zopakuje, obchodník se doptá na aktuální stav místo toho, aby zakládal druhou platbu.
Průběh a stavy
Typický životní cyklus má několik zastávek. Objekt vznikne ve stavu, kdy čeká na platební metodu, po jejím připojení čeká na potvrzení. Potvrzením se spustí autorizace: pokud vydavatel karty vyžaduje ověření, objekt přejde do stavu čekání na akci zákazníka a klientská knihovna otevře 3-D Secure. Po návratu se pokus dokončí a objekt skončí buď jako úspěšný, nebo se vrátí do stavu, kdy je možné zkusit jinou kartu. Zrušení je samostatný koncový stav.
Klíčová vlastnost je, že přechody řídí brána, nikoli frontend. Prohlížeč dostane jen dočasný klientský klíč vázaný na konkrétní objekt, takže může platbu potvrdit a číst její stav, ale nemůže změnit částku ani měnu.
Oddělená autorizace a zúčtování
Payment Intent umí i dvoufázový režim, kdy se prostředky nejdřív jen zablokují a strhnou se později samostatným voláním. Hodí se pro e-shopy, které účtují až při expedici, pro půjčovny nebo pro objednávky s ruční kontrolou dostupnosti zboží.
Idempotence a webhooky
Vytvoření objektu se posílá s idempotenčním klíčem, takže opakovaný požadavek po timeoutu vrátí původní objekt místo druhé platby. Výsledek se ale nikdy nespoléhá jen na odpověď prohlížeče: závazný je asynchronní webhook, který platební brána pošle na server obchodníka. Zákazník může zavřít okno vteřinu po úspěšné autorizaci a objednávka musí i tak přejít do stavu zaplaceno.
Čím se liší od Setup Intentu
Setup Intent má stejný tvar i stavový automat, ale neúčtuje peníze. Slouží k ověření a uložení platební metody pro budoucí použití, typicky před spuštěním předplatného nebo jiné opakované platby. Silné ověření se tedy odbaví ve chvíli, kdy je zákazník u počítače, a pozdější strhávání už proběhne bez jeho účasti.
Kde se pojem používá
Termín zpopularizovalo Stripe, kde je PaymentIntent základním objektem moderního platebního API. Stejný vzor ale najdete i jinde pod jinými jmény: order, payment session nebo checkout session. Podstata je vždy stejná: platba je zdroj se stavem, ne jednorázový příkaz.
Příklady z praxe
Vytvoření platby na serveru a potvrzení v prohlížeči
E-shop vytvoří Payment Intent na svém backendu ve chvíli, kdy zákazník klikne na Zaplatit. Částku i měnu určuje server z dat košíku, frontend dostane pouze client secret. Prohlížeč pak platbu potvrdí a v případě potřeby zobrazí 3-D Secure okno vydavatele karty.
// server (Node.js) const intent = await stripe.paymentIntents.create( { amount: 249000, // 2 490 Kč v haléřích currency: 'czk', automatic_payment_methods: { enabled: true }, metadata: { order_id: 'OBJ-2024-1187' }, }, { idempotencyKey: 'OBJ-2024-1187' } ); res.json({ clientSecret: intent.client_secret });Blokace prostředků u zboží skladem na objednávku
Prodejce nábytku peníze při objednávce jen zablokuje, protože kus se teprve dováží. Payment Intent se vytvoří s odloženým zúčtováním a zůstane v autorizovaném stavu. Ve chvíli expedice server zavolá capture, případně na část částky, pokud zákazník jednu položku stornoval. Neprovedená blokace po několika dnech sama vyprší.
// autorizace bez stržení await stripe.paymentIntents.create({ amount: 1890000, currency: 'czk', capture_method: 'manual', }); // při expedici, klidně jen část await stripe.paymentIntents.capture(intentId, { amount_to_capture: 1590000, });
Časté omyly
- MýtusKdyž prohlížeč po potvrzení vrátí succeeded, mám hotovo a můžu odbavit objednávku.
- Ve skutečnostiOdpověď v prohlížeči je jen indikace pro uživatelské rozhraní. Zákazník může zavřít okno, ztratit signál nebo mít pomalou síť. Autoritativní je stav objektu na straně brány, který se na server dostane webhookem nebo dotazem na aktuální stav.
- MýtusPro každý pokus o zaplacení jedné objednávky je potřeba nový Payment Intent.
- Ve skutečnostiJeden Payment Intent zvládne několik pokusů. Když karta selže, objekt se vrátí do stavu, kdy lze připojit jinou platební metodu a potvrdit znovu. Zakládání nového objektu pro každý pokus komplikuje párování a reporting.
- MýtusČástku můžu bezpečně poslat z frontendu, brána si to ohlídá.
- Ve skutečnostiPayment Intent se záměrně vytváří na serveru právě proto, že částka z prohlížeče je pod kontrolou útočníka. Klientský klíč umožňuje platbu potvrdit a číst, nikoli měnit částku nebo měnu.
Časté dotazy
- Jak dlouho zůstává Payment Intent platný?
- Payment Intent není určený k dlouhodobému skladování. Nepotvrzený objekt brány obvykle po několika dnech neaktivity samy zruší, protože už neodpovídá aktuálnímu košíku ani ceně. U dvoufázových plateb je limit přísnější: autorizovaná blokace na kartě má omezenou životnost danou pravidly karetní asociace, typicky v řádu dnů, a pokud obchodník nestihne částku strhnout, blokace propadne a peníze se zákazníkovi uvolní. V praxi se proto objekt vytváří až ve chvíli zahájení placení, ne při vkládání zboží do košíku.
- Co dělat, když se částka objednávky změní po vytvoření Payment Intentu?
- Payment Intent lze aktualizovat, dokud nebyl úspěšně potvrzený. Změna částky nebo měny se tedy provede běžnou úpravou objektu na serveru, načež se prohlížeči pošle aktualizovaný stav. Jakmile platba skončí ve stavu úspěšně zaplaceno, částka už měnitelná není a rozdíl se řeší refundací nebo doplatkem jako samostatnou transakcí. U dvoufázového režimu existuje třetí možnost: strhnout jen část zablokované částky a zbytek uvolnit.
- Potřebuje projekt Payment Intent, když používá hostovanou platební stránku?
- Hostovaná platební stránka nebo checkout session objekt typu Payment Intent obvykle vytvoří sama na pozadí, takže vývojář s ním nemusí pracovat přímo. Práce s Payment Intentem se vyplatí tam, kde je potřeba vlastní platební formulář, dvoufázová autorizace, dělené platby marketplace nebo jemná kontrola nad opakováním neúspěšných pokusů. Pro běžný e-shop bez těchto požadavků bývá hostovaná stránka rychlejší cesta i s ohledem na PCI DSS.
- Jak Payment Intent souvisí s chargebackem?
- Payment Intent končí svůj životní cyklus úspěšnou platbou, chargeback přichází až potom jako samostatná událost od vydavatele karty. Identifikátor Payment Intentu ale slouží jako spojnice: reklamovaná transakce se odkazuje na konkrétní platbu, takže obchodník podle něj dohledá objednávku, doručenku i výsledek 3-D Secure ověření. Právě proto se do metadat objektu ukládá číslo objednávky, které pak výrazně zrychlí sestavení podkladů pro rozporování.
Zdroje
- Stripe API Reference(otevře se v novém okně)
- Payments documentation(otevře se v novém okně)
- EMV 3-D Secure(otevře se v novém okně)
- Směrnice (EU) 2015/2366 o platebních službách na vnitřním trhu (PSD2)(otevře se v novém okně)