Pago remoto a partir del 28/04/2025*

¿Te interesa integrar pago remoto a tus servicios? Sé parte de nuestros clientes y adquiere un dispositivo POS con nosotros para comenzar 🙌.

🤔 ¿Qué es pago remoto?

El concepto de pago remoto implica que, a través de un webservice, se envía una solicitud de pago a dispositivos POS (Point of Sale), lo que activa de manera remota un flujo en el que el POS se inicia con un conjunto de datos específicos para realizar una transacción con el tarjetahabiente. El POS procesa el pago, y una vez completado el flujo (ya sea exitoso o fallido), se retorna el resultado al sitio web o sistema que realizó la solicitud.

A continuación, se presenta un diagrama de alto nivel que ilustra el flujo del proceso de pago remoto:


🚧

Por favor, tener en consideración los sgtes. puntos:

  • Confirmar la carga y activación de su POS en Espacio de Trabajo.
  • Obtener su API Key desde Espacio de Trabajo para hacer uso de los endpoints de Pago Remoto.
  • Generada la solicitud de pago, confirme su recepción en el "Modo Integración" del POS.

🔐 Autenticación y Modo de Integración

Clave API

Toda interacción con los endpoints requiere que el comercio posea una API Key válida. Esta API Key se obtiene directamente desde el Espacio de Trabajo del comercio y es única por comercio.

¿Cómo obtener la API Key?

Dirígete al panel de administración de tu cuenta en el Espacio de Trabajo (Workspace), sección Pagos>Configuración>API.

Modo Integración

Antes de poder interactuar con los endpoints de la API, el terminal debe estar configurado en modo integración. Este modo permite que el terminal quede a la espera de solicitudes de pago externas. Para habilitar este modo, sigue estos pasos:

  1. Ingrese a la aplicación Pago, realice los pasos que le solicita y posteriormente, se activará una vista de "Activa tu dispositivo".
  2. Diríjase a tu Espacio de trabajo, selecciona la sección Pagos e ingresa a la opción Pagos Haulmer (barra lateral izquierda).
  3. Ingresa el código que aparece en tu POS y ¡Activa tu dispositivo!
  4. Finalmente, seleccione el menú tipo "hamburguesa" y haga clic en la opción "Modo Integración".

Con estos pasos su dispositivo esta listo para recibir solicitudes de pago de forma remota.

📖 Diccionario de datos

Estados de las Solicitudes de Pago

Cada solicitud de pago pasa por varios estados durante su ciclo de vida. A continuación, se describen los posibles estados que puede tener una solicitud de pago:

  • Pending: La solicitud ha sido recibida, pero aún no ha sido enviada al Punto de Venta.
  • Sent: El intento de pago ha sido enviado al Punto de Venta.
  • Canceled: El intento de pago fue cancelado en el Punto de Venta.
  • Processing: El sistema está validando el pago con los adquirentes y emisores correspondientes.
  • Failed: El sistema rechazó o falló la transacción debido a un error o validación negativa.
  • Completed: La transacción fue validada exitosamente, y el pago ha sido completado.

Tabla de conversión de solicitud

StatusValor
Pending0
Sent1
Canceled2
Processing3
Failed4
Completed5

Tabla de conversión DTE

DTEValor
0Comprobante afecto. Por defecto
33Factura afecta
34Factura exenta
48Comprobante afecto
99Comprobante exento

API's

Creación de pago (SIN idempotencia):

POST <https://integrations.payment.haulmer.com/RemotePayment/v2/Create>
Header: X-API-Key: XXX

Consulta solicitud de pago (SIN idempotencia):

GET <https://integrations.payment.haulmer.com/PaymentRequest/:id>
Header: X-API-Key: XXX

Creación de pago (CON idempotencia):

POST <https://integrations.payment.haulmer.com/PaymentRequest/Create>
Header: X-API-Key: XXX

Consulta solicitud de pago (CON idempotencia):

GET <https://integrations.payment.haulmer.com/RemotePayment/v2/GetPaymentReques/:idempotency-key>
Header: X-API-Key: XXX

Campos de entrada


A continuación se presenta una tabla que describe los principales campos de entrada requeridos para la solicitud de pago en el flujo de integración con el sistema de pago remoto. Estos campos son esenciales para procesar la transacción y deben incluirse en la solicitud.

🚧

Campo con * corresponde al flujo con idempotencia (v2)

NombreTipoDescripciónEjemplo
idempotencyKey*stringIdentificador único de la solicitud de pago.KEY-01
amountintMonto total de la transacción.1000
devicestringNúmero de serie del dispositivo POS.TJ44245N20440
cashbackAmount*intVuelto.500
tipAmount*intPropina.10
paymentMethod*intTipo de método de pago, sea crédito (1) o débito (2)1
descriptionstringBreve descripción de la transacción."Pago de servicios"
dteTypeintTipo de documento tributario electrónico.99
extradataobjectInformación adicional relevante para la transacción, incluyendo montos exentos y campos personalizados.

