Pagos

Endpoints para procesar pagos con Stripe.

Integración Stripe

SalonBookIt usa Stripe para procesar pagos. El widget maneja todo el flujo automáticamente. Estos endpoints son para integraciones personalizadas.

POST /api/v1/pagos/intent/

Crea un PaymentIntent de Stripe para procesar un pago.

Body parameters

Parámetro Tipo Requerido Descripción
cliente_id integer ID del cliente
amount integer Monto en céntimos (ej: 2500 = 25.00€)
type string booking, order o points
reference_id integer ID de la reserva, pedido o paquete de puntos

Ejemplo de petición

cURL
curl -X POST "https://app.salonbookit.com/api/v1/pagos/intent/" \
  -H "X-API-Key: hh_pub_live_abc123..." \
  -H "Authorization: Bearer eyJhbG..." \
  -H "Content-Type: application/json" \
  -d '{
    "cliente_id": 456,
    "amount": 2500,
    "type": "booking",
    "reference_id": 12345
  }'

Respuesta (200 OK)

JSON
{
    "success": true,
    "data": {
        "client_secret": "pi_3N...secret_abc123",
        "payment_intent_id": "pi_3N...",
        "amount": 2500,
        "currency": "eur",
        "stripe_publishable_key": "pk_live_...",
        "customer_id": "cus_abc123"
    }
}

Uso en frontend

Usa el client_secret con Stripe.js para completar el pago:

JavaScript
// Inicializar Stripe
const stripe = Stripe('pk_live_...');
const elements = stripe.elements({
    clientSecret: response.data.client_secret
});

// Crear elemento de tarjeta
const cardElement = elements.create('card');
cardElement.mount('#card-element');

// Confirmar pago
const { error, paymentIntent } = await stripe.confirmCardPayment(
    response.data.client_secret,
    {
        payment_method: {
            card: cardElement,
            billing_details: {
                name: 'Juan Pérez',
                email: 'juan@email.com'
            }
        }
    }
);

if (error) {
    console.error('Error:', error.message);
} else if (paymentIntent.status === 'succeeded') {
    // Pago exitoso
    console.log('Pago completado:', paymentIntent.id);
}
POST /api/v1/pagos/confirmar/

Confirma un pago después de que Stripe lo procese.

Body parameters

Parámetro Tipo Descripción
payment_intent_id string ID del PaymentIntent de Stripe

Respuesta (200 OK)

JSON
{
    "success": true,
    "data": {
        "pago_id": 789,
        "estado": "completado",
        "monto": 25.00,
        "moneda": "EUR",
        "reserva_actualizada": true,
        "puntos_otorgados": 25,
        "recibo_url": "https://pay.stripe.com/receipts/..."
    }
}

Webhook de Stripe

SalonBookIt recibe webhooks de Stripe automáticamente en:

POST https://app.salonbookit.com/api/v1/webhooks/stripe/

Eventos procesados:

Evento Stripe Acción
payment_intent.succeeded Marca el pago como completado, actualiza reserva
payment_intent.payment_failed Marca el pago como fallido, notifica al cliente
charge.refunded Registra el reembolso
charge.dispute.created Notifica al negocio de disputa
No necesitas configurar nada

El webhook de Stripe se configura automáticamente al conectar tu cuenta de Stripe en el Dashboard.

Errores de pago

Código HTTP Descripción
STRIPE_NOT_CONFIGURED 400 El negocio no tiene Stripe configurado
INVALID_AMOUNT 400 Monto inválido (debe ser positivo)
BOOKING_ALREADY_PAID 400 La reserva ya fue pagada
PAYMENT_FAILED 400 Error al procesar el pago (ver mensaje de Stripe)
CARD_DECLINED 400 Tarjeta rechazada

Monedas soportadas

Código Moneda Símbolo
EUR Euro
USD Dólar estadounidense $
GBP Libra esterlina £
AED Dirham emiratí د.إ