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

Rouslan Solomakhin
Rouslan Solomakhin
José Luis Zapata
José Luis Zapata

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