The Rabo Tap to Pay app supports a “direct payment entry” mode that controls whether cashiers can open the Register screen inside the RTP app and manually key in a payment amount. By default this mode is enabled. A third-party cash-register app can disable it so that only App-to-App transactions initiated by the external POS system are accepted.
iOS
Info.plist (required)
Add the rabotaptopay scheme to the LSApplicationQueriesSchemes array in your app’s Info.plist so that iOS allows your app to open RTP URLs:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>rabotaptopay</string>
</array>
Method – Via deep link URL scheme
On iOS the only supported integration method is the URL scheme deep link. Open the URI below from your app using UIApplication.shared.open(_:) or SwiftUI’s openURL environment action.
URI pattern: rabotaptopay://settings?directPaymentEnabled={true|false}
Parameter: directPaymentEnabled (String “true” / “false”, optional)
true (or absent) – allow the cashier to open the Register screen and enter amounts manually (default behaviour)
false – block manual entry; an informational dialog is shown inside the RTP app
Swift example (UIKit):
if let url = URL(string: "rabotaptopay://settings?directPaymentEnabled=false") {
if UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url)
} else {
// Rabo Tap to Pay app is not installed
}
}
Swift example (SwiftUI – using openURL):
@Environment(\.openURL) var openURL
// ...
if let url = URL(string: "rabotaptopay://settings?directPaymentEnabled=false") {
openURL(url)
}
Behavior notes
- The setting is persisted inside the RTP app and survives app restarts. Sending the command once at launch is sufficient.
- Enabled (default): cashiers can open the Register screen inside the RTP app and enter payment amounts manually.
- Disabled: the Register screen is replaced by an informational dialog. App-to-App transactions initiated from your external POS system still work normally.
- The parameter value is case-insensitive. Only the exact string “false” disables direct payment; any other value (including an absent parameter) leaves it enabled.
- After the deep link is processed, the RTP app displays a brief confirmation alert to acknowledge the change
Android
AndroidManifest.xml (required for Android 11 / API 30+)
Add the following queries block inside manifest so that your app can resolve the RTP app on Android 11 and higher:
<queries>
<package android:name="nl.rabobank.rabo.tap.to.pay" />
<intent>
<action android:name="nl.rabobank.rabo.tap.to.pay.SET_DIRECT_PAYMENT" />
</intent>
</queries>
Method 1 – Via Intent (recommended for native Android apps)
Send an Intent with the action nl.rabobank.rabo.tap.to.pay.SET_DIRECT_PAYMENT and a single boolean extra directPaymentEnabled. No result is returned; the setting takes effect immediately and is persisted inside the RTP app across process restarts.
Parameter:
directPaymentEnabled (Boolean, mandatory)
true – allow the cashier to open the Register screen and enter amounts manually (default behaviour)
false – block manual entry; an informational dialog is shown instead
Kotlin example:
val intent = Intent("nl.rabobank.rabo.tap.to.pay.SET_DIRECT_PAYMENT").apply {
putExtra("directPaymentEnabled", true) // pass false to disable
addCategory(Intent.CATEGORY_DEFAULT)
}
try {
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
// Rabo Tap to Pay app is not installed
}
Method 2 – Via deep link
When launching from a context where an explicit Intent action is not available (e.g. a browser, QR code scanner, or push notification handler), use an ACTION_VIEW Intent with the URI below.
URI pattern: rabotaptopay://settings?directPaymentEnabled=1
Kotlin example:
val uri = Uri.parse("rabotaptopay://settings?directPaymentEnabled=false")
val intent = Intent(Intent.ACTION_VIEW, uri)
try {
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
// Rabo Tap to Pay app is not installed
}
Checking whether the Rabo Tap to Pay app is installed
On Android 11+ the package manager enforces visibility restrictions in release builds. Use a two-step check: primary lookup by package name, with a fallback to queryIntentActivities for the SET_DIRECT_PAYMENT action.
fun isRtpInstalled(context: Context): Boolean {
// Primary: package name lookup (reliable in release with <queries> declared)
return try {
context.packageManager.getPackageInfo("nl.rabobank.rabo.tap.to.pay", 0)
true
} catch (e: PackageManager.NameNotFoundException) {
// Fallback: query by intent action
val probe = Intent("nl.rabobank.rabo.tap.to.pay.SET_DIRECT_PAYMENT")
.addCategory(Intent.CATEGORY_DEFAULT)
context.packageManager
.queryIntentActivities(probe, PackageManager.MATCH_DEFAULT_ONLY)
.isNotEmpty()
}
}
Behavior notes
- The setting is persisted inside the RTP app and survives process death. Sending the command once at app startup is sufficient.
- Enabled (default): cashiers can open the Register screen inside the RTP app and enter payment amounts manually.
- Disabled: the Register screen is replaced by an informational dialog. App-to-App transactions initiated from your external POS system still work normally.
- Both integration methods (Intent and deep link) produce the same result. Choose the one that best fits your launch context.