Bạn có thể sử dụng API yêu cầu thanh toán để chạy các ứng dụng thanh toán Android từ các trang web chạy bên trong WebView. Tính năng này hoạt động bằng cách sử dụng cùng một API JavaScript có sẵn trong Chrome.
Tính năng này bắt đầu có trong WebView phiên bản 136, thường đi kèm với Chrome 136.
Thiết lập Yêu cầu thanh toán trong các ứng dụng lưu trữ WebView
Để chạy ứng dụng thanh toán Android từ WebView, API Yêu cầu thanh toán sẽ truy vấn hệ thống bằng cách sử dụng ý định Android.
Để hỗ trợ việc này, ứng dụng lưu trữ WebView phải khai báo các ý định đó trong tệp AndroidManifest.xml
.
Theo mặc định, Yêu cầu thanh toán bị tắt trong WebView.
Hãy làm theo các bước sau để bật tính năng này bằng WebSettingsCompat
từ AndroidX WebKit phiên bản 1.14.0
trở lên:
Bước 1: Thêm phần phụ thuộc 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'
}
Danh mục phiên bản
[versions]
webkit = "1.14.0"
[libraries]
androidx-ktx = { group = "androidx.webkit", name = "webkit", version.ref = "webkit" }
Bước 2: Nhập các lớp bắt buộc
Các lớp này cho phép bạn truy cập và định cấu hình chế độ cài đặt WebView, đồng thời kiểm tra tính năng hỗ trợ trong thời gian chạy.
import android.webkit.WebSettings;
import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;
Bước 3: Bật Yêu cầu thanh toán trong mã WebView
Bước này sẽ bật tính năng Yêu cầu thanh toán trong WebView và đảm bảo trang web có thể kích hoạt tính năng này bằng JavaScript.
Bước này sẽ bật tính năng Yêu cầu thanh toán trong WebView và đảm bảo trang web có thể kích hoạt tính năng này bằng 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);
}
Bước 4: Thêm bộ lọc ý định trong AndroidManifest.xml
Các bộ lọc này cho phép WebView khám phá và gọi các ứng dụng thanh toán Android bằng ý định của hệ thống:
<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>
Sử dụng các ý định sau trong AndroidManifest.xml
để hỗ trợ các tính năng chính của Yêu cầu thanh toán:
org.chromium.intent.action.PAY
: Cho phép WebView gọi các ứng dụng thanh toán Android và nhận phản hồi thanh toán. Tìm hiểu thêm trong hướng dẫn dành cho nhà phát triển ứng dụng thanh toán trên Android.org.chromium.intent.action.IS_READY_TO_PAY
: Cho phép các trang web kiểm tra xem người dùng đã thiết lập phương thức thanh toán được hỗ trợ hay chưa. Tìm hiểu thêm trong hướng dẫn dành cho nhà phát triển ứng dụng thanh toán trên Androidorg.chromium.intent.action.UPDATE_PAYMENT_DETAILS
: Hỗ trợ cập nhật động, chẳng hạn như khi người dùng thay đổi địa chỉ giao hàng hoặc phương thức giao hàng trong ứng dụng thanh toán. Tìm hiểu thêm trong phần Cung cấp thông tin vận chuyển và thông tin liên hệ từ ứng dụng thanh toán Android.
Bước 5: Tạo lại và phát hành ứng dụng
Sau khi thực hiện những thay đổi này, hãy tạo lại ứng dụng và phát hành phiên bản cập nhật lên Cửa hàng Play.
Không bắt buộc: Tuỳ chỉnh quy trình kiểm tra trạng thái sẵn sàng
Ngoài việc chạy các ứng dụng thanh toán Android, API Yêu cầu thanh toán cho phép các trang web kiểm tra xem người dùng đã sẵn sàng thanh toán hay chưa. Ví dụ: các trang web có thể phát hiện xem người dùng có thiết lập phương thức thanh toán được hỗ trợ hay không.
Chrome có một chế độ cài đặt cho phép người dùng bật hoặc tắt tính năng kiểm tra này. Các ứng dụng lưu trữ WebView có thể cung cấp một nút bật/tắt tương tự bằng cách sử dụng:
WebSettingsCompat.setHasEnrolledInstrumentEnabled(WebSettings, boolean)
Chế độ cài đặt này được bật theo mặc định (true
). Khi đang hoạt động, chế độ này cho phép các trang web chạy trong WebView phát hiện xem người dùng có phương thức thanh toán đã đăng ký hay không.
Kiểm tra xem có hỗ trợ Yêu cầu thanh toán trong JavaScript hay không
Sau khi WebSettingsCompat.setPaymentRequestEnabled(webSettings, true)
được gọi trong Java hoặc Kotlin, giao diện window.PaymentRequest
sẽ có sẵn trong JavaScript. Bạn có thể sử dụng thuộc tính này để phát hiện tính năng trên trang web:
if (window.PaymentRequest) {
// Payment Request is available.
} else {
// Payment Request is not available.
}
Khi có window.PaymentRequest
, trang web có thể tiếp tục bắt đầu một giao dịch thanh toán.
Tích hợp ứng dụng thanh toán Android với Yêu cầu thanh toán
Để hỗ trợ Yêu cầu thanh toán, ứng dụng thanh toán Android phải phản hồi các ý định cụ thể của hệ thống và xử lý dữ liệu thanh toán một cách an toàn. Các hướng dẫn này giải thích cách đăng ký phương thức thanh toán, triển khai dịch vụ thanh toán và bảo vệ ứng dụng:
- Hướng dẫn dành cho nhà phát triển ứng dụng thanh toán Android: Tạo và định cấu hình ứng dụng thanh toán, bao gồm cả cách xử lý ý định và xác minh ứng dụng gọi.
- Thiết lập phương thức thanh toán: Đăng ký phương thức thanh toán và xác định các chức năng của phương thức đó.
Bảo vệ ứng dụng của bạn khỏi hành vi sử dụng sai mục đích
Mọi ứng dụng đều có thể gọi ý định thanh toán trên Android org.chromium.intent.action.PAY
, IS_READY_TO_PAY
và UPDATE_PAYMENT_DETAILS
. Các ứng dụng lưu trữ WebView cũng có thể quan sát, bắt đầu và chặn các lệnh gọi Yêu cầu thanh toán. Vì WebView chạy bên trong quy trình của ứng dụng lưu trữ, nên WebView không thể hạn chế cách sử dụng các ý định này.
Các ứng dụng độc hại có thể khai thác điều này để thực hiện các cuộc tấn công oracle.
Trong một cuộc tấn công oracle, ứng dụng thanh toán vô tình tiết lộ thông tin mà ứng dụng không nên tiết lộ. Ví dụ: kẻ tấn công có thể sử dụng IS_READY_TO_PAY
để khám phá những phương thức thanh toán mà người dùng có.
Bạn phải xây dựng các biện pháp bảo vệ vào ứng dụng thanh toán của mình để chống lại loại hành vi sử dụng sai trái này.
Hãy sử dụng các chiến lược sau để giảm thiểu hành vi sai trái:
- Yêu cầu điều tiết: Giới hạn tần suất ứng dụng phản hồi
IS_READY_TO_PAY
. Ví dụ: chỉ trả lời một lần mỗi 30 phút. - Sử dụng phương thức mã hoá: Mã hoá các phản hồi nhạy cảm để chỉ các máy chủ người bán đáng tin cậy của bạn mới có thể giải mã các phản hồi đó. Luôn thực hiện việc mã hoá và giải mã ở phía máy chủ.
- Hạn chế quyền truy cập: Duy trì danh sách cho phép các ứng dụng lưu trữ WebView đáng tin cậy bằng cách sử dụng tên gói và chứng chỉ ký SHA256 của các ứng dụng đó. Tìm hiểu thêm trong hướng dẫn dành cho nhà phát triển ứng dụng thanh toán trên Android.