1. Terminal SDK
Español
  • English
  • Español
  • Docs de API 🇲🇽
  • Online Payments
    • Errores ISO
    • Errores del API de Kushki
    • Notas de versión
    • Card Payments
      • Solicitar un token de tarjeta
      • Hacer un cargo o cargo diferido
      • Crear pago (sin token)
      • Solicitar opciones de diferido
      • Reembolsar una transacción
      • Autorizar pagos
      • Preautorización (sin token)
      • Anular una transacción
      • Reautorizar pagos
      • Capturar un pago autorizado
      • Información de BIN V2
      • Información de BIN
      • Validar OTP
    • One-Click and Scheduled Payments
      • Solicitar un token de cargo recurrente
      • Crear un cargo recurrente
      • Hacer un pago One-click
      • Actualizar los datos de la tarjeta del cargo recurrente
      • Cancelar un cargo recurrente
      • Actualizar un cargo recurrente
      • Agregar un cargo o descuento temporal
      • Autorizar pagos
      • Capturar un pago autorizado
      • Consultar información del cargo recurrente
    • Transfer in
      • Consultar lista de bancos
      • Solicitar un token de Transfer In
      • Iniciar transacción
      • Consultar estado
    • Transfer Out
      • Consultar lista de bancos
      • Consultar lista de bancos V2
      • Solicitar un token de Transfer Out
      • Iniciar transacción
      • Consultar estado
      • Saldo para payouts
    • Smartlinks
      • Crear un Smartlink
      • Consultar un Smartlink
      • Eliminar un Smartlink
      • Actualizar un Smartlink
    • Payment Button
      • Crear un Payment Button
    • Analytics
      • Consultar listado de transacciones v2
    • Chargebacks
      • Consultar chargebacks
      • Solicitar exportación de chargebacks
    • Commissions
      • Consultar configuración de comisiones
    • Payment Credentials
      • Crear una credencial
      • Activar o desactivar
      • Eliminar credencial
      • Regenerar una credencial
      • Actualizar credencial
      • Búsqueda avanzada
      • Buscar credenciales
    • Platform Status
      • Consultar estado de la plataforma
      • Consultar estado del gateway
    • Settlement
      • Consultar liquidación
    • Subscription Transactions
      • Consultar transacciones de suscripción
    • Fraud Report
      • Consultar alertas de fraude
  • Card Present Billpocket
    • Notas de versión
    • Notas de versión del SDK de Android
    • Notas de versión de la app de Android
    • Notas de versión de la app de iOS
    • Get Started
      • Crear una cuenta
      • User Token
      • API Keys
    • Webhooks
      • Webhooks — Transferencia de fondos a tu cuenta bancaria
      • Errores de transferencia de fondos
    • Terminals
      • App Review
      • Splash Screen
    • Card not Present Billpocket Services
      • 3DS Checkout
        • Crear checkout
        • Consultar detalles del checkout
      • E-commerce Flex
        • Obtener token
        • Validar token
        • Cobrar pagos
        • Reembolso
        • Capturar un pago autorizado
        • Consultar estado
    • Catalogs
      • Estados
      • Municipios
      • Empresas de impuestos
      • Actividades comerciales
    • Accounts
      • Clabe Account Setup
        • Agregar cuenta CLABE
      • Deposit Accounts
        • Agregar o actualizar cuenta CLABE
    • User Settings
      • Crear usuario
    • Card Present Payment Services
      • Cloud Terminal API
        • Cobrar pagos con tarjeta
        • Imprimir ticket
        • Cancelar notificación push
        • Consultar estado de la transacción
        • Cobrar pagos con tarjeta v2
      • App-to-App
        • Android intents
        • App to App — iOS
        • App to App — Mobile Web
      • Terminal SDK
        • Terminal SDK Android
        • Errores del SDK de Android
    • Transactions
      • Transaction List
        • Obtener token
        • Consultar listado de transacciones
        • Consultar listado de transacciones v2
        • Consultar listado de transacciones v3
        • Consultar listado de transacciones v4
      • Cancel Payments
        • Códigos de error de cancelación
        • Cancelar pagos
  • API Raw Card Present
    • El objeto Amount
    • Catálogo de errores
    • Proceso de intercambio de llaves
    • Notas de versión
    • Datos de prueba
    • One-time payments
      • Pago único
    • Two-step-payments
      • Autorización y captura
    • Voids & Refunds
      • Reembolsar una transacción
      • Anular y reversar
    • Card information
      • Consultar información de BIN
      • Información de BIN V2
      • Solicitar opciones de diferido
    • Query Transactions
      • Búsqueda de transacciones
    • Webhooks
      • Webhooks — Pagos con tarjeta
      • Webhooks — Reembolsos
      • Webhooks — Introducción
      • Buenas prácticas
      • Revisa tus webhooks
    • Chargebacks
      • Consultar chargebacks
      • Solicitar exportación de chargebacks
    • Fraud Report
      • Consultar alertas de fraude
  • Kushki One
    • Error Catalog
    • Release notes
    • Transaction Examples
    • Webhooks
    • Cloud Services
      • Payment
        • Sync
          • Charge
          • Authorization (Pre-auth)
          • Capture
          • Re-authorization
          • Post-tip
          • Void
          • Refund
          • Abort
        • Async
          • Charge (Async)
          • Authorization — Pre-auth (Async)
          • Capture (Async)
          • Re-authorization (Async)
          • Post-tip (Async)
          • Void (Async)
        • Search
          • Transaction Search
      • Print
        • Create Print Job
        • Get Print Job Status
    • Local Services
      • Payment
        • Sync
          • Charge
          • Authorization (Pre-auth)
          • Capture
          • Re-authorization
          • Post-tip
          • Void
          • Refund
          • Abort
        • Async
          • Charge (Async)
          • Authorization — Pre-auth (Async)
          • Capture (Async)
          • Re-authorization (Async)
          • Post-tip (Async)
          • Void (Async)
          • Abort (Async)
        • Search
          • Transaction Search — Online
          • Transaction Search — Local
      • Print
        • Create Print Job
        • Get Print Job Status
        • Print Job Webhook (inbound — implemented by your POS)
  • Appian - Submerchant Register
    • Release Notes
    • Submerchant Validation in Batch
    • Query submerchant status by requestId/submerchantId
    • Submerchant Document Upload
    • Get submerchantIds
    • Get credentials for submerchants
  • Schemas
    • RequestBodies
      • one-and-two-step-payment
    • Card
    • Channel
    • Amount-cash-in
    • ChargebackListResponse
    • TransactionResponse
    • PrintJobRequest
    • one-and-two-step-payment-2
    • Card Present (CP)
    • one-and-two-step-payment-2
    • SubscriptionTransactionsResponse
    • FraudAlertRequest
    • StatusComponent
    • SettlementDateRangeRequest
    • amount
    • ChargebackItem
    • SubscriptionTransaction
    • extra_taxes
    • RawResponse
    • CommandText
    • Card Not Present (CNP)
    • Deferred
    • networkToken
    • FraudAlertResponse
    • ErrorResponse400
    • SettlementRecord
    • card
    • CardData
    • CommandColumns
    • FraudAlertRecord
    • SettlementResponse
    • currency
    • webhooksItem
    • ErrorResponse
    • Country
    • ErrorResponse401
    • LinkFailure
    • ColumnItem
    • ValidationError
    • Amount
    • card_details
    • ErrorResponse403
    • enc_tlv
    • CommandDivider
    • TransactionEvent
    • extraTaxes
    • payment_method
    • ErrorResponse500
    • CommandFeed
    • TransactionStatus
    • deferred
    • CommandSpace
    • ReadingType
    • pos_details
    • ContactDetails
    • sub_merchant
    • CommandCut
    • FailureReason
    • contact_details
    • Subscription
    • metadata
    • CommandImage
    • EventTerminal
    • documentType
    • orderDetails
    • Language
    • TransactionSearchRequest
    • CommandQR
    • EventOperation
    • Shipping Address
    • payment_submethod
    • CommandBarcode
    • EventAmount
    • Billing-Address
    • SubscriptionUpdate
    • EventExtraTaxes
    • PrintJobAccepted
    • PrinterError
    • EventMetadata
    • SubscriptionAdjustmentRequest
    • product
    • AmountWithTaxes
    • PrintJobStatus
    • PrintJobStatusRequest
    • threeDomainSecure
    • AmountCore
    • webhooks
    • headers
    • ExtraTaxes
    • PrintWebhookPayload
    • webhooksChargeback
    • Metadata
    • AmountWithTip
    • citMit
    • TransactionSearchBody
    • TransactionSearchOnlineBody
    • network
    • binInfo
    • AmountWithOptionalTip
    • TransactionSearchLocalBody
    • TransactionEvent_2
    • messageFields
    • UnexpectedErrorResponse
    • FailureReason_2
    • transactionType
    • ExternalReferenceId
    • EventTerminal_2
    • ExternalSubscriptionId
    • EventOperation_2
    • EventAmount_2
    • EventExtraTaxes_2
    • EventMetadata_2
    • SettlementTicketRequest
