Skip to content
Create account
or
Sign in
The Stripe Docs logo
/
Ask AI
Create account
Sign in
Get started
Payments
Finance automation
Platforms and marketplaces
Money management
Developer tools
Get started
Payments
Finance automation
Get started
Payments
Finance automation
Platforms and marketplaces
Money management
Overview
About Stripe payments
Upgrade your integration
Payments analytics
Online payments
OverviewFind your use caseManaged Payments
Use Payment Links
Build a checkout page
Build an advanced integration
Build an in-app integration
Payment Methods
Add payment methods
Manage payment methods
Faster checkout with Link
Payment interfaces
Payment Links
Checkout
Web Elements
In-app Elements
Payment scenarios
Custom payment flows
Flexible acquiring
Orchestration
In-person payments
Terminal
    Overview
    Accept in-person payments
    Integration design
    Select your reader
    Design an integration
    Quickstart
    Example applications
    Testing
    Terminal setup
    Set up your integration
    Connect to a reader
    Accepting a payment
    Collect card payments
    Additional payment methods
    Accept offline payments
    Mail order and telephone order payments
    Regional considerations
    During checkout
    Collect tips
    Collect and save payment details for future use
    Flexible authorisations
    After checkout
    Refund transactions
    Provide receipts
    Customize checkout
    Cart display
    Collect on-screen inputs
    Collect swiped data
    Collect tapped data for NFC instruments
    Apps on devices
    Manage readers
    Order, return, replace readers
    Register readers
    Manage locations and zones
    Configure readers
    Encryption
    References
    API references
    Mobile readers
    Smart readers
    SDK migration guide
    Deployment checklist
    Stripe Terminal reader product sheets
Other Stripe products
Financial Connections
Crypto
Climate
HomePaymentsTerminal

Additional payment methodsPublic preview

Accept supported payment methods by displaying a QR code on Terminal smart readers.

Copy page

Terminal’s smart readers can display transaction-specific QR codes for payment methods besides cards. Your customers can then scan this code to complete their checkout on their mobile devices.

The flow below shows a payment that supports both card and non-card payment methods. Alternatively, if you want to support multiple non-card payment methods without accepting cards, the reader bypasses the tap or insert prompt and instead shows the menu of non-card payment method options. If you want to support a single non-card payment method, the reader loads the QR code directly.

The collect payment method screen with button reading more ways to pay

Collect payment method screen

The payment method selection screen with buttons for paying with card, Affirm, or WeChat Pay

Payment method selection screen

The payment loading screen

Loading screen

The screen displaying a WeChat Pay QR code to scan

Scan QR code screen

The screen displaying Approved

Approved screen

Supported payment methods: WeChat Pay and Affirm

Supported readers: Stripe Reader S700, BBPOS WisePOS E

Note

Connect Accounts must have the requisite capability to perform transactions for each payment method. Learn more about Connect compatibility with Affirm and WeChat Pay.

To test non-card payment methods on Stripe Terminal, use a physical reader. The simulated reader isn’t supported.

All transactions must be made with a functional network connection, i.e. not while offline.

Create a PaymentIntent

To accept non-card payment methods through the QR code interface, create a PaymentIntent and include your preferred payment method types in the payment_method_types parameter.

  • To present your customer all payment method options in the checkout flow, combine card_present with non-card payment method types (affirm, wechat_pay). We recommend enabling this if you operate in a heavily offline environment because only cards are supported in offline mode.
  • If you don’t want to accept cards, support only non-card payment method types (affirm, wechat_pay).
  • If you know which payment method you want to direct your customer to checkout to, select a single payment method type.

Note

To process payments supporting both card_present and non-card payment_method_types, the reader application must be at least 2.30.5.0. To process payments supporting only non-card payment_method_types, the reader application must be at least 2.31.6.0.

Capture type

