Create a PaymentIntent with payment_method_types: ['blik'] and currency 'pln' — BLIK only supports PLN — plus an optional statement_descriptor (shown as line 3, max 22 characters, in the customer's banking app).
Collect the customer's 6-digit BLIK code from your own form immediately before confirming; the code is valid for only 2 minutes from when the customer requests it in their banking app.
Confirm with stripe.confirmBlikPayment(clientSecret, { payment_method: { blik: {} }, payment_method_options: { blik: { code } } }) — the code can only be supplied at confirmation time, not on PaymentIntent creation.
After confirmation the PaymentIntent moves to requires_action with a blik_authorize next_action; show a countdown, since the customer has 60 seconds to approve the push notification in their bank app before it times out.
Handle payment_intent.succeeded and payment_intent.payment_failed webhooks for fulfillment, and use documented sandbox test-email patterns (e.g. invalid_code@, expired_code@, customer_timeout@) to simulate each failure branch.
Known gotchas
The 6-digit code's 2-minute validity and the separate 60-second in-app authorization window are two different timers — a code entered just before it expires can still fail if the customer doesn't approve fast enough afterward.
BLIK has no built-in recurring or stored-credential model — every transaction, including repeat customers, requires a fresh 6-digit code.
Distinguish immediate failures (payment_method_invalid_parameter for bad/expired codes) from provider declines (roughly an 8-second delay) and timeouts (roughly a 60-second delay) in your error handling, since they surface on different timelines.
Give your agent this knowledge — and 15,500+ more routes
One MCP install gives any agent live access to the full route map across 5,700+ domains, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp
Need this verified for your stack — or a route we don't have yet?