您可以使用 Payment Request API,從 WebView 內執行的網站啟動 Android 付款應用程式。這項功能使用 Chrome 中已提供的相同 JavaScript API。
這項功能從 WebView 136 版開始提供,通常會隨附於 Chrome 136 版。
在 WebView 主機應用程式中設定付款要求
如要從 WebView 啟動 Android 付款應用程式,Payment Request API 會使用 Android intent 查詢系統。如要支援這項功能,WebView 主機應用程式必須在 AndroidManifest.xml 檔案中宣告這些意圖。
根據預設,WebView 會停用付款要求。
如要使用 Jetpack Webkit WebSettingsCompat 以上版本啟用這項功能,請按照下列步驟操作:1.14.0
步驟 1:新增 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'
}
版本目錄
[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 中的付款要求功能,並確保網站可以使用 JavaScript 觸發這項功能。
這個步驟會在 WebView 中開啟 Payment Request 功能,並確保網站可以使用 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 功能:
org.chromium.intent.action.PAY:允許 WebView 叫用 Android 付款應用程式,並接收付款回應。詳情請參閱 Android 付款應用程式開發人員指南。org.chromium.intent.action.IS_READY_TO_PAY:允許網站檢查使用者是否已設定支援的付款方式。詳情請參閱 Android 付款應用程式開發人員指南org.chromium.intent.action.UPDATE_PAYMENT_DETAILS:支援動態更新,例如使用者在付款應用程式中變更運送地址或選項時。詳情請參閱「從 Android 付款應用程式提供運送和聯絡資訊」。
步驟 5:重新建構並發布應用程式
完成這些變更後,請重建應用程式,並將更新版本發布至 Play 商店。
選用:自訂準備檢查
除了啟動 Android 付款應用程式外,Payment Request API 也可讓網站檢查使用者是否已準備好付款。舉例來說,網站可以偵測使用者是否已設定支援的付款方式。
Chrome 內建設定,可讓使用者啟用或停用這項檢查。 WebView 主機應用程式可以使用下列項目提供類似的切換鈕:
WebSettingsCompat.setHasEnrolledInstrumentEnabled(WebSettings, boolean)
這項設定預設為啟用 (true)。啟用後,WebView 中執行的網站就能偵測使用者是否已註冊付款工具。
在 JavaScript 中檢查是否支援付款要求
在 Java 或 Kotlin 中呼叫 WebSettingsCompat.setPaymentRequestEnabled(webSettings, true) 後,window.PaymentRequest 介面就會在 JavaScript 中提供。這項功能可用於偵測網頁上的特徵:
if (window.PaymentRequest) {
// Payment Request is available.
} else {
// Payment Request is not available.
}
如果 window.PaymentRequest 可用,網頁可以繼續啟動付款交易。
將 Android 付款應用程式與 Payment Request 整合
如要支援付款要求,Android 付款應用程式必須回應特定系統意圖,並安全地處理付款資料。這些指南說明如何註冊付款方式、導入付款服務,以及保護應用程式:
- Android 付款應用程式開發人員指南: 建構及設定付款應用程式,包括如何處理意圖及驗證呼叫應用程式。
- 設定付款方式: 註冊付款方式並定義其功能。
防止應用程式遭到濫用
任何應用程式都可以呼叫 Android 付款意圖 org.chromium.intent.action.PAY、IS_READY_TO_PAY 和 UPDATE_PAYMENT_DETAILS。WebView 主機應用程式也可以觀察、啟動及攔截付款要求呼叫。由於 WebView 是在主機應用程式的程序中執行,因此無法限制這些 Intent 的使用方式。惡意應用程式可能會利用這點發動 Oracle 攻擊。
在 Oracle 攻擊中,付款應用程式會無意間揭露不應揭露的資訊。舉例來說,攻擊者可能會使用 IS_READY_TO_PAY 找出使用者可用的付款方式。
您必須在付款應用程式中建構防護機制,防範這類濫用行為。
請使用下列策略減少濫用行為:
- 節流要求:限制應用程式回應
IS_READY_TO_PAY的頻率。例如每 30 分鐘回覆一次。 - 使用加密:加密敏感回應,確保只有受信任的商家伺服器可以解密。一律在伺服器端執行加密和解密作業。
- 限制存取權:使用套件名稱和 SHA256 簽署憑證,維護受信任的 WebView 主機應用程式許可清單。詳情請參閱 Android 付款應用程式開發人員指南。