Example: Stripe Payment Element
this is an example of the psp integration guide # pattern, applied to stripe payment element stripe payment element confirms payments client side, so its cartridge needs targeted changes for forter to get complete data save pre auth card data payment element uses a secure iframe card details never reach sfcc, so a pre auth basket has no payment data to send the client already receives stripe's confirmation token, which includes card details in payment method preview in app stripe sfra/cartridge/scripts/checkout/checkouthelpers js , inside validatebasketandorder , save it to the basket before the validateorder hook call if (req form && req form confirmationtoken) { transaction wrap(function () { currentbasket custom forterpspauthresult = req form confirmationtoken; }); } this requires forterpspauthresult to exist as a custom attribute on the basket object, not just order (it ships on order by default) required for pre auth or pre and post auth timing expand the paymentintent newer stripe api versions return latest charge and payment method as string ids instead of full objects, leaving forter nothing to extract add expand \['latest charge', 'payment method'] to every paymentintent creation call buildpaymentintentpayload in app stripe sfra/cartridge/scripts/checkout/checkouthelpers js stripequickcheckout in int stripe sfra/cartridge/controllers/stripepaymentsapm js createpaymentintent in int stripe core/cartridge/scripts/stripe/helpers/checkouthelper js stripe paymentintents create({ // expand \['latest charge', 'payment method'] }); this is safe on any api version re fire after 3ds for cards that trigger 3ds, app post auth fires with the paymentintent still in requires action state, before the charge exists in int stripe sfra/cartridge/controllers/stripepaymentscard js , inside cardpaymenthandlerequiresaction , after the paymentintent is confirmed, overwrite forterpspauthresult with the final response order custom forterpspauthresult = json stringify(paymentintent); fire the saved card hook stripe saves cards through its own stripewallet addnewcard endpoint, bypassing sfcc's standard paymentinstruments savepayment route entirely, so forter's controller hooks never fire for this flow in app stripe sfra/cartridge/static/default/js/stripe newcardform js , send the full stripe paymentmethod object from the client alongside the payment method id then, in int stripe sfra/cartridge/controllers/stripewallet js , inside the addnewcard handler, fire app payment saved from the server before the card is attached var hookresult = hookshelper('app payment saved', 'paymentsaved', { paymentmethodid request httpparametermap payment method id stringvalue, paymentmethoddata request httpparametermap paymentmethoddata stringvalue }, require(' /cartridge/scripts/hooks/paymentsavedhandling') paymentsaved); if (hookresult && hookresult error) { res json({ success false, error hookresult errormessage }); return next(); } this same pattern applies to any psp that bypasses paymentinstruments savepayment