# Checkout en tu tienda

> Integra el cobro en el carrito de tu tienda: crea una sesión de checkout, manda al comprador a pagar y recíbelo de vuelta en tu sitio.

Igual que un link de pago, pero con vuelta a tu sitio cuando el comprador termina.

La sesión de checkout y el link de pago comparten contrato: mismo cuerpo, misma respuesta. La diferencia es que acá defines a dónde vuelve el comprador.

### POST /v1/checkout/sessions

Crea la sesión y devuelve la URL a la que mandas al comprador.

**Además de los campos del link**

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `success_url` | URL | no | A dónde vuelve el comprador después de pagar. |
| `cancel_url` | URL | no | A dónde vuelve si abandona. |
| `error_url` | URL | no | A dónde vuelve si el emisor rechaza la tarjeta. |
| `line_items` | lista | no | El detalle del carrito, si quieres conservarlo con el cobro. |

## Las URL de retorno admiten marcadores

Lane reemplaza `{PAYMENT_ID}` y `{CHECKOUT_SESSION_ID}` en tus URL de retorno antes de mandar al comprador. Así tu página de gracias sabe de qué cobro habla sin que tengas que arrastrar el identificador por la sesión.

**Crear la sesión**

_cURL_

```bash
curl -X POST https://gxxazsplhgyezwxghrnn.supabase.co/functions/v1/blink-api/v1/checkout/sessions \
  -H "Authorization: Bearer sk_test_…" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 11900000,
    "currency": "COP",
    "description": "Pedido #4821",
    "success_url": "https://mitienda.com/gracias?pago={PAYMENT_ID}",
    "cancel_url": "https://mitienda.com/carrito",
    "error_url": "https://mitienda.com/carrito?error=1",
    "customer": { "email": "cliente@ejemplo.com" },
    "metadata": { "order_id": "4821" }
  }'
```

_Node_

```js
// En tu servidor, cuando el comprador aprieta "Pagar".
app.post("/checkout", async (req, res) => {
  const orden = await crearOrden(req.body);

  const lane = await fetch("https://gxxazsplhgyezwxghrnn.supabase.co/functions/v1/blink-api/v1/checkout/sessions", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.LANE_SECRET_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      amount: orden.totalCentavos,
      currency: "COP",
      description: `Pedido #${orden.numero}`,
      success_url: `https://mitienda.com/gracias?pago={PAYMENT_ID}`,
      cancel_url: "https://mitienda.com/carrito",
      metadata: { order_id: orden.id },
    }),
  }).then((r) => r.json());

  await orden.guardarPagoId(lane.payment.id);
  res.redirect(303, lane.checkout_url);
});
```

_Respuesta 201_

```json
{
  "id": "3f0c8a1e-…",
  "object": "checkout.session",
  "environment": "live",
  "amount": 11900000,
  "currency": "COP",
  "status": "pending",
  "checkout_url": "https://lane.money/l/a7Kd2",
  "payment": { "id": "9b41d0c7-…", "status": "pending" }
}
```

> **Importante: La página de gracias no confirma nada.** Volver a tu `success_url` prueba que el navegador volvió, no que el cobro se aprobó. Un comprador puede cerrar la pestaña antes de volver, o escribir la URL a mano. Marca el pedido como pagado cuando llegue `payment.succeeded` por [webhook](https://lane.money/docs/webhooks), y usa la página de gracias solo para mostrar el estado.

## Embeber en vez de redirigir

La respuesta trae `embed_url`, que es la misma URL, pensada para usarla como `src` de un iframe si prefieres que el comprador no salga de tu sitio. La pantalla mide su propio ancho, así que dale al iframe el ancho completo del contenedor.

## Ya tienes tienda en Shopify

Si tu tienda es Shopify, no hace falta escribir nada de esto: la conexión se hace desde el panel. La API es para tiendas propias o para cuando necesitas control sobre el flujo.