HomePerú 🇵🇪México 🇲🇽
Ecuador 🇪🇨Colombia 🇨🇴Chile 🇨🇱
HomePerú 🇵🇪México 🇲🇽
Ecuador 🇪🇨Colombia 🇨🇴Chile 🇨🇱
  1. Terminal SDK

Terminal SDK Android

Acepta pagos presenciales a través de una terminal directamente desde tu app de Android. El SDK de Android te permite comunicarte de forma segura con una terminal y ejecutar distintas operaciones, con control total de la interfaz de usuario de tu aplicación.
A diferencia de la integración App to App, la integración por SDK no requiere que tengas instalada la app POS en tu dispositivo.
INFO
Servicio disponible solo en México 🇲🇽.

Requisitos#

Para integrar tu aplicación mediante el SDK, debes cumplir los siguientes requisitos:
Una cuenta válida
Una terminal POS compatible

Importar el SDK de Android#

Importa el SDK a tu proyecto agregando las siguientes líneas a tu archivo build.gradle:
Si vas a integrar un lector Ultra SE, debes agregar el siguiente permiso a tu archivo AndroidManifest.xml para inicializar el SDK correctamente:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
    tools:ignore="QueryAllPackagesPermission" />
Nota
Si usas una versión anterior a 2.8.1 y planeas actualizar la versión del SDK en tu app, ten en cuenta el permiso anterior para evitar problemas al inicializar el SDK.