Many payment methods don’t support manual capture. Create your PaymentIntent with the capture_method parameter automatic to support the broadest set of payment methods. To support manual capture for card payments while also accepting payment methods that require automatic capture, set capture_method on the nested payment_method_options.card_present attribute to manual.

Command Line
cURL
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d amount=1000 \ -d currency=usd \ -d "payment_method_types[]"=card_present \ -d "payment_method_types[]"=wechat_pay \ -d capture_method=automatic \ -d "payment_method_options[card_present][capture_method]"=manual

Handle the payment

Unlike card payments, processing QR code payments occurs asynchronously. When processing a PaymentIntent with a QR code payment method, Stripe generates a QR code unique to that payment. After processing the payment, the reader displays the QR code for the customer to scan with their mobile device. Shortly after the customer completes the payment on their device, the reader updates to reflect the completed payment.

Note

The time it takes for the reader to display the result of the payment might differ depending on the payment method used. The reader usually updates after a few seconds.

QR code payments support both processing the payment immediately and the two-step collect-and-confirm flow.

API reference

  • Process a PaymentIntent

To collect payment, make a request to Stripe with the ID of the PaymentIntent you created and the reader you want to use for the transaction.

Some payment methods (for example, Affirm) require a return_url when confirming a PaymentIntent to redirect your customer to after they authenticate or cancel their payment on the payment method’s app or site. You can provide your own return_url when processing the PaymentIntent. If you don’t provide one, the customer sees a generic landing page hosted by Stripe.

Command Line
cURL
curl https://api.stripe.com/v1/terminal/readers/tmr_xxx/process_payment_intent \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d payment_intent=pi_xxx \ --data-urlencode "process_config[return_url]"="https://my.store.com/payment-completed"

When you process a payment, Stripe immediately responds to the request with an HTTP 200 status code as an acknowledgement that the reader received the action. In most cases, the request returns a reader with an in_progress status. However, because processing occurs asynchronously, the action status might already reflect the final state (succeeded or failed) if the payment completes quickly.

Simultaneously, the reader screen switches to a UI that prompts the customer to insert their card or select a QR code payment method. For QR code payments, the customer completing the payment on their device updates the status of the payment. To verify the reader state, listen to the terminal.reader.action_succeeded webhook or poll the Reader and PaymentIntent status to receive the status of the payment.

Command Line
cURL
curl https://api.stripe.com/v1/terminal/readers/tmr_xxx \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
{ "id": "tmr_xxx", "object": "terminal.reader", ... "status": "online", "action": { "type": "process_payment_intent", "process_payment_intent": { "payment_intent": "pi_xxx" }, "status": "in_progress", "failure_code": null, "failure_message": null } }

Customer experience

After you process the PaymentIntent, the customer scans a QR code rendered on the reader screen. Depending on the payment method, the customer might quickly finalize the payment in their mobile application (most digital wallets), or complete a more extended process of evaluating financing offers (BNPL payment methods). Below are demonstrations of the payment flow for supported payment methods:

Learn more about how to provide the best customer experience and promote awareness of BNPL options in a store through these Affirm training resources.

Testing

In a sandbox, you can scan the QR code using a regular QR code scanning application on your mobile phone. The QR code payload contains a URL that takes you to one of these test payment pages:

  • Affirm-hosted sandbox page: If your account is onboarded with Affirm, the QR code URL takes you to an Affirm-hosted sandbox page where you can complete the payment process. When you’re redirected to the Affirm sandbox, you might receive a prompt to enter the last four digits of your SSN. Affirm recommends using either 0000 or 5678 for testing purposes.

  • Stripe-hosted test payment page: If your account isn’t onboarded with Affirm, you’ll be directed to a Stripe-hosted test payment page where you can choose to authorize or decline the test payment.

Note

The present_payment_method endpoint doesn’t support specifying QR code payment method types.

Was this page helpful?
YesNo
Need help? Contact Support.
Join our early access programme.
Check out our changelog.
Questions? Contact Sales.
LLM? Read llms.txt.
Powered by Markdoc