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

您可以使用 Payment Request APIWebView 内运行的网站启动 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 来支持关键的付款请求功能:

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

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

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

使用以下策略来缓解滥用问题:

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