SDK Web em um WebView móvel
Hospede o checkout web do comerciante em um WebView móvel, preservando as chamadas de retorno da DEUNA, autenticação externa, limites de segurança e comportamento responsivo.
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#
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:
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#
| Capacidade | Por que isso é necessário |
|---|---|
| JavaScript e armazenamento do DOM | O checkout hospedado e o SDK exigem a execução no navegador e o armazenamento de sessão. |
| Interceptação em nova janela | Os fluxos 3DS e APM podem utilizar window.open. |
| Lista de permissões de navegação | Impedir que a WebView do checkout se torne um navegador genérico. |
| Ponte de mensagens bidirecional | Enviar mensagens de conclusão, erro, fechamento e ciclo de vida. |
| Gerenciamento do ciclo de vida do aplicativo | Preservar o estado durante o backgrounding e autenticação externa. |
| Downloads ou compartilhamento, se utilizado | Os fluxos de vouchers podem gerar um arquivo ou referência para download. |
Definir uma ponte mínima#
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#
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
httpsURLs 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 · WKWebView
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 · WebView
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-webview
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.