SDK web dans un WebView mobile
Hôter un point de vente web du commerçant dans un WebView mobile tout en conservant les appels de retour DEUNA, l'authentification externe, les limites de sécurité et le comportement responsive.
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#
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 :
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 DOM | Le 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êtres | Les flux 3DS et APM peuvent utiliser window.open. |
| Liste d'autorisation de navigation | Empêcher le WebView de la page de paiement de devenir un navigateur général. |
| Pont de communication bidirectionnel | Transmettre les messages de réussite, d'erreur, de fermeture et de cycle de vie. |
| Gestion du cycle de vie de l'application | Pré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#
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#
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
httpsLes 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 · WKWebView
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 · WebView
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-webview
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.