Plugins#

Instala en tu archivo build.gradle los siguientes plugins, necesarios para el correcto funcionamiento del SDK:

Repositorios#

Agrega los siguientes repositorios en tu archivo settings.gradle:

Inicializar el SDK#

Inicializa el SDK indicando tu user token y el ambiente mediante el método initSDK().
PropiedadTipoObligatorioDescripciónValores permitidos
contextObjectSÍandroid.content.Context.
sdkModeObjectSÍInitBillpocketSDK.SdkMode.TEST, PRODUCTION
userTokenStringSÍTu user token.
deviceTokenStringNOID del dispositivo. Disponible a partir de la versión 2.8.4. Puedes verlo y renombrarlo desde el dashboard de Billpocket, en la sección My devices.
listenerObjectSÍEventListenerInitSDK.
Envía eventListener como un objeto que implemente la interfaz EventListenerInitSDK para escuchar el resultado de la inicialización:
Nota
Este método también conecta automáticamente las terminales Ultra y Ultra P, así que no es necesario llamar al método connectReader para esos modelos.

Conectar un lector Bluetooth#

Vincula la terminal con tu dispositivo móvil por Bluetooth para que el SDK pueda encontrarla.
Obtén los lectores disponibles con el método getListBluetoothReaders:
Implementa el método resultListReaders de la interfaz EventListenerConnection para escuchar el resultado:

Permisos de Bluetooth en Android con API level inferior a 31#

En dispositivos con un API level de Android inferior a 31, debes verificar los permisos de Bluetooth:
Nota
El método resultListReaders no está disponible para las terminales Ultra y Ultra P.

Conectar el lector seleccionado#

