Seamless Flow - Android
The purpose of this document is to inform developers about the various ways in which they can integrate Tridentity SDK (Seamless Flow) with their applications. Tridentity SDK follows a modular approach, providing the flexibility to the application to handle the UI while the SDK handles the business logic.
1. Gradle changes
Update the build.gradle file to include the following:
android {
dependencies {
implementation files('libs/<Tridentity_SDK>.aar') // Tridentity SDK library
// Other required dependencies for Tridentity SDK
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.biometric:biometric:1.1.0'
implementation 'org.bouncycastle:bcprov-jdk15+:1.46'
implementation 'com.nimbusds:nimbus-jose-jwt:7.4'
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'
implementation 'com.scottyab:rootbeer-lib:0.1.0'
}
}
2. Manifest changes
Permissions needed for the SDK are based on the authentication mode. Here, it must be updated in AndroidManifest.xml.
Permission | Description | Mandatory for Modes |
---|---|---|
Post notification
| Mandatory for version 13 and above to receive push notification |
|
Phone State | Mandatory to detect sim swap scenarios |
|
SMS | For auto send of SMS if SDK is enabled for binding the device |
|
Below permissions are needed for Push Notification, Push with Biometric, Biometric-based and Offline OTP modes of authentication:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- Additional permissions may be required based on your implementation -->
3. Configuration of SDK
Configure the SDK by providing required parameters.
Parameter | Description | Mandatory for Modes |
---|---|---|
context | Application Context | All |
clientId | Client ID provided by Tridentity | All |
env | Environment (PROD/UAT) | All |
clientJsonConfig | Client configuration in JSON format | All |
authType | Authentication type (e.g. Biometric) | Push with Biometric, Biometric-based |
biometricRetryCount | Number of biometric retries (default: 3) | Push with Biometric, Biometric-based |
BIN | First 6 digits of the card | Push with Biometric, Biometric-based |
Invoke the following method of the SDK to configure the client details. All the security checks and mandatory permissions required for the SDK will be validated during this call. In case if any security check fails or permission not granted, specific error message will be provided in the callback and the calling app should terminate the flow by showing appropriate message to the user.
Note:From the response event in the
onSuccess
method check for the message flag toget Configuration
status.
val configObject = JSONObject()
configObject.put("env", "UAT") // UAT or PROD
configObject.put("clientId", "")
HeadlessTridentitySDK.getInstance().configSdk(
context,
configObject,
object : ConfigStatusCallback {
override fun onSuccess(event: String) {
// Implementation here
}
override fun onError(errorCode: Int, errorDesc: String) {
// Implementation here
}
}
)
4. Initialisation of FCM
This method is used to pass the FCM token to the SDK in order to send push notification. This method should be called before Initiating Registration and when ever there is a new FCM token generated. Applicable only if the authentication mode enabled is
- Push notification
- Push with Biometric
Parameter & Constraints | Remarks |
---|---|
context
|
|
fcmToken
| Token generated by Firebase Messaging service |
For Push Notification and Push with Biometric modes, pass the FCM token to the SDK.
-
Add Firebase to the Project:
- Create a Firebase project and download the
google-services.json
file.
- Create a Firebase project and download the
-
Include the FCM SDK in
build.gradle
:implementation 'com.google.firebase:firebase-messaging:<latest_version>'
-
Initialize Firebase in the Application:
FirebaseApp.initializeApp(this);
-
Handle FCM Token Registration:
HeadlessTridentitySDK.getInstance().registerFCM(
context,
fcmToken,
object : FCMRegistrationCallback {
override fun onSuccess(event: String) {
Log.d("TAG", "onSuccess: $event")
}
override fun onError(code: Int, error: String) {
// Error handling
}
}
)
5. Registering in SDK
Fetch Features (Optional)
Parameter & Constraints | Remarks | Mandatory for Modes |
---|---|---|
context
| Application Context | All |
Fetch the list of features enabled for the SDK.
HeadlessTridentitySDK.getFeatures(
context,
object : FetchFeaturesCallBack {
override fun fetchFeatures(event: String) {
// Handle feature response
}
}
)
Fetch Consent (Optional)
Fetch the Terms and Conditions for user consent.
HeadlessTridentitySDK.getInstance().getConsent(context, object : ConsentCallBack {
override fun onSuccess(event: String) {
}
override fun onError(error: String) {
}
})
Device binding by App / Device binding bypassed
Fetch SMS Token
Parameter | Remarks |
---|---|
context
| Application Context |
mobileNumber
| Mobile number of the user against which the card is registered prefixed with country code |
uid
| Any other unique identifier of the user if BIN is passed as part of configuring the SDK |
Fetch the SMS token and vendor number for device binding.
val custObject = JSONObject()
custObject.put("mobileNumber", "919876543210")
HeadlessTridentitySDK.getInstance().getSMSToken(
context,
custObject,
object : BindingTokenCallBack {
override fun onSuccess(event: String) {
// Handle success response
}
override fun onError(error: String) {
// Handle error response
}
}
)
Set SIM Info
Parameter | Remarks |
---|---|
context
| Application Context |
simSlotIndex
| SIM slot index of the device |
subscriptionId
| Subscription ID of the subscriber. |
Provide SIM information to detect SIM swap scenarios.
val simObject = JsonObject()
simObject.addProperty("simSlotIndex", 0) // example value has given
simObject.addProperty("subscriptionId", 1) // example value has given
HeadlessTridentitySDK.getInstance().setSimInfo(
context,
simObject,
object : SimInfoCallBack {
override fun onSuccess(event: String) {
Log.d("TAG", "onSuccess: $event")
}
override fun onError(code: Int, error: String) {
// Handle error response
}
}
)
Sample JSON for SIM Info:
{
"simSlotIndex": 0,
"subscriptionId": 123456789,
"mobileNumber": "9876543210"
}
Device Binding by SDK
Parameter & Constraints | Remarks |
---|---|
context
| Application Context |
simSlotIndex
| SIM slot index of the device |
subscriptionId | Subscription ID of the subscriber |
mobileNumber
| Mobile number of the user against which the card is registered prefixed with country code |
uid
| Any other unique identifier of the user if BIN is passed as part of configuring the SDK |
Let the SDK handle SMS sending and device binding.
val simObject = JsonObject()
simObject.addProperty("simSlotIndex", 0) // example value has given
simObject.addProperty("subscriptionId", 1) // example value has given
simObject.addProperty("mobileNumber", "919876543210")
HeadlessTridentitySDK.getInstance().initiateSIMBindingProcess(
context,
simObject,
object : SimBindingResponseCallBack {
override fun onSuccess(event: String) {
Log.d("TAG", "onSuccess: $event")
// On success, do initiate the below method to check the registration status
}
override fun onError(code: Int, error: String) {
// Handle error response
}
}
)
Check Registration Status
Parameter | Description |
---|---|
context
| Application Context |
clientId
| Client ID provided by Tridentity |
mobileNumber
| Mobile number of the user against which the card is registered prefixed with country code |
uid
| Any other unique identifier of the user if BIN is passed as part of configuring the SDK |
Check the current registration status of the customer.
val custObject = JSONObject()
custObject.put("mobileNumber", "919876543210")
HeadlessTridentitySDK.getInstance().checkRegistrationStatus(
context,
custObject,
object : RegistrationStatusCallBack {
override fun onSuccess(event: String) {
// Note: customerStatus : registration_comm_success is only considered as successful Registration.
}
override fun onError(code: Int, error: String) {
// Handle error response
}
}
)
6. Transaction History
Parameter | Remarks |
---|---|
activity
| Transaction activity description |
limit
| No of transaction record fetched per single request. Default of 10 records per request |
offset
| Page index. Default 0-4 |
Retrieve transaction data authenticated via the SDK.
val historyObject = JsonObject()
historyObject.addProperty("limit", 10)
historyObject.addProperty("offset", 0)
TridentitySDK.getTransactionHistory(
activity as AppCompatActivity,
historyObject,
object : transactionHistoryCallback {
override fun onSuccess(event: String) {
// Note: customerStatus : registration_comm_success is only considered as successful Registration.
}
override fun onError(code: Int, error: String) {
// Handle error
}
}
)
7. View Offline OTP
Generate and view an offline OTP for authentication.
TridentitySDK.showofflineOTP(
requireActivity() as HomeActivity,
object : ResponseCallbackInterface {
override fun fetchStatus(event: String) {
// Perform necessary actions based on callback received
}
}
)
8. Process Transaction
Parameter | Remarks | Mandatory for Modes |
---|---|---|
context
| Application context | All |
remoteMessage
| Message received from push notification |
|
buildNotification | To be passed as True if SDK needs to render the Push notification |
|
jsonObject | Refer to jsonObject fields description | Biometric |
jsonObject fields description
Parameter | Remarks |
---|---|
txnId
| Transaction ID of the transaction |
clientID
| Client ID provided by Wibmo |
amount
| Transaction amount |
merchantName
| Merchant name |
Authenticate transactions using the SDK.
TridentitySDK.getInstance().processTransaction(
context = applicationContext,
remoteMessage = remoteMessage.data,
buildNotification = false,
object : UpdateTransactionCallback {
override fun onSuccess(event: JSONObject) {
Log.v("processTransaction", "onSuccess")
}
override fun onError(error: String) {
Log.e("processTransaction", "onError: $error")
}
}
)
Sample JSON for transaction data:
{
"amount": "1000.00",
"currency": "INR",
"merchantName": "Example Merchant",
"transactionId": "TX123456789"
}
9. De-Registration
Remove a customer from the Tridentity system.
TridentitySDK.getInstance().deRegistration(
context,
object : DeregisterCallBack {
override fun onSuccess(event: JSONObject) {
// Success handling
}
override fun onError(code: Int, error: String) {
// Error handling
}
}
)
Is there anything specific you'd like me to modify or enhance in this markdown version?
Updated 26 days ago