| [ Web Proxy ] |
| Viewing: https://docs.stripe.com/terminal/payments/additional-payment-methods | [Back] [Original] |
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 Pay1, Affirm, and PayNow
We support Klarna in Private Preview. If youre interested in joining the preview, share your email address to request access.
Want access to Klarna on Stripe Terminal?
Enter your email to request access.
We support Affirm in the UK in Private Preview. If youre interested in joining the preview, share your email address to request access.
Want access to Affirm in the UK on Stripe Terminal?
Enter your email to request access.
Supported readers: Smart readers, mobile readers, and Tap to Pay readers
1WeChat Pay isnt available for Terminal in Japan due to regional limitations.
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 isnt supported.
All transactions must be made with a functional network connection, not while offline.
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 youve 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.
In the United States, if you plan on deploying readers with only non-card payment methods, displaying cart details isnt 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.
[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
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.
See Terminal mobile readers for supported SDKs.
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.
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.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.
curl https://api.stripe.com/v1/payment_intents \ -u "sk_test_wU7nrJCZspk1NPDxiQgAF05q:" \ -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"
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.
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 methods app or site. You can provide your own return_url when processing the PaymentIntent. If you dont provide one, the customer sees a generic landing page hosted by Stripe.
curl https://api.stripe.com/v1/terminal/readers/tmr_xxx/process_payment_intent \ -u "sk_test_wU7nrJCZspk1NPDxiQgAF05q:" \ -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.
{ "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 } }
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.
After you cancel the readers 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.
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 (BNPL 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 BNPL options in a store through these Affirm training resources.
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.
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 youre 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 isnt onboarded with Affirm, youll be directed to the Stripe-hosted test payment page.
The present_payment_method endpoint doesnt support specifying QR code payment method types.
| Web Proxy Viewer | New URL | Original Page |