Crear un pago
La función principal del TPV es procesar pagos con tarjeta. El PaymentRepository gestiona esta operación, encargándose de la comunicación entre el lector de tarjetas y el Get Smart SDK Payment Service.
Antes de procesar cualquier pago, asegúrate de haber inicializado el TPV.
Realizar un pago estándar
Para procesar un pago sencillo con tarjeta, utiliza la función makePayment. El único parámetro obligatorio es el amount (como un objeto Money).
suspend fun pay(amount: BigDecimal, currency: Currency) {
// 1. Create the Money object
val money = Money(amount, currency)
// 2. Call makePayment
val result = paymentRepository.makePayment(
amount = money
)
// 3. Handle the result
when (result) {
is RepositoryResult.Success -> handlePaymentResult(result.data)
is RepositoryResult.ConnectionError -> showError("Connection failed")
is RepositoryResult.Cancelled -> showInfo("User cancelled: ${result.message}")
is RepositoryResult.ProtocolError -> showError("Error: ${result.type}")
}
}Parámetros de pago avanzados
La función makePayment admite varios parámetros opcionales para enriquecer los datos de la transacción:
tip: Un objetoMoneyque representa el importe de la propina.shiftInfo: Un objetoShiftInfopara asociar el pago con un turno de trabajo específico (Número y Fecha).financialConditions: Condiciones financieras específicas si aplica (como Plazox).proprietaryExtraData: Un objeto para adjuntar datos de terceros a la transacción.language: Un enumLanguageIso6391para forzar la interfaz del servicio a un idioma específico en esta operación.
Ejemplo con parámetros opcionales:
val result = paymentRepository.makePayment(
amount = Money(BigDecimal("50.00"), Currency.getInstance("EUR")),
tip = Money(BigDecimal("5.00"), Currency.getInstance("EUR")),
language = LanguageIso6391.ES
)Interpretar el PaymentResult
Cuando la llamada al repositorio es exitosa (RepositoryResult.Success), devuelve un objeto PaymentResult. Debes verificar este objeto para determinar si la operación financiera fue realmente aprobada o denegada por el banco.
PaymentResult es una interfaz sellada (sealed interface) con tres estados posibles:
1. Aceptado (PaymentResult.Accepted)
El pago fue autorizado por el host.
- Datos: Contiene un objeto
Transactioncon detalles completos (tarjeta utilizada, código de autorización, datos del recibo). - Acción: Imprime el recibo y completa la venta en tu aplicación.
2. Denegado (PaymentResult.Denied)
El pago fue rechazado por el host o el banco.
- Datos: Contiene un objeto
Transaction(a menudo con el motivo del rechazo). - Acción: Informa al usuario de que la tarjeta fue declinada.
3. Tarjeta no encontrada (PaymentResult.CardNotFound)
Error específico para flujos de entrada manual donde el número de tarjeta ingresado no existe.
Ejemplo de lógica de gestión
fun handlePaymentResult(paymentResult: PaymentResult) {
when (paymentResult) {
is PaymentResult.Accepted -> {
val transaction = paymentResult.data
val authCode = transaction.operationInfo.authorizationNumber
println("✅ Payment Approved! Auth Code: $authCode")
// Proceed to print ticket...
}
is PaymentResult.Denied -> {
val transaction = paymentResult.data
val reason = transaction.operationInfo.failedReasonInfo?.desc ?: "Unknown"
println("❌ Payment Denied. Reason: $reason")
}
is PaymentResult.CardNotFound -> {
println("❌ Error: Card not found.")
}
}
}Próximos pasos
- Crear un Pago Preautorizado: Aprende sobre la reserva de fondos en una tarjeta.
- Devolver un Pago: Cómo devolver fondos si un pago se realizó por error.