Tap to Pay is an experimental feature. If you’re interested in implementing and testing it in your wallet, please contact us before getting started.
Android
How It Works
When a user taps their phone on a POS terminal, the terminal emits an NDEF tag with a single URI record pointing tohttps://pay.walletconnect.com. Android dispatches this in one of three ways:
- One wallet installed with a verified App Link — Android opens the wallet’s
NfcPaymentActivitydirectly. - Multiple wallets installed — Android shows the “Open with…” chooser; user selects a wallet.
- No wallet installed — Android opens the URL in the browser, which shows a wallet chooser page with App Store / Play Store links.
Flow: Tap from Home Screen (Phone Unlocked, No App in Foreground)
Flow: Tap from Wallet App (Foreground)
Integration Steps
1
Register with WalletConnect for App Links
Android App Links require
pay.walletconnect.com to list your app in its /.well-known/assetlinks.json file. Without this, autoVerify intent filters won’t pass verification.Provide the following to WalletConnect:- Package name
- SHA-256 certificate fingerprint(s)
2
Manifest Setup
Add NFC permissions:Register a translucent activity with three intent filters — each covers a different Android dispatch path for the same NFC tap:Create
AndroidManifest.xml
AndroidManifest.xml
res/xml/nfc_tech_filter.xml:nfc_tech_filter.xml
3
Implement the NFC Interceptor Activity
The activity handles multiple intent paths to extract the payment URL:
NfcPaymentActivity.kt
4
Add Foreground Dispatch (wallet already open)
When the wallet activity is in the foreground, manifest intent filters may not fire. Use foreground dispatch to claim NFC priority:Wire it into your main activity:
NfcPaymentReader.kt
MainActivity.kt
5
Process Payment via WalletKit Pay
PaymentFlow.kt
iOS
How It Works
When a user taps their phone on a POS terminal, iOS reads the NDEF tag automatically (Background Tag Reading, iOS 13+) and resolves the URL as a Universal Link. Depending on what’s installed:- One wallet registered in AASA — iOS shows a notification banner “Open in [Wallet]”; user taps to open.
- Multiple wallets in AASA — AASA is evaluated top-to-bottom; first installed match wins (no disambiguation UI). On iOS 26, a system wallet chooser modal is shown instead.
- No wallet installed — iOS opens the URL in Safari, which shows a wallet chooser page with App Store links.
NFCNDEFReaderSession, which takes priority over Background Tag Reading.
Flow: Tap from Home Screen (Phone Unlocked, No App in Foreground)
Flow: Tap from Wallet App (Foreground)
Integration Steps
1
Register with WalletConnect for Universal Links
Universal Links require
pay.walletconnect.com to host an Apple App Site Association (AASA) file listing your app. WalletConnect will add your app to pay.walletconnect.com/.well-known/apple-app-site-association.Provide:- Apple Team ID
- Bundle ID
2
Entitlements
Add two entitlements in your NFC Tag Reading (for manual CoreNFC scans):Also enable these capabilities in Xcode → Target → Signing & Capabilities:
.entitlements file.Associated Domains (for Universal Links / Background Tag Reading):Entitlements.plist
Entitlements.plist
- Associated Domains
- Near Field Communication Tag Reading
3
Info.plist
Add the NFC usage description (required by Apple for CoreNFC):
Info.plist
4
Implement the NFC Reader (manual scan path)
This handles the case where the user taps an NFC button inside the app to initiate a read:Key points:
NFCPaymentReader.swift
invalidateAfterFirstRead: true— iOS dismisses the NFC sheet after one tag is read.wellKnownTypeURIPayload()— extracts the URI from a standard NDEF URI record (what the POS emits)..readerSessionInvalidationErrorFirstNDEFTagRead— normal completion, not an error.
5
Handle Background Tag Reading (Universal Links)
This is the zero-interaction path. The user holds their phone near the POS terminal — even from the lock screen or home screen — and iOS reads the NDEF tag automatically, resolves the URL as a Universal Link, and opens your app.The URL arrives via For cold start (app was not running), Universal Links arrive in
NSUserActivity in your SceneDelegate:SceneDelegate.swift
connectionOptions.userActivities:SceneDelegate.swift
6
Wire the NFC Button in Your UI
Show an NFC scan button only on devices that support it:
NFCScanView.swift
7
Process Payment via WalletKit Pay
PaymentFlow.swift