# Tap to Pay Learn how to accept contactless payments on a compatible iPhone or Android device. Looking for a no-code solution? [Accept payments from the Stripe Dashboard mobile app](https://docs.stripe.com/no-code/in-person.md). # Android Use Tap to Pay on Android to accept in-person contactless payments with [compatible NFC-equipped Android devices](https://docs.stripe.com/terminal/payments/setup-reader/tap-to-pay.md?platform=android#supported-devices). Tap to Pay on Android includes support for Visa, Mastercard, American Express, and Discover contactless cards, NFC-based mobile wallets, and [QR-based payment methods](https://docs.stripe.com/terminal/payments/additional-payment-methods.md). PIN entry is supported. Additionally, [eftpos](https://docs.stripe.com/terminal/payments/regional.md?integration-country=AU#eftpos-payments) is supported in Australia, [Interac](https://docs.stripe.com/terminal/payments/regional.md?integration-country=CA#interac-payments) is supported in Canada, and [Cartes Bancaires](https://docs.stripe.com/terminal/payments/regional.md?integration-country=FR#cartes-bancaires-payments) is supported in France. Stripe includes Tap to Pay on Android in the Terminal Android SDK and the Terminal React Native SDK, and enables payments directly in your Android mobile app. ### Availability - AT - AU - BE - CA - CH - DE - DK - FI - FR - GB - IE - IT - MY - NL - NZ - PL - SE - SG - US ### Availability in (Public preview) - BG - CY - CZ - EE - ES - GI - HR - HU - LI - LT - LU - LV - MT - NO - PT - RO - SI - SK ## Get started #### Android Integrate the latest version of the [Terminal Android SDK](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=android) to include the latest bug fixes and features. You can view version-specific updates and bug fixes in the [SDK changelog](https://github.com/stripe/stripe-terminal-android/blob/master/CHANGELOG.md). Device and minimum SDK version requirements can change due to updated compliance requirements or security vulnerabilities. To make sure your solution is up to date with Tap to Pay requirements, subscribe to [terminal-announce@lists.stripe.com](https://groups.google.com/a/lists.stripe.com/g/terminal-announce). To enable Tap to Pay in your Android application: 1. [Set up](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=android) the Terminal Android SDK. 2. Replace your existing `stripeterminal` dependencies with the following dependencies: #### Kotlin ```kotlin dependencies { implementation("com.stripe:stripeterminal-taptopay:5.7.0") implementation("com.stripe:stripeterminal-core:5.7.0") // ... } ``` 3. [Connect](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=android&reader-type=tap-to-pay) to the Tap to Pay reader. 4. [Collect](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=android) the payment with the Tap to Pay reader. #### React Native Integrate the latest version of the [Terminal React Native SDK](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=react-native) to include the latest bug fixes and features. Device and minimum SDK version requirements can change due to updated compliance requirements or security vulnerabilities. To make sure your solution is up to date with Tap to Pay requirements, subscribe to [terminal-announce@lists.stripe.com](https://groups.google.com/a/lists.stripe.com/g/terminal-announce). To enable Tap to Pay in your application: 1. [Set up](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=react-native) the Terminal React Native SDK. 2. [Connect](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=react-native&reader-type=tap-to-pay) to the Tap to Pay reader. 3. [Collect](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=react-native) the payment with the Tap to Pay reader. ## Supported devices Tap to Pay on Android works with a variety of Android devices, including mobile phones, kiosks, tablets, and handheld devices. You can only discover and connect to devices that meet all of the following criteria: - Has a functioning, integrated NFC sensor and ARM-based processor - Isn’t rooted and device bootloader is locked and unchanged - Runs Android 13 or later - Has a security update installed from the past 12 months - Uses Google Mobile Services and has the Google Play Store app installed - Has a keystore with hardware support for ECDH ([`FEATURE_HARDWARE_KEYSTORE`](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_HARDWARE_KEYSTORE) version must be 100 or later) - Has a stable connection to the internet - Runs the unmodified manufacturer provided OS - Has Developer options disabled Android device emulators aren’t supported by Tap to Pay. The same device requirements are enforced in the simulated and production reader to give developers the most realistic experience during testing. ### Device types Supported device types include, but aren’t limited to: | Type of device | Manufacturer | Models | | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------ | | Countertop | [Sunmi](https://partner.posportal.com/stripe/stripe/catalog/category/view/id/11/) | D3 MINI, V3 MIX | | Handheld | Honeywell | CT32, CT37 | | iMin | Lark 1 | | [Sunmi](https://partner.posportal.com/stripe/stripe/catalog/category/view/id/11/) | L3, V3 | | Zebra | TC53E | | Kiosk | [Sunmi](https://partner.posportal.com/stripe/stripe/catalog/category/view/id/11/) | Flex 3 with Qualcomm 6225 chip | | Register | iMin | Falcon 2 | | [Sunmi](https://partner.posportal.com/stripe/stripe/catalog/category/view/id/11/) | T3 | | Tablet | HMD Global | HMD T21 | | Samsung Galaxy | Tab Active5 | | [Sunmi](https://partner.posportal.com/stripe/stripe/catalog/category/view/id/11/) | CPad | | Oukitel | RT3 Plus | | Ulefone | Armor Pad 4 Ultra | Some manufacturers produce both GMS and non-GMS certified devices. If you’re using a non-GMS certified device, you’ll receive an error stating `ATTESTATION_FAILURE: Device is not Google Mobile Services (GMS) certified` when attempting to connect the device. If this occurs, contact the manufacturer to resolve the issue. ### Mobile phones Supported mobile phones include, but aren’t limited to: | Manufacturer | Models | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Asus | ROG Phone 7 series, ROG Phone 8 series, ROG Phone 9, ROG Phone 9 Pro, Zenfone 10, Zenfone 11 Ultra, Zenfone 12 Ultra, Zenfone 9 | | Google | Pixel 10, Pixel 10 Pro, Pixel 10 Pro Fold, Pixel 10 Pro XL, Pixel 10a, Pixel 5, Pixel 5a 5G, Pixel 6, Pixel 6 Pro, Pixel 6a, Pixel 7, Pixel 7 Pro, Pixel 7a, Pixel 8, Pixel 8 Pro, Pixel 8a, Pixel 9, Pixel 9 Pro, Pixel 9 Pro Fold, Pixel 9 Pro XL, Pixel 9a, Pixel Fold | | Honor | 100, 200, 200 Lite, 200 Pro, 200 Smart, 400, 400 Lite, 400 Pro, 400 Smart, 600 Lite, 90, 90 Lite, 90 Smart, Magic V2, Magic V3, Magic V5, Magic Vs, Magic4 Pro, Magic5 Pro, Magic6, Magic6 Lite 5G, Magic6 Pro, Magic7 Lite, Magic7 Pro, Magic8 Lite, Magic8 pro, PORSCHE DESIGN HONOR Magic6, PORSCHE DESIGN HONOR Magic7 RSR, X5 Plus, X5c Plus, X6, X6a, X6b, X6c, X7a, X7b, X7b 5G, X7c, X7c 5G, X7d, X8a, X8b, X8c, X9b 5G, X9c, X9c Smart, X9d | | Infinix | GT 20 Pro, GT 30, GT 30 Pro, HOT 40 Pro, HOT 40i, HOT 50, HOT 50 5G, HOT 50 Pro, HOT 50 Pro+, HOT 50i, HOT 60 5G, HOT 60 Pro, HOT 60 Pro+, HOT 60i, HOT 60i 5G, NOTE 30, NOTE 30 Pro, NOTE 40, NOTE 40 5G, NOTE 40 Pro, NOTE 40 Pro 5G, NOTE 40 Pro+ 5G, NOTE 50, NOTE 50 Pro, NOTE 50 Pro+ 5G, NOTE 50S 5G, NOTE 60 Pro, NOTE Edge, SMART 10 PLUS, SMART 20, ZERO 30, ZERO 40, ZERO 40 5G | | Motorola | ThinkPhone 25 by motorola, ThinkPhone by motorola, edge (2022), edge 2023, edge 2024, edge 2025, edge 30 ultra, edge 30, edge 40 neo, edge 40 pro, edge 40, edge 50 fusion, edge 50 neo, edge 50 pro, edge 50 ultra, edge 50, edge 60 fusion, edge 60 neo, edge 60 pro, edge 60 stylus, edge 60, edge 70 fusion, edge plus (70), edge plus 2022, edge plus 5G UW (2023), moto g - 2022, moto g play - 2025, moto g power - 2024, moto g power - 2025, moto g power X70 - 2026, moto g stylus 5G - 2024, moto g stylus 5G - 2023, moto g stylus 5G - 2024, moto 5G, moto g04, moto g04s, moto g05, moto g06 power, moto g06, moto g14, moto g15 g35, moto 5G g54, moto 5G g55, moto 5G g56, moto 5G, moto g57 power, moto g57 g64, moto 5G g64y, moto 5G g66j, moto 5G, moto g67 power g67, moto 5G, moto g72 g73, moto 5G g75, moto 5G, moto g77 g85, moto 5G g86, moto 5G power g86, moto 5G g96, razr 2025, razr 2022, razr 2023, razr 2024, razr 2025, razr 40 ultra, razr 40, razr 50 ultra, razr 50, razr 60 ultra, razr fold, razr fold 60, razr plus 2026, razr plus 2023, razr plus 2024, razr ultra 2025, signature | | OnePlus | 10 Pro, 10 Pro 5G, 10R 5G, 10T 5G, 11 5G, 11R 5G, 12, 12R, 13, 13R, 13T, 13s, 15, 15R, Ace 3, Ace 5, Ace 5 Pro, Ace 6, Nord 3 5G, Nord 4, Nord 5, Nord CE4 Lite 5G, Nord CE5, Nord N30 SE 5G, Oneplus Ace 2 Pro, Open, PHP110, Turbo 6 | | Oppo | A3, A3 Pro 5G/A3 5G/A80 5G, A38, A40/A3/A40m, A40/A40m, A5 5G, A5 Pro, A5 Pro 5G, A5/A5m, A58, A5x, A6 5G, A6 Pro, A60, A60 5G, A6t 5G, A6x, A6x 5G, A78, A78 5G, A79 5G, A80 5G, F25 Pro 5G, Find N2 Flip, Find N3, Find N3 Flip, Find N5, Find X5 Pro, Find X6, Find X6 Pro, Find X7 Ultra, Find X8, Find X8 Pro, Find X8 Ultra, Find X8s, Find X9, Find X9 Pro, K12 5G, K12x 5G, OPPO A38, OPPO A6 Pro 5G, OPPO A60 5G/ A3 5G, OPPO F31 5G, OPPO K11 5G, OPPO Reno10 Pro+ 5G, OPPO Reno8 Pro 5G, OPPO Reno8 T, PFFM10, PFFM20, PGAM10, PGBM10, Reno 11, Reno 11 Pro, Reno10 5G, Reno10 Pro+ 5G, Reno11, Reno11 F 5G, Reno11 F 5G/Reno11 A, Reno12, Reno12 5G, Reno12 F, Reno12 F 5G, Reno12 F/FS 5G, Reno12 Pro, Reno12 Pro 5G, Reno13, Reno13 5G, Reno13 F 5G, Reno13 F 5G / Reno13 A, Reno13 Pro 5G, Reno14, Reno14 5G, Reno14 F 5G, Reno14 F 5G/Reno14 FS 5G, Reno14 Pro 5G, Reno15, Reno15 5G, Reno15 C 5G, Reno15 F 5G, Reno15 F 5G/Reno15 A, Reno15 FS 5G/Reno15 F 5G, Reno15 Pro 5G, Reno15 Pro Max 5G, Reno15 Pro Mini 5G, realme C51 | | Redmi | 12 5G, 13C 5G, 15, 15 5G, 15C 5G, K40S, K50, K50 Pro, K50G, K60, K60 Pro, K60 Ultra, K70, K70 Pro, Note 12, Note 12 Pro, Note 12 Turbo, Note 12T Pro, Note 13, Note 13 5G, Note 13 Pro, Note 13 Pro 5G, Note 13 Pro+ 5G, Note 14, Note 14 5G, Note 14 Pro, Note 14 Pro 5G, Note 14 Pro+, Note 14 Pro+ 5G, Note 14S, REDMI 15C, REDMI K90 Pro Max, REDMI Note 15, REDMI Note 15 5G, REDMI Note 15 Pro, REDMI Note 15 Pro 5G, REDMI Note 15 Pro+5G, REDMI Turbo 4, REDMI Turbo 4 Pro, Turbo 3 | | Samsung Galaxy | A04s, A05s, A13, A14, A14 5G, A15, A15 5G, A16, A16 5G, A17, A17 5G, A23 5G, A24, A25 5G, A26 5G, A33 5G, A34 5G, A35 5G, A36 5G, A37 5G, A52 5G, A53 5G UW, A53 5G, A54 5G, A55 5G, A56 5G, A57 5G, A73 5G, F17 5G, F34 5G, F54, 5G Jump4, M13 M14, 5G M15, 5G M16, 5G M17, 5G M33, 5G M34, 5G M35, 5G M36, 5G M53, 5G M55s, 5G, M56 Ultra, 5G+, S21, 5G FE, S22 Ultra, S22+, S22, S23 FE, S23 Ultra, S23+, S23, S24 Edge, S24 FE, S24 Ultra, S24+, S25, S25 Ultra, S25+, Tab S25, Tab S25 S26, Tab S26 Pro, Tab S26 Pro Active5, Active5, 5G, Active5 Pro, Z Active5, Z 5G, Z Wide8, Z XCover7, Z XCover7 FE, Z Flip4, Z Flip5, Z Flip6, Z Flip7, Z TriFold | | Xiaomi | 12, 12 Pro, 12S Ultra, 12T, 12T Pro, 13, 13 Lite, 13 Pro, 13 Ultra, 13 pro, 13T, 13T Pro, 14, 14 Pro, 14 Ultra, 14T, 14T Pro, 15, 15 Pro, 15 Ultra, 15T, 15T Pro, 17, 17 Pro, 17 Pro Max, 17 Ultra, Civi 4, MIX 4, MIX Flip, MIX Fold 3, MIX Fold 4 | ## User interface Tap to Pay on Android includes payment collection screens. When your application is ready to collect a payment, the Stripe Terminal SDK takes over the display to handle the collection process. After you call the [process payment](https://docs.stripe.com/terminal/payments/collect-card-payment.md#process-payment) method, your application continues to run while Tap to Pay displays a full-screen prompt that instructs the cardholder to tap their card or NFC-based mobile wallet. If there’s an error reading the card, a prompt for retry displays. A successful tap returns a success indication and then control returns to your application. ### Device-specific NFC tap zone When possible, the Tap to Pay on Android SDK automatically moves the tap zone indicator to help the end user understand where the tap zone is located on the device: ![](https://d37ugbyn3rpeym.cloudfront.net/videos/terminal/ttpa-onscreen-demo-1.mp4)![](https://d37ugbyn3rpeym.cloudfront.net/videos/terminal/ttpa-onscreen-demo-2.mp4) If the SDK is unable to determine the tap zone position automatically (such as when the tap zone is offscreen), a default variant is used instead: ![](https://d37ugbyn3rpeym.cloudfront.net/videos/terminal/ttpa-default-demo.mp4) ### UX configuration - [TapToPayUxConfiguration (Android)](https://stripe.dev/stripe-terminal-android/external/com.stripe.stripeterminal.external.models/-tap-to-pay-ux-configuration/index.html) - [TapToPayUxConfiguration (React Native)](https://stripe.dev/stripe-terminal-react-native/api-reference/types/TapToPayUxConfiguration.html) You can override the default tap screen using the Terminal SDK, including colours of the tap UI, error UI, success UI, and the position of the tap zone indicator. Call `setTapToPayUxConfiguration` during your initialisation or reader connection process. You can invoke it multiple times to adjust the appearance of the tap screen during the lifetime of your application. This configuration only affects the appearance of the tap screen, not the PIN collection screen. #### Android #### Kotlin ```kotlin val config = TapToPayUxConfiguration.Builder() .tapZone( TapToPayUxConfiguration.TapZone.Front(0.5f, 0.3f) ) .colors( TapToPayUxConfiguration.ColorScheme.Builder() .primary(TapToPayUxConfiguration.Color.Value(Color.parseColor("#FF008686"))) .success(TapToPayUxConfiguration.Color.Default) .error(TapToPayUxConfiguration.Color.Resource(android.R.color.holo_red_dark)) .build() ) .darkMode( TapToPayUxConfiguration.DarkMode.DARK ) .build() Terminal.getInstance().setTapToPayUxConfiguration(config) ``` #### React Native ```js import { useStripeTerminal, DarkMode, } from '@stripe/stripe-terminal-react-native'; const { setTapToPayUxConfiguration } = useStripeTerminal(); const callSetTapToPayUxConfiguration = async () => { let tapZone = { indicator: 'front', xBias: 0.5, yBias: 0.3, }; let darkMode = DarkMode.DARK; let colors = { primary: '#FF008686', error: '#FFCC0000', }; let config = { tapZone: tapZone, darkMode: darkMode, colors: colors, }; const { error } = await setTapToPayUxConfiguration(config); if (error) { console.log('setTapToPayUxConfiguration error', error); return; } console.log('setTapToPayUxConfiguration success'); }; ``` ![](https://d37ugbyn3rpeym.cloudfront.net/videos/terminal/ttpa-configuration-demo.mp4) ## Cardholder verification limits and fallback Some contactless card transactions [above certain amounts](https://support.stripe.com/questions/what-are-the-regional-contactless-limits-for-stripe-terminal-transactions) require additional cardholder verification methods (CVM) such as PIN entry. Tap to Pay on Android supports PIN entry on Terminal Android SDK [4.3.0](https://github.com/stripe/stripe-terminal-android/releases/tag/v4.3.0) or later. The PIN is collected in two scenarios: - The transaction amount is above the [cardholder verification method (CVM) limit](https://support.stripe.com/questions/what-are-the-regional-contactless-limits-for-stripe-terminal-transactions). In this case, the PIN is collected before [collectPaymentMethod](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/collect-payment-method.html) returns. Focus returns to your application after the PIN is entered or PIN collection is cancelled. ![Tap to Pay on Android local PIN flow](https://b.stripecdn.com/docs-statics-srv/assets/ttpa-local-pin-flow.0f134662b73c0dfa4eaf1e57f09fd17a.png) - The issuer makes a [Strong Customer Authentication (SCA)](https://stripe.com/guides/strong-customer-authentication) request. In this case, the PIN is collected during [confirmPaymentIntent](https://stripe.dev/stripe-terminal-android/core/com.stripe.stripeterminal/-terminal/confirm-payment-intent.html). Focus returns to your application after `confirmPaymentIntent`, unless the issuer makes a PIN request. In that case, PIN collection takes focus again until the PIN is entered or PIN collection is cancelled. ![Tap to Pay on Android SCA PIN flow](https://b.stripecdn.com/docs-statics-srv/assets/ttpa-sca-pin-flow.4144d0670052a3544bfe573182bb9487.png) ### PIN error handling You can only collect a PIN under the following conditions: - [Developer options](https://developer.android.com/studio/debug/dev-options) are disabled. - [Accessibility services](https://developer.android.com/guide/topics/ui/accessibility/service) aren’t registered or running. - [Screen recording](https://support.google.com/android/answer/9075928) isn’t active. - There are no [screen overlay windows](https://developer.android.com/privacy-and-security/risks/tapjacking) - You have an active internet connection. PIN collection also fails if any party attempts to take a screenshot. If PIN collection fails due to one of these factors, you receive a `TAP_TO_PAY_INSECURE_ENVIRONMENT` error with additional information about the cause of the error. We recommend providing actionable next steps for the user to retry the payment to prompt for a PIN. ### Regional PIN considerations NFC wallet payments (Apple Pay, Google Pay, and Samsung Pay) usually don’t require a PIN. However, in the UK, Canada, and Finland, regional requirements and card issuer policies can affect contactless payments. In the UK, depending on the issuer, Strong Customer Authentication might require some cards to be inserted into a device. In such cases, if the card isn’t inserted, the payment is declined before the PIN screen appears, with the reason `offline_pin_required`. In Canada and Finland, many issued cards are offline PIN only, meaning that entering the PIN requires physical contact, such as insertion into a device, which isn’t supported with Tap to Pay. In these scenarios, we recommend asking the customer to try a different card or collecting payment in a different way. For example, using a Terminal card reader or sending a [Payment Link](https://docs.stripe.com/payment-links.md). When collecting payment with your mobile device, hold the card to the reader until it reads the chip information. You might need to wait a few seconds after the initial vibration when the card makes contact. In the event of a decline, use another method to collect payment, such as a Terminal card reader. You can only have one active connection to a reader at a time. ### PIN UX For security reasons, the PIN pad doesn’t always appear in the centre of the screen. It appears in a randomly determined position. ![Tap to Pay on Android PIN collection screen](https://b.stripecdn.com/docs-statics-srv/assets/ttpa-pin-screen.ceb66e1d9695de8ca517e39265a2be10.png) An off-centre PIN pad is expected behaviour ## Best practices and promotion guidelines Ensure an optimal user experience by considering the following: - Connect to the reader in the background on app startup to reduce wait times when collecting a payment. - Use [automatic reconnection](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=android&reader-type=tap-to-pay#automatically-attempt-reconnection) to reconnect to the reader when the app comes to the foreground to reduce wait times. - Provide merchant education to guide your users on how to accept contactless payments on a compatible Android device, including in-product promotion and text or email alerts. - Launch and promote your Tap to Pay on Android marketing campaigns using our messaging templates and design assets. Become a [Stripe Partner](https://stripe.com/partners/become-a-partner) to access these assets in the [partner portal](https://portal.stripe.partners/s). ## Next steps - [Set up your integration](https://docs.stripe.com/terminal/payments/setup-integration.md) - [Connect to a reader](https://docs.stripe.com/terminal/payments/connect-reader.md) - [Collect a card payment](https://docs.stripe.com/terminal/payments/collect-card-payment.md) - [Test your integration](https://docs.stripe.com/terminal/references/testing.md) - [Regional payment methods](https://docs.stripe.com/terminal/payments/regional.md)