Tap to Pay overview
Learn how Tap to Pay lets your app accept contactless, card-present payments with no external hardware
Tap to Pay (also called SoftPOS) turns a partner’s phone into a card-present payment terminal. A payor taps their contactless card, phone, or watch against the device. No external card reader is required. Because it’s a card-present transaction, it qualifies for card-present interchange rates. The payment happens inside the partner’s own app, under the partner’s own brand.
Tap to Pay is a payment method, built on Payabli’s mobile SDK. Right now, only iOS is supported. See Tap to Pay for the component reference.
How Tap to Pay works
A Tap to Pay charge moves through six steps, from requesting an access token to receiving a transaction result. Device setup (initializing the SDK) and reading a card happen separately. Initializing the SDK doesn’t touch the card at all:
Partner app requests an access token
Before accepting a payment, the partner app asks its own backend for a short-lived Payabli access token. The Payabli clientSecret never leaves the backend.
Partner backend exchanges credentials for a token
The backend calls Payabli’s token endpoint with its clientId and clientSecret and returns the resulting access token to the app.
App initializes the SDK
The app calls the mobile SDK’s initialize() method, which performs one-time device attestation and prepares the reader. No card is read yet.
SDK starts the charge
The app calls charge(). The SDK sends the transaction details to Payabli’s Pay In API, which returns a transaction ID before any card is read.
Diagram: Tap to Pay transaction flow
This diagram shows the sequence of calls between the partner app, the partner’s backend, Payabli, the processor, and the card network:
- The partner app requests an access token from the partner backend.
- The partner backend exchanges its
clientIdandclientSecretwith Payabli for an access token, then returns it to the app. - The app initializes the SDK, which performs device attestation. No card is read yet.
- The app starts the charge. Payabli returns a transaction ID before any card is read.
- The app reads the payor’s contactless card, phone, or watch over NFC, then sends the card data to the processor, which requests authorization from the card network.
- The app notifies Payabli that the payment is complete, and Payabli stores the authorization data with the transaction.
- Payabli returns the transaction result, including the
paymentTransId, to the partner app.
Supported payment types
Tap to Pay accepts:
- Tokenized NFC card (digital wallet). A card provisioned into a digital wallet, such as Apple Pay or Google Pay, on a payor’s NFC-capable phone or smartwatch.
- NFC-enabled card. A physical contactless card from Visa, Mastercard, Discover, or American Express.
Requirements
Tap to Pay requires a physical device. See Accept Tap to Pay payments: Prerequisites for the full checklist, including minimum OS and hardware versions.
First-time device activation
The first time a device runs your app, attestation succeeds but the device is marked pending, and the SDK throws devicePendingActivation. Your backend requests a one-time activation code from Payabli, and your app delivers it to the user by email, SMS, or in-app. After the user enters the code and the app submits it, the device is authorized for all future sessions. See Integration steps for the implementation details.
Diagram: First-time device activation
This diagram shows the sequence for activating a device the first time it runs your app:
- The app calls
initialize(), which asks Payabli’s device service to run an App Attest check. - The device service completes attestation but marks the device as pending.
- The app throws
devicePendingActivation. - The app calls its own backend, which requests a one-time activation code from Payabli.
- The backend returns the activation code and its expiration to the app.
- The app delivers the code to the user by email, SMS, or in-app.
- The user enters the code in the app.
- The app calls
activateDevice(activationCode:), which sends the code to Payabli’s device service. - The device service confirms the activation.
- The app calls
initialize()again. - Because attestation is already cached,
initialize()skips straight to fetching configuration and preparing the reader, and the session becomes ready.
Next steps
- Accept Tap to Pay payments walks through the full Tap to Pay integration, including paypoint registration, Apple entitlements, and device activation.
- Tap to Pay documents the
PayabliSDKTapToPaycomponent, including its full implementation reference and example app.
Related resources
See these related resources to help you get the most out of Payabli.
Next steps
- Accept Tap to Pay payments - Integrate Tap to Pay in your native iOS app, from paypoint registration through your first charge