Skip to content

Matrice des cas limites embed ​

Référence des comportements attendus lorsque le parcours embed ne suit pas le chemin nominal. Le principe directeur : le front intégrateur ne débloque jamais un dossier sur la seule base du postMessage.

Matrice ​

CasComportement attenduAction intégrateur
Front forge paid: true dans postMessageIgnoré ; seul completion_token est émisToujours appeler verify-completion
Webhook checkout.completed avant onCompleteDéblocage via webhookacknowledge idempotent sur order_id
onComplete avant webhookDéblocage via verify-completionWebhook traité en idempotent ensuite
Overlay fermé, paiement agence en coursPas de token immédiatAttendre webhook ou polling status
Overlay fermé après voucher agencePolling iframe arrêté ; encaissement ultérieurWebhook ou GET ?order_id=
client_secret sur session hostedAPI retourne 401Créer session mode: embedded
Origines embed non configurées422 embed.origins_required à la création sessionConfigurer origines admin / régie
parent_origin non listéIframe refuse le chargementAjouter origine exacte (schéma + hôte)
layout absent ou inconnuRendu large (puis repli compact si conteneur ≤ 559 px)Passer compact / large via le SDK si besoin
Viewport < 720 pxSDK ouvre en compact par défautForcer layout: 'large' uniquement si le portail le justifie
Token expiré (> 10 min)410 checkout.completion_token_expiredNouvelle session ou polling fallback
Token déjà consommé409 puis replay idempotent → 200 même corpsTraiter comme succès
Token inconnu404 checkout.completion_token_not_foundRejeter ; investiguer fraude ou bug
order_id verify ≠ dossier attenduRejeter côté back intégrateur403 métier
paid: false après verifySession terminale non payée (expirée, annulée)Informer citoyen, proposer nouvelle session
iframe bloquée (X-Frame)SDK propose hosted nouvel ongletWebhook obligatoire pour ce parcours
Double clic open()Deux overlays possiblesDésactiver bouton pendant session
Paiement MM en cours (pending)Fermeture overlay demande confirmationLaisser webhook finaliser si fermé
Paiement carte redirect en coursepayment.checkout.pending actifNe pas débloquer ; attendre webhook ou verify-completion
Refus carte acquéreurSession checkout reste openCitoyen peut relancer paddle sur la même session
Timeout approbation carteSession open, pas de checkout.failedNouvelle tentative carte ou autre offre
Overlay fermé pendant carte pendingPas de token immédiatWebhook checkout.completed ou polling GET ?order_id=
Devise session XAFOffre paddle absenteCréer session en devise carte si paiement carte requis
Session expirée en iframeÉtat terminal expired ; pas de token payéRecréer session
Clé plateforme sans tenant_id400 checkout.tenant_requiredToujours passer tenant_id (eGouv)
Réseau coupé pendant verifyRetry exponentiel côté backNe pas débloquer sans réponse API
Citoyen change d'onglet (mobile)Overlay persiste ; polling voucher continuePas d'action spécifique
Montant session ≠ attente métierVerify retourne amount dans metadata si fourniValider order_id + règles métier

Priorité des chemins de confirmation ​

  1. Webhook HMAC checkout.completed (file durable, at-least-once)
  2. POST /checkout/sessions/verify-completion avec sk_ (fermeture synchrone post-embed)
  3. GET /checkout/sessions?order_id= avec sk_ (fallback)

Idempotence déblocage ​

typescript
async function unlockDossierIdempotent(orderId: string, source: 'webhook' | 'verify' | 'poll') {
  // Même order_id : second appel ne doit pas annuler le premier succès
  await db.transaction(async (tx) => {
    const row = await tx.dossier.findForUpdate(orderId);
    if (row.status === 'paid') return;
    await tx.dossier.markPaid(orderId, { source });
  });
}

Anti-patterns à éviter ​

Anti-patternRisque
Débloquer sur onComplete sans verifyFraude front, token forgé
Faire confiance à event.data.paidNon émis par le SDK officiel
Stocker client_secret en localStorageVol XSS
Exposer sk_ au navigateurCompromission compte ministry
Ignorer webhook car verify a réussiPerte notification si verify rollback métier

Documentation associée ​

Plateforme d'orchestration de paiement DPI. Les fonds ne transitent pas par Epayment.