Campos del extra data

NombreTipoDescripciónEjemplo
exempAmountintMonto exento de impuestos que aplica a la transacción.1000
customFieldsarrayLista de campos personalizados que contiene información adicional relevante.
sourceNamestringNombre de origen de la transacción."Plataforma de pagos"
sourceVersiónstringVersión del origen de la solicitud."v1.0.0"

Campos del CustomFields

NombreTipoDescripciónEjemplo
namestringNombre del campo personalizado."Contacto"
valuestringValor del campo personalizado"9 2321 4244"
printbooleanIndica si el campo debe imprimirse en el comprobantetrue

Tabla de errores

La siguiente tabla describe los errores que pueden generarse durante el proceso de pago. Cada error incluye una descripción y un código que permite identificar el problema y tomar las acciones correctivas necesarias para su resolución por parte del equipo técnico.

🚧

Campo con * corresponde al flujo con idempotencia (v2)

CódigoTipoMensajeDescripción
MR-100DispositivoDevice for API-Key doesn't existEl dispositivo asociado a la API-Key no existe.
MR-110Campo de entradaTransaction Amount is less than allowed minimumEl monto de la transacción es inferior al mínimo permitido.
MR-120Campo de entradaTransaction Amount is more than allowedEl monto de la transacción supera el máximo permitido.
MR-130Campo de entradaDTE type not recognizedEl tipo de DTE proporcionado no es reconocido por el sistema.
MR-140Campo de entradaNo exempt amount found for DTE Type 99No se ha proporcionado un monto exento para el tipo de DTE 99.
MR-141Campo de entradaExempt amount not equal to transaction amountEl monto exento no coincide con el monto total de la transacción.
MR-150Campo de entradaExempt Amount is not less than transaction amountEl monto exento es mayor o igual al monto total de la transacción.
MR-151Campo de entradaExempt Amount is invalidEl monto exento proporcionado no es válido.
MR-000AutorizaciónNot AuthorizedEl usuario no está autorizado para realizar esta operación.
MR-160Solicitud de pagoPayment Request doesn't existNo se encontró una solicitud de pago con el ID proporcionado.
MR-161DispositivoDevice by SN not foundNo se encontró un dispositivo con el número de serie proporcionado.
MR-170ServicioError with DatabaseOcurrió un error al intentar acceder a la base de datos.
MR-180Cola de SolicitudesPayment Request Queue for the device is fullLa cola de solicitudes de pago para el dispositivo está llena.
I-04Campos PersonalizadosExtraData String has invalid charactersEl campo ExtraData contiene caracteres no válidos.
INT-MIDDLEWARE-429Límite de SolicitudesAPI Quota Exceeded! Quota: 0 per 1, Try Again in 2 secondsSe ha excedido la cuota de solicitudes de la API.
I-02Campos PersonalizadosCustom field length invalidLa longitud de un campo personalizado es inválida.
I-03Campos PersonalizadosCustom field length invalidLa longitud de un campo personalizado es inválida.
KEY-002 *AutenticaciónAPI Key is missing in the request headerFalta la clave API en la cabecera de la solicitud.
KEY-003 *AutenticaciónInvalid API KeyLa clave API proporcionada no es válida.
RP-000 *IdempotenciaInvalid Idempotency KeyLa clave de idempotencia proporcionada es inválida o está mal formada.
RP-001 *Campo de entradaIdempotency Key length must be between 1 and 36 charactersLa longitud de la clave de idempotencia debe estar entre 1 y 36 caracteres.
RP-003 *Campo de entradaThe characters entered are invalidLos caracteres ingresados en el nombre de origen son inválidos.
RP-004 *Campo de entradaInvalid characters in source versionLos caracteres ingresados en la versión de origen son inválidos.
RP-005 *Campo de entradaNo exempt amount for specific DTE typesEl monto exento no esta permitido para el tipo de DTE ingresado.
RP-006 *Campo de entradaExempt amount does not match totalEl monto exento no coincide con el total.
RP-007 *Campos PersonalizadosReserved custom field nameEl campo personalizado tiene un nombre reservado.
RP-008 *Campo de entradaMissing payment methodFalta el método de pago.
RP-010 *Campos PersonalizadosMaximum custom fields exceededLa cantidad de campos personalizados supera el máximo permitido.
RP-011 *Campo de entradaExempt amount must be less than the total amountEl monto exento debe ser menor que el monto total.
RP-012 *Campo de entradaExempt amount exceeds transaction amountEl monto exento excede el monto total. Máximo permitido 99999999.
RP-015 *Campo de entradaInvalid lengthLongitud inválida. La longitud debe ser entre 1 y 28.
RP-017 *Campo de entradaAmount exceeds maximum allowedEl monto excede el máximo permitido
RP-018 *Campo de entradaTip amount must be less than the total amountLa propina debe ser menor que el monto
RP-019 *Campo de entradaTip amount exceeds maximum allowedLa propina excede el máximo permitido. Máximo 99999999.
RP-020 *Campo de entradaMethod not permitteMétodo de pago no permitido.
RP-021 *Campo de entrada.Cashback amount must be less than the total amountEl vuelto debe ser menor que el monto total.
RP-022 *Campo de entradaCashback amount exceeds maximum allowedEl vuelto excede el máximo permitido.
RP-025 *Campo de entradaInvalid payment methodMétodo de pago no válido.
RP-026 *Campos personalizadosDuplicate custom field namesSe encontraron campos personalizados con nombres duplicados.
RP-027 *Campo de entradaAll amounts exceed the maximum allowedLa suma de los montos supera el máximo permitido.
RP-028 *Campo de entradaInvalid amount, must be equal to or greater than 100El monto debe ser mayor o igual a 100.
RP-029 *PosDevice configuration not foundConfiguración del dispositivo no encontrada
RP-030 *PosDevice settings do not allow tip entryLa configuración del dispositivo no permite la opción de propina.
RP-031 *PosThe device configuration does not allow the deposit of cashbackLa configuración del dispositivo no permite la opción de vuelto.
RP-032 *PosDevice settings do not support the payment method enteredLa configuración del dispositivo no permite la opción del método de pago ingresado.
RP-100 *AutenticaciónUnauthorized access. Authentication required.Acceso no autorizado. Se requiere autenticación.
RP-101 *AutenticaciónInvalid or missing Payment Account IDCuenta no encontrada.
RP-102 *AutenticaciónJWT validation failedJWT inválido.
RP-200 *IdempotenciaPayment request not found for the provided idempotency keyLa solicitud de pago no existe para la clave de idempotencia proporcionada
MR-191 *IdempotenciaThe identifier provided is already in use.La clave de idempotencia ya está en uso para otra solicitud.
MR-203 *Solicitud de pagoPayment request is in processLa solicitud de pago está actualmente en proceso.
RP-005 *Campo de entradaNo exempt amount for specific DTE typesNo se especificó un monto exento para los tipos de DTE específicos.
RP-006 *Campo de entradaExempt amount does not match totalEl monto exento no coincide con el total de la transacción.

