> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fintoc.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Prueba tu integración

> Simula un pago usando métodos alternativos

Simula todos los resultados de los métodos de pago alternativos sin tocar bancos reales. En modo de prueba, Fintoc reemplaza la página de checkout del banco con un simulador sandbox que emite los mismos webhooks que el flujo en vivo, para que puedas verificar tu integración antes de pasar a producción.

## Proveedores disponibles

Usa `institution_id` para filtrar bancos en la página de checkout y `payment_type` para enrutar la lógica de webhooks por banco.

| Banco           | `institution_id`     | `payment_type`    | Tipos de cuenta    |
| :-------------- | :------------------- | :---------------- | :----------------- |
| Banco Santander | `cl_banco_santander` | `banco_santander` | Personal y empresa |
| Banco de Chile  | `cl_banco_de_chile`  | `banco_de_chile`  | Personal y empresa |
| BancoEstado     | `cl_banco_estado`    | `banco_estado`    | Personal y empresa |
| Mach            | `cl_mach`            | `mach`            | Personal           |

Los proveedores con cuenta empresa incluyen un flujo de múltiples firmantes. Los proveedores solo personales se completan en un solo paso.

## Crea una Checkout Session en modo de prueba

Envía la solicitud con tu API key de prueba. Establece `payment_method_types` en `["bank_transfer"]` para que la página de checkout muestre los botones de banco.

```bash theme={null}
curl https://api.fintoc.com/v2/checkout_sessions \
  -u sk_test_a1b3h4j24i9j0: \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 1000000,
    "currency": "CLP",
    "payment_method_types": ["bank_transfer"],
    "success_url": "https://example.com/success",
    "cancel_url": "https://example.com/cancel"
  }'
```

La respuesta incluye `id` y `redirect_url`.

```json theme={null}
{
  "id": "cs_test_a1b2c3d4e5f6g7h8i9j0",
  "object": "checkout_session",
  "status": "in_progress",
  "redirect_url": "https://pay.fintoc.com/payment?checkout_session=cs_ca29miv93md9hwl9",
  "amount": 1000000,
  "currency": "CLP"
}
```

<br />

## Abre el checkout y elige un banco

Abre el `redirect_url` en un navegador y haz clic en el banco que quieres probar. Fintoc te redirige a `https://pay.fintoc.com/sandbox/{checkout_session_id}`.

## Dispara un resultado

El simulador renderiza una página con el estilo del banco seleccionado.

Para proveedores con capacidad de empresa (Santander, Banco de Chile, BancoEstado), primero elige el escenario:

* `Pago Persona`
* `Pago empresa con 1 apoderado`
* `Pago empresa con 2 o más apoderados`

Mach omite este paso y muestra la pantalla de resultado directamente. Luego haz clic en el resultado que quieres simular:

**Pagos personales** (Mach, o el flujo `Pago Persona` en proveedores con capacidad de empresa):

| Botón de resultado | Estado      |
| ------------------ | ----------- |
| `Pago exitoso`     | `succeeded` |
| `Pago fallido`     | `failed`    |
| `Pago expirado`    | `expired`   |

**Pagos empresa** (1 o 2+ apoderados en Santander, Banco de Chile, BancoEstado):

| Botón de resultado                       | Estado                                                                                      |
| ---------------------------------------- | ------------------------------------------------------------------------------------------- |
| `Pago aprobado por todos los apoderados` | Pasa a `requires_action` y transiciona a `succeeded` después de 30 segundos.                |
| `Pago pendiente de aprobación`           | Permanece en `requires_action` hasta que los firmantes restantes actúen o expire la sesión. |
| `Pago fallido`                           | `failed`.                                                                                   |

El retraso de 30 segundos reproduce el tiempo que toma a cada firmante firmar el pago en producción.

## Inspecciona los webhooks

Suscríbete a estos eventos en la configuración de tu endpoint de webhooks; el sandbox emite los mismos payloads que producción. Los payloads a continuación muestran solo los campos relevantes para este flujo.

### Empresa aprobada por todos los firmantes

El cliente hace clic en **Pago aprobado por todos los apoderados**. Fintoc envía `checkout_session.finished` inmediatamente, luego `payment_intent.succeeded` después de 30 segundos.

```json theme={null}
{
  "type": "checkout_session.finished",
  "mode": "test",
  "data": {
    "object": "checkout_session",
    "id": "cs_test_a1b2c3d4e5f6g7h8i9j0",
    "status": "finished",
    "payment_resource": {
      "payment_intent": {
        "object": "payment_intent",
        "id": "pi_test_1a2b3c4d5e6f7g8h9i0j",
        "status": "requires_action",
        "amount": 1000000,
        "currency": "CLP",
        "payment_type": "banco_santander",
        "next_action": {
          "type": "bank_transfer_authorization",
          "expires_at": "2026-05-16T00:00:00-04:00"
        }
      }
    }
  }
}
```

```json theme={null}
{
  "type": "payment_intent.succeeded",
  "mode": "test",
  "data": {
    "object": "payment_intent",
    "id": "pi_test_1a2b3c4d5e6f7g8h9i0j",
    "status": "succeeded",
    "amount": 1000000,
    "currency": "CLP",
    "payment_type": "banco_santander",
    "next_action": null
  }
}
```

