Aller au contenu principal
Sur cette page

Utiliser un WebView personnalisé uniquement lorsque votre application doit héberger un point de vente web existant appartenant au commerçant. Pour une nouvelle intégration mobile, privilégiez la solution maintenue iOS, Android, ou Réagir à l'initié SDK : Ces SDK implémentent déjà le pont DEUNA WebView et le cycle de vie des actions externes.

Architecture#

Diagramme de séquence
1Native app2Merchant checkoutWebView3DEUNA Web SDK43DS / APM surfaceLoad allow-listed HTTPScheckout URLInitialize and open widgetCallback oropenExternalPopupValidated JSON bridgemessageOpen approved external URLClose or returnResume and reconcile
Marchand ou clientDEUNAFournisseur ou processeur
01 · load
Mise en œuvre d'un paiement sécurisé
Utiliser HTTPS et une origine de marchand autorisée.
02 · bridge
Valider les messages
Accepter un schéma minimal et versionné uniquement à partir de la page attendue.
03 · redirect
Gérer les actions externes
Présenter les URL 3DS et APM dans un navigateur approuvé ou un WebView secondaire.
04 · reconcile
Confirmer l'état de la commande
Considérer les retours et les fermetures comme ambigus jusqu'à ce que le backend les confirme.

Voir le modèle de wrapper WebView#

Cette procédure pas à pas montre un paiement Web marchand chargé dans une WebView iOS. Le wrapper natif échange des messages avec la page de paiement tandis que DEUNA Web SDK restitue l'expérience de paiement :

WebView wrapper example using a merchant checkout page and native message bridge.

La vidéo montre le modèle de présentation. Les détails de l'interface utilisateur peuvent changer ; utilisez l'architecture, les limites de sécurité et les exigences de plate-forme ci-dessous comme contrat de mise en œuvre.

Capacités WebView requises#

CapacitéPourquoi c'est nécessaire
JavaScript et stockage DOMLe processus de paiement hébergé et l'SDK nécessitent l'exécution dans un navigateur et le stockage de session.
Interception de nouvelles fenêtresLes flux 3DS et APM peuvent utiliser window.open.
Liste d'autorisation de navigationEmpêcher le WebView de la page de paiement de devenir un navigateur général.
Pont de communication bidirectionnelTransmettre les messages de réussite, d'erreur, de fermeture et de cycle de vie.
Gestion du cycle de vie de l'applicationPréserver l'état lors du changement d'arrière-plan et de l'authentification externe.
Téléchargements ou partage, si utiliséLes flux de codes promotionnels peuvent générer un fichier ou une référence téléchargeable.

Définir un pont minimal#

Code exécuté sur la page de paiement du commerçantJavaScript
type NativeMessage = {
  version: 1;
  type: 'success' | 'error' | 'closed' | 'event';
  widget: 'payment' | 'elements' | 'voucher' | 'nextAction';
  data?: unknown;
};

function postToNative(message: NativeMessage) {
  const body = JSON.stringify(message);
  window.webkit?.messageHandlers.deunaPayment?.postMessage(body); // iOS
  window.deunaPayment?.postMessage(body);                         // Android
  window.ReactNativeWebView?.postMessage(body);                   // React Native
}

Au niveau natif, analyser les données JSON avec un schéma strict, rejeter les versions et types de messages inconnus, limiter la taille des messages et ignorer les messages provenant d'une page de niveau supérieur inattendue. Ne jamais exposer un dispatcher de méthode natif générique au JavaScript.

Transmettre les résultats de l'SDK#

JavaScript
await DeunaSDK.initPaymentWidget({
  orderToken,
  callbacks: {
    onSuccess: (data) => postToNative({version: 1, type: 'success', widget: 'payment', data}),
    onError: (data) => postToNative({version: 1, type: 'error', widget: 'payment', data}),
    onClosed: (action) => postToNative({version: 1, type: 'closed', widget: 'payment', data: {action}}),
    onEventDispatch: (event) => postToNative({
      version: 1,
      type: 'event',
      widget: 'payment',
      data: {event},
    }),
  },
});

Transmettre uniquement les champs dont l'application native a besoin. Ne pas transmettre les tokens de commande, les tokens de portefeuille, les données de carte, les objets clients complets ou des charges de travail d'événements brutes arbitraires.

Fenêtres et redirections externes#

Le Web SDK émet des événements de cycle de vie pour les pop-ups externes pris en charge. Votre WebView doit intercepter window.open ou les requêtes de nouvelles fenêtres et afficher la cible sans signaler de manière incorrecte qu'elle a été fermée immédiatement.

  • Autoriser uniquement https Les URL dont l'hôte correspond à vos destinations d'authentification ou de paiement approuvées.
  • Privilégier une surface de navigateur isolée pour le contenu tiers ; ne pas injecter le pont du commerçant sur une page d'émetteur ou de fournisseur.
  • Suivre la surface externe indépendamment du WebView de la page de paiement.
  • Lors de la fermeture ou de la reprise, relancez le processus de paiement et récupérez l'état de la commande.
  • Ne supprimez pas les erreurs de timeout de manière globale. Un timeout peut indiquer une action incomplète ; vérifiez, puis affichez un chemin de récupération approprié.

Les dépôts SDK incluent des wrappers de référence maintenus pour Examples/checkout-web-wrapper iOS et examples/checkout-web-wrapper Android.

Vérification de la plateforme#

iOS · WKWebViewNavigation et messages de script

Activer JavaScript pour la configuration de paiement de confiance, enregistrer un script avec un nom spécifique WKScriptMessageHandler, valider la navigation principale WKNavigationDelegate, et implémenter WKUIDelegate Gestion des fenêtres dans une nouvelle fenêtre. Supprimez les gestionnaires de script lorsque le contrôleur est supprimé pour éviter de conserver le pont.

Android · WebViewNavigation et création de fenêtres

Activer JavaScript et le stockage DOM uniquement pour le WebView de paiement, utiliser une interface JavaScript limitée, valider les URL. WebViewClient, et gérer les nouvelles fenêtres via WebChromeClient ou une surface secondaire contrôlée. Désactiver l'accès aux fichiers et au contenu, sauf si votre application en a explicitement besoin.

React Native · react-native-webviewCycle de vie des messages et des fenêtres.

Utilisation onMessage, onShouldStartLoadWithRequest, et la fonction de rappel pour la nouvelle fenêtre prise en charge. Conservez le composant principal de paiement DEUNA en cours de fonctionnement tout en affichant l'interface externe. Le SDK React Native DEUNA existant est déjà mis en œuvre et est recommandé pour les nouvelles intégrations.

Présentation réactive et accessible#

  • Respectez les marges de sécurité et le clavier sur écran.
  • Utiliser toute la largeur disponible et une hauteur de fenêtre dynamique. Éviter une WebView de taille fixe.
  • Conserver les contrôles de fermeture natifs en dehors du contenu de paiement, mais accessibles aux technologies d'assistance.
  • Annoncer la navigation et les erreurs, et restaurer le focus après la fermeture d'une surface externe.
  • Tester la rotation, le mode split-screen, le grand texte, les lecteurs d'écran, les réseaux lents et la mise en arrière-plan de l'application.

Matrice de test#

  • Succès, refus et fermeture du paiement par le client.
  • 3DS sans friction et avec des défis.
  • Succès, annulation et timeout du fournisseur pour APM.
  • Fenêtre externe fermée par le client.
  • Application mise en arrière-plan et reprise ultérieure.
  • Perte de connexion avant et après la soumission.
  • Navigation non fiable et messages de pont malformés sont rejetés.
  • L'état du backend est correct après chaque résultat client ambigu.