☝️ Consideraciones adicionales

Idempotencia para flujo PaaS

En el sistema de pagos, la idempotencia asegura que múltiples solicitudes con el mismo propósito no creen transacciones duplicadas. El proceso de idempotencia se maneja automáticamente por el sistema y no requiere ninguna acción por parte del cliente.

Generación de la idempotencia

  • Para crear una nueva solicitud de pago el cliente debe enviar la clave idempotencia (obligatorio).
  • El idempotencyKey debe ser único para cada solicitud y se utiliza para rastrear el estado de la transacción.

Prevención de solicitudes duplicadas

  • Si se envía la misma solicitud de pago varias veces (por ejemplo, debido a un problema de red o un timeout), el sistema verifica si existe un idempotencyKey asociado a una solicitud anterior dentro de los últimos 10 minutos.
  • Si el idempotencyKey ya existe y la solicitud anterior está en estado Completed o Sent, el sistema no volverá a procesar la transacción.
  • Si la solicitud está en estado Processing, el sistema indicará que la transacción aún está en proceso, evitando múltiples intentos de pago.

Límite de Solicitudes

Para evitar la saturación del sistema y del terminal, existe un control de flujo sobre las solicitudes de pago. Cada terminal tiene las siguientes restricciones:

  • Máximo de solicitudes pendientes: Un terminal puede tener un máximo de 5 solicitudes pendientes en cola.
  • Límite de solicitudes por minuto: Se puede enviar 1 solicitud por minuto. Si se excede este límite, el sistema devolverá un error 429 Too Many Requests.

Validaciones de campos

  1. Amount: El monto de la solicitud de pago debe estar entre 100 y 99999999.
  2. Device: El número de serie del dispositivo asociado debe ser una cadena válida y registrada.
  3. Montos Exentos:
    • Si el dteType es no afecta, se requiere un exemptAmount igual al Amount.
    • Si el dteType es afecta, se requiere un exemptAmount menor a Amount
  4. Campos Personalizados (Custom Fields):
    • Máximo 5 campos personalizados.
    • Longitud combinada de name y value no debe exceder los 28 caracteres.
    • Caracteres especiales no permitidos "&", "/".
    • No utilice caracteres no ASCII.
  5. DTE Type: Debe ser uno de los valores permitidos: 0, 33, 48 o 99.

🚀 ¿Listo para integrar?

Diríjase a la sección API Reference, específicamente Integración Pago Remoto.


☎️ Contacto y Soporte

Si necesitas soporte adicional o tienes dudas sobre el proceso, nuestro equipo está disponible para ayudarte.

Formulario de contacto