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

É possível usar a API Payment Request para iniciar apps de pagamento do 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 Payment Request em apps host da WebView

Para iniciar apps de pagamento do 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 Payment Request está desativada na WebView.

Siga estas etapas para ativá-la usando WebSettingsCompat da versão 1.14.0 ou mais recente do Jetpack Webkit:

Etapa 1: adicionar a dependência do Jetpack 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 Payment Request no código da WebView

Essa etapa ativa o recurso Payment Request na WebView e garante que o site possa acioná-lo usando JavaScript.

Essa etapa ativa o recurso Payment Request na WebView e garante que o site possa acioná-lo 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 no AndroidManifest.xml

Esses filtros permitem que a WebView descubra e invoque apps de pagamento do 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 intents a seguir no AndroidManifest.xml para oferecer suporte aos principais recursos da Payment Request:

Etapa 5: recriar e publicar o app

Depois de fazer essas mudanças, recrie o app e lance uma versão atualizada no Google Play Store.

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

Além de iniciar apps de pagamento do 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 host da WebView podem oferecer uma alternância semelhante usando:

WebSettingsCompat.setHasEnrolledInstrumentEnabled(WebSettings, boolean)

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

Verificar o suporte da Payment Request em JavaScript

Depois que WebSettingsCompat.setPaymentRequestEnabled(webSettings, true) for chamado em Java ou Kotlin, a interface window.PaymentRequest ficará disponível em JavaScript. Ela pode ser usada para detecção de 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 a iniciar uma transação de pagamento.

Integrar apps de pagamento do Android com a Payment Request

Para oferecer suporte à Payment Request, os apps de pagamento do Android precisam responder a intents específicas do sistema e processar dados de pagamento com segurança. Estes guias explicam como registrar formas de pagamento, implementar o serviço de pagamento e proteger o app:

Proteger o 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 host da WebView também podem observar, iniciar e interceptar chamadas da Payment Request. Como a WebView é executada no processo do app host, ela não pode restringir o uso dessas intents. Apps maliciosos podem aproveitar isso para iniciar ataques de oráculo.

Em um ataque de oráculo, um app de pagamento revela 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 estratégias a seguir para mitigar 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 confidenciais para que apenas os servidores de comerciantes confiáveis possam descriptografá-las. Sempre realize a criptografia e a descriptografia no lado do servidor.
  • Restringir o 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 em o guia do desenvolvedor de apps de pagamento do Android.