Integrar el flujo de pago
El SDK de Mercado Pago ofrece un conjunto integral de funcionalidades diseñadas para simplificar y optimizar todo el proceso de pagos.
Vas a poder configurar, adaptar y automatizar el flujo de cobro según las necesidades específicas de tu aplicación. Esto abarca acciones como gestionar medios de pago, optimizar flujos de cobro, gestionar errores e incluso realizar el tratamiento de pagos aprobados.
A continuación, ve cómo configurar cada una de estas funcionalidades.
Para facilitar la integración de medios de pago en tu aplicación, nuestro SDK proporciona una instancia de PaymentsMethodsTools. A partir de esto, utilizando la función getPaymentMethods, es posible obtener una lista de los medios de pago disponibles, que se presentan en PaymentMethod.
Este recurso permite recuperar los medios de pago soportados, de acuerdo con las especificaciones de cada país. Esta información es fundamental al momento de iniciar el flujo de pago.
FEEDING_VOUCHER_LIST) como medio de pago (paymentMethod) debe ser solicitada al equipo comercial responsable de su integración.A continuación, ve un ejemplo de cómo acceder a esta función mediante el objeto MPManager y obtener los medios de pago disponibles según el país.
MPManager.paymentMethodsTools.getPaymentMethods { response ->
response
.doIfSuccess { result ->
// puedes renderizar la lista de payment methods en un recycler view
}.doIfError { exception ->
// manejo del error
}
}
/**
* Consulta el estado de un pago usando la referencia de pago
* @param paymentReference Referencia del pago (descripción ingresada en el campo)
*/
public static void getPaymentStatus(String paymentReference) {
PaymentStatus paymentStatus = MPManager.INSTANCE.getPaymentStatus();
paymentStatus.getPaymentStatus(paymentReference, response -> {
doIfSuccess(response, result -> {
Log.i("PaymentStatusManager", "Payment status: " + result);
return null;
});
doIfError(response, error -> {
Log.e("PaymentStatusManager", "Payment status error: " + error.getMessage());
return null;
});
return null;
});
}
Para iniciar el flujo de pago en tu SmartApp con el SDK de Mercado Pago, utiliza la función PaymentFlow, disponible en la clase launchPaymentFlow. Esta función te permite gestionar las respuestas mediante callbacks, simplificando tanto la implementación como el control posterior.
Al implementar el objeto PaymentFlowRequestData, presta atención a la definición del parámetro paymentMethod, que puede variar según el país de integración. Usa el recurso para consultar los medios de pago disponibles y configúralos de acuerdo a cada país.
FEEDING_VOUCHER_LIST) como medio de pago (paymentMethod) debe ser solicitada al equipo comercial responsable de su integración.Observa a continuación un ejemplo de cómo acceder a esta función mediante el objeto MPManager e iniciar el flujo de pago.
val paymentFlow = MPManager.paymentFlow
val paymentFlowRequestData = PaymentFlowRequestData(
amount = 10.0,
description = "test description",
paymentMethod = paymentMethod, // este parámetro se obtiene mediante el método getPaymentMethods
printOnTerminal = false, // campo opcional si se lanza el pago sin impresión en la terminal
taxes = listOf(
Tax(
payerCondition = PayerCondition.PAYMENT_TAXABLE_IVA
)
), // campo opcional si se lanza el pago con impuestos
)
paymentFlow.launchPaymentFlow(
paymentFlowRequestData = paymentFlowRequestData
) { response ->
response.doIfSuccess { result ->
// manejar éxito utilizando un mensaje
}.doIfError { error ->
// manejar el error
}
}
final PaymentFlow paymentFlow = MPManager.INSTANCE.getPaymentFlow();
final String amount = "2.0";
final String description = "Payment description";
final ArrayList<Tax> taxes = new ArrayList<>();
taxes.add(new Tax(
PayerCondition.PAYMENT_TAXABLE_IVA
));
final PaymentFlowData paymentFlowData = new PaymentFlowData(
amount,
description,
PaymentMethod, // este parámetro se obtiene mediante el método getPaymentMethods
6, // campo opcional si se lanza el pago con cuotas
false, // campo opcional si se lanza el pago sin impresión en la terminal
taxes, // campo opcional si se lanza el pago con impuestos
);
final Function1<MPResponse<PaymentResponse>, Unit> callback = (final MPResponse<PaymentResponse> response) -> {
if (response.getStatus() == ResponseStatus.SUCCESS) {
// manejo de éxito utilizando un mensaje
} else {
// manejo del error
}
return Unit.INSTANCE;
};
paymentFlow.launchPaymentFlow(paymentFlowData, callback);
| Parámetro | Tipo | Descripción | Obligatoriedad |
amount | String | Valor del pago. | Sí |
description | String | Descripción del flujo de pago. Este campo debe contener información única por transacción porque se utilizará como base para consultar el estado del pago. | Sí |
paymentMethod | String | El medio de pago a utilizar. | No |
printOnTerminal | Boolean | Flag para impresión automática del comprobante de pago en la terminal (predeterminado: true). | No |
taxes | List | Lista de indicadores para inclusión de impuestos en la venta, siendo: - PAYMENT_EXEMPT_IVA: pago exento de IVA. - PAYMENT_TAXABLE_IVA: pago con impuesto de IVA. | No |
En caso de éxito, la respuesta será similar al siguiente ejemplo:
kotlin
paymentFlow.launchPaymentFlow( paymentFlowRequestData = paymentFlowRequestData ) { response -> response.doIfSuccess { result -> // result es un objeto PaymentResponse con la siguiente información: println("Referencia de pago: ${result.paymentReference}") println("Método de pago: ${result.paymentMethod}") println("Monto: ${result.paymentAmount}") println("Fecha de creación: ${result.paymentCreationDate}") println("Cuotas: ${result.paymentInstallments}") println("Últimos 4 dígitos: ${result.paymentLastFourDigits}") println("Terminal: ${result.paymentSnDevice}") println("Usuario: ${result.paymentBrandName}") println("Propina: ${result.tipAmount}") println("Referencia externa: ${result.externalReference}") }.doIfError { error -> // error contiene el mensaje de error println("Error: ${error.message}") } }
| Parámetro | Tipo | Descripción |
paymentReference | String | Número que sirve como identificador único de la transacción. |
paymentMethod | PaymentMethod | Método de pago utilizado para realizar el pago (ej: CREDIT_CARD, DEBIT_CARD, etc.). |
paymentAmount | Number | Valor del pago realizado. |
paymentCreationDate | String | Fecha en que se creó la transacción. |
paymentInstallments | String | Número de cuotas que el usuario eligió al momento de realizar el pago. |
paymentLastFourDigits | String | Últimos 4 dígitos de la tarjeta del cliente que realizó el pago. |
paymentSnDevice | String | Número de serie de la terminal Point Smart que realizó la transacción. |
paymentBrandName | String | Nombre de usuario registrado en la terminal Point Smart. |
paymentStatusError | String | Campo para registrar problemas y errores de la transacción. Vacío si el pago fue exitoso. |
tipAmount | String | Valor de la propina cobrada en el pago. |
externalReference | String | Referencia externa del pago. |
Nuestro SDK presenta un método para consultar el estado de un pago aprobado al finalizar el flujo en la pantalla de finalización del pago.
La consulta se realiza a partir de la descripción del pago. Por eso, ese campo debe contener información única por transacción. Si múltiples pagos usan la misma descripción, el sistema actualizará el estado con base en el pago más reciente y mostrará solo los datos del último registro asociado.
Implementar la consulta de estado
Con el método getPaymentStatus, que recibe como parámetro la descripción (description) correspondiente al pago, se ejecuta una consulta en nuestra base de datos y se devuelve un objeto de tipo PaymentResponse con toda la información relacionada al pago aprobado.
La función parseResponse, disponible en PaymentFlow, permite analizar las respuestas de cada transacción. Al convertir los datos del URI en un objeto PaymentResponse, puedes acceder a información como la referencia del pago, el medio utilizado y posibles errores asociados.
A continuación, observa un ejemplo de cómo implementar este recurso.
// Inicializamos el estado de pago a través de MPManager
private val paymentStatus = MPManager.paymentStatus
// Este es el resultado de lo que se escribe en el campo de descripción
private val paymentReference = ""
paymentStatus.getPaymentStatus(paymentReference) { response ->
response.doIfSuccess {
// manejo de caso de éxito del resultado del objeto PaymentResponse
}.doIfError {
// Manejo del caso de error
}
}
// Inicializamos el estado de pago a través de MPManager
PaymentStatus paymentStatus = MPManager.getPaymentStatus();
// Este es el resultado de lo que se escribe en el campo de descripción
String paymentReference = "";
paymentStatus.getPaymentStatus(paymentReference, new PaymentStatusCallback() {
@Override
public void onSuccess(PaymentResponse result) {
// Manejo del caso de éxito del resultado del objeto PaymentResponse
}
@Override
public void onError(Throwable error) {
// Manejo del caso de error
}
});
En caso de éxito, la respuesta será similar al siguiente ejemplo:
kotlin
// Inicializamos el estado del pago a través de MPManager private val paymentStatus = MPManager.paymentStatus // Este es el valor del campo de descripción utilizado para buscar el estado private val paymentReference = "12345678" paymentStatus.getPaymentStatus(paymentReference) { response -> response.doIfSuccess { result -> // result es un objeto ApprovedPaymentData con la siguiente información: println("ID del pago: ${result.paymentId}") println("Tipo de pago: ${result.type}") println("Valor: ${result.amount}") println("Fecha de creación: ${result.creationDate}") println("Número de serie del terminal: ${result.snDevice}") println("Estado: ${result.status}") println("Marca: ${result.brandName}") println("Últimos 4 dígitos: ${result.lastFourDigits}") println("Referencia externa: ${result.externalReference}") println("Descripción: ${result.description}") println("Propina: ${result.tip}") }.doIfError { error -> // Manejo del caso de error println("Error: ${error.message}") } }
| Parámetro | Tipo | Descripción |
paymentId | String | ID del pago. |
type | String | Tipo de pago. |
amount | Number | Valor del pago realizado. |
creationDate | String | Fecha de creación del pago. |
snDevice | String | Número de serie de la terminal Point Smart que realizó la transacción. |
status | String | Estado del pago. |
brandName | String | Nombre de usuario registrado en la terminal Point Smart. |
lastFourDigits | String | Últimos 4 dígitos de la tarjeta del cliente utilizada en el pago. |
externalReference | String | Referencia externa del pago. |
description | String | Descripción de la transacción. |
tip | String | Valor de la propina cobrada en el pago. |
paymentStatusError | String | Campo para registrar problemas y errores de la transacción. Vacío si el pago fue exitoso. |