Integración con Android
Esta guía proporciona información técnica detallada sobre la integración del SDK en una aplicación Android. Asegúrate de seguir los pasos y consideraciones que se mencionan a continuación para lograr una integración exitosa.
Paso 1: Descargar el SDK
Descarga el archivo SDK aquí
Una vez en el enlace, haz clic en el botón de descarga para obtener el archivo del SDK en formato comprimido.
Descomprime el archivo descargado en una ubicación de tu elección en tu máquina de desarrollo.
Paso 2: Integración del SDK en tu proyecto
En primer lugar, es necesario añadir el SDK al proyecto de tu aplicación Android. Para ello, crea una carpeta llamada "libs" dentro del directorio correspondiente y copia la librería (AAR) en dicha carpeta.
Paso 3: Modificar el build.gradle de la "APP"
Nos dirigimos a build.gradle del app y ponemos las siguientes líneas de código.
plugins {
id 'kotlin-kapt'
id 'kotlin-android-extensions'
id 'dagger.hilt.android.plugin'
}
dependencies {
implementation files('../libs/izipay-sdk-1.2.2.aar')
implementation files('../libs/TMXAuthentication-RL-6.3-77.aar')
implementation files('../libs/TMXBehavioralBiometrics-RL-6.3-77.aar')
implementation files('../libs/TMXDeviceSecurityHealth-RL-6.3-77.aar')
implementation files('../libs/TMXProfilingConnections-RL-6.3-77.aar')
implementation files('../libs/TMXProfiling-RL-6.3-77.aar')
implementation 'androidx.core:core-ktx:1.8.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation "com.google.dagger:hilt-android:2.44"
kapt "com.google.dagger:hilt-compiler:2.44"
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
implementation "com.squareup.retrofit2:converter-scalars:2.9.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
implementation 'com.github.bumptech.glide:glide:4.14.2'
annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2'
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.3'
implementation "com.github.skydoves:balloon:1.5.2"
implementation "com.github.skydoves:powerspinner:1.2.4"
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
Paso 4: Modificar el build.gradle del "Proyecto"
Si ya configuraste Dagger Hilt en tu proyecto, puedes omitir este paso. En caso contrario nos dirigimos al build.gradle del Proyecto y ponemos las siguientes líneas de codigo:
plugins {
id 'com.google.dagger.hilt.android' version '2.44' apply false
}
luego le damos al botón Sync Now en la parte superior derecha.
Paso 5: Agregar archivo @HiltAndroidApp
Si ya agregaste la anotación @HiltAndroidApp en tu aplicación, no es necesario repetirlo. Si aún no ha sido agregado, en su archivo App debera agregar en la cabecera la siguiente línea de código @HiltAndroidApp (Si no tiene el archivo: App debe crear uno).
@HiltAndroidApp
class NombreDeTuArchivo: Application{
}
NombreDeTuArchivo es el nombre de tu archivo y puede lucir así: SDKExampleApp
Enviar un objeto CONFIGREQUEST con estos parámetros correspondientes
CONFIGREQUEST = {
data class ConfigRequest(
var environment: String?,
var action: String?,
var publicKey: String?,
var transactionId: String?,
var merchantCode: String?,
var facilitatorCode: String?,
var order: OrderPaymentIzipay?,
var token: TokenPaymentIzipay?,
var billing: BillingPaymentIzipay?,
var shipping: ShippingPaymentIzipay?,
var appearance: AppearencePaymentIzipay?,
var urlIPN: String?,
): Serializable
data class OrderPaymentIzipay(
var orderNumber: String?,
var currency: String?,
var amount: String?,
var payMethod: String?,
var channel: String?,
var processType: String?,
var merchantBuyerId: String?,
var dateTimeTransaction: String?
): Serializable
data class BillingPaymentIzipay(
var firstName: String?,
var lastName: String?,
var email: String?,
var phoneNumber: String?,
var street: String?,
var city: String?,
var state: String?,
var country: String?,
var postalCode: String?,
var documentType: String?,
var document: String?
): Serializable
data class ShippingPaymentIzipay(
var firstName: String?,
var lastName: String?,
var email: String?,
var phoneNumber: String?,
var street: String?,
var city: String?,
var state: String?,
var country: String?,
var postalCode: String?,
var documentType: String?,
var document: String?
): Serializable
data class AppearencePaymentIzipay(
var language: String? = "",
var formControls: AppearenceControlsPaymentIzipay?,
var visualSettings: AppearenceVisualSettingsPaymentIzipay?,
var theme: String? = "",
var customTheme: CustomThemePaymentIzipay?,
var logo: String? = "",
): Serializable
data class AppearenceVisualSettingsPaymentIzipay(
showMessageResult: Boolean? = false
)
data class AppearenceControlsPaymentIzipay(
var isAmountLabelVisible: Boolean? = false,
var isLangControlVisible: Boolean? = false,
): Serializable
data class CustomThemePaymentIzipay(
var payButtonBackgroundColor: String? = "",
var textInputBorderColor: String? = "",
var textInputPlaceholderTextColor: String? = ""
): Serializable
data class TokenPaymentIzipay(
var cardToken : String? = "",
): Serializable
}
Puedes enviar el request de la siguiente manera:
val intent = Intent(activity, ContainerActivity::class.java)
intent.putExtra(ContainerActivity.REQUEST, request) // request es una instancia de CONFIGREQUEST
responseLauncher.launch(intent)
Actualmente el SDK cuenta con dos modos de visualización: Modo FullScreen
y Modo Embebido
.
A continuación podrá ver la forma en que responde ambos modos y tambien los pasos a seguir para implementar el modo Embebido
.
5.1 Modo FullScreen Screen
Para recibir e implementar, en modo fullscreen, la respuesta del objeto "RESPONSE", se deben agregar las siguientes líneas de código en el código fuente de la aplicación. Es importante tener en cuenta que la respuesta es un string en formato JSON. Para realizar una lectura correcta de los datos de la respuesta, se recomienda revisar los ejemplos de JSON proporcionados en el capítulo casos de uso. Estos ejemplos servirán como referencia para comprender la estructura de los datos y facilitar su manipulación en la implementación del código
private val responseLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result ->
val dataSignature = result.data?.getStringExtra(ContainerActivity.RESPONSESIGNTURE).orEmpty()
val dataPayLoad:PaymentResponse = Gson().fromJson(result.data?.getStringExtra(ContainerActivity.RESPONSEPAYLOAD).orEmpty(), object: TypeToken<PaymentResponse>(){}.type)
if(result.resultCode == AppCompatActivity.RESULT_OK){
val response = "$timeStamp :: $dataPayLoad->$dataSignature"
binding.etResponse.setText(response)
}else{
val response = "$timeStamp :: $dataPayLoad->$dataSignature"
binding.etResponse.setText(response)
}
}
5.2 Modo Embebido
Sigue los siguientes pasos para la implementación del modo Embebido:
- Para emplear el modo embebido, se inicia añadiendo la clase PayCallback al fragmento que funciona como el contenedor del SDK. Luego, se crea una variable libraryManager de tipo PayManager.
@AndroidEntryPoint
class HomeFragment : Fragment(), PayCallback {
private lateinit var libraryManager: PayManager
- A continuación, se crea una instancia de la clase PayManager y se asigna a la variable libraryManager. Luego, se aplica el método setCallback al contexto actual, ya que este contexto será recibido por nuestro fragmento PaymentsFragment (que es parte del SDK).
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = FragmentHomeBinding.inflate(inflater, container, false)
libraryManager = PayManager()
libraryManager.setCallback(this)
}
- Dentro del método intentActivity() de tu fragmento que sirve como contenedor del SDK, crea un objeto Bundle en el cual incluye la solicitud (request) de tipo ConfigRequest. Luego, realiza la invocación del fragmento PaymentsFragment de la siguiente manera:
private fun intentActivity() {
val bundle = Bundle().apply {
putSerializable("data", request) //donde request es una instancia de ConfigRequest que ya esta llena de valores para el pago
}
val transaction = parentFragmentManager.beginTransaction()
var fragment = PaymentsObject.paymentsObject() as PaymentsFragment
fragment.arguments = bundle
fragment.payManager = libraryManager
transaction
.addToBackStack("HomeFragment")
.add(R.id.navContainer, fragment)
.commit()
}
- Implementa la interfaz PayCallback en el fragmento que actúa como contenedor del SDK, y sobrescribe el método onDataFromPayments de la siguiente manera:
override fun onDataFromPayments(success: Boolean, pdata: PaymentResponse?, psignature:String?) {
if(success){
val response = "Success: True \n\nTra.ID: $timeStamp \n\nData: $pdata \n\nSignature: $psignature"
binding.etResponse.setText(response)
}else{
val response = "Success: False \n\nTra.ID: $timeStamp \n\nData: $pdata \n\nSignature: $psignature"
binding.etResponse.setText(response)
}
if (parentFragmentManager.backStackEntryCount > 0)
parentFragmentManager.popBackStack()
}
Ten en cuenta que los valores pdata, pdataSignature, y pdataPayload son equivalentes a los que se devuelven en el modo fullscreen y se utilizan de la misma manera.
Paso 6: Integración con librerías de sensory branding
Copiar las librerías de sensory branding en la carpeta libs (junto con el SDK de Izipay).
Insertar las líneas siguientes en el archivo gradle ubicado a nivel de aplicación, tal como se indica a continuación:
dependencies {
implementation files('../libs/izipay-sdk-1.2.2.aar')
implementation files('../libs/sonic-sdk-release-1.4.0.aar')
implementation files('../libs/visa-sensory-branding-2.1.aar')
//Otras dependencias
…
}
La integración con las librerías de sensory branding es un paso obligatorio exigido por las marcas.