# Additional payment methods

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

In addition to cards, Terminal supports QR code-based [payment methods](https://docs.stripe.com/payments/payment-methods/overview.md). Your customers can scan a QR code to complete their checkout on their mobile devices.

**Supported payment methods**: [WeChat Pay](https://docs.stripe.com/payments/wechat-pay.md)1, [Affirm](https://docs.stripe.com/payments/affirm.md), and [PayNow](https://docs.stripe.com/payments/paynow.md)

> #### Want access to Klarna on Stripe Terminal?
> 
> We support [Klarna](https://docs.stripe.com/payments/klarna.md) in Private Preview. If you’re interested in joining the preview, [share your email address to request access](https://docs.stripe.com/terminal/payments/additional-payment-methods.md#signup).

### Want access to Klarna on Stripe Terminal?

Enter your email to request access.

```bash
curl https://docs.stripe.com/preview/register \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Referer: https://docs.stripe.com/terminal/payments/additional-payment-methods" \
  -d '{"email": "EMAIL", "preview": "terminal_klarna_preview"}'
```

> #### Want access to Affirm in the UK on Stripe Terminal?
> 
> We support [Affirm](https://docs.stripe.com/payments/affirm.md) in the UK in Private Preview. If you’re interested in joining the preview, [share your email address to request access](https://docs.stripe.com/terminal/payments/additional-payment-methods.md#signup-affirm-uk).

### Want access to Affirm in the UK on Stripe Terminal?

Enter your email to request access.

```bash
curl https://docs.stripe.com/preview/register \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Referer: https://docs.stripe.com/terminal/payments/additional-payment-methods" \
  -d '{"email": "EMAIL", "preview": "terminal_affirm_uk_preview"}'
```

**Supported readers**: [Smart readers](https://docs.stripe.com/terminal/smart-readers.md), [mobile readers](https://docs.stripe.com/terminal/mobile-readers.md), and [Tap to Pay readers](https://docs.stripe.com/terminal/tap-to-pay-readers.md)

1WeChat Pay isn’t available for Terminal in Japan due to regional limitations.

> Connected accounts must have the [required capability](https://docs.stripe.com/connect/account-capabilities.md#payment-methods) to perform transactions for each payment method. Learn more about Connect compatibility with [Affirm](https://docs.stripe.com/payments/affirm.md#capabilities), [WeChat Pay](https://docs.stripe.com/payments/wechat-pay.md#enable-wechat-pay), and [PayNow](https://docs.stripe.com/payments/paynow.md#connect).
> 
> 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](https://docs.stripe.com/terminal/features/operate-offline/overview.md).

## Smart readers and Tap to Pay on Android

- [setReaderDisplay (Android)](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/set-reader-display.html)

For [smart readers](https://docs.stripe.com/terminal/smart-readers.md) with built-in displays and [Tap to Pay on Android](https://docs.stripe.com/terminal/tap-to-pay-readers.md), 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
> 
> In the United States, if you plan on deploying readers with only non-card payment methods, [displaying cart details](https://docs.stripe.com/terminal/features/display.md) 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.
![The collect payment method screen with button reading more ways to pay](https://b.stripecdn.com/docs-statics-srv/assets/s700-more-ways-to-pay.dfa04185db8a0b70bb7b13e7a695a80d.png)

Collect payment method screen
![The payment method selection screen with buttons for paying with card, Affirm, or WeChat Pay](https://b.stripecdn.com/docs-statics-srv/assets/s700-pay-with-screen.9c8f58c5a58e9db064085647d0151737.png)

Payment method selection screen
![The payment loading screen](https://b.stripecdn.com/docs-statics-srv/assets/s700-loading-screen.5e0523a12d7a1fc5c4f6f511d0928163.png)

Loading screen
![The screen displaying a WeChat Pay QR code to scan](https://b.stripecdn.com/docs-statics-srv/assets/s700-wechat-pay-qr-code.a63cff6f60892ec896f726a93b88c167.png)

Scan QR code screen
![The screen displaying Approved](https://b.stripecdn.com/docs-statics-srv/assets/s700-approved-screen.ae53ca99ba84aefbf2cb1aacf9ef1a2e.png)

Approved screen

## Mobile readers and Tap to Pay on iPhone

When using a [mobile reader](https://docs.stripe.com/terminal/mobile-readers.md) and [Tap to Pay on iPhone](https://docs.stripe.com/terminal/tap-to-pay-readers.md), the app on your POS device must show the QR code for supported payment methods. The mobile reader display isn’t 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](https://docs.stripe.com/terminal/payments/additional-payment-methods.md?terminal-sdk-platform=android&reader-type=bluetooth#create-payment).

> See [Terminal mobile readers](https://docs.stripe.com/terminal/mobile-readers.md) for supported SDKs.

# Server-driven


## Create a PaymentIntent

To accept non-card payment methods through the QR code interface, [create a PaymentIntent](https://docs.stripe.com/api/payment_intents.md) and include your preferred payment method types in the `allowed_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](https://docs.stripe.com/terminal/features/operate-offline/overview.md) 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](https://docs.stripe.com/terminal/payments/collect-card-payment.md#capture-payment). The following table shows which payment methods support manual capture:

| Payment method | Manual capture  |
| -------------- | --------------- |
| `card_present` | ✓ Supported     |
| `affirm`       | ✓ Supported     |
| `wechat_pay`   | ❌ Not supported |
| `paynow`       | ❌ Not supported |

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
curl https://api.stripe.com/v1/payment_intents \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount=1000 \
  -d currency=usd \
  -d "allowed_payment_method_types[]=card_present" \
  -d "allowed_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.

> 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.

#### Process immediately

- [Process a PaymentIntent](https://docs.stripe.com/api/terminal/readers/process_payment_intent.md)

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](https://docs.stripe.com/api/terminal/readers/process_payment_intent.md#process_payment_intent-process_config-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](https://docs.stripe.com/api/terminal/readers/process_payment_intent.md#process_payment_intent-process_config-return_url) when processing the PaymentIntent. If you don’t provide one, the customer sees a [generic landing page](https://terminal-statics.stripe.com/terminal-checkout/assets/index.html) hosted by Stripe.

```curl
curl https://api.stripe.com/v1/terminal/readers/tmr_xxx/process_payment_intent \
  -u "<<YOUR_SECRET_KEY>>:" \
  -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](https://docs.stripe.com/api/terminal/readers.md) 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](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=server-driven#verify-reader), listen to the `terminal.reader.action_succeeded` webhook or poll the Reader and PaymentIntent status to receive the status of the payment.

```curl
curl https://api.stripe.com/v1/terminal/readers/tmr_xxx \
  -u "<<YOUR_SECRET_KEY>>:"
```

```json
{
  "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
  }
}
```

#### Collect, inspect, and confirm

### Collect a PaymentMethod

- [Collect a payment method](https://docs.stripe.com/api/terminal/readers/collect_payment_method.md)

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.

When you start collecting a payment method, Stripe immediately responds to the request with an HTTP `200` status code and returns a [reader](https://docs.stripe.com/api/terminal/readers.md) with an action status of `in_progress`. Simultaneously, the reader screen switches to a UI that prompts the customer to insert their card or select a QR code payment method.

```curl
curl https://api.stripe.com/v1/terminal/readers/tmr_xxx/collect_payment_method \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d payment_intent=pi_xxx
```

After the reader collects payment method data, the PaymentMethod attaches to the server-side PaymentIntent and it’s stored on the Reader object as `action.collect_payment_method.payment_method`. To [verify the reader state](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=server-driven#verify-reader), listen to the `terminal.reader.action_updated` or poll the Reader action status to inspect the PaymentMethod. At this point, you can determine the payment method type selected and see other data from the PaymentMethod.

### Process the PaymentIntent

- [Confirm a PaymentIntent](https://docs.stripe.com/api/terminal/readers/confirm_payment_intent.md)

After successfully collecting a payment method, you can proceed to processing the PaymentIntent.

Confirming the PaymentIntent is asynchronous. You can listen to the `terminal.reader.action_succeeded` webhook or poll the Reader and PaymentIntent status to receive the status of the payment.

Some payment methods (for example, Affirm) require a [return_url](https://docs.stripe.com/api/terminal/readers/process_payment_intent.md#confirm_payment_intent-confirm_config-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](https://docs.stripe.com/api/terminal/readers/process_payment_intent.md#confirm_payment_intent-confirm_config-return_url) when confirming the PaymentIntent. If you don’t provide one, the customer sees a [generic landing page](https://terminal-statics.stripe.com/terminal-checkout/assets/index.html) hosted by Stripe.

```curl
curl https://api.stripe.com/v1/terminal/readers/tmr_xxx/confirm_payment_intent \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d payment_intent=pi_xxx \
  --data-urlencode "confirm_config[return_url]=https://my.store.com/payment-completed"
```

For QR code payments, after confirming the payment, the reader screen switches to a UI displaying the QR code for the customer to scan. The customer completing the payment on their device updates the payment which delivers the `terminal.reader.action_succeeded` event.

If the customer chooses to cancel paying with the QR code and taps the back button, confirming the payment intent fails with the `terminal.reader.action_failed` event and the reader returns to the splash screen.

### 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](https://docs.stripe.com/api/terminal/readers/object.md#terminal_reader_object-action-cancel_action) endpoint to reset the reader.

```curl
curl -X POST https://api.stripe.com/v1/terminal/readers/tmr_xxx/cancel_action \
  -u "<<YOUR_SECRET_KEY>>:"
```

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](https://docs.stripe.com/payments/payment-intents/verifying-status.md#webhooks).

## Customer experience 

After you [process](https://docs.stripe.com/terminal/payments/additional-payment-methods.md#handle-payment) the PaymentIntent, the customer scans a QR code. For [smart readers](https://docs.stripe.com/terminal/smart-readers.md), the QR code is rendered on the reader screen. For [mobile readers](https://docs.stripe.com/terminal/mobile-readers.md), 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:

#### Affirm

Learn more about how to provide the best customer experience and promote awareness of BNPL options in a store through these [Affirm training resources](https://businesshub.affirm.com/hc/en-us/articles/30660865631892-Stripe-User-Affirm-Resources).
![](https://d37ugbyn3rpeym.cloudfront.net/videos/terminal/affirm-customer-experience.mp4)
#### WeChat Pay
![](https://d37ugbyn3rpeym.cloudfront.net/videos/terminal/wechat-pay-customer-experience.mp4)
#### PayNow
![](https://docs.stripecdn.com/50c48b010444a4c4db73126c3ecc68f555ab3a59940349a72558d934f274b666.mp4)
## Testing 

In a *sandbox* (A sandbox is an isolated test environment that allows you to test Stripe functionality in your account without affecting your live integration. Use sandboxes to safely experiment with new features and changes), 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.

> The [present_payment_method](https://docs.stripe.com/api/terminal/readers/present_payment_method.md) endpoint doesn’t support specifying QR code payment method types.

