Saltar al contenido principal
En esta página

Utilice un WebView personalizado solo cuando su aplicación debe hospedar un checkout web existente propiedad del comerciante. Para una nueva integración móvil, prefiera el SDK iOS, androideo Reaccionar nativo ; esos SDK ya implementan el puente WebView de DEUNA y el ciclo de vida de la acción externa.

Arquitectura#

Diagrama de secuencia
1Native app2Merchant checkoutWebView3DEUNA Web SDK43DS / APM surfaceLoad allow-listed HTTPScheckout URLInitialize and open widgetCallback oropenExternalPopupValidated JSON bridgemessageOpen approved external URLClose or returnResume and reconcile
Comercio o clienteDEUNAProveedor o procesador
01 · load
Checkout de confianza
Utilizar HTTPS y un origen de comerciante autorizado.
02 · bridge
Validar mensajes
Aceptar un esquema mínimo y versionado proveniente únicamente de la página esperada.
03 · redirect
Manejar acciones externas
Mostrar las URLs de 3DS y APM en un navegador o WebView secundario aprobado.
04 · reconcile
Confirmar el estado del pedido
Considerar las devoluciones y cierres como ambiguos hasta que el backend los verifique.

Ver el patrón contenedor WebView#

Este tutorial muestra el pago web de un comerciante cargado dentro de un WebView de iOS. El contenedor nativo intercambia mensajes con la página de pago mientras DEUNA Web SDK ofrece la experiencia de pago:

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

El vídeo muestra el patrón de presentación. Los detalles de la interfaz de usuario pueden cambiar; Utilice la arquitectura, los límites de seguridad y los requisitos de plataforma a continuación como contrato de implementación.

Capacidades requeridas del WebView#

Capacidad¿Por qué es necesario?
JavaScript y almacenamiento en el DOMEl checkout alojado y el SDK requieren la ejecución en el navegador y el almacenamiento de sesión.
Intercepción de nuevas ventanasLos flujos de 3DS y APM pueden utilizar window.open.
Lista de navegación permitidaEvitar que el WebView del checkout se convierta en un navegador de uso general.
Puente de mensajes bidireccionalEnviar mensajes de finalización, error, cierre y ciclo de vida.
Manejo del ciclo de vida de la aplicaciónPreservar el estado en el modo de fondo y autenticación externa.
Descargas o compartidos, si se utilizanLos flujos de vouchers pueden generar un archivo o referencia descargable.

Definir un puente mínimo#

Código que se ejecuta en la página de checkout del comercianteJavaScript
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
}

En el límite nativo, parsear JSON con un esquema estricto, rechazar versiones y tipos de mensajes desconocidos, limitar el tamaño del mensaje e ignorar mensajes de una página de nivel superior inesperada. Nunca exponga un dispatcher nativo genérico a JavaScript.

Enviar resultados del 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},
    }),
  },
});

Enviar únicamente los campos que necesita la aplicación nativa. No transmitir tokens de pedido, tokens de wallet, datos de tarjeta, objetos de cliente completos o payloads de eventos brutos arbitrarios.

Ventanas y redirecciones externas#

El Web SDK emite eventos de ciclo de vida para popups externos compatibles. Su WebView debe interceptar window.open o solicitudes de nuevas ventanas y presentarlas sin informar erróneamente que se han cerrado inmediatamente.

  • Permitir únicamente https URLs cuyo host coincida con sus destinos de autenticación o pago autorizados.
  • Prefiera una superficie de navegador aislada para el contenido de terceros; no inyecte el puente del comerciante en una página del emisor o proveedor.
  • Rastrear la superficie externa de forma independiente del WebView del checkout.
  • Al cerrar o devolver, reanudar el checkout y recuperar el estado del pedido.
  • No suprimir los errores de tiempo de espera globalmente. Un tiempo de espera puede representar una acción incompleta; reconciliar y luego mostrar una ruta de recuperación adecuada.

Los repositorios del SDK incluyen envoltorios de referencia mantenidos en Examples/checkout-web-wrapper para iOS y examples/checkout-web-wrapper para Android.

Lista de verificación de la plataforma#

iOS · WKWebViewNavegación y mensajes de script

Habilitar JavaScript para la configuración del checkout de confianza, registrar un nombre específico WKScriptMessageHandler, validar la navegación de nivel superior en WKNavigationDelegate, e implementar WKUIDelegate manejo de nuevas ventanas. Elimine los controladores de script cuando el controlador se deshaga para evitar mantener el puente.

Android · WebViewNavegación y creación de ventanas

Habilitar JavaScript y almacenamiento en el DOM únicamente para el WebView del checkout, utilizar una interfaz de JavaScript restringida, validar las URLs en WebViewClienty maneje nuevas ventanas a través de WebChromeClient o una superficie secundaria controlada. Desactive el acceso a archivos y contenido a menos que su aplicación lo requiera explícitamente.

React Native · react-native-webviewCiclo de mensajes y apertura de ventanas

Uso onMessage, onShouldStartLoadWithRequesty la función de devolución de llamada para nuevas ventanas. Mantenga el componente principal de la cesta de compra montado mientras la superficie externa es visible. El SDK de React Native de DEUNA ya implementa este controlador y se recomienda para nuevas integraciones.

Presentación adaptable y accesible#

  • Respete los márgenes seguros y el teclado en pantalla.
  • Utilice el ancho disponible completo y la altura del viewport dinámica; evite un WebView de tamaño de escritorio fijo.
  • Mantenga los controles nativos de cierre fuera del contenido de pago, pero accesibles a través de tecnologías de asistencia.
  • Anuncie la navegación y los errores, y restaure el foco después de que se cierre una superficie externa.
  • Pruebe la rotación, la pantalla dividida, el texto grande, los lectores de pantalla, las redes lentas y el cierre en segundo plano de la aplicación.

Matriz de pruebas#

  • Éxito, rechazo y cierre del cliente para la tarjeta.
  • 3DS sin fricciones y desafiado.
  • Éxito, cancelación y tiempo de espera del proveedor para la redirección de APM.
  • La ventana externa cerrada por el cliente.
  • Aplicación en segundo plano y posterior reanudación.
  • Pérdida de red antes y después de la presentación.
  • La navegación no confiable y los mensajes de puente malformados son rechazados.
  • El estado del backend es correcto después de cada resultado ambiguo del cliente.