Cuando selecciones un lector entre las opciones devueltas, usa el método connectReader. Obtén los parámetros type, macAddress y name del objeto BluetoothDevice que seleccionaste antes.
Implementa el método resultReaderConnect de la interfaz EventListenerConnection para escuchar el resultado de la conexión:

Desconectar un lector Bluetooth#

Usa el método disconnectReader para desconectar un lector Bluetooth conectado previamente:
Implementa el método resultReaderDisconnection de la interfaz EventListenerDisconnection para escuchar el resultado de la operación:
Implementa el método onQposDisconnected para ejecutar una acción cuando una terminal se apaga tras un periodo de inactividad:

Iniciar una transacción#

Usa el método doTransaction para iniciar una transacción con la terminal. Debes establecer los parámetros obligatorios al momento de hacer la solicitud.
PropiedadTipoObligatorioDescripción
contextObjectSÍandroid.content.Context.
amountNumberSÍMonto de la transacción.
descriptionStringSÍDescripción de la transacción.
locationObjectSÍInstancia del objeto android.location.Location con la latitud y la longitud del origen de la transacción.
tipNumberNOPropina de la transacción (si aplica).
listenerObjectSÍInstancia de EventListenerTransaction.
rotationSignatureBooleanNOUsa true para mostrar la pantalla de firma en vertical o false para mostrarla en horizontal.
Para usar este método, asegúrate de incluir primero el siguiente import:
Envía una solicitud a la terminal para iniciar una transacción:
Define eventListener como un objeto que implemente la interfaz EventListenerTransaction para escuchar los eventos de la transacción:
Existen otros métodos que te permiten cubrir correctamente los distintos flujos de pago.

onMagneticCardFound#

El SDK lo llama para indicar que la tarjeta se leyó por banda magnética, así que debes invocar el método onContinueTransactionWithMagneticCard() para continuar con el flujo de pago:
El SDK llama automáticamente al método doOnTransaction después de invocar onMagneticCardFound para continuar la transacción.

selectAplication#

Si la tarjeta leída tiene más de una opción de pago, el SDK llama al método selectAplication con la lista de opciones disponibles para que selecciones una y continúes la operación:
Para continuar con la transacción, llama a BluetoothReaderTransaction.continueWithAppIndex(itemSelected) enviando la opción seleccionada.
PropiedadTipoObligatorioDescripción
itemSelectedIntegerSÍElemento seleccionado.

Meses Sin Intereses (MSI)#

Si la venta es mayor o igual a $300 MXN, se llama al callback onMsiDefined con la lista de todas las opciones Q6Descriptor disponibles para diferir la transacción.
Nota
Debes implementar este callback aunque no planees ofrecer la opción de diferido, para poder continuar el flujo de pago durante una transacción.
Si no quieres diferir una venta, elige la última opción devuelta en la lista Q6Descriptor (Q6Descriptor{installments=0, minAmount=0, commission=0}).
Ejemplo de valores Q6Descriptor devueltos
Continúa el proceso llamando al método continueTransactionWithMSI una vez que hayas seleccionado la opción de diferido correcta:
PropiedadTipoObligatorioDescripción
msiIntegerSÍElemento seleccionado.

Autenticación del tarjetahabiente#

Autentica al tarjetahabiente con su número de identificación personal (PIN) o con una firma electrónica para procesar la transacción. El tipo de autenticación depende de la tarjeta.

Autenticación con PIN#

Para implementar esta funcionalidad, incluye la siguiente dependencia en tu archivo build.gradle:
Puedes descargar la dependencia del repositorio Card-present Mexico BP apps.
Agrega las siguientes activities en tu archivo AndroidManifest.xml:
<application
    ...

    <activity
        android:name="com.billpocket.minerva.core.PlainPINCaptureActivity"
        android:excludeFromRecents="true"
        android:exported="false"
        android:permission="com.billpocket.minerva.permission.SECURE_PIN_INPUT"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateAlwaysHidden"/>

    <activity
        android:name="com.billpocket.minerva.core.RSAKeyPINCaptureActivity"
        android:excludeFromRecents="true"
        android:exported="false"
        android:permission="com.billpocket.minerva.permission.SECURE_PIN_INPUT"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateAlwaysHidden"/>
