Off-session (merchant-initiated) charge of a vaulted instrument. The
networks' credential-on-file rules ride the off_session flag; a bank
demanding authentication surfaces as authentication_required
(retryable ONLY by bringing the customer back on-session).
Creates the PSP-side customer that saved instruments attach to.
Deletes by SavedPaymentMethod.token — the token is dead afterwards.
Missed-webhook recovery over GET /v1/events: the same payload shapes webhooks deliver, normalized by the same mapper — dedupe by event.id works identically for delivered and fetched events. Stripe retains ~30 days.
Reconciliation passthrough. Only present if getCapabilities().supportsListing.
Reconciliation passthrough. Only present if getCapabilities().supportsListing.
Throws PayFanoutError (code "invalid_request") on unparseable payloads; maps genuinely unknown-but-valid event types to type "unknown" rather than throwing.
Polls an async refund ("pending" from refundPayment) to its terminal state.
Cart total changed? Stripe PaymentIntents update in place — same pspSessionId, same clientSecret, no client remount needed (the Payment Element re-fetches the amount on confirm).
"Test connection" probe: one read-only GET /v1/events, classified so a host
UI can tell a bad key (auth) from a transient outage (network). Returns a
result on every path instead of throwing, and never surfaces the credential.
Zero-amount verification via SetupIntent (§8 option a). A succeeded SetupIntent attaches a PaymentMethod, which collides with no-vaulting — so the PaymentMethod is detached on EVERY path (success, failed verification, or error) before this method returns.
Webhook handling — same adapter, separate concerns. Both async: future PSPs may need remote key retrieval; the contract stays uniform. MUST operate on the RAW request body bytes/string — re-serializing a parsed body breaks signatures (the conformance suite tests this).
Only present if getCapabilities().supportsManualCapture. Capture is the canonical double-charge operation — the idempotency key is REQUIRED, and under supportsMultiCapture each partial capture is its own charge with its own key.