Pular para o conteúdo principal
Nesta página

Utilize um WebView personalizado somente quando sua aplicação precisa hospedar um checkout web existente e de propriedade do comerciante. Para uma nova integração móvel, prefira a solução mantida iOS, Android, ou Reagir nativo SDK: Estes SDKs já implementam a ponte DEUNA WebView e o ciclo de vida de ações externas.

Arquitetura#

Diagrama de sequência
1Native app2Merchant checkoutWebView3DEUNA Web SDK43DS / APM surfaceLoad allow-listed HTTPScheckout URLInitialize and open widgetCallback oropenExternalPopupValidated JSON bridgemessageOpen approved external URLClose or returnResume and reconcile
Comerciante ou clienteDEUNAProvedor ou processador
01 · load
Realizar pagamentos de forma segura
Utilizar HTTPS e um domínio de comerciante autorizado.
02 · bridge
Validar mensagens
Aceitar um esquema mínimo e versionado, proveniente apenas da página esperada.
03 · redirect
Gerenciar ações externas
Exibir URLs de 3DS e APM em um navegador ou WebView secundário aprovado.
04 · reconcile
Confirmar o estado do pedido
Considerar as devoluções e cancelamentos como ambíguos até que o backend os verifique.

Veja o padrão de wrapper WebView#

Este passo a passo mostra um checkout na web do comerciante carregado dentro de um iOS WebView. O wrapper nativo troca mensagens com a página de checkout enquanto o DEUNA Web SDK renderiza a experiência de pagamento:

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

O vídeo demonstra o padrão de apresentação. Os detalhes da IU podem mudar; use a arquitetura, os limites de segurança e os requisitos de plataforma abaixo como contrato de implementação.

Capacidades necessárias do WebView#

CapacidadePor que isso é necessário
JavaScript e armazenamento do DOMO checkout hospedado e o SDK exigem a execução no navegador e o armazenamento de sessão.
Interceptação em nova janelaOs fluxos 3DS e APM podem utilizar window.open.
Lista de permissões de navegaçãoImpedir que a WebView do checkout se torne um navegador genérico.
Ponte de mensagens bidirecionalEnviar mensagens de conclusão, erro, fechamento e ciclo de vida.
Gerenciamento do ciclo de vida do aplicativoPreservar o estado durante o backgrounding e autenticação externa.
Downloads ou compartilhamento, se utilizadoOs fluxos de vouchers podem gerar um arquivo ou referência para download.

Definir uma ponte mínima#

Código executado na página de checkout do 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
}

Na fronteira nativa, parse JSON com um esquema rigoroso, rejeitar versões e tipos de mensagens desconhecidos, limitar o tamanho da mensagem e ignorar mensagens de páginas de nível superior inesperadas. Nunca expor um dispatcher nativo genérico para JavaScript.

Enviar resultados do 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 apenas os campos que a aplicação nativa precisa. Não transmitir tokens de pedido, tokens de carteira, dados de cartão, objetos de cliente completos ou payloads de eventos brutos arbitrários.

Janelas e redirecionamentos externos#

O Web SDK emite eventos de ciclo de vida para pop-ups externos suportados. Sua WebView deve interceptar window.open ou solicitações de nova janela e apresentar o alvo sem relatar incorretamente que ele foi fechado imediatamente.

  • Permitir apenas https URLs cujo host corresponda aos seus destinos de autenticação ou pagamento aprovados.
  • Preferir uma superfície de navegador isolada para conteúdo de terceiros; não injetar a ponte do comerciante em uma página do emissor ou provedor.
  • Rastrear a superfície externa independentemente da WebView do checkout.
  • Ao finalizar ou retornar, retome o processo de checkout e obtenha o estado do pedido.
  • Não suprima globalmente os erros de timeout. Um timeout pode indicar uma ação incompleta; reconcilie e, em seguida, apresente um caminho de recuperação adequado.

Os repositórios do SDK incluem wrappers de referência mantidos para Examples/checkout-web-wrapper para iOS e examples/checkout-web-wrapper para Android.

Verificação da plataforma#

iOS · WKWebViewNavegação e mensagens de script

Habilite o JavaScript para a configuração de checkout confiável, registre um nome específico WKScriptMessageHandler, valide a navegação de nível superior em WKNavigationDelegatee implemente WKUIDelegate Gerenciamento de novas janelas. Remova os manipuladores de script quando o controlador é descartado para evitar a manutenção da ponte.

Android · WebViewNavegação e criação de janelas

Habilite JavaScript e armazenamento no navegador WebView apenas para o processo de checkout, utilize uma interface JavaScript restrita e valide URLs. WebViewClient, e gerencie novas janelas através do WebChromeClient ou uma superfície secundária controlada. Desative o acesso a arquivos e conteúdo, a menos que sua aplicação o exija explicitamente.

React Native · react-native-webviewCiclo de mensagens e abertura de janela

Uso onMessage, onShouldStartLoadWithRequeste a função de callback para nova janela suportada. Mantenha o componente principal de checkout montado enquanto a interface externa estiver visível. O SDK React Native da DEUNA já implementa este controlador e é a opção preferida para novas integrações.

Interface responsiva e acessível#

  • Respeite as margens de segurança e o teclado na tela.
  • Utilize a largura total disponível e altura dinâmica da viewport; evite um WebView de tamanho fixo, semelhante ao de desktop.
  • Mantenha os controles de fechamento nativos fora do conteúdo de pagamento, mas acessíveis através de tecnologias assistivas.
  • Anuncie a navegação e os erros, e restaure o foco após o fechamento de uma superfície externa.
  • Teste a rotação, a tela dividida, texto grande, leitores de tela, redes lentas e o fechamento em segundo plano do aplicativo.

Matriz de testes#

  • Sucesso, falha e encerramento do cliente no pagamento.
  • 3DS sem atrito e com desafios.
  • Sucesso, cancelamento e timeout do provedor no APM.
  • Janela externa fechada pelo cliente.
  • Aplicativo fechado em segundo plano e posteriormente retomado.
  • Perda de rede antes e depois da submissão.
  • Navegação não confiável e mensagens de ponte malformadas são rejeitadas.
  • O estado do backend é correto após qualquer resultado ambíguo do cliente.