Supportare le app di pagamento Android in WebView utilizzando l'API Payment Request

Puoi utilizzare l' API Payment Request per avviare app di pagamento Android da siti web in esecuzione all'interno di una WebView. Questa funziona utilizzando la stessa API JavaScript già disponibile in Chrome.

Questa funzionalità è disponibile a partire dalla versione 136 di WebView, che in genere viene fornita con Chrome 136.

Configurare la richiesta di pagamento nelle app host WebView

Per avviare app di pagamento per Android da WebView, l'API Payment Request esegue query sul sistema utilizzando gli intent Android. Per supportare questa funzionalità, l'app host WebView deve dichiarare questi intent nel file AndroidManifest.xml.

Per impostazione predefinita, la richiesta di pagamento è disattivata in WebView.

Segui questi passaggi per attivarlo utilizzando WebSettingsCompat da Jetpack Webkit versione 1.14.0 o successive:

Passaggio 1: aggiungi la dipendenza 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'
}

Catalogo delle versioni

[versions]
webkit = "1.14.0"

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

Passaggio 2: importa le classi richieste

Queste classi ti consentono di accedere e configurare le impostazioni di WebView e verificare il supporto delle funzionalità in fase di runtime.

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

Passaggio 3: attiva la richiesta di pagamento nel codice WebView

Questo passaggio attiva la funzionalità Richiesta di pagamento in WebView e garantisce che il sito possa attivarla utilizzando JavaScript.

Questo passaggio attiva la funzionalità Richiesta di pagamento in WebView e garantisce che il sito possa attivarla utilizzando 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);
}

Passaggio 4: aggiungi filtri per intent in AndroidManifest.xml

Questi filtri consentono a WebView di rilevare e richiamare le app di pagamento Android utilizzando gli intent di 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>

Utilizza i seguenti intent nel tuo AndroidManifest.xml per supportare le funzionalità chiave di richiesta di pagamento:

Passaggio 5: ricompila e pubblica l'app

Dopo aver apportato queste modifiche, ricompila l'app e rilascia una versione aggiornata sul Play Store.

(Facoltativo) Personalizza i controlli di idoneità

Oltre ad avviare app di pagamento per Android, l'API Payment Request consente ai siti web di verificare se l'utente è pronto a pagare. Ad esempio, i siti web possono rilevare se l'utente ha configurato un metodo di pagamento supportato.

Chrome include un'impostazione che consente agli utenti di attivare o disattivare questo controllo. Le app host WebView possono offrire un pulsante di attivazione/disattivazione simile utilizzando:

WebSettingsCompat.setHasEnrolledInstrumentEnabled(WebSettings, boolean)

Questa impostazione è attiva per impostazione predefinita (true). Quando è attiva, consente ai siti web in esecuzione in WebView di rilevare se l'utente ha uno strumento di pagamento registrato.

Verificare il supporto della richiesta di pagamento in JavaScript

Dopo che WebSettingsCompat.setPaymentRequestEnabled(webSettings, true) è stato chiamato in Java o Kotlin, l'interfaccia window.PaymentRequest diventa disponibile in JavaScript. Può essere utilizzato per il rilevamento delle funzionalità sulla pagina web:

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

Quando window.PaymentRequest è disponibile, la pagina web può continuare a avviare una transazione di pagamento.

Integrare le app di pagamento per Android con Richiesta di pagamento

Per supportare la richiesta di pagamento, le app di pagamento per Android devono rispondere a intent di sistema specifici e gestire i dati di pagamento in modo sicuro. Queste guide spiegano come registrare i metodi di pagamento, implementare il servizio di pagamento e proteggere l'app:

Proteggere la tua app da un utilizzo improprio

Qualsiasi app può chiamare gli intent di pagamento Android org.chromium.intent.action.PAY, IS_READY_TO_PAY e UPDATE_PAYMENT_DETAILS. Le app host WebView possono anche osservare, avviare e intercettare le chiamate Payment Request. Poiché WebView viene eseguito all'interno del processo dell'app host, non può limitare la modalità di utilizzo di questi intent. Le app dannose possono sfruttare questa vulnerabilità per lanciare attacchi Oracle.

In un attacco oracle, un'app di pagamento rivela involontariamente informazioni che non dovrebbe. Ad esempio, un malintenzionato potrebbe utilizzare IS_READY_TO_PAY per scoprire quali strumenti di pagamento sono disponibili per l'utente.

Devi integrare protezioni nella tua app di pagamento per difenderti da questo tipo di uso improprio.

Utilizza le seguenti strategie per mitigare gli abusi:

  • Richieste di limitazione: limita la frequenza con cui la tua app risponde a IS_READY_TO_PAY. Ad esempio, rispondi solo una volta ogni 30 minuti.
  • Utilizza la crittografia: cripta le risposte sensibili in modo che solo i tuoi server commerciante attendibili possano decriptarle. Esegui sempre la crittografia e la decrittografia sul lato server.
  • Limitare l'accesso: gestisci una lista consentita di app host WebView attendibili utilizzando i nomi dei pacchetti e i certificati di firma SHA256. Scopri di più nella Guida per gli sviluppatori di app di pagamento per Android.