Guías
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.
/v1/checkout/sessionsCrea la sesión y devuelve la URL a la que mandas al comprador.
| 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. |
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 tusuccess_urlprueba 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 lleguepayment.succeededpor webhook, y usa la página de gracias solo para mostrar el estado.
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.
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