使用 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 付款應用程式開發人員指南