Saltar al contenido principal

Inicio rápido

Una integración de pagos mínima: la creación de una factura a través de la API y la gestión de la notificación de pago. La última sección cubre la entrega del pedido. Los ejemplos son autónomos; no se usa ningún SDK.

tip

¿Trabajas con un agente de IA? Dale la versión en markdown de esta página. Contiene suficiente detalle para montar una integración para tu sitio o tienda.

Requisitos previos

ValorDónde obtenerlo
Clave de APILa sección Integraciones (Integrations)
ID del proyectoLa sección Proyectos (Projects)
Secreto del webhookConfiguración del proyecto

En esa misma configuración del proyecto, establece el Webhook URL —la dirección del gestor de notificaciones en tu servidor. Solo HTTPS; no se siguen las redirecciones.

Los ejemplos usan valores de prueba —sustitúyelos por los tuyos.

Creación de una factura

POST https://api.bitsby.app/invoices/create, la clave de API se pasa en el encabezado Authorization.

ParámetroObligatorioValor
projectIdID del proyecto, UUID
amountFiatImporte de la factura
currencyFiatMoneda: USD, EUR, RUB
timeToPayPlazo de pago en horas: 0.5, 1, 3, 6, 12
descriptionnoDescripción, se muestra al cliente en la página de pago
serviceDatanoDatos de servicio, no se muestran al cliente. Recomendamos pasar el número de pedido: vuelve en la notificación de pago
curl -X POST https://api.bitsby.app/invoices/create \
-H "Authorization: Token MSvL2ltaDZdWVjmZURURMVWhqSJLT2NURjhL2Fla1Z1T1IxQTltKs1T3Ay" \
-F "projectId=9deea1e2-0c08-41a3-bdc2-a34eada3892d" \
-F "amountFiat=49.90" \
-F "currencyFiat=USD" \
-F "timeToPay=1" \
-F "description=Order 4172" \
-F "serviceData=order-4172"

Respuesta:

{
"result": "success",
"data": {
"id": "ade9550d-3dc7-4fd3-b94e-3b4c12aaaa0c",
"uid": "MXNj4m8HhcM4",
"createDatetime": "2026-09-14 10:12:03",
"timeToPayDatetime": "2026-09-14 11:12:03",
"commissionFiatUSD": 0.5,
"amountFiatUSD": 49.9,
"url": "https://dash.bitsby.app/invoices/pay/MXNj4m8HhcM4"
}
}

Guarda data.id junto con el pedido y envía al cliente a data.url —la página de pago. Entrega el enlace como prefieras: una redirección, un correo, un mensaje del bot. La factura es válida hasta timeToPayDatetime (UTC).

Gestión de la notificación

Cuando una factura pasa a Pagada (Paid), el servicio envía una solicitud POST al Webhook URL del proyecto. El cuerpo es JSON; la firma va en los encabezados:

EncabezadoValor
X-TimestampHora de envío, unix time en segundos
X-Signaturesha256= + HMAC-SHA256 en hexadecimal de la cadena <timestamp>.<request body>

La clave de firma es el secreto del webhook. La firma se calcula sobre el cuerpo de la solicitud sin procesar, así que verifícala antes de analizar el JSON.

<?php
$secret = 'k7QwR2mZ9tXbN4vL8sJpH3dF6yA1cE0u';

$body = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';

// Reject replayed requests: allow up to 5 minutes of clock drift
if (abs(time() - (int)$timestamp) > 300) {
http_response_code(400);
exit;
}

$expected = 'sha256='.hash_hmac('sha256', $timestamp.'.'.$body, $secret);

if (!hash_equals($expected, $signature)) {
http_response_code(403);
exit;
}

$invoice = json_decode($body, true)['invoice'];

if ($invoice['status'] === 'paid') {
// $invoice['serviceData'] — the order id passed at creation: 'order-4172'
// $invoice['amountFiat'] — the original invoice amount: 49.9
// Issue the order here, see the next section
}

http_response_code(200);

Responde con un código 2xx en un máximo de 10 segundos. Cualquier otro código, una redirección o un timeout cuenta como entrega fallida: el servicio reintenta a intervalos crecientes, desde 5 minutos hasta 24 horas, y después se detiene. Deriva el procesamiento largo a una cola: responde primero con 200 y luego procesa el pedido.

El formato completo de la notificación y la referencia de campos están en la sección Webhook URL.

Entrega del pedido

Una notificación verificada con el estado paid confirma el pago. Pasos de la entrega:

  1. Encuentra el pedido por invoice.serviceData —el valor pasado al crear la factura (order-4172).
  2. Comprueba por invoice.id si esta factura ya se ha entregado. Una notificación con el mismo invoice.id puede llegar más de una vez —entrega el pedido una sola vez y guarda una marca de procesado.
  3. Verifica el importe y la moneda con invoice.amountFiat y invoice.currencyFiat —son los valores originales de la factura y nunca cambian. amountFiatUSD se sobrescribe con el importe realmente recibido. Compara los importes como números, no como cadenas: los ceros finales se descartan, así que 49.90 llega como 49.9. Si los valores no coinciden con el pedido, envía la factura a revisión manual en lugar de entregarla —estos casos se describen en Asociación de pagos y discrepancias de importes.
  4. Entrega el pedido y márcalo como procesado.

No compruebes el plazo de pago en la entrega: el pago puede haberse confirmado on-chain después de timeToPayDatetime, y el comercio puede asociar un pago a una factura manualmente. La propia notificación confirma el pago.

Siguientes pasos