您可以使用 Payment Request API 从 WebView 内运行的网站启动 Android 付款应用。此功能使用 Chrome 中已有的同一 JavaScript API。
此功能从 WebView 版本 136 开始提供,该版本通常随 Chrome 136 一起发布。
在 WebView 宿主应用中设置 Payment Request
如需从 WebView 启动 Android 付款应用,Payment Request API 会使用 Android intent 查询系统。为了支持此功能,WebView 宿主应用必须在其 AndroidManifest.xml 文件中声明这些 intent。
默认情况下,WebView 中的付款请求处于停用状态。
按照以下步骤操作,使用 Jetpack Webkit 版本 1.14.0 或更高版本中的 WebSettingsCompat 启用此功能:
第 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 中启用 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 中添加 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 来支持关键的付款请求功能:
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 付款应用必须响应特定的系统 intent 并安全地处理付款数据。以下指南介绍了如何注册支付方式、实现支付服务以及保护您的应用:
- Android 付款应用开发者指南:构建和配置付款应用,包括如何处理 intent 和验证调用应用。
- 设置支付方式: 注册支付方式并定义其功能。
保护您的应用免遭滥用
任何应用都可以调用 Android 付款 intent 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 分钟仅响应一次。 - 使用加密:加密敏感响应,以便只有您信任的商家服务器才能解密这些响应。始终在服务器端执行加密和解密操作。
- 限制访问权限:使用受信任的 WebView 主机应用的软件包名称和 SHA256 签名证书来维护许可名单。如需了解详情,请参阅 Android 付款应用开发者指南。