使用 Payment Request API 在 WebView 中支援 Android 付款應用程式

您可以使用 Payment Request API,從在 WebView 中執行的網站啟動 Android 付款應用程式。這項功能會使用 Chrome 中已提供的相同 JavaScript API

這項功能從 WebView 136 版開始提供,通常會隨 Chrome 136 版一併發布。

在 WebView 主機應用程式中設定付款要求

如要從 WebView 啟動 Android 付款應用程式,Payment Request API 會使用 Android 意圖查詢系統。為支援這項功能,WebView 主機應用程式必須在 AndroidManifest.xml 檔案中宣告這些意圖。

根據預設,WebView 會停用付款要求。

如要使用 AndroidX WebKit 1.14.0 以上版本的 WebSettingsCompat 啟用此功能,請按照下列步驟操作:

步驟 1:新增 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' } 

版本目錄

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

步驟 2:匯入必要的類別

這些類別可讓您存取及設定 WebView 設定,並在執行階段檢查功能支援情形。

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

步驟 3:在 WebView 程式碼中啟用付款要求

這個步驟會在 WebView 中啟用 Payment Request 功能,並確保網站可以使用 JavaScript 觸發這項功能。

這個步驟會在 WebView 中啟用付款要求功能,並確保網站可以使用 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); } 

步驟 4:在 AndroidManifest.xml 中新增意圖篩選器

這些篩選器可讓 WebView 使用系統意圖,探索及叫用 Android 付款應用程式:

<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> 

AndroidManifest.xml 中使用下列意圖,支援主要的 PaymentRequest 功能:

步驟 5:重新建構並發布應用程式

完成這些變更後,請重建應用程式,並將更新版發布至 Play 商店。

選用:自訂就緒檢查

除了啟動 Android 付款應用程式,Payment Request API 還可讓網站檢查使用者是否已準備好付款。舉例來說,網站可以偵測使用者是否已設定支援的付款方式。

Chrome 提供設定,可讓使用者啟用或停用這項檢查。WebView 主機應用程式可以使用以下方式提供類似的切換按鈕:

WebSettingsCompat.setHasEnrolledInstrumentEnabled(WebSettings, boolean) 

這項設定預設為啟用 (true)。啟用後,在 WebView 中執行的網站就能偵測使用者是否已註冊付款工具。

檢查 JavaScript 是否支援付款要求

在 Java 或 Kotlin 中呼叫 WebSettingsCompat.setPaymentRequestEnabled(webSettings, true) 後,JavaScript 就會提供 window.PaymentRequest 介面。這可用於偵測網頁上的功能:

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

window.PaymentRequest 可用時,網頁可以繼續啟動付款交易

將 Android 付款應用程式與 Payment Request 整合

為了支援付款要求,Android 付款應用程式必須回應特定系統意圖,並安全地處理付款資料。以下指南說明如何註冊付款方式、導入付款服務,以及保護應用程式:

保護應用程式免於遭到濫用

任何應用程式都可以呼叫 Android 付款意圖 org.chromium.intent.action.PAYIS_READY_TO_PAYUPDATE_PAYMENT_DETAILS。WebView 主機應用程式也可以觀察、啟動及攔截付款要求呼叫。由於 WebView 會在主機應用程式程序中執行,因此無法限制這些意圖的使用方式。惡意應用程式可以利用這項功能發動Oracle 攻擊

在 Oracle 攻擊中,付款應用程式會不小心洩漏不該洩漏的資訊。舉例來說,攻擊者可能會使用 IS_READY_TO_PAY 來找出使用者可用的付款工具。

您必須在付款應用程式中加入防護機制,以防範這類濫用行為。

請採用下列策略,減少濫用行為:

  • 調節要求數:限制應用程式回應 IS_READY_TO_PAY 的頻率。例如每 30 分鐘只回覆一次。
  • 使用加密功能:加密敏感回應,讓只有您信任的商家伺服器才能解密。一律在伺服器端執行加密和解密作業。
  • 限制存取權:使用信任的 WebView 主機應用程式套件名稱和 SHA256 簽署憑證,維護許可清單。詳情請參閱 Android 付款應用程式開發人員指南