Validación de BIN y cuotas

Validación de BIN y cuotas

ℹ️

Este proceso es obligatorio

En esta fase, se realiza la validación del BIN de la tarjeta para determinar la marca, el tipo, y si se trata de una tarjeta nacional o internacional. Si la validación es exitosa y la tarjeta corresponde a una de crédito, también se obtiene el listado de cuotas disponibles junto con sus respectivos cálculos.

Requisitos

  • BIN de la tarjeta (los primeros 8 dígitos del número de la tarjeta) recuperado en el proceso de lectura

Resultado

  • Después del proceso de validación del BIN, se obtendrán la marca de la tarjeta, el tipo, un indicador que señalará si debe ser tratada como nacional o internacional.
  • Y, en el caso de tarjetas de crédito (no internacionales), el listado de cuotas disponibles con sus respectivos cálculos.

Paso a paso

  1. Instanciar el objeto BinValidationData pasándole el contexto.
  2. Hacer el set del objeto OperationFlow.
  3. Invocar el método doBinValidation y pasarle el BIN como parámetro.
  4. Configurar un observador para recuperar el resultado.

Datos para la consulta

A continuación, se detallan los datos que necesita el método setOperationFlow y doBinValidation para realizar la validación del BIN y consulta de cuotas.

CampoDescripción
merchantIdIdentificador del merchant.
customerIdIdentificadot del cliente.
currencyCódigo de moneda con el que está procesando la terminal.
interestFlag para indicar si la consulta es con interés o sin interés.
binPrimeros 8 números del número de la tarjeta.
ℹ️

Recuerde que si envía el flag interest = true, el backend de Menta realizará los cálculos de interés siempre que la tarjeta no sea internacional.

Ejemplo de implementación

 private val operationFlow: OperationFlow?
        get() = OperationFlowHolder.operationFlow
 
RestClientConfiguration.configure(AppfinRestClientConfigure())
 
val binValidationData = BinValidationData(this)
binValidationData.setOperationFlow(
    operationFlow = operationFlow,
    merchantId = merchantId,
    customerId = customerId,
    currency = CURRENCY_LABEL,
    interest = false //false = sin interés | true = con interés
)
binValidationData.doBinValidation(bin)
 
binValidationData.binValidationResponse.observe(this) {
    if (it.status == "FOUND") {
        binValidationData.setCardBrand(it.brand)
        val cardType: String = when (it.type) {
            "C" -> {
                CardType.CREDIT.name
            }
 
            "D" -> {
                CardType.DEBIT.name
            }
 
            else -> {
                CardType.PREPAID.name
            }
        }
        binValidationData.setCardType(cardType)
        binValidationData.setIsInternational(it.isInternational ?: false)
        binValidationData.setInstitutionId(
            idInstitution = it.institutionId,
            customerId = customerId
        )
 
        when (cardType) {
            CardType.CREDIT.name -> {
                Log.i(TAG, "Cuotas disponibles: ${it.installments.installments}")
            }
 
            else -> { //Debit y Prepaid
                operationFlow!!.installments = "01"
                Log.i(TAG, "Ir directo al pago")
            }
        }
 
    } else {
        Log.i(TAG, "Bin no encontrado")
        val brandsAvailable = it.brandsAvailable
        Log.i(TAG, "Marcas y tipos disponibles: $brandsAvailable")
    }
}          

Las cuotas disponibles se recuperan por medio del objeto InstallmentsApp que contiene los siguientes campos:

CampoDescripción
codeNúmero de la cuota
financingTipo de financiamiento. Puede ser: BANK para planes estándar o CUOTA_SIMPLE para planes especiales.
typeDescripción del tipo de plan. Puede ser: Planes estandar o Planes especiales para CUOTA_SIMPLE.
installmentLabelMonto de la cuota
installmentAmountLabelNúmero de la cuota formateado para mostrar en la pantalla
totalAmountMonto total incluido impuestos
totalAmountLabelMonto total formateado para mostrar en la pantalla

Códigos de respuesta

El resultado se recibe mediante el objeto BinValidationResponse. En la siguiente tabla se muestran los posibles valores que se pueden recibir como respuesta:

CódigoDescripción
FOUNDIndica que el BIN fue encontrado en la base de datos de Menta.
NOT_FOUNDIndica que el BIN no fue encontrado.
  • Para el caso de BIN encontrado, como siguiente paso, se debe hacer el set de la marca, tipo, flag de nacional/internacional y del institutionID usando los métodos del SDK.
  • En caso de que el BIN no sea encontrado, el objeto BinValidationResponse incluirá una lista de marcas y tipos disponibles, permitiendo al cliente configurar pantallas de selección manual si lo considera necesario. Es importante destacar que estos datos son requeridos para realizar cualquier operación. Además, el SDK ofrece un método para consultar las cuotas disponibles en estos casos. A continuación, se presenta un ejemplo de su implementación.

Ejemplo para consultar cuotas disponibles

 private fun getInstallments(binValidationViewModel: BinValidationData) {
        val brand = "VISA"
        val cardType = "CREDIT"
        val isInternational = false
        binValidationViewModel.getInstallments(
            brand,
            paymentMethod = cardType,
            isInternational = isInternational
        )
        binValidationViewModel.getInstallmentsResponse.observe(this) {
            Log.i(TAG, "installments: ${it.installments}")
 
        }
    }
  • El método getInstallments recibe como parámetros: la marca, el tipo y el flag que indica si la tarjeta es nacional o internacional.
  • Como respuesta se retorna el objeto que en el caso de BIN encontrado.

Consideraciones

  • Se debe enviar el financing en el request de la transacción. Para esto, es necesario hacer la asignación en el objeto operationFlow.
    operationFlow?.financing = installmentWithTotal.financing