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")
    }
}          

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.

Objeto de respuesta BinValidationResponse

CampoDescripción
statusEstado de la consulta del bin: FOUND o NOT_FOUND
binPrimeros 8 digitos del número de la tarjeta
brandMarca de la tarjeta. Ejemplo: Visa, Mastercard
country?País donde se emitió la tarjeta. Campo opcional
isInternational?Indicador de tarjeta internacional. Campo opcional
institutionId?Identificador del emisor de la tarjeta. Campo opcional
typeTipo de tarjeta. Ejemplo: Débito o Crédito
installmentsObjeto AcquirerInstallmentsResponse que contiene el detalle de cuotas, para el caso de tarjetas de crédito

Objeto AcquirerInstallmentsResponse

CampoDescripción
acquirerAdquirente por el cual se va a procesar la transacción
installmentsListado de tipo InstallmentsApp

Objeto InstallmentsApp

Mediante este objeto se recuperan las cuotas disponibles para la tarjeta de crédito en uso.

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.
installmentLabelNúmero de cuota
installmentAmountLabelMonto de la cuota formateado para mostrar en la pantalla
installmentAmountMonto de la cuota en formato ISO
totalAmountMonto total incluido impuestos
totalAmountLabelMonto total formateado para mostrar en la pantalla
  • 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

Caso de BIN no 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.