Widget de réservation

Widget de réservation de ferry

Intégrez une expérience complète de réservation de ferry sur n'importe quel site en deux lignes de HTML. Le widget est un Web Component autonome qui recherche, tarife et réserve chez tous les opérateurs FerryGate.

Démarrage rapide

La mise en ligne tient en quatre étapes. Aucun outil de build, aucun framework, aucun npm install — juste une balise script et un élément personnalisé.

1

Obtenir une clé widget

Chaque widget est lié à une clé widget qui commence par wgt_. Votre administrateur FerryGate provisionne cette clé pour votre organisation, avec la liste des origines (domaines) autorisées à la charger. Vous ne la générez pas vous-même.

Note :

Demandez à votre administrateur la clé widget ainsi que la liste des origines autorisées. La clé ne fonctionne que sur ces domaines.

2

Charger le bundle

Ajoutez le script du widget à votre page, idéalement juste avant la balise body fermante. L'attribut defer évite de bloquer le rendu de la page.

HTML
<script src="https://ferrygate.com/widget/default/latest.js" defer></script>
3

Poser l'élément

Placez l'élément personnalisé là où vous voulez voir apparaître l'expérience de réservation. Passez votre clé widget et une langue facultative.

HTML
<ferrygate-booking
  api-key="wgt_xxxxxxxxxxxxxxxx"
  lang="fr"></ferrygate-booking>
4

Redirection vers le checkout (B2C, automatique)

En mode B2C, une fois le ticket créé, le widget redirige le client vers votre page de checkout pour encaisser le paiement. Par défaut il cible l'origine courante + /checkout — rien à configurer. Surchargez le chemin avec checkout-path, ou utilisez un checkout-url complet pour un autre domaine.

HTML
<!-- Checkout auto-derived: <your-origin>/checkout (nothing to configure) -->
<ferrygate-booking
  api-key="wgt_xxxxxxxxxxxxxxxx"
  lang="fr"></ferrygate-booking>

<!-- Optional overrides: checkout-path="/pay"  ·  checkout-url="https://other-domain.com/pay" -->

Installer selon votre environnement

Le widget est un Web Component standard : il fonctionne dans n'importe quelle stack. La balise script et l'élément ne changent jamais — seule la façon de les inclure varie. Choisissez votre environnement ci-dessous.

Les attributs (api-key, lang, et les optionnels checkout-path / checkout-url) sont de simples chaînes : aucune liaison de données spécifique au framework n'est nécessaire.

HTML / site statique

Collez les deux lignes n'importe où dans votre markup — un CMS, une landing page ou un page builder. Rien d'autre n'est nécessaire.

HTML
<script src="https://ferrygate.com/widget/default/latest.js" defer></script>

<ferrygate-booking api-key="wgt_..." lang="fr"></ferrygate-booking>

WordPress

Chargez le script depuis votre thème, puis placez l'élément dans un bloc HTML personnalisé (ou exposez-le via un shortcode).

PHP — functions.php
add_action('wp_enqueue_scripts', function () {
  wp_enqueue_script(
    'ferrygate-widget',
    'https://ferrygate.com/widget/default/latest.js',
    [], null, true // load in the footer
  );
});
Bloc HTML personnalisé
<ferrygate-booking api-key="wgt_..." lang="fr"></ferrygate-booking>

PHP (Laravel / Symfony)

C'est du HTML rendu côté serveur : placez le script dans votre layout et l'élément dans n'importe quel template Blade ou Twig.

Blade / Twig
{{-- layout.blade.php (or base.html.twig) --}}
<script src="https://ferrygate.com/widget/default/latest.js" defer></script>

{{-- any page template --}}
<ferrygate-booking api-key="wgt_..." lang="fr"></ferrygate-booking>

React / Next.js

Les custom elements s'affichent nativement dans React. Sur Next.js, chargez le bundle avec next/script et utilisez l'élément directement.

JSX — Next.js
import Script from 'next/script'

export default function BookingPage() {
  return (
    <>
      <Script src="https://ferrygate.com/widget/default/latest.js" strategy="afterInteractive" />
      <ferrygate-booking api-key="wgt_..." lang="fr" />
    </>
  )
}

TypeScript : déclarez ferrygate-booking une fois dans JSX.IntrinsicElements ; les attributs sont des chaînes.

Vue / Nuxt

Indiquez à Vue de traiter ferrygate-booking comme un custom element afin qu'il ne soit pas analysé comme un composant Vue, puis utilisez-le comme n'importe quelle balise.

nuxt.config.ts
export default defineNuxtConfig({
  vue: {
    compilerOptions: {
      isCustomElement: (tag) => tag === 'ferrygate-booking'
    }
  },
  app: {
    head: {
      script: [{ src: 'https://ferrygate.com/widget/default/latest.js', defer: true }]
    }
  }
})
Vue template
<ferrygate-booking api-key="wgt_..." lang="fr" />

