使用 Payment Request API 在 WebView 中支持 Android 付款应用

您可以使用 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 功能:

第 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 org.chromium.intent.action.PAYIS_READY_TO_PAYUPDATE_PAYMENT_DETAILS。WebView 托管应用还可以观察、发起和拦截付款请求调用。由于 WebView 在托管应用的进程中运行,因此无法限制使用这些 intent 的方式。恶意应用可能会利用此漏洞发起预言攻击

在 Oracle 攻击中,付款应用无意中会泄露不应泄露的信息。例如,攻击者可能会使用 IS_READY_TO_PAY 来发现用户可用的付款方式。

您必须在付款应用中内置保护措施,以防范此类滥用行为。

请采用以下策略来减少滥用行为:

  • 限制请求数量:限制应用响应 IS_READY_TO_PAY 的频率。例如,每 30 分钟只响应一次。
  • 使用加密:对敏感响应进行加密,以便只有您信任的商家服务器可以对其进行解密。始终在服务器端执行加密和解密。
  • 限制访问权限:使用受信任 WebView 托管应用的软件包名称和 SHA256 签名证书维护一个许可名单。如需了解详情,请参阅 Android 付款应用开发者指南