Lane · Documentación

Guías

Checkout en tu tienda

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

CampoTipoObligatorioDescripción
success_urlURLnoA dónde vuelve el comprador después de pagar.
cancel_urlURLnoA dónde vuelve si abandona.
error_urlURLnoA dónde vuelve si el emisor rechaza la tarjeta.
line_itemslistanoEl 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 -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" }
  }'
// 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

{
  "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" }
}
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, 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.

Esta página en markdown: /docs/guias/checkout.md · Toda la documentación: /docs/llms-full.txt