Venta de producto digital
Integración completa de punta a punta: link plantilla, checkout por pedido, webhook firmado, reconciliación y comprobante.
Escenario: una web vende el ebook "UX en 30 días" a USD 19 y quiere que cada compra genere un pedido único (ORD-xxxx), se confirme por webhook y tenga su comprobante.
1. Creá la plantilla (una sola vez)
curl https://api.vexorpay.com/api/v1/payment-links \
-X POST \
-H "Authorization: Bearer vxp_u_tu_clave" \
-H "Content-Type: application/json" \
-d '{ "amount": 19, "title": "Ebook UX en 30 días", "reference": "CATALOGO-UX" }'Guardás el id del link, p. ej. 66f1c1e2c8a4b0d1f2e3a4b5.
2. Alguien compra → checkout único por pedido
Cuando tu cliente inicia la compra, llamás al checkout con la referencia del pedido y una Idempotency-Key única por pedido (así, si el cliente repite el request, no se cobra dos veces):
curl https://api.vexorpay.com/api/v1/payment-links/66f1c1e2c8a4b0d1f2e3a4b5/checkout \
-X POST \
-H "Authorization: Bearer vxp_u_tu_clave" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 8f14e45f-ceea-486d-9b5a-3f2e4b8b0d7c" \
-d '{
"reference": "ORD-1001",
"customer_email": "cliente@mail.com",
"metadata": { "userId": "u_42" }
}'Respuesta: charge.id = ch_abc123 y checkoutUrl = https://checkout.stripe.com/.... Redirigís al cliente a ese checkoutUrl. El cobro queda pending hasta que pague.
3. El servidor del vendedor recibe el webhook
Al confirmarse el pago, Vexorpay hace POST a tu endpoint configurado en Configuración → Webhooks, con headers Vexorpay-Signature y Vexorpay-Event-Id:
{
"id": "evt_1001",
"type": "payment.completed",
"created": "2026-01-02T12:05:00.000Z",
"data": {
"charge": {
"id": "ch_abc123",
"reference": "ORD-1001",
"amountCents": 1900,
"currency": "usd",
"status": "paid",
"paidAt": "2026-01-02T12:05:00.000Z"
},
"payment_link": {
"id": "66f1c1e2c8a4b0d1f2e3a4b5",
"slug": "a1b2c3d4e5",
"title": "Ebook UX en 30 días",
"reference": "CATALOGO-UX"
}
}
}Tu servidor:
- Verifica la firma (HMAC-SHA256 del body crudo con tu secreto; comparación en tiempo constante).
- Deduplica por
id(guardásevt_1001como procesado). - Recién entonces actualiza
ORD-1001como pagado y envía el ebook por email.
La referencia del pedido viene en charge.reference — no necesitás adivinar qué compra fue.
4. Verificación a demanda (por si se perdió el webhook)
Siempre podés preguntar por el cobro puntual:
curl https://api.vexorpay.com/api/v1/charges/ch_abc123 \
-H "Authorization: Bearer vxp_u_tu_clave"O listar el histórico de eventos con el mismo evt_ que te hubiera llegado por webhook:
curl "https://api.vexorpay.com/api/v1/events?type=payment.completed&created[gte]=2026-01-02T00:00:00.000Z" \
-H "Authorization: Bearer vxp_u_tu_clave"5. Comprobante
Descargás el recibo del cliente en PDF:
curl -O -J https://api.vexorpay.com/api/v1/charges/ch_abc123/receipt \
-H "Authorization: Bearer vxp_u_tu_clave"
# → receipt-ORD-1001.pdf6. Saldo y contabilidad
curl https://api.vexorpay.com/api/v1/balance \
-H "Authorization: Bearer vxp_u_tu_clave"
curl "https://api.vexorpay.com/api/v1/charges?status=paid" \
-H "Authorization: Bearer vxp_u_tu_clave"
curl "https://api.vexorpay.com/api/v1/payouts" \
-H "Authorization: Bearer vxp_u_tu_clave"Resumen del flujo
| Paso | Endpoint | Qué pasa |
|---|---|---|
| 1 | POST /api/v1/payment-links | Creás la plantilla (una vez). |
| 2 | POST /api/v1/payment-links/{id}/checkout | Pedido único + redirect a Stripe. |
| 3 | Webhook payment.completed | Tu servidor confirma y entrega. |
| 4 | GET /api/v1/events | Reconciliás si se perdió algo. |
| 5 | GET /api/v1/charges/{id}/receipt | Comprobante en PDF. |
| 6 | GET /api/v1/balance, GET /api/v1/payouts, GET /api/v1/charges | Contabilidad. |