Configuración
BeTickets.init(config)
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
container | string | HTMLElement | Sí | Selector CSS o referencia al elemento contenedor |
channelSlug | string | Sí | Slug del canal de venta |
sessionId | number | Sí | ID de la sesión a mostrar |
apiKey | string | Sí | Widget key generada en el dashboard (wk_…) |
lang | string | No | Idioma. Defecto: 'es' |
checkoutMode | 'redirect' | 'popup' | No | Modo de pago. Defecto: 'redirect' |
checkoutBaseUrl | string | No | URL del portal de checkout. Defecto: https://tickets.bticketing.com |
apiBaseUrl | string | No | URL base del API. Defecto: https://api.bticketing.com/api |
theme | object | No | Personalización visual (ver abajo) |
onOrderUpdate | (order) => void | No | Se dispara con cada cambio en el carrito |
onOrderComplete | (order) => void | No | Compra completada (solo en modo popup) |
onCheckoutStart | () => void | No | Se dispara justo antes de abrir el checkout |
onError | (error) => void | No | Errores del widget o de la API |
checkoutMode y checkoutBaseUrl
⚠️ Estos parámetros son ignorados si el canal tiene configurado
widget_betickets_payment(Modelo C) owidget_external_payment(Modelo D). El widget consultaintegration_modedesde/configal arrancar y se autoconfigura. Si pasas valores incompatibles, el widget emite unconsole.warny prevalece la configuración del backend.
| Comportamiento | Cuándo ocurre | Modelo |
|---|---|---|
| Botón "Ir al pago" → redirect al portal | El widget detecta widget_betickets_payment | C |
| Sin botón de checkout | El widget detecta widget_external_payment; el canal gestiona el pago | D |
| N/A | Modelos A y B no usan widget | A, B |
onOrderUpdate
Callback imprescindible en el Modelo D. Se dispara con cada cambio en el carrito:
onOrderUpdate: (order) => {
const items = (order?.events ?? [])
.flatMap(ev => (ev.sessions ?? []).flatMap(s => s.items ?? []));
const total = order?.total_amount ?? 0;
// Habilitar botón de pago propio y mostrar total
payBtn.disabled = items.length === 0;
totalEl.textContent = `${Number(total).toFixed(2)} €`;
},Ciclo de vida — destroy()
Siempre llama a instance.destroy() antes de montar un nuevo widget en el mismo contenedor o con un sessionId diferente. De lo contrario, el cliente HTTP interno queda en estado inconsistente.
// Cambio de sesión
instance.destroy();
instance = BeTickets.init({ container: '#widget', sessionId: nuevaSession, ... });Cambio de sesión en Modelo D: si la orden activa en localStorage pertenece a una sesión distinta al nuevo
sessionId, el widget la cancela automáticamente en el backend al montar. No es necesario limpiar el carrito manualmente al cambiar de fecha/evento.
theme
| Campo | Tipo | Descripción |
|---|---|---|
theme.primaryColor | string | Color principal en hex (ej. '#e11d48') |
theme.borderRadius | string | Radio de bordes (ej. '0.5rem') |
theme.fontFamily | string | Familia tipográfica (ej. 'Inter') |
Los valores de theme sobreescriben el branding configurado en el dashboard para ese canal.
Atributos data-* (loader automático)
| Atributo | Equivalente JS |
|---|---|
data-channel-slug | channelSlug |
data-api-key | apiKey |
data-session-id | sessionId |
data-lang | lang |
data-checkout-mode | checkoutMode |
data-primary-color | theme.primaryColor |
data-border-radius | theme.borderRadius |
data-font-family | theme.fontFamily |
data-api-url | apiBaseUrl |
API de instancia
const instance = BeTickets.init(config);| Método / Propiedad | Descripción |
|---|---|
instance.getOrder() | Devuelve la orden activa (GuestOrder) o null si el carrito está vacío |
instance.startCheckout() | Inicia el checkout. Modelo D: emite console.warn y no redirige — el canal gestiona el pago |
instance.notifyPaymentComplete(order?) | Modelo D: notifica al widget que el pago externo completó. Dispara onOrderComplete y limpia el carrito |
instance.destroy() | Desmonta el widget y libera recursos |
instance.policy | Solo lectura. Disponible tras la carga asíncrona de /config. Expone { integrationMode, paymentHandler } para que el canal pueda adaptar su UI al modelo configurado |
notifyPaymentComplete — Modelo D
Llama a este método desde el frontend del canal después de que tu servidor haya llamado a POST /confirm con éxito:
// 1. Tu servidor llama a /confirm y recibe ticket_pdf_urls
const result = await yourBackend.confirmOrder({
orderToken: instance.getOrder().order_token,
// ...datos del comprador y pago
});
// 2. Usa las URLs de los PDFs para construir tu email
await yourEmailService.send({
to: buyerEmail,
attachments: result.ticket_pdf_urls,
// + bono, billete de tren, etc.
});
// 3. Avisa al widget: dispara onOrderComplete y limpia el carrito
instance.notifyPaymentComplete();
onOrderCompletese dispara tanto en el cierre del popup (Modelo C) como al llamar anotifyPaymentComplete()(Modelo D). Úsalo para mostrar un mensaje de éxito o redirigir al comprador.