Na web aberta, tocar em «Pagar» abre o painel de pagamento do navegador: Apple Pay no Safari, Google Pay no Chrome ou a Payment Request API em todos os navegadores. Dentro de um WebView, esses botões somem em silêncio. O Apple Pay simplesmente não está disponível no WKWebView, e o Android desativa a Payment Request API a menos que o host a reative explicitamente. Um runtime próprio do host conecta os SDKs de pagamento nativos: uma chamada de pagamento uniforme que resolve Apple Pay, Google Pay ou a carteira da plataforma em cada motor.

Apple Pay: apenas Safari e SFSafariViewController

A documentação da Apple e todo o ecossistema de pagamentos são claros: o Apple Pay na web é suportado apenas no Safari e no SFSafariViewController. A Apple orienta os apps que carregam o checkout em um WKWebView a moverem a solicitação de pagamento para o código nativo. O Apple Pay JS (window.ApplePaySession) é efetivamente inexistente em um WebView embutido; o painel que abre nativamente no Safari desaparece e a página não obtém nenhum método de pagamento utilizável: a opção simplesmente não é oferecida.

O iOS 13 abriu um caminho estreito para o Apple Pay dentro do WKWebView, mas com uma armadilha severa: se o app chamar WKUserScript ou evaluateJavaScript antes da página usar o Apple Pay, a transação é desativada. Com o WebKit em camadas, mais WKWebViews agora são totalmente restritas à injeção de scripts. Para um app híbrido, o resultado prático é o mesmo: não se pode confiar no painel de pagamento web e é preciso conectar o Apple Pay via PKPaymentAuthorizationController em código nativo.

Android: Payment Request desativada por padrão

A própria documentação do Google Pay diz sem rodeios: «Por padrão, o WebView desativa a Payment Request API». Quando um checkout web é embutido em um Android WebView, a Payment Request API —que o fluxo web do Google Pay usa para abrir o painel de pagamento— fica desligada. Para reativá-la, o host deve adicionar a dependência AndroidX WebKit, declarar a flag de metadados android.webkit.WebView.enablePaymentRequest e chamar WebSettingsCompat.setPaymentRequestEnabled(settings, true) em tempo de execução.

E os requisitos são rigorosos: o Google Pay dentro do WebView precisa do Google Play services 25.18.30+ e do Android WebView (Chrome) 137+, e o isReadyToPay retorna false quando não são atendidos. A Stripe descontinuou seu Payment Request Button, e os provedores empurram sistematicamente para SDKs nativos justamente porque o caminho web embutido é pouco confiável.

O que quebra quando o pagamento morre

  • O botão da carteira nunca aparece. Um checkout que mostra Apple Pay ou Google Pay no navegador não mostra nenhum dos dois no WebView: sem erro, apenas uma opção ausente.
  • A conversão despenca. Os usuários que pagavam só com uma carteira ficam obrigados a digitar os dados do cartão ou desistem.
  • O login federado também falha. O mesmo WebView embutido perde o login com Google (disallowed_useragent), então login e pagamento travam juntos.
  • Os navegadores de apps sociais também o escondem. Os WebViews de WeChat, Douyin, Instagram e Facebook impõem suas próprias restrições, então a quebra não aparece no QA de desktop.

A solução do runtime

Um runtime próprio do host conecta a camada de pagamento. A página chama uma API uniforme —runtime.requestPayment(methods, details)— e o host a resolve por meio do SDK de pagamento nativo da plataforma: Apple Pay via PKPaymentAuthorizationController no iOS, Google Pay / o painel de pagamento nativo no Android. A sessão do comerciante, a apresentação do painel e o retorno do token são tratados de forma nativa e consistente. Uma integração, cada motor, um checkout concluído.

DimensãoWebViewRuntime próprio do host
Apple Pay (iOS)Não suportado no WKWebViewPKPaymentAuthorizationController nativo
Google Pay (Android)Payment Request desativada por padrãoSDK do Google Pay nativo
AtivaçãoFlags do host + AndroidX WebKitUm runtime.requestPayment()
Apresentação do painelDo navegador, ausenteDo host, confiável
FallbackApenas cartão manualCarteira ou cartão, ambos conectados
ConsistênciaConforme o motorUniforme

Um app nativo conclui um pagamento com carteira em todos os dispositivos. Um WebView padrão o conclui em quase nenhum. Um runtime dá à página uma ação de pagar —e uma autorização real no final.

Fontes