Public preview
Additional payment methods Public preview
Accept supported payment methods by displaying a QR code on Terminal readers.
In addition to cards, Terminal supports QR code-based payment methods. Your customers can scan a QR code to complete their checkout on their mobile devices.
Supported payment methods: WeChat Pay 1, Affirm, and PayNow
Want access to Klarna on Stripe Terminal?
We support Klarna in Private Preview. If you’re interested in joining the preview, share your email address to request access.
Want access to Affirm in the UK on Stripe Terminal?
We support Affirm in the UK in Private Preview. If you’re interested in joining the preview, share your email address to request access.
Supported readers: Smart readers, mobile readers, and Tap to Pay readers
1 WeChat Pay isn’t available for Terminal in Japan due to regional limitations.
Note
Connected accounts must have the required capability to perform transactions for each payment method. Learn more about Connect compatibility with Affirm, WeChat Pay, and PayNow.
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, not while offline.
Smart readers and Tap to Pay on Android
For smart readers with built-in displays and Tap to Pay on Android, the reader displays the QR code directly on its screen.
If you only want to accept non-card payment methods, the reader can bypass the tap or insert prompt used for card payment methods. If you’ve enabled a single non-card payment method, the reader loads the QR code directly. Otherwise, the reader displays a list of non-card payment method options.
US-based readers United States
In the United States, if you plan on deploying readers with only non-card payment methods, displaying cart details isn’t supported at this time. Displaying cart details shows the NFC logo and supports pre-dipping cards to tokenize card details before a PaymentIntent is created.
Collect payment method screen
Payment method selection screen
Loading screen
Scan QR code screen
Approved screen
Mobile readers and Tap to Pay on iPhone
When using a mobile reader and Tap to Pay on iPhone, the app on your POS device must show the QR code for supported payment methods. The mobile reader display is not capable of displaying QR codes itself because of the pixel density.
To have your mobile app display the QR code, you must have at least SDK 5.3, and follow the implementation details.
Note
See Terminal mobile readers for supported SDKs.
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. 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.
- If you know which payment method you want to direct your customer to checkout to, select a single payment method type.
Capture type
Not all payment methods support manual capture. The following table shows which payment methods support manual capture:
| Payment method | Manual capture |
|---|---|
card_present | |
affirm | |
wechat_pay | |
paynow |
To support the broadest set of payment methods, create your PaymentIntent with capture_method set to automatic. To support manual capture for card payments and Affirm 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
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.
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
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
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
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
{
"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
}
}
Free up the reader to take another payment
It might take multiple minutes for a customer to complete the payment on their device. Instead of waiting for the reader to reflect the result of the completed payment, you can free up the reader to take a payment for a different customer.
After the customer scans the QR code and switches to their device to complete the payment, use the cancel_action endpoint to reset the reader.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
After you cancel the reader’s action to process the payment, the payment intent remains in the requires_action state, allowing the customer to complete the payment. Use the payment_intent.succeeded and payment_intent.payment_failed webhooks to reconcile the result of the completed payment. Learn how to monitor a PaymentIntent with webhooks.
Customer experience
After you process the PaymentIntent, the customer scans a QR code. For smart readers, the QR code is rendered on the reader screen. For mobile readers, your app displays the QR code using the callbacks. 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 (the related setting payment methods). The following sections demonstrate the payment flow for supported payment methods with smart readers:
Learn more about how to provide the best customer experience and promote awareness of the related setting options in a store through these Affirm training resources.
Testing
In a sandbox, you can scan the QR code using a QR code scanning application on your mobile phone. The QR code payload contains a URL that goes to a Stripe-hosted test payment page where you can authorize or decline the test payment.
Affirm sandbox
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.
If your account isn’t onboarded with Affirm, you’ll be directed to the Stripe-hosted test payment page.
Note
The present_payment_method endpoint doesn’t support specifying QR code payment method types.
