# 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). # iPhone Use Tap to Pay on iPhone to accept in-person contactless payments with a [compatible iPhone](https://docs.stripe.com/terminal/payments/setup-reader/tap-to-pay.md?platform=ios#supported-devices). Tap to Pay on iPhone 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 iPhone in the Terminal iOS SDK and the Terminal React Native SDK, and enables payments directly in your iOS mobile app. > For platforms, use of Tap to Pay on iPhone is subject to the [Apple Acceptance Platform User Terms and Conditions](https://stripe.com/legal/apple-acceptance-platform). ### Availability - AT - AU - BE - CA - CH - CZ - DE - DK - ES - FR - GB - IE - IT - NL - NZ - PL - PT - SE - SG - US ### Availability in (Public preview) - BG - CY - EE - FI - HR - HU - JP - LI - LT - LU - LV - MT - MY - NO - RO - SI - SK ## Get started #### iOS Tap to Pay on iPhone introduces an [SCPDiscoveryMethodTapToPay](https://stripe.dev/stripe-terminal-ios/docs/Enums/SCPDiscoveryMethod.html#/c:@E@SCPDiscoveryMethod@SCPDiscoveryMethodTapToPay) discovery option and a [connectReader](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)connectReader:delegate:connectionConfig:completion:) method. Integrate the latest version of the [Terminal iOS SDK](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=ios) 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-ios/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 iOS application: 1. [Request](https://developer.apple.com/documentation/proximityreader/setting-up-the-entitlement-for-tap-to-pay-on-iphone?language=objc) an entitlement. 1. [Set up](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=iOS) the Terminal iOS SDK. 1. [Connect](https://docs.stripe.com/terminal/payments/connect-reader.md?terminal-sdk-platform=ios&reader-type=tap-to-pay) to the Tap to Pay reader. 1. [Collect](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=ios) the payment with the Tap to Pay reader. ### Entitlements and build file To use Tap to Pay on iPhone to accept payments in your application, you must first [request and configure the Tap to Pay on iPhone development entitlement from your Apple Developer account](https://developer.apple.com/documentation/proximityreader/setting-up-the-entitlement-for-tap-to-pay-on-iphone?language=objc). After you complete internal testing, you must request a distribution entitlement. After you add the development entitlement file to your app build target, add the following: | | | | | Key | `com.apple.developer.proximity-reader.payment.acceptance` | | Value type | `boolean` | | Value | `true` or `1` | Implementing Tap to Pay on iPhone is a complex process that requires submitting your app to Apple for approval. For detailed instructions, you can download our guide: [ Tap to Pay Guide (PDF)](https://docs.stripecdn.com/fd6123a72c0ea6d22019c125f9a35d855fe859b4e327faeb89a2934091830744.pdf) #### React Native Tap to Pay on iPhone introduces a [tapToPay](https://stripe.dev/stripe-terminal-react-native/api-reference/modules/Reader.IOS.html#DiscoveryMethod) discovery option and a [connectReader](https://stripe.dev/stripe-terminal-react-native/api-reference/interfaces/StripeTerminalSdkType.html#connectreader-1) method. 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. You can view version-specific updates and bug fixes in the [SDK changelog](https://github.com/stripe/stripe-terminal-react-native/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 application: 1. [Request](https://developer.apple.com/documentation/proximityreader/setting-up-the-entitlement-for-tap-to-pay-on-iphone?language=objc) an entitlement. 1. [Set up](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=react-native) the Terminal iOS SDK. 1. [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. 1. [Collect](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=react-native) the payment with the Tap to Pay reader. ### Entitlements and build file To use Tap to Pay on iPhone to accept payments in your application, you must first [request and configure the Tap to Pay on iPhone development entitlement from your Apple Developer account](https://developer.apple.com/documentation/proximityreader/setting-up-the-entitlement-for-tap-to-pay-on-iphone?language=objc). After you complete internal testing, you must request a distribution entitlement. After you add the development entitlement file to your app build target, add the following: | | | | | Key | `com.apple.developer.proximity-reader.payment.acceptance` | | Value type | `boolean` | | Value | `true` or `1` | Implementing Tap to Pay on iPhone is a complex process that requires submitting your app to Apple for approval. For detailed instructions, you can download our guide: [ Tap to Pay Guide (PDF)](https://docs.stripecdn.com/fd6123a72c0ea6d22019c125f9a35d855fe859b4e327faeb89a2934091830744.pdf) ## Supported devices Tap to Pay requires an iPhone XS or later running a one-year or later iOS version. [Apple’s Business Register documentation](https://register-docs.apple.com/tap-to-pay-on-iphone/docs/sdk-and-api-guide#ios-versions-and-deprecation-management) lists supported iOS versions. Advise your users to update to the latest iOS version for the best performance. > Tap to Pay won’t work on beta releases of iOS. ## 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 iPhone supports PIN entry for devices running iOS 16.4 or later. 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. To test PIN entry in markets where PIN is accepted, use [physical test cards](https://docs.stripe.com/terminal/references/testing.md#physical-test-cards) with amounts ending in .03. In markets where PIN isn’t accepted, a transaction ending in .03 returns an `online_or_offline_pin_required` error code after the card is tapped, instead of allowing the user to test PIN entry. ## Merchant education > Apple requires you to present a “How to Tap” instructional overlay when enabling Tap to Pay on iPhone. You must integrate this before submitting your app for review. Use Apple’s [ProximityReaderDiscovery API](https://developer.apple.com/documentation/proximityreader/proximityreaderdiscovery) to display this overlay directly in your app. No additional dependencies are required because `ProximityReader` is a built-in iOS system framework already linked by the Stripe Terminal SDK. The API follows a two-step pattern described in [Apple’s documentation](https://developer.apple.com/documentation/proximityreader/proximityreaderdiscovery): 1. Call `content(for:)` to fetch the educational content. 1. Call `presentContent(_:from:)` to display it. ```swift func showHowToTap(from rootViewController: UIViewController) async throws { guard #available(iOS 18.0, *) else { // Provide your own fallback merchant education UI for earlier versions return } let discovery = ProximityReaderDiscovery() let content = try await discovery.content(for: .payment(.howToTap)) // Walk the presentedViewController chain to find the topmost view controller var topVC = rootViewController while let presented = topVC.presentedViewController { topVC = presented } discovery.presentContent(content, from: topVC) } ``` Keep two integration requirements in mind: - Wrap the call in a `#available(iOS 18.0, *)` guard and provide a fallback UI for earlier versions. - Pass the topmost presented view controller at the time of the call. Walk the `presentedViewController` chain from your root view controller to find it, otherwise the call fails. Apple ensures that the content is up to date and localized for your business’s region. For additional merchant education strategies, including in-product promotion and text or email alerts, see Apple’s [developer marketing guidance](https://developer.apple.com/tap-to-pay/marketing-guidelines/). ## Best practices and promotion guidelines Follow the guidelines in [Tap to Pay on iPhone](https://developer.apple.com/design/human-interface-guidelines/technologies/tap-to-pay-on-iphone/) to ensure an optimal user experience and successful review process with Apple. Consider 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=ios&reader-type=tap-to-pay#automatically-attempt-reconnection) to reconnect to the reader when the app comes to the foreground to reduce wait times. - Launch and promote your Tap to Pay on iPhone marketing campaigns using our messaging templates and design assets following [Apple’s brand guidelines](https://developer.apple.com/tap-to-pay/marketing-guidelines/#editorial-guidelines). 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)