Vue 3 simple (Vite) : définissez le même isCustomElement dans les options du plugin vue().

Angular

Enregistrez CUSTOM_ELEMENTS_SCHEMA pour qu'Angular accepte la balise inconnue, puis chargez le script depuis angular.json ou index.html.

TypeScript
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'

@NgModule({
  schemas: [CUSTOM_ELEMENTS_SCHEMA] // or in a standalone component
})
export class AppModule {}

Utilisez ensuite <ferrygate-booking api-key="wgt_..." lang="fr"></ferrygate-booking> dans n'importe quel template.

Attributs

L'élément se configure entièrement via des attributs HTML. Aucune initialisation JavaScript n'est requise.

AttributRequisDescription
api-keyOuiVotre clé widget, préfixée par wgt_. Détermine les opérateurs, les tarifs et le mode disponibles pour le widget.
langNonLangue de l'interface : fr ou en. Par défaut, la langue du navigateur du visiteur si l'attribut est omis.
checkout-pathNonOptionnel. B2C uniquement — chemin de votre page de checkout sur la même origine. Défaut : /checkout. URL finale = origine courante + ce chemin.
checkout-urlNonOptionnel. B2C uniquement — URL absolue complète pour un checkout sur un autre domaine. Surcharge l'URL dérivée de l'origine.

Résolution de l'URL de checkout (B2C) : l'attribut checkout-url l'emporte ; sinon l'origine de la page courante + checkout-path (défaut /checkout). La résolution se fait côté client. Les origines autorisées contrôlent où le widget peut tourner, pas la destination du checkout.

Modes

Le widget fonctionne dans l'un des deux modes. Le mode est porté par la clé widget elle-même — vous ne le définissez pas via un attribut. Demandez à votre administrateur quel mode utilise votre clé.

Mode B2C

Pour vendre à des clients finaux. Une fois le ticket créé, le widget redirige l'acheteur vers votre checkout marchand pour encaisser le paiement. Les marges B2B ne sont jamais exposées au navigateur.

Mode agent

Pour les agents internes et les revendeurs. Après la réservation, le widget redirige vers la page de confirmation SaaS FerryGate, où l'agent gère le paiement et l'émission.

Origines autorisées (CORS)

Chaque clé widget porte une liste blanche d'origines. Le widget n'accepte que les requêtes provenant de ces domaines. Le HTTPS est requis en production ; le http simple est toléré pour le développement local.

Une requête provenant d'une origine absente de la liste blanche est rejetée avec une réponse 403.

OrigineAcceptée
https://yoursite.comOui (production)
http://localhost:3000Oui (local uniquement)
https://not-whitelisted.comNon (403)

Attention :

Ajouter ou modifier une origine nécessite que votre administrateur mette à jour la clé. Planifiez vos domaines avant la mise en ligne.

Bundle et isolation

~78 kB

Taille du bundle gzippé — assez léger pour être chargé sur n'importe quelle page.

Shadow DOM

Un vrai Web Component avec un Shadow DOM isolé. Le CSS et le JavaScript de votre site hôte restent intacts.

Zéro dépendance

Aucune bibliothèque partagée avec le site hôte. Le widget ne pollue jamais le scope global ni les styles de la page.

Note :

Comme les styles sont confinés dans le Shadow DOM, le widget s'affiche de façon identique sur tous les sites, quel que soit le framework CSS de l'hôte.

Securité

  • Token opaque. La clé widget est un identifiant opaque. Elle n'expose au navigateur aucun tarif, aucune marge ni aucun détail interne du compte.

  • Limite de débit. Chaque token est plafonné à 120 requêtes par minute. Dépasser cette limite renvoie une réponse 429 jusqu'à la réinitialisation de la fenêtre.

  • Révocable. Une clé compromise peut être révoquée instantanément par votre administrateur, désactivant immédiatement le widget partout où il est intégré.

Dépannage et FAQ

J'obtiens une erreur 401

La clé widget est invalide, mal saisie ou a été révoquée. Vérifiez la valeur wgt_ et demandez à votre administrateur de confirmer que la clé est toujours active.

J'obtiens une erreur 403

L'origine de la page actuelle n'est pas dans la liste blanche de la clé. Vérifiez que le domaine exact (https inclus) est autorisé pour votre clé.

Le widget ne s'affiche pas

Parcourez cette liste de vérifications :

  • La balise script est-elle chargée et accessible (vérifiez l'onglet réseau) ?
  • L'élément <ferrygate-booking> est-il présent dans le DOM ?
  • L'attribut api-key contient-il une clé wgt_ valide ?

J'obtiens une erreur 429

Vous avez dépassé 120 requêtes par minute sur ce token. Attendez la réinitialisation de la fenêtre de limite avant de réessayer.

Comment changer la langue ?

Définissez l'attribut lang sur fr ou en. Sans cela, le widget suit la langue du navigateur du visiteur.