Payment Request API を使用して WebView で Android 支払いアプリをサポートする

Rouslan Solomakhin
Rouslan Solomakhin
Dominik Mengelt
Dominik Mengelt
José Luis Zapata
José Luis Zapata

Payment Request API を使用すると、WebView 内で実行されているウェブサイトから Android 支払いアプリを起動できます。これは、Chrome ですでに利用可能な同じ JavaScript API を使用して機能します。

この機能は WebView バージョン 136 以降で利用できます。通常、WebView バージョン 136 は Chrome 136 とともに提供されます。

WebView ホストアプリで支払いリクエストを設定する

WebView から Android 決済アプリを起動するために、Payment Request API は Android インテントを使用してシステムにクエリを実行します。これをサポートするには、WebView ホストアプリが AndroidManifest.xml ファイルでこれらのインテントを宣言する必要があります。

デフォルトでは、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 にインテント フィルタを追加する

これらのフィルタにより、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 で次のインテントを使用して、Payment Request の主要な機能をサポートします。

ステップ 5: アプリを再ビルドして公開する

これらの変更を加えた後、アプリを再ビルドして、更新されたバージョンを Google Play ストアにリリースします。

省略可: 準備状況チェックをカスタマイズする

Payment Request API を使用すると、Android 支払いアプリを起動するだけでなく、ユーザーが支払いの準備ができているかどうかをウェブサイトで確認できます。たとえば、ウェブサイトは、ユーザーがサポートされているお支払い方法を設定したかどうかを検出できます。

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 の支払いアプリが特定のシステム インテントに応答し、支払いデータを安全に処理する必要があります。以下のガイドでは、お支払い方法を登録する方法、お支払いサービスを実装する方法、アプリを保護する方法について説明します。

不正使用からアプリを保護する

どのアプリでも、Android の支払いインテント org.chromium.intent.action.PAYIS_READY_TO_PAYUPDATE_PAYMENT_DETAILS を呼び出すことができます。WebView ホストアプリは、Payment Request 呼び出しを監視、開始、インターセプトすることもできます。WebView はホストアプリのプロセス内で実行されるため、これらのインテントの使用方法を制限することはできません。悪意のあるアプリはこれを悪用してオラクル攻撃を仕掛ける可能性があります。

オーラクル攻撃では、支払いアプリが意図せず、公開すべきでない情報を開示します。たとえば、攻撃者は IS_READY_TO_PAY を使用して、ユーザーが利用できる支払い方法を見つける可能性があります。

このような不正使用を防ぐには、お支払いアプリに保護機能を組み込む必要があります。

不正行為を軽減するには、次の戦略を使用します。

  • リクエストのスロットリング: アプリが IS_READY_TO_PAY に応答する頻度を制限します。たとえば、30 分ごとに 1 回だけ返信します。
  • 暗号化を使用する: 機密性の高いレスポンスを暗号化して、信頼できる販売者サーバーのみが復号できるようにします。暗号化と復号は常にサーバー側で行う。
  • アクセスを制限する: パッケージ名と SHA256 署名証明書を使用して、信頼できる WebView ホストアプリの許可リストを維持します。詳しくは、Android 決済アプリのデベロッパー ガイドをご覧ください。