Saltar a contenido

Cobro con Terminal

Flujo completo de un cobro desde el ERP hasta la confirmación.

Diagrama de secuencia

sequenceDiagram
    participant Cajero
    participant ERP as ERP (Histrix)
    participant API as Integration API
    participant MP as MercadoPago
    participant Terminal as Terminal Point

    Cajero->>ERP: Cobra $1500.50
    ERP->>API: POST /orders
    API->>API: POS → Terminal lookup
    API->>API: Monto: 1500,50 → 1500.50
    API->>MP: POST /v1/orders
    MP-->>API: order_id, status: created
    API-->>ERP: 201 { order_id, status: created }

    MP->>Terminal: Envía orden
    Terminal->>Terminal: Muestra monto
    Note over Cajero,Terminal: Cliente acerca tarjeta/QR

    Terminal->>MP: Pago procesado
    MP->>API: Webhook order.processed
    API->>API: Actualiza DB

    ERP->>API: GET /orders/:orderId
    API->>MP: GET /v1/orders/:id
    MP-->>API: status: processed, payments: [...]
    API-->>ERP: 200 { status: processed }
    ERP->>Cajero: ✅ Pago confirmado

Desde el ERP

1. Crear la orden

curl -X POST https://api.example.com/orders \
  -H "Content-Type: application/json" \
  -H "x-api-token: mk_client_key" \
  -d '{
    "caja_id": "SUC001-POS001",
    "external_reference": "TICKET-00001",
    "amount": "1500,50",
    "description": "Venta mostrador",
    "payment_method": "all",
    "expiration_minutes": 16
  }'

2. Polling del estado

El ERP puede consultar periódicamente el estado:

curl https://api.example.com/orders/550e8400 \
  -H "x-api-token: mk_client_key"
flowchart LR
    A["GET /orders/:key"] --> B{status?}
    B -->|created| C["⏳ Esperar<br/>+ reintentar"]
    B -->|at_terminal| C
    B -->|processed| D["✅ Pago OK<br/>Cerrar ticket"]
    B -->|canceled| E["❌ Cancelado"]
    B -->|expired| F["⏰ Expirado<br/>Crear nueva orden"]
    B -->|failed| G["❌ Rechazado<br/>Ver status_detail"]
    C --> A

3. Reintentos

Si una orden se cancela o expira, MercadoPago crea una nueva con diferente order_id:

# Primera orden — se canceló
POST /orders    order_id: "550e8400"    canceled

# Reintento — nueva orden
POST /orders    order_id: "550e8401"    processed 

external_reference puede repetirse

El mismo TICKET-00001 puede tener múltiples order_id (intentos). Cada intento es una orden separada.

Métodos de pago

Valor Terminal acepta
all (default) Todos los medios
debit_card Tarjeta débito y crédito
credit_card Tarjeta débito y crédito
qr Solo QR y Pix

Expiración

La orden expira automáticamente si no se procesa dentro del tiempo configurado:

expiration_minutes Rango Default
Mínimo 1 min
Default 16 min
Máximo 180 min