Payment Request API を使用すると、WebView 内で実行されているウェブサイトから Android 決済アプリを起動できます。この機能は、Chrome で利用可能な同じ JavaScript API を使用して動作します。
この機能は WebView バージョン 136 以降で利用できます。通常、WebView バージョン 136 は Chrome 136 とともにリリースされます。
WebView ホストアプリで Payment Request を設定する
WebView から Android 決済アプリを起動するために、Payment Request API は Android インテントを使用してシステムにクエリを実行します。これをサポートするには、WebView ホストアプリが AndroidManifest.xml ファイルでこれらのインテントを宣言する必要があります。
デフォルトでは、WebView で Payment Request は無効になっています。
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 コードで Payment Request を有効にする
この手順では、WebView で Payment Request 機能が有効になり、サイトが JavaScript を使用してこの機能をトリガーできるようになります。
この手順では、WebView で Payment Request 機能が有効になり、サイトが 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 の主な機能をサポートします。
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: アプリを再構築して公開する
これらの変更を行った後、アプリを再ビルドして、更新されたバージョンを Google Play ストアにリリースします。
省略可: 準備状況チェックをカスタマイズする
Payment Request API を使用すると、Android 決済アプリを起動できるだけでなく、ウェブサイトでユーザーが支払いの準備ができているかどうかを確認することもできます。たとえば、ウェブサイトは、ユーザーがサポートされているお支払い方法を設定しているかどうかを検出できます。
Chrome には、ユーザーがこのチェックを有効または無効にできる設定があります。WebView ホストアプリでは、次を使用して同様の切り替えを提供できます。
WebSettingsCompat.setHasEnrolledInstrumentEnabled(WebSettings, boolean)
この設定はデフォルトで有効(true)になっています。有効にすると、WebView で実行されているウェブサイトは、ユーザーが登録済みのお支払い方法を持っているかどうかを検出できます。
JavaScript で Payment Request のサポートを確認する
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 決済アプリ デベロッパー ガイド: インテントの処理方法や呼び出し元アプリの確認方法など、決済アプリのビルドと構成について説明します。
- お支払い方法を設定する: お支払い方法を登録し、その機能を定義します。
不正使用からアプリを保護する
どのアプリでも Android の支払いインテント org.chromium.intent.action.PAY、IS_READY_TO_PAY、UPDATE_PAYMENT_DETAILS を呼び出すことができます。WebView ホストアプリは、Payment Request 呼び出しをモニタリング、開始、インターセプトすることもできます。WebView はホストアプリのプロセス内で実行されるため、これらのインテントの使用方法を制限できません。悪意のあるアプリは、この脆弱性を悪用してオラクル攻撃を仕掛ける可能性があります。
オラクル攻撃では、支払いアプリが意図せず、公開すべきでない情報を公開します。たとえば、攻撃者は IS_READY_TO_PAY を使用して、ユーザーが利用できる支払い方法を特定する可能性があります。
このような不正使用を防ぐため、お支払いアプリに保護機能を組み込む必要があります。
不正使用を軽減するには、次の戦略を使用します。
- リクエストをスロットリングする: アプリが
IS_READY_TO_PAYに応答する頻度を制限します。たとえば、30 分に 1 回だけ応答します。 - 暗号化を使用する: 信頼できる販売者サーバーのみが復号できるように、機密性の高いレスポンスを暗号化します。暗号化と復号は常にサーバーサイドで行います。
- アクセスを制限: パッケージ名と SHA256 署名証明書を使用して、信頼できる WebView ホストアプリの許可リストを維持します。詳しくは、Android 決済アプリのデベロッパー ガイドをご覧ください。