</application>
Implementa el callback startForActivityResult(intent, code) o activityResultLauncher.Launch(intent) para realizar la autenticación con PIN:
Implementa la función BluetoothReaderTransaction.continueTransactionWithPIn(result.data, eventListener) para obtener el resultado de la activity.
PropiedadTipoObligatorioDescripción
result.dataObjectSÍIntent del resultado de la activity.
listenerObjectSÍInstancia de EventListenerTransaction.

Autenticación con firma#

Agrega la siguiente activity en tu archivo AndroidManifest.xml:
<application
    ...

    <activity
        android:name="com.billpocket.bil_lib.SignatureActivity"
        android:excludeFromRecents="true"
        android:exported="false"
        android:permission="com.billpocket.minerva.permission.SECURE_PIN_INPUT"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateAlwaysHidden"/>
</application>
Implementa el callback startForActivityResult(intent, code) o activityResultLauncher.Launch(intent) para realizar la autenticación con firma electrónica:
Implementa la función BluetoothReaderTransaction.continueTransactionWithSignature(result.data) para obtener el resultado de la activity.
PropiedadTipoObligatorioDescripción
result.dataObjectSÍIntent del resultado de la activity.

Callbacks de respuesta#

Una transacción puede terminar en success o error según el resultado. Esta es la lista de callbacks disponibles.

onTransactionSuccessful#

Se llama cuando la transacción es exitosa. transactionData contiene toda la información de la transacción.

onTransactionFinished#

Se llama cuando se realiza un pago con banda magnética o cuando ocurre un error durante la transacción.

onTransactionAborted#

Si la operación se aborta —por ejemplo, porque la terminal se desconectó o se agotó el tiempo de lectura de la tarjeta—, se ejecuta el callback onTransactionAborted para indicar el resultado de la operación.

EventListenerTransaction#

Esta es la lista de eventos disponibles para una transacción.

Obtener la lista de transacciones#

Obtén la lista de transacciones previas con el método getHistoryTransaction:
El resultado se devuelve en el callback resultHistoryTransaction de la interfaz EventListenerHistoryTransactions:

Reembolso#

Selecciona una transacción de la lista de transacciones autorizadas para realizar un reembolso:
Implementa el método resultHistoryTransaction de la interfaz EventListenerHistoryTransactions:
Llama al método refundPayment para realizar el reembolso:
Implementa el método resultRefundPayment de la interfaz EventListenerRefundPayment para obtener el resultado:

Imprimir el ticket#

Imprimir por ID de transacción#

Para imprimir el ticket de compra, llama al método printTicket:

Imprimir una copia del ticket#

A partir de la versión 2.8.5, el callback requestPrintCopy muestra al usuario un diálogo que le pregunta si quiere imprimir una copia del ticket.
requestPrintCopy() llama a continueWithPrintTicketCopy con true (imprimir) o false (no imprimir), según lo que elija el usuario:
Ejemplo de implementación:

Resultado de la impresión#

Implementa el callback onResult de la interfaz EventListenerPrinter para obtener la respuesta de la operación:

Imprimir un bitmap#

Puedes imprimir un ticket enviando un bitmap con el método printTicketImage:
La respuesta se devuelve a través del mismo callback onResult de la interfaz EventListenerPrinter.
¿Necesitas acceso a la impresora de la terminal?
Consulta la documentación del fabricante.

Seguimiento de mensajes#

Implementa los siguientes métodos opcionales para obtener más información durante el uso del SDK.

Transacción#

Método para obtener información durante una transacción:

Inicialización del SDK#

Método para obtener información durante el proceso de inicialización del SDK:

Conexión del lector#

Método para obtener información durante el proceso de conexión con una terminal:

Recursos#

Demo del SDK
Errores del SDK de Android

¿Tienes una sugerencia sobre esta documentación? Contáctanos.
Modified at 2026-09-10 16:05:06
Previous
Terminal SDK
Next
Errores del SDK de Android
Built with