Oferecer suporte a apps de pagamento Android na WebView usando a API Payment Request

Rouslan Solomakhin
Rouslan Solomakhin

Você pode usar a API Payment Request para iniciar apps de pagamento Android em sites executados em uma WebView. Isso funciona usando a mesma API JavaScript já disponível no Chrome.

Esse recurso está disponível a partir da versão 136 da WebView, que normalmente é enviada com o Chrome 136.

Configurar a solicitação de pagamento em apps host da WebView

Para iniciar apps de pagamento Android na WebView, a API Payment Request consulta o sistema usando intents do Android. Para oferecer suporte a isso, o app host da WebView precisa declarar essas intents no arquivo AndroidManifest.xml.

Por padrão, a solicitação de pagamento fica desativada na WebView.

Siga estas etapas para ativar o recurso usando WebSettingsCompat do AndroidX WebKit versão 1.14.0 ou mais recente:

Etapa 1: adicionar a dependência do AndroidX WebKit

Kotlin (build.gradle.kts)

dependencies {
  implementation("androidx.webkit:webkit:1.14.0")
}

Groovy (build.gradle)

dependencies {
  implementation 'androidx.webkit:webkit:1.14.0'
}

Catálogo de versões

[versions]
webkit = "1.14.0"

[libraries]
androidx-ktx = { group = "androidx.webkit", name = "webkit", version.ref = "webkit" }

Etapa 2: importar as classes necessárias

Essas classes permitem acessar e configurar as configurações da WebView e verificar o suporte a recursos no momento da execução.

import android.webkit.WebSettings;
import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;

Etapa 3: ativar a solicitação de pagamento no código da WebView

Esta etapa ativa o recurso de solicitação de pagamento na WebView e garante que o site possa acionar esse recurso usando JavaScript.

Essa etapa ativa o recurso de solicitação de pagamento na WebView e garante que o site possa acionar esse recurso usando JavaScript.

Kotlin (Compose)

AndroidView(
  factory = {
      WebView(it).apply {
          settings.javaScriptEnabled = true
          if (WebViewFeature.isFeatureSupported(
                  WebViewFeature.PAYMENT_REQUEST)) {
              WebSettingsCompat.setPaymentRequestEnabled(settings, true);
          }
      }
  },
  update = {it.loadUrl(url)
  }
)

Java

WebView webView = findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavascriptEnabled(true);
if (WebViewFeature.isFeatureSupported(
        WebViewFeature.PAYMENT_REQUEST)) {
    WebSettingsCompat.setPaymentRequestEnabled(webSettings, true);
}

Etapa 4: adicionar filtros de intent em AndroidManifest.xml

Esses filtros permitem que o WebView descubra e invoque apps de pagamento Android usando intents do sistema:

<queries>
  <intent>
    <action android:name="org.chromium.intent.action.PAY"/>
  </intent>
  <intent>
    <action android:name="org.chromium.intent.action.IS_READY_TO_PAY"/>
  </intent>
  <intent>
    <action android:name="org.chromium.intent.action.UPDATE_PAYMENT_DETAILS"/>
  </intent>
</queries>

Use as seguintes intents no AndroidManifest.xml para oferecer suporte aos principais recursos de solicitações de pagamento:

Etapa 5: recriar e publicar o app

Depois de fazer essas mudanças, crie uma nova versão do app e lance-a na Play Store.

Opcional: personalizar as verificações de prontidão

Além de iniciar apps de pagamento para Android, a API Payment Request permite que os sites verifiquem se o usuário está pronto para pagar. Por exemplo, os sites podem detectar se o usuário tem uma forma de pagamento compatível configurada.

O Chrome inclui uma configuração que permite aos usuários ativar ou desativar essa verificação. Os apps de host da WebView podem oferecer uma alternância semelhante usando:

WebSettingsCompat.setHasEnrolledInstrumentEnabled(WebSettings, boolean)

Essa configuração é ativada por padrão (true). Quando ativa, ela permite que os sites em execução na WebView detectem se o usuário tem um instrumento de pagamento registrado.

Verificar a compatibilidade com a solicitação de pagamento em JavaScript

Depois que WebSettingsCompat.setPaymentRequestEnabled(webSettings, true) for chamado em Java ou Kotlin, a interface window.PaymentRequest vai ficar disponível no JavaScript. Isso pode ser usado para detectar recursos na página da Web:

if (window.PaymentRequest) {
  // Payment Request is available.
} else {
  // Payment Request is not available.
}

Quando window.PaymentRequest estiver disponível, a página da Web poderá continuar iniciando uma transação de pagamento.

Integrar apps de pagamento Android com a solicitação de pagamento

Para oferecer suporte à solicitação de pagamento, os apps de pagamento Android precisam responder a intents e processar dados de pagamento de forma segura. Estes guias explicam como registrar formas de pagamento, implementar seu serviço de pagamento e proteger seu app:

Proteger seu app contra uso indevido

Qualquer app pode chamar as intents de pagamento do Android org.chromium.intent.action.PAY, IS_READY_TO_PAY e UPDATE_PAYMENT_DETAILS. Os apps de host da WebView também podem observar, iniciar e interceptar chamadas de solicitação de pagamento. Como o WebView é executado dentro do processo do app host, ele não pode restringir como essas intents são usadas. Apps maliciosos podem explorar isso para lançar ataques de oráculo.

Em um ataque Oracle, um app de pagamento revela acidentalmente informações que não deveria. Por exemplo, um invasor pode usar IS_READY_TO_PAY para descobrir quais instrumentos de pagamento o usuário tem disponíveis.

É necessário criar proteções no app de pagamento para se defender contra esse tipo de uso indevido.

Use as seguintes estratégias para reduzir o abuso:

  • Limitar solicitações: limite a frequência com que o app responde a IS_READY_TO_PAY. Por exemplo, responda apenas uma vez a cada 30 minutos.
  • Usar criptografia: criptografe respostas sensíveis para que apenas seus servidores de comerciante confiáveis possam descriptografá-las. Sempre realize a criptografia e a descriptografia do lado do servidor.
  • Restringir acesso: mantenha uma lista de permissões de apps host da WebView confiáveis usando os nomes de pacote e os certificados de assinatura SHA256. Saiba mais no guia para desenvolvedores de apps de pagamento Android.