> For the complete documentation index, see [llms.txt](https://docs.payvalida.com/api-tarjeta/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.payvalida.com/api-tarjeta/master/sdk-para-3ds-y-score-de-riesgo-transaccional/guia-de-integracion-con-el-sdk-para-android/3.-ejemplo-de-uso-kotlin.md).

# 3. Ejemplo de Uso (Kotlin)

### Validación Antifraude

La validación antifraude es un proceso de dos pasos:

1. &#x20;debes llamar a `startAntiFraudValidator` mientras el usuario escribe la información de su tarjeta (con un debounce). Esta verificación inicial te indicará si se requiere 3DS para la transacción.

{% hint style="info" %}
Debes almacenar el estado `threeDSRequired` junto con `pvThreedsId` y referenceId de la respuesta.
{% endhint %}

2. Cuando el usuario envía el formulario de pago completo, verificas el estado almacenado.&#x20;

* Si `threeDSRequired` es <mark style="color:$success;">verdadero</mark>, procedes con la validación 3DS llamando a `startThreeDSValidator` .
* Si `threeDSRequired` es <mark style="color:$danger;">falso</mark> y la verificación inicial fue aprobada, puedes proceder directamente con la transacción.

{% hint style="info" %}
La llamada al método del SDK debe hacerse cada vez que cambien los campos de número de tarjeta o de vencimiento, con un debounce que el cliente considere adecuado.
{% endhint %}

```kotlin
import com.payvalida.antifraud.*
import com.payvalida.antifraud.models.*

// En tu ViewModel o clase de manejo de estado
var isThreeDSRequired: Boolean = false
var isAntiFraudApproved: Boolean = false
var antiFraudKountSessionId: String? = null
var antiFraudPvThreedsId: String? = null
var antiFraudReferenceId: String? = null
var antiFraudFranchise: String? = null

// Paso 1: Llama a esto con un debounce mientras el usuario escribe el número de tarjeta/vencimiento
suspend fun performAntiFraudValidation() {
    try {
        val antiFraudArgsData = AntiFraudArgs(
            token = "tu-token",
            cardNumber = "4111111111111111",
            expirationMonth = "12",
            expirationYear = "25"
        )

        val response = sdk.startAntiFraudValidator(antiFraudArgsData)

        // Almacena los resultados de la verificación antifraude.
        // Es posible que una transacción sea aprobada por la verificación antifraude
        // pero aún así requiera la validación 3DS como un paso de seguridad adicional.
        isAntiFraudApproved = response.isApproved
        isThreeDSRequired = response.threeDSRequired == true
        antiFraudKountSessionId = response.data?.kountSessionId
        antiFraudPvThreedsId = response.data?.pvThreedsId
        antiFraudReferenceId = response.data?.referenceId
        antiFraudFranchise = response.data?.franchise

        if (!isAntiFraudApproved && !isThreeDSRequired) {
            // Maneja el fallo inmediato: muestra un error al usuario.
        }

    } catch (e: Exception) {
        // Manejar excepciones
    }
}

// Paso 2: Llama a esto cuando el usuario envíe el formulario de pago completo
suspend fun onFormSubmit() {
    if (isThreeDSRequired) {
        // Si se requiere 3DS, comenzar la validación 3DS con los datos completos del formulario.
        perform3DSValidation()
    } else if (isAntiFraudApproved) {
        // Si no se requiere 3DS y la verificación antifraude fue aprobada,
        // procede con la transacción, enviando kountSessionId y franchise a tu backend.
    } else {
        // Maneja el caso en que la transacción no está aprobada y no requiere 3DS.
    }
}
```

### Validación 3DS

Cuando <mark style="color:$success;">`startAntiFraudValidator`</mark> retorna <mark style="color:$success;">`threeDSRequired = true`</mark>, debes pasar los valores <mark style="color:$success;">`pvThreedsId`</mark> y referenceId de esa respuesta al <mark style="color:$success;">`FormData`</mark>:

```kotlin
import com.payvalida.antifraud.PayvalidaAntifraudSdk
import com.payvalida.antifraud.models.FormData

suspend fun perform3DSValidation() {
    try {
        val formData = FormData(
            billAddrCity = "Bogotá",
            billAddrCountry = "Colombia",
            billAddrLine1 = "some direction",
            billAddrLine2 = "some direction",
            billAddrPostCode = "660001",
            billAddrState = "Cundinamarca",
            cardNumber = "4111111111111111",
            instalments = 1,
            cvv = "123",
            di = "12341234",
            expirationMonth = "12",
            expirationYear = "25",
            lastName = "Doe",
            name = "John",
            token = "tu-token",
            typeDI = "CC",
            phoneNumber = "3001234567",
            email = "usuario@ejemplo.com",
            pvThreedsId = antiFraudPvThreedsId,   // De la respuesta de startAntiFraudValidator
            referenceId = antiFraudReferenceId     // De la respuesta de startAntiFraudValidator
        )

        val response = sdk.startThreeDSValidator(formData)

        if (response.isApproved) {
            // Manejar validación exitosa
        } else {
            // Manejar validación fallida, revisar response.error
        }
    } catch (e: Exception) {
        // Manejar excepciones
    }
}
```
