Skip to content

Configuración

BeTickets.init(config)

CampoTipoRequeridoDescripción
containerstring | HTMLElementSelector CSS o referencia al elemento contenedor
channelSlugstringSlug del canal de venta
sessionIdnumberID de la sesión a mostrar
apiKeystringWidget key generada en el dashboard (wk_…)
langstringNoIdioma. Defecto: 'es'
checkoutMode'redirect' | 'popup'NoModo de pago. Defecto: 'redirect'
checkoutBaseUrlstringNoURL del portal de checkout. Defecto: https://tickets.bticketing.com
apiBaseUrlstringNoURL base del API. Defecto: https://api.bticketing.com/api
themeobjectNoPersonalización visual (ver abajo)
onOrderUpdate(order) => voidNoSe dispara con cada cambio en el carrito
onOrderComplete(order) => voidNoCompra completada (solo en modo popup)
onCheckoutStart() => voidNoSe dispara justo antes de abrir el checkout
onError(error) => voidNoErrores del widget o de la API

checkoutMode y checkoutBaseUrl

⚠️ Estos parámetros son ignorados si el canal tiene configurado widget_betickets_payment (Modelo C) o widget_external_payment (Modelo D). El widget consulta integration_mode desde /config al arrancar y se autoconfigura. Si pasas valores incompatibles, el widget emite un console.warn y prevalece la configuración del backend.

ComportamientoCuándo ocurreModelo
Botón "Ir al pago" → redirect al portalEl widget detecta widget_betickets_paymentC
Sin botón de checkoutEl widget detecta widget_external_payment; el canal gestiona el pagoD
N/AModelos A y B no usan widgetA, B

onOrderUpdate

Callback imprescindible en el Modelo D. Se dispara con cada cambio en el carrito:

js
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.

js
// 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

CampoTipoDescripción
theme.primaryColorstringColor principal en hex (ej. '#e11d48')
theme.borderRadiusstringRadio de bordes (ej. '0.5rem')
theme.fontFamilystringFamilia tipográfica (ej. 'Inter')

Los valores de theme sobreescriben el branding configurado en el dashboard para ese canal.


Atributos data-* (loader automático)

AtributoEquivalente JS
data-channel-slugchannelSlug
data-api-keyapiKey
data-session-idsessionId
data-langlang
data-checkout-modecheckoutMode
data-primary-colortheme.primaryColor
data-border-radiustheme.borderRadius
data-font-familytheme.fontFamily
data-api-urlapiBaseUrl

API de instancia

ts
const instance = BeTickets.init(config);
Método / PropiedadDescripció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.policySolo 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:

js
// 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();

onOrderComplete se dispara tanto en el cierre del popup (Modelo C) como al llamar a notifyPaymentComplete() (Modelo D). Úsalo para mostrar un mensaje de éxito o redirigir al comprador.

beTickets — Plataforma de ticketing