Retiros (Pay Out)
Este módulo permite a los Proveedores de Pago (Payment Providers) procesar solicitudes de retiro de efectivo iniciadas por usuarios de Pago46. El flujo está diseñado para garantizar la atomicidad de la transacción y evitar duplicidad en la entrega de fondos mediante un mecanismo de bloqueo (locking).
Todas las rutas descritas a continuación son relativas a la URL base de la API: /api/v1
Registro de Redes de Pago
Antes de procesar transacciones, los proveedores deben registrar las redes de pago que utilizan. Cada red debe tener un identificador único (provider_network_id) que se utilizará en todas las transiciones de estado.
Ejemplo de IDs de Red:
01oxxo_networkseven_eleven_mxfarmacia_abcnetwork_123
Para registrar tus redes de pago, contacta al equipo de integración de Pago46. Los IDs que proporciones serán los que deberás usar en las solicitudes de cobro.
Ciclo de Vida de la Orden
El proceso se rige por un cambio estricto de estados para asegurar que el dinero solo se entregue una vez.
- Consulta (Check): El proveedor verifica si el código entregado por el usuario es válido y la orden está en estado
READY. - Bloqueo (Start Payment): El proveedor "toma" la orden. Esto cambia el estado a
PAYMENT_STARTED. En este punto, ningún otro proveedor puede procesar esta orden. - Confirmación (Confirm Payment): Una vez entregado el dinero, el proveedor confirma la transacción, pasando la orden a
COMPLETED.
1. Verificar Orden
El primer paso ocurre cuando el usuario presenta su código de retiro en el punto físico. Debes consultar los detalles de la orden para validar el monto y su disponibilidad.
Endpoint: GET /providers/orders/pay-out/{code}/
| Parámetro | Ubicación | Descripción |
|---|---|---|
code | Path | El código numérico o alfanumérico proporcionado por el usuario final. |
- Request
- Response (200 OK) - Order Ready
- Response (200 OK) - Order Already In Progress
curl -X GET "https://api.sandbox.pago46.io/api/v1/providers/orders/pay-out/1234567890/" \
-H "Provider-Key: <TU_PROVIDER_KEY>" \
-H "Message-Date: <TIMESTAMP>" \
-H "Message-Hash: <HMAC_SIGNATURE>"
{
"order_type": "LocalCurrencyOrder",
"price": "1500.00",
"price_currency": "MXN",
"created": "2023-11-25T10:00:00Z",
"modified": "2023-11-25T10:05:00Z",
"status": "READY",
"expiry": "2023-11-26T10:00:00Z"
}
{
"order_type": "LocalCurrencyOrder",
"price": "1500.00",
"price_currency": "MXN",
"created": "2023-11-25T10:00:00Z",
"modified": "2023-11-25T10:05:00Z",
"status": "PAYMENT_STARTED",
"expiry": "2023-11-26T10:00:00Z"
}
Solo debes proceder al siguiente paso si el campo status es READY. Si recibes CANCELLED, COMPLETED o EXPIRED, debes informar al usuario que la orden no puede ser procesada.
2. Iniciar Pago (Bloqueo)
Este es el paso más crítico. Al ejecutar este endpoint, estás indicando que tienes la intención de pagar la orden. El sistema bloqueará la orden para tu proveedor y cambiará su estado a PAYMENT_STARTED.
Si otro proveedor intenta iniciar el pago de la misma orden simultáneamente, recibirá un error indicando que la orden ya está siendo procesada.
Endpoint: POST /providers/orders/pay-out/{code}/start-payment/
- Request
- Response (200 OK)
- Error (409 Conflict)
curl -X POST "https://api.sandbox.pago46.io/api/v1/providers/orders/pay-out/1234567890/start-payment/" \
-H "Provider-Key: <TU_PROVIDER_KEY>" \
-H "Message-Date: <TIMESTAMP>" \
-H "Message-Hash: <HMAC_SIGNATURE>" \
-H "Content-Type: application/json" \
-d '{
"order_type": "LocalCurrencyOrder",
"provider_network_id": "network_123",
"price": "1500.00",
"price_currency": "MXN"
}'
{
"order_type": "LocalCurrencyOrder",
"price": "1500.00",
"price_currency": "MXN",
"status": "PAYMENT_STARTED",
"modified": "2023-11-25T10:06:00Z",
"expiry": "2023-11-26T10:00:00Z"
}
{
"detail": "Order is currently being processed by another provider."
}
| Campo | Tipo | Descripción |
|---|---|---|
order_type | string | Tipo de orden (LocalCurrencyOrder o ForeignCurrencyOrder). |
provider_network_id | string | ID de la red de pago utilizada por el proveedor. Requerido para órdenes LocalCurrencyOrder. |
price | string | Monto exacto que se va a entregar. Debe coincidir con el price de la orden. Requerido para órdenes LocalCurrencyOrder. |
price_currency | string | Código de moneda (ej. MXN, USD). Debe coincidir con el price_currency de la orden. Requerido para órdenes LocalCurrencyOrder. |
Como proveedor, debes suministrar el provider_network_id que identifica la red específica utilizada para procesar esta transacción. Esto permite a Pago46 mantener un registro detallado de qué red procesó cada pago y proporcionar esta información al usuario final.
Una vez recibes el 200 OK con status PAYMENT_STARTED, es seguro proceder a la entrega física del dinero o la gestión interna de fondos. La orden está reservada para ti.
3. Confirmar Pago (Finalización)
Una vez que el dinero ha sido entregado exitosamente al usuario (o la transacción interna ha finalizado), debes confirmar la operación para cerrar la orden definitivamente.
Endpoint: POST /providers/orders/pay-out/{code}/confirm-payment/
- Request
- Response (200 OK)
curl -X POST "https://api.sandbox.pago46.io/api/v1/providers/orders/pay-out/1234567890/confirm-payment/" \
-H "Provider-Key: <TU_PROVIDER_KEY>" \
-H "Message-Date: <TIMESTAMP>" \
-H "Message-Hash: <HMAC_SIGNATURE>" \
-H "Content-Type: application/json" \
-d '{
"order_type": "LocalCurrencyOrder",
"provider_network_id": "network_123",
"price": "1500.00",
"price_currency": "MXN"
}'
{
"order_type": "LocalCurrencyOrder",
"price": "1500.00",
"price_currency": "MXN",
"status": "COMPLETED",
"paid": "2023-11-25T10:08:00Z",
"modified": "2023-11-25T10:08:00Z"
}
Al recibir esta respuesta, notificaremos al usuario final que su transacción ha concluido exitosamente.
Cancelación (Opcional)
Si por alguna razón (insuficiencia de fondos en caja, error operativo), no puedes completar el pago después de haber ejecutado el start-payment, debes liberar la orden para no dejarla bloqueada indefinidamente.
Endpoint: POST /providers/orders/pay-out/{code}/cancel-payment/
Esto devolverá la orden a un estado donde (dependiendo de la lógica de negocio) podría ser cancelada definitivamente o reintentada.
curl -X POST "https://api.sandbox.pago46.io/api/v1/providers/orders/pay-out/1234567890/cancel-payment/" \
-H "Provider-Key: <TU_PROVIDER_KEY>" \
-H "Message-Date: <TIMESTAMP>" \
-H "Message-Hash: <HMAC_SIGNATURE>" \
-H "Content-Type: application/json" \
-d '{
"order_type": "LocalCurrencyOrder",
"provider_network_id": "network_123",
"price": "1500.00",
"price_currency": "MXN"
}'
Resumen de Estados
| Estado | Descripción | Acción Requerida del Proveedor |
|---|---|---|
READY | La orden está lista para ser pagada. | Puede llamar a start-payment. |
PAYMENT_STARTED | La orden está bloqueada por un proveedor. | Debe entregar el dinero y llamar a confirm-payment. |
COMPLETED | El flujo terminó exitosamente. | No requiere acción. Historico. |
CANCELLED | La orden fue anulada. | No entregar dinero. |