Integrate Turbo UPI Headless Mock SDK
Steps to integrate the Razorpay Turbo UPI Headless Mock SDK with your app.
Mock SDK is a tool designed to facilitate your integration with Turbo UPI. Unlike conventional integration methods that rely on the stability of partner banks and NPCI UAT environments, Mock SDK removes this dependency, streamlining the integration process.
- No Dependency on UAT Environment: Traditional integration methods often encounter obstacles due to issues with UAT environments. Mock SDK removes this roadblock, enabling you to integrate without external dependency.
- Streamlines Integration: Mock SDK is designed to create a smoother integration experience, ensuring a hassle-free process. This allows you to quickly offer Turbo UPI services to the users.
- Effortless Integration for Essential Flows: Mock SDK simplifies the process of integrating Turbo for important scenarios. This enables you to expand your range of UPI services for customers without dealing with complex requirements.
- Seamless Transition to Production: After testing your integration with Mock SDK, you can smoothly transition to the Production SDK for final testing. This ensures a seamless and secure transition from development to live production.
-
Contact our
to get your app and GitHub account whitelisted to get access to thehttps://github.com/upi-turbo/android-turbo-sample-app
- sample app repository.- In this repository, you will find the AAR files (libraries for Turbo) and the sample app source code to help you with the integration.
- The AARs on the main branch are for the UAT environment, the ones on the prod branch are for the production environment, and the mock branch is for the mock environment.
These are the important files in the sample app repo:
app/libs
: All libraries (Bank, SecureComponent and Turbo) common for headless and UI SDKapp/build.gradle
: All transitive dependencies needed to integrate Turbo SDK.
-
Integrate with the
. -
Import the following frameworks:
- Razorpay Turbo Wrapper Plugin SDK (maven)
- Razorpay Turbo Core SDK
- Mock SDK
-
Add the following lines to your Android project's
gradle.properties
file:android.enableJetifier=true
android.useAndroidX=true
Watch Out!
minSDKversion
for using Turbo UPI is currently 19 and cannot be overwritten.- API Key Usage for Different Environments:
- Use the
rzp_test_0wFRWIZnH65uny
API key id for testing on the UAT environment. - Use the
rzp_test_vacN5cmVqNIlhO
API key id for testing on the Mock environment. - Use the for prod testing.
- Use the
- As a compliance requirement, you need to get approval from Google for READ_SMS permission. Refer to the for more details.
Follow these steps to integrate with
.Razorpay has three environments: Mock, UAT and Prod. We recommend the following:
- Complete the integration with the Mock environment.
- Perform the UAT using the Razorpay-provided API keys.
Use the following data to test the integration.
Following are the various scenarios based on the dependencies.
Given are the various test cases and their sequential steps.
In the scenario of successful device binding, follow these simple steps:
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.linkNewUpiAccount
method. - The SDK response should then transition to
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
(no errors). - The expected response should be
UpiTurboLinkAction = SELECT_BANK
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data.
In the event of a SIM card not being found, follow these steps:
- Remove all SIM cards from the device.
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.linkNewUpiAccount
method. - The SDK response should then transition to
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
(no errors). - Grant all the required permissions as prompted.
- The expected response should be
UpiTurboLinkAction = SELECT_SIM
withaction.getError()!=null
(no errors).
When permissions are denied or access is restricted, follow these steps:
- Remove all SIM cards from the device.
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.linkNewUpiAccount
method. - The SDK response should then trasition from
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
(no errors). - Deny the required permissions when prompted.
- The expected response should be
UpiTurboLinkAction = SHOW_PERMISSION_ERROR
.
In the scenario where an account is found, follow these steps:
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.linkNewUpiAccount
method. - The SDK response should then transition from
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
(no errors). - Grant the required permissions when prompted.
- After the permissions are granted, the SDK response should change to
UpiTurboLinkAction = SELECT_SIM
withaction.getError()==null
(no errors). - Select Axis Bank or SBI Bank as mentioned in the .
- The expected response should be
UpiTurboLinkAction = SELECT_BANK_ACCOUNT
withaction.getError()==null
(no errors).
When it comes to setting or managing your PIN, follow these steps:
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.linkNewUpiAccount
method. - Check the response from SDK, which should switch from
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
(no errors). - Grant the necessary permissions when prompted.
- The SDK response should then transition to
UpiTurboLinkAction = SELECT_BANK
withaction.getError()==null
(no errors). - Subsequently, you will receive another SDK response of
UpiTurboLinkAction = SELECT_BANK
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Select SBI Bank as specified in the .
- Following that, the SDK response should become
UpiTurboLinkAction = SELECT_BANK_ACCOUNT
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Select an account ending with xxxx0203.
- Expect the final response to confirm that an account with a PIN is already set and the UPI ID is linked.
When dealing with scenarios where a PIN is not set, follow these steps:
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.linkNewUpiAccount
method. - Check the response from SDK, which should switch from
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
(no errors). - Grant the necessary permissions when prompted.
- Subsequently, you will receive an SDK response of
UpiTurboLinkAction = SELECT_SIM
withaction.getError()==null
(no errors). - Following that, you will receive another SDK response of
UpiTurboLinkAction = SELECT_BANK
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Choose SBI Bank as specified in the .
- The SDK response should then become
UpiTurboLinkAction = SELECT_BANK_ACCOUNT
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Select an account ending with xxxx0001.
- Expect the final response to be
UpiTurboLinkAction = SETUP_UPI_PIN
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data.
When there is no account associated with a particular number, follow these steps:
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.linkNewUpiAccount
method. - Check the response from SDK, which should switch from
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
(no errors). - Grant the necessary permissions when prompted.
- Subsequently, you will receive an SDK response of
UpiTurboLinkAction = SELECT_SIM
withaction.getError()==null
(no errors). - Following that, you will receive another SDK response of
UpiTurboLinkAction = SELECT_BANK
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Select HDFC or Yes Bank as mentioned in the .
- The expected response should be
UpiTurboLinkAction = SELECT_BANK_ACCOUNT
withaction.getError()==null
(no errors).
For a successful PIN setup, follow these steps:
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.linkNewUpiAccount
method. - Check the response from SDK, which should switch from
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
(no errors). - Grant the necessary permissions when prompted.
- Subsequently, you will receive an SDK response of
UpiTurboLinkAction = SELECT_SIM
withaction.getError()==null
(no errors). - Following that, you will receive another SDK response of
UpiTurboLinkAction = SELECT_BANK
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - The SDK response should then become
UpiTurboLinkAction = SELECT_BANK_ACCOUNT
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Select an account ending with xxxx0001.
- Following that, you will receive another SDK response of
UpiTurboLinkAction = SETUP_UPI_PIN
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Enter the card details.
- The expected final response should be
UpiTurboLinkAction = STATUS
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data.
When you need to change your PIN successfully, follow these steps:
- Call the
razorpay.upiTurbo.changeUpiPin
method with the correct PIN. - Expect a callback
onSuccess
. Your PIN change has been successfully completed.
When dealing with an invalid PIN or a PIN that does not match, follow these steps:
- Call the
razorpay.upiTurbo.changeUpiPin
method with the correct PIN. - Expect a callback
onFailure
. This means the PIN provided was invalid or did not match the expected PIN.
In situations where an incorrect OTP is encountered, follow these steps:
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.linkNewUpiAccount
method. - Check the response from SDK, which should switch from
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
(no errors). - Grant the necessary permissions when prompted.
- Subsequently, you will receive an SDK response of
UpiTurboLinkAction = SELECT_SIM
withaction.getError()==null
(no errors). - Following that, you will receive another SDK response of
UpiTurboLinkAction = SELECT_BANK
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Select SBI Bank as specified in the .
- The SDK response should then become
UpiTurboLinkAction = SELECT_BANK_ACCOUNT
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Select an account ending with xxxx0001.
- Following that, you will receive another SDK response of
UpiTurboLinkAction = SETUP_UPI_PIN
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Enter the card details.
- Enter any random OTP except for 123456.
When dealing with resetting your PIN with incorrect card details, follow these steps:
- Call the
razorpay.upiTurbo.resetUpiPin
method with incorrect PIN and card details that are not mentioned in the . - Expect a callback
onFailure
. This indicates that the reset attempt has failed due to incorrect card details.
When working with scenarios involving the presence of a UPI ID, follow these steps:
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.linkNewUpiAccount
method. - Check the response from SDK, which should switch from
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
(no errors). - Grant the necessary permissions when prompted.
- Subsequently, you will receive an SDK response of
UpiTurboLinkAction = SELECT_SIM
withaction.getError()==null
(no errors). - Following that, you will receive another SDK response of
UpiTurboLinkAction = SELECT_BANK
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Select SBI Bank as specified in the .
- The SDK response should then become
UpiTurboLinkAction = SELECT_BANK_ACCOUNT
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Select an account ending with xxxx0203.
- Expect the final response to confirm that an account with a UPI ID is linked successfully.
When dealing with scenarios related to UPI ID, such as new UPI ID creation, follow these steps:
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.linkNewUpiAccount
method. - Check the response from SDK, which should switch from
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
(no errors). - Grant the necessary permissions when prompted.
- Subsequently, you will receive an SDK response of
UpiTurboLinkAction = SELECT_SIM
withaction.getError()==null
(no errors). - Following that, you will receive another SDK response of
UpiTurboLinkAction = SELECT_BANK
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Select Axis Bank as mentioned in .
- The SDK response should then become
UpiTurboLinkAction = SELECT_BANK_ACCOUNT
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Select an account ending with xxxx0001.
- Following that, you will receive another SDK response of
UpiTurboLinkAction = SETUP_UPI_PIN
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data. - Enter the card details.
- The expected final response should be
UpiTurboLinkAction = STATUS
withaction.getError()==null
andaction.getData != null
. This response should not have any errors, and it should contain some relevant data.
When it comes to transactional scenarios, with a focus on ensuring a successful payment, follow these steps:
- Begin by following the , specifically the
submit
method. - Enter an amount that is lower than the account balance.
- Enter the correct PIN.
- Subsequently, you will receive a callback on
onPaymentSuccess
. This indicates that the payment has been successfully processed.
Handy Tips
The account balance remains unchanged, and the paid amount is not deducted in mock payment.
In situations where an invalid PIN is entered, follow these steps:
- Begin by following the , specifically the
submit
method. - Enter an amount lower than the account balance mentioned in .
- Enter the incorrect PIN.
- Subsequently, you will receive a callback on
onPaymentError
. This indicates that an error occurred during the payment process due to the invalid PIN.
When dealing with transactional scenarios, specifically focusing on handling timeouts, follow these steps:
- Begin by following the , specifically the
submit
method. - Enter the amount as 24.
- Enter the correct PIN.
- Subsequently, you will receive a callback on
onPaymentError
. This indicates that an error occurred during the payment process due to a timeout.
When it comes to transactional scenarios with a focus on handling insufficient balance, follow these steps:
- Begin by following the , specifically the
submit
method. - Enter an amount greater than the account balance as mentioned in .
- Enter the correct PIN.
- Subsequently, you will receive a callback on
onPaymentError
. This indicates that an error occurred during the payment process due to insufficient balance.
For scenarios related to checking your balance, follow these steps:
- Call the
razorpay.upiTurbo.getBalance
method. - Enter the correct PIN.
- Expect a callback on
onSuccess
. This confirms that you will receive the requested balance information.
When it comes to scenarios focused on checking your balance, follow these steps:
- Call the
razorpay.upiTurbo.getBalance
method. - Enter an incorrect PIN.
- Expect a callback on
onFailure
. This indicates that an error occurred during the payment process due to the invalid PIN.
Follow these simple steps for the first time onboarding:
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.prefetchAndLinkUpiAccounts
method. - The SDK's initial response should shift to
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
indicating no errors. - Prompt the user to grant the necessary permissions by calling
action.consents([consent]).requestPermission()
. - Upon successful device binding, the process of fetching accounts will commence.
- Subsequently, expect the SDK's response to transition to
UpiTurboLinkAction = STATUS
withaction.getError()==null
, indicating no errors. - Once the account is successfully linked, you will receive a callback asynchronously in the
UpiTurboLinkAction=STATUS
with updated lists.
Follow these simple steps for the first time onboarding:
- Enter a mobile number that exists on the user's device.
- Call
razorpay.upiTurbo.prefetchAndLinkUpiAccounts
method. - The SDK's initial response should shift to
UpiTurboLinkAction = ASK_FOR_PERMISSION
withaction.getError()==null
indicating no errors. - Call either
action.requestPermission()
oraction.consents([consent]).requestPermission()
with afalse
value in the consent object. - The device binding process is initiated, including SMS sending.
- After successful device binding, the expected response should transition to
UpiTurboLinkAction = SELECT_BANK
with no errorsaction.getError()==null
and should contain relevant data availableaction.getData != null
.
When it comes to setting or managing your PIN, follow these steps:
- Call the
action.selectBankAccount(bankAccount, card)
method to select the desired bank account fetched during the prefetch process. - On the next screen, enter the bank OTP from the and proceed.
- Enter and confirm the PIN on the subsequent screens.
Follow these steps for accounts that are already onboarded:
- Call the
razorpay.upiTurbo.prefetchAndLinkUpiAccounts
method. - The SDK response should transition to
UpiTurboLinkAction = SELECT_BANK
withaction.getError()==null
andaction.getData != null
. This response should not have any errors and should contain relevant data.
Watch Out!
- Device Binding will only work if the user has at least one SIM card in their mobile device.
- Users can set/reset the UPI PIN. The configured PIN will be used to validate the transaction.
- Based on the for bank accounts, choose a bank for a single, multiple or no bank account.
- Use the same ATM PIN and card Number mentioned in the .
- The UPI PIN will revert to its default setting or be removed when you uninstall or clear storage.
- Amount ₹24 is blocked for special cases. Please refer to .
Businesses should have the capability to display a user-friendly message to their customers for certain special or additional error scenarios. The SDK is equipped to simulate some of these cases.
The following points are be considered for TPV flow:
- Only one TPV whitelisted account (ending with xxxx0203) is permitted. Payments made using any other accounts will fail with the error Payment failed because the account linked to VPA is invalid.
- Payment can be made multiple times when using Mock for any given
order_id
, which is not the case in production. - Use the
rzp_test_V5AtnjYvupQXm1
API key id for TPV testing on the Mock environment.
Complete this
to take your integration live.Is this integration guide useful?