### Empresa pendiente de aprobación

El cliente hace clic en **Pago pendiente de aprobación**. Fintoc envía `checkout_session.finished`. El intent permanece en `requires_action` hasta que los firmantes restantes actúen. Si nadie actúa antes del plazo mostrado en `next_action.expires_at`, Fintoc envía `payment_intent.expired`.

```json theme={null}
{
  "type": "checkout_session.finished",
  "mode": "test",
  "data": {
    "object": "checkout_session",
    "id": "cs_test_a1b2c3d4e5f6g7h8i9j0",
    "status": "finished",
    "payment_resource": {
      "payment_intent": {
        "object": "payment_intent",
        "id": "pi_test_1a2b3c4d5e6f7g8h9i0j",
        "status": "requires_action",
        "amount": 1000000,
        "currency": "CLP",
        "payment_type": "banco_santander",
        "next_action": {
          "type": "bank_transfer_authorization",
          "expires_at": "2026-05-16T00:00:00-04:00"
        }
      }
    }
  }
}
```

```json theme={null}
{
  "type": "payment_intent.expired",
  "mode": "test",
  "data": {
    "object": "payment_intent",
    "id": "pi_test_1a2b3c4d5e6f7g8h9i0j",
    "status": "expired",
    "amount": 1000000,
    "currency": "CLP",
    "payment_type": "banco_santander",
    "next_action": null
  }
}
```

### Empresa rechazada

El cliente hace clic en **Pago fallido**. Fintoc envía `checkout_session.finished` y luego `payment_intent.failed`.

```json theme={null}
{
  "type": "checkout_session.finished",
  "mode": "test",
  "data": {
    "object": "checkout_session",
    "id": "cs_test_a1b2c3d4e5f6g7h8i9j0",
    "status": "finished",
    "payment_resource": {
      "payment_intent": {
        "object": "payment_intent",
        "id": "pi_test_1a2b3c4d5e6f7g8h9i0j",
        "status": "requires_action",
        "amount": 1000000,
        "currency": "CLP",
        "payment_type": "banco_santander",
        "next_action": {
          "type": "bank_transfer_authorization",
          "expires_at": "2026-05-16T00:00:00-04:00"
        }
      }
    }
  }
}
```

```json theme={null}
{
  "type": "payment_intent.failed",
  "mode": "test",
  "data": {
    "object": "payment_intent",
    "id": "pi_test_1a2b3c4d5e6f7g8h9i0j",
    "status": "failed",
    "amount": 1000000,
    "currency": "CLP",
    "payment_type": "banco_santander",
    "next_action": null
  }
}
```

### Personal exitoso

El cliente hace clic en **Pago exitoso**. Fintoc envía `checkout_session.finished` y `payment_intent.succeeded` en la misma transacción.

```json theme={null}
{
  "type": "checkout_session.finished",
  "mode": "test",
  "data": {
    "object": "checkout_session",
    "id": "cs_test_a1b2c3d4e5f6g7h8i9j0",
    "status": "finished",
    "payment_resource": {
      "payment_intent": {
        "object": "payment_intent",
        "id": "pi_test_1a2b3c4d5e6f7g8h9i0j",
        "status": "succeeded",
        "amount": 1000000,
        "currency": "CLP",
        "payment_type": "mach"
      }
    }
  }
}
```

```json theme={null}
{
  "type": "payment_intent.succeeded",
  "mode": "test",
  "data": {
    "object": "payment_intent",
    "id": "pi_test_1a2b3c4d5e6f7g8h9i0j",
    "status": "succeeded",
    "amount": 1000000,
    "currency": "CLP",
    "payment_type": "mach"
  }
}
```

### Personal fallido

El cliente hace clic en **Pago fallido**. Misma estructura que personal exitoso, con `status: "failed"`.

```json theme={null}
{
  "type": "payment_intent.failed",
  "mode": "test",
  "data": {
    "object": "payment_intent",
    "id": "pi_test_1a2b3c4d5e6f7g8h9i0j",
    "status": "failed",
    "amount": 1000000,
    "currency": "CLP",
    "payment_type": "mach"
  }
}
```

`checkout_session.finished` también se dispara en paralelo, con `payment_resource.payment_intent.status: "failed"`.

### Personal expirado

El cliente hace clic en **Pago expirado**. Fintoc envía `checkout_session.finished` y `payment_intent.expired`.

```json theme={null}
{
  "type": "payment_intent.expired",
  "mode": "test",
  "data": {
    "object": "payment_intent",
    "id": "pi_test_1a2b3c4d5e6f7g8h9i0j",
    "status": "expired",
    "amount": 1000000,
    "currency": "CLP",
    "payment_type": "mach"
  }
}
```

`checkout_session.finished` también se dispara en paralelo, con `payment_resource.payment_intent.status: "expired"`.

Cuando el pago termina en `failed` o `expired`, el objeto `payment_intent` también puede incluir un campo `error_reason` que describe la falla. Los valores exactos dependen del banco y del traductor de razones.
