您可以使用 Payment Request API 从在 WebView 中运行的网站启动 Android 付款应用。此功能使用 Chrome 中已有的相同 JavaScript API 进行运作。
此功能从 WebView 136 版(通常随 Chrome 136 版一起提供)开始提供。
在 WebView 托管应用中设置付款请求
如需从 WebView 启动 Android 付款应用,Payment Request API 会使用 Android intent 查询系统。为了支持此功能,WebView 托管应用必须在其 AndroidManifest.xml
文件中声明这些 intent。
默认情况下,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 中开启付款请求功能,并确保网站可以使用 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 中添加 intent 过滤器
借助这些过滤条件,WebView 可以使用系统 intent 发现和调用 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
中使用以下 intent 来支持关键的 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)
后,JavaScript 中便会提供 window.PaymentRequest
接口。这可用于网页上的功能检测:
if (window.PaymentRequest) {
// Payment Request is available.
} else {
// Payment Request is not available.
}
window.PaymentRequest
可用时,网页可以继续发起付款交易。
将 Android 付款应用与 Payment Request 集成
如需支持付款请求,Android 付款应用必须响应特定系统 intent 并安全地处理付款数据。以下指南介绍了如何注册付款方式、实现付款服务以及保护应用:
- Android 付款应用开发者指南:构建和配置付款应用,包括如何处理 intent 和验证调用应用。
- 设置付款方式:注册您的付款方式并定义其功能。
保护您的应用免遭滥用
任何应用都可以调用 Android 付款 intent org.chromium.intent.action.PAY
、IS_READY_TO_PAY
和 UPDATE_PAYMENT_DETAILS
。WebView 托管应用还可以观察、发起和拦截付款请求调用。由于 WebView 在托管应用的进程中运行,因此无法限制使用这些 intent 的方式。恶意应用可能会利用此漏洞发起预言攻击。
在 Oracle 攻击中,付款应用无意中会泄露不应泄露的信息。例如,攻击者可能会使用 IS_READY_TO_PAY
来发现用户可用的付款方式。
您必须在付款应用中内置保护措施,以防范此类滥用行为。
请采用以下策略来减少滥用行为:
- 限制请求数量:限制应用响应
IS_READY_TO_PAY
的频率。例如,每 30 分钟只响应一次。 - 使用加密:对敏感响应进行加密,以便只有您信任的商家服务器可以对其进行解密。始终在服务器端执行加密和解密。
- 限制访问权限:使用受信任 WebView 托管应用的软件包名称和 SHA256 签名证书维护一个许可名单。如需了解详情,请参阅 Android 付款应用开发者指南。