Payment Request API를 사용하여 WebView에서 Android 결제 앱 지원

Payment Request API를 사용하여 WebView 내에서 실행되는 웹사이트에서 Android 결제 앱을 실행할 수 있습니다. 이는 Chrome에서 이미 사용 가능한 동일한 JavaScript API를 사용하여 작동합니다.

이 기능은 일반적으로 Chrome 136과 함께 제공되는 WebView 버전 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)
  }
)

자바

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단계: 앱 다시 빌드 및 게시

이러한 변경사항을 적용한 후 앱을 다시 빌드하고 업데이트된 버전을 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 결제 앱을 결제 요청과 통합

결제 요청을 지원하려면 Android 결제 앱이 특정 시스템 인텐트에 응답하고 결제 데이터를 안전하게 처리해야 합니다. 다음 가이드에서는 결제 수단을 등록하고, 결제 서비스를 구현하고, 앱을 보호하는 방법을 설명합니다.

오용으로부터 앱 보호

모든 앱은 Android 결제 인텐트 org.chromium.intent.action.PAY, IS_READY_TO_PAY, UPDATE_PAYMENT_DETAILS를 호출할 수 있습니다. WebView 호스트 앱은 결제 요청 호출을 관찰, 시작, 가로챌 수도 있습니다. WebView는 호스트 앱의 프로세스 내에서 실행되므로 이러한 인텐트가 사용되는 방식을 제한할 수 없습니다. 악성 앱은 이를 악용하여 오라클 공격을 실행할 수 있습니다.

오라클 공격에서는 결제 앱이 의도치 않게 표시해서는 안 되는 정보를 표시합니다. 예를 들어 공격자는 IS_READY_TO_PAY를 사용하여 사용자가 사용할 수 있는 결제 수단을 파악할 수 있습니다.

이러한 악용을 방지하려면 결제 앱에 보호 기능을 빌드해야 합니다.

다음 전략을 사용하여 악용을 완화하세요.

  • 요청 제한: 앱이 IS_READY_TO_PAY에 응답하는 빈도를 제한합니다. 예를 들어 30분마다 한 번만 응답합니다.
  • 암호화 사용: 신뢰할 수 있는 판매자 서버만 복호화할 수 있도록 민감한 응답을 암호화합니다. 항상 서버 측에서 암호화 및 복호화를 실행합니다.
  • 액세스 제한: 패키지 이름과 SHA256 서명 인증서를 사용하여 신뢰할 수 있는 WebView 호스트 앱의 허용 목록을 유지합니다. Android 결제 앱 개발자 가이드에서 자세히 알아보세요.