Integración avanzada
Estos campos son opcionales y se agregan a la orden que creás con POST {base_url}/api/v2/orders. Todos van dentro de data.attributes, junto a currency e items.
| Campo | Para qué sirve |
|---|---|
shipping | Sumar el costo de envío a la orden. |
redirect_urls | Llevar al comprador de vuelta a tu sitio después de pagar. |
webhookUrl | Recibir en tu servidor el resultado del pago. Muy recomendado. |
expireLimitMinutes | Poner un tiempo límite para pagar. |
Al final de la página hay un ejemplo completo con todos los campos juntos.
Monto del envío
Suma el costo de envío al total de la orden. El comprador lo ve como un ítem más en el detalle.
"shipping": {
"name": "Envío por Correo Argentino",
"price": {
"currency": "032",
"amount": 60100
}
}
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
name | string | No | Nombre del método de envío que ve el comprador. |
price.currency | string | Sí | "032". |
price.amount | integer | Sí | Costo en centavos: 60100 = $601,00. |
Por ejemplo: un ítem de 150000 ($1.500) más un envío de 60100 ($601) da una orden con price.amount = 210100 ($2.101).
Si no hay envío, no mandes el campo shipping.
URL de retorno
Cuando termina el pago, redirigimos al comprador a tu sitio: a una URL si el pago se aprobó y a otra si falló.
"redirect_urls": {
"success": "https://mitienda.com/pago-ok?pedido=1234",
"failed": "https://mitienda.com/pago-fallido?pedido=1234"
}
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
success | string | No | URL a la que vuelve el comprador si el pago fue aprobado. |
failed | string | No | URL a la que vuelve el comprador si el pago falló. |
- Solo se admiten URLs HTTPS.
- Podés agregar parámetros propios (como
?pedido=1234) para saber de qué pedido se trata cuando el comprador vuelve.
Que el comprador llegue a tu URL de success no prueba que haya pagado: cualquiera puede abrir esa URL a mano. Antes de mostrar "pago aprobado" o entregar el producto, confirmá el estado con GET /api/v2/orders/{uuid} o con el webhook.
Webhook URL
Cuando un pago termina, le enviamos un POST a esta URL con el resultado. Es la forma más confiable de enterarte de un pago, porque llega aunque el comprador cierre el navegador antes de volver a tu sitio.
"webhookUrl": "https://mitienda.com/webhooks/sipago?token=UN_SECRETO_TUYO"
| Campo | Tipo | Obligatorio | Longitud máxima |
|---|---|---|---|
webhookUrl | string | No | 255 caracteres |
La URL tiene que ser pública: SiPago tiene que poder llegar a ella desde internet. Para probar en tu computadora, podés usar un túnel como ngrok.
Qué te enviamos
Un POST con un JSON como este:
{
"data": {
"type": "Payment",
"order": {
"uuid": "ea138a99-c9df-44a5-b2bf-09e5db6f8d0c",
"status": "SUCCESS",
"source": "api_checkout"
},
"payment": {
"id": 1823,
"authorizationCode": "901159",
"refNumber": "62b4a8ff60fee",
"status": "APPROVED"
}
}
}| Campo | Descripción |
|---|---|
data.order.uuid | El uuid de la orden que creaste. Usalo para identificar tu pedido. |
data.order.status | Estado de la orden. Ver estados. |
data.payment.status | Resultado del intento de pago, por ejemplo APPROVED o DENIED. |
data.payment.id | Identificador del pago en SiPago. |
data.payment.refNumber | Número de referencia del pago. |
data.payment.authorizationCode | Código de autorización. No siempre viene: si lo necesitás, consultalo en el estado de la orden. |
Cómo responder
- Respondé
200lo antes posible. Si tenés que hacer algo lento (mandar un mail, facturar…), hacelo después de responder. - Si tu endpoint responde con un error o no responde, reintentamos el envío: hasta 4 llamados, con unos 2 minutos entre cada uno.
- Por los reintentos, podés recibir el mismo aviso más de una vez. Tu código tiene que ser idempotente: procesar dos veces el mismo
uuidno puede, por ejemplo, despachar dos veces el pedido.
Seguridad
El webhook no viene firmado, así que cualquiera que conozca tu URL podría enviarte un aviso falso. Para protegerte:
- Confirmá siempre el estado con
GET /api/v2/orders/{uuid}antes de dar el pedido por pagado. No confíes solo en el contenido del webhook. - Agregá un secreto a la URL, por ejemplo
?token=UN_SECRETO_TUYO. Rechazá con401los avisos que no lo traigan.
// Ejemplo con Express
app.post('/webhooks/sipago', express.json(), async (req, res) => {
if (req.query.token !== process.env.WEBHOOK_SECRET) return res.sendStatus(401);
res.sendStatus(200); // respondé primero
const uuid = req.body?.data?.order?.uuid;
const order = await consultarOrden(uuid); // GET /api/v2/orders/{uuid}
if (order.status === 'SUCCESS') {
await marcarPedidoComoPagado(uuid); // idempotente
}
});
Tiempo límite para pagar (expireLimitMinutes)
Pone un tiempo límite, en minutos, para pagar la orden. Una vez vencido, el link ya no sirve.
"expireLimitMinutes": 30
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
expireLimitMinutes | integer | No | Minutos desde la creación de la orden. Por ejemplo, 14400 = 10 días. |
Si enviás 0 o no enviás el campo, la orden no vence: el link se puede pagar sin límite de tiempo.
Cuando vence el tiempo:
| Situación | Qué ve el comprador |
|---|---|
| Abre el link después del vencimiento | "Tu link de pago expiró" |
| Abrió el link a tiempo, pero paga después del vencimiento | "Tuvimos un inconveniente en nuestro sistema" |
En ninguno de los dos casos te enviamos un webhook. Si necesitás saber que una orden venció, consultá su estado con GET /api/v2/orders/{uuid}: va a estar en EXPIRED.
Ejemplo completo
Una orden con todos los campos opcionales:
curl --request POST 'https://{base_url}/api/v2/orders' \
--header 'Authorization: Bearer {access_token}' \
--header 'Content-Type: application/vnd.api+json' \
--data '{
"data": {
"attributes": {
"currency": "032",
"items": [{
"id": 31,
"name": "Silla Eames Base Madera",
"unitPrice": { "currency": "032", "amount": 100000 },
"quantity": 1
}],
"shipping": {
"name": "Envío por Correo Argentino",
"price": { "currency": "032", "amount": 60100 }
},
"redirect_urls": {
"success": "https://mitienda.com/pago-ok?pedido=1234",
"failed": "https://mitienda.com/pago-fallido?pedido=1234"
},
"webhookUrl": "https://mitienda.com/webhooks/sipago?token=UN_SECRETO_TUYO",
"expireLimitMinutes": 30
}
}
}'