FlowAlp

Intégration iFrame

July 30, 2026

Intégrez le formulaire de paiement FlowAlp Pay dans votre site via un iFrame : URL, attribut allow, limites des moyens et événements de statut.

Avec l'intégration iFrame, le formulaire de paiement FlowAlp Pay s'affiche directement dans votre site plutôt que sur une page séparée. Vous pouvez intégrer une page de paiement configurée dans le dashboard, le terminal virtuel ou le lien de paiement d'un Gateway créé via l'API.

Choisir l'URL à intégrer

Ce que vous intégrezURL pour l'attribut src
Page de paiement (outil Pages)https://<instance>.pay.flowalp.com/pay?tid=<PAYMENT_TEMPLATE_ID>
Terminal virtuel (vPOS)https://<instance>.pay.flowalp.com/vpos
Gateway créé via l'APILe lien de paiement renvoyé par Create a Gateway

<instance> est votre nom d'instance ; la valeur tid est l'ID d'une page de paiement créée avec l'outil Pages du dashboard.

Intégration iFrame de basetext
<iframe
  id="checkout-frame"
  src="https://<instance>.pay.flowalp.com/pay?tid=<PAYMENT_TEMPLATE_ID>"
  width="530"
  height="700"
  allow="payment *">
</iframe>

Une largeur de 530 et une hauteur de 700 pixels sont des valeurs de départ éprouvées ; avec les événements de redimensionnement ci-dessous, la hauteur s'ajuste toute seule.

Support des wallets : l'attribut allow

Conservez l'attribut allow="payment *" sur le frame — Google Pay ne fonctionne que s'il est présent. Sans lui, le bouton du wallet n'apparaît pas dans le formulaire intégré.

Moyens de paiement incompatibles avec l'iFrame

Pour des raisons de sécurité, certains moyens de paiement refusent l'exécution intégrée, notamment PostFinance Pay, Reka Pay, PayPal et Coinbase. PostFinance est en outre désactivé lorsque le navigateur bloque les cookies tiers, ce qui est le comportement par défaut sur iOS et macOS.

Pour garder ces moyens disponibles, ajoutez le paramètre GET &breakIframe=true à l'URL intégrée. La page de paiement externe concernée s'ouvre alors dans un nouvel onglet au lieu du frame.

Réagir aux événements de la page de paiement

La page intégrée communique avec votre site via postMessage. Deux étapes : après le chargement de l'iFrame, vous envoyez un handshake contenant votre origin afin que la page soit autorisée à répondre ; ensuite la page envoie des messages JSON avec les événements suivants.

ÉvénementPayloadQuoi faire
heightHauteur du contenu en pixelsRedimensionner l'iFrame pour que le formulaire ne défile jamais en interne
topDécalage verticalFaire défiler la page parente, p. ex. au changement d'étape du checkout
transactionObjet transaction avec statusMettre à jour l'UI — ne jamais exécuter une commande sur cette seule base
closeModalURL de redirectionNaviguez vous-même la page parente ; l'iFrame ne peut pas rediriger votre site
Écouter les événements du checkoutJavaScript
var frame = document.getElementById('checkout-frame');

// Handshake: tell the embedded page which origin may receive its events
frame.addEventListener('load', function () {
  frame.contentWindow.postMessage(
    JSON.stringify({ origin: window.location.origin }),
    frame.src
  );
});

window.addEventListener('message', function (event) {
  if (typeof event.data !== 'string') return;
  var data = null;
  try { data = JSON.parse(event.data); } catch (ignore) { return; }
  if (!data || typeof data !== 'object') return;

  // Events arrive wrapped under a single vendor namespace key
  Object.keys(data).forEach(function (key) {
    var events = data[key] || {};

    if (events.height) {
      frame.style.height = parseInt(events.height, 10) + 'px';
    }
    if (events.top !== undefined) {
      window.scrollTo({
        top: frame.offsetTop + parseInt(events.top, 10),
        behavior: 'smooth'
      });
    }
    if (events.transaction && typeof events.transaction === 'object') {
      // UI signal only - fulfil orders after webhook or API confirmation
      console.log('Transaction status:', events.transaction.status);
    }
    if (events.closeModal) {
      window.location.href = events.closeModal;
    }
  });
});

N'ajoutez pas le paramètre appview à l'URL intégrée si vous utilisez la hauteur dynamique — les deux s'excluent mutuellement.

Les messages sont des chaînes JSON dont les événements se trouvent sous une clé racine propre au fournisseur. Le listener ci-dessus gère n'importe quelle clé ; journalisez tout de même un message en mode TEST et vérifiez la structure livrée par votre compte avant de vous appuyer sur des champs précis.

Confirmer le paiement côté serveur

N'exposez jamais votre API Secret dans le frontend et ne marquez jamais une commande comme payée simplement parce que l'événement transaction annonce un succès. Confirmez l'état final via les webhooks avec la vérification de signature, ou récupérez la transaction via l'API.

Vous préférez un overlay à un frame inline ? Poursuivez avec le guide de la fenêtre modale et configurez les webhooks avant la mise en production.