Môi trường
SDK kết nối đến các domain API và iframe khác nhau tùy theo tùy chọn environment.
Cấu hình
const bahn = new Bahn({
pk: "pk_test_...",
environment: "sandbox", // hoặc "production"
});| Môi trường | Trường hợp sử dụng |
|---|---|
"sandbox" | Kiểm thử và phát triển. Sử dụng các domain .tech. |
"production" | Thanh toán thật. Sử dụng các domain .vn. |
Ánh xạ domain
SDK phân giải môi trường thành các domain cụ thể tại thời điểm khởi tạo. Các domain này được hardcode — bạn không thể ghi đè chúng:
| Thành phần | Sandbox | Production |
|---|---|---|
| Domain iframe | https://bn.cakedigibank.tech/bn-sdk/v2/components | https://bn.cake.vn/bn-sdk/v2/components |
| Domain API | https://bn.cakedigibank.tech | https://bn.cake.vn |
Script bundle (CDN): https://bn.cake.vn/bn-sdk/v<version>/index.js — chỉ có một host script duy nhất, được dùng cho cả hai môi trường. Tùy chọn environment bạn truyền vào new Bahn() mới là thứ kiểm soát domain iframe/API nào được sử dụng tại runtime, không phải URL script bạn tải.
Phiên bản & tính toàn vẹn của script bundle
Mỗi bản phát hành của Bahn Web SDK được publish tại đường dẫn riêng, gắn theo phiên bản SDK — ví dụ v2.4.0:
https://bn.cake.vn/bn-sdk/v2.4.0/index.jsMột file sẽ không bao giờ thay đổi sau khi đã được publish dưới một phiên bản nhất định, vì vậy hãy pin đúng phiên bản bạn đã kiểm thử thay vì dùng một alias có thể thay đổi. Mỗi bundle đều đi kèm một hash Subresource Integrity tại index.js.sha384:
https://bn.cake.vn/bn-sdk/v2.4.0/index.js.sha384Sử dụng nó cùng với các thuộc tính integrity + crossorigin để trình duyệt xác minh file không bị thay đổi trong quá trình truyền tải:
<script
src="https://bn.cake.vn/bn-sdk/v2.4.0/index.js"
integrity="sha384-jBbonUZLgKU82F+X/ITqcmeInXYYwZYdmCDoPFX8wkWL9dCkeUHyi0Fs1EUnkeDS"
crossorigin="anonymous"
></script>Lưu ý:
crossorigin="anonymous"khiến đây trở thành một request CORS — response phải bao gồm headerAccess-Control-Allow-Originđể trình duyệt cho phép script chạy. Hãy xác nhận điều này đã được bật trên domain lưu trữ trước khi phụ thuộc vàointegritytrong môi trường production.
Cùng một domain iframe phục vụ:
- Iframe nhập thẻ (
card-number-iframe.html,expiry-iframe.html,cvc-iframe.html) - Iframe QR (
qr-iframe.html) - Iframe 3DS (
3ds.html)
Domain API phục vụ:
POST /bn/sdk/payment_intents/confirmPOST /bn/sdk/confirmation_token- Truy vấn và polling payment intent
Kiểu SDKEnvironment
type SDKEnvironment = "sandbox" | "production";Sandbox vs Production
Sandbox
Sử dụng "sandbox" để phát triển và kiểm thử:
- Tất cả lệnh gọi API đi đến môi trường sandbox
- Không có thanh toán thật nào được xử lý
- Dùng các thẻ test sandbox bên dưới
- Các thử thách 3DS sử dụng ACS sandbox
const bahn = new Bahn({
pk: "pk_test_abc123",
environment: "sandbox",
});Production
Sử dụng "production" cho thanh toán thật:
- Tất cả lệnh gọi API đi đến môi trường production
- Các thanh toán thật được xử lý
- Các thử thách 3DS sử dụng ACS production
const bahn = new Bahn({
pk: "pk_live_xyz789",
environment: "production",
});Thẻ test sandbox
Dùng các thẻ này với environment: "sandbox" và publishable key sandbox. Chúng bị từ chối ở production.
| Thương hiệu | Số thẻ | Ngày hết hạn | CVC |
|---|---|---|---|
| Visa | 4229 9899 9900 0012 | 12/31 | 871 |
| Mastercard | 5204 5001 3000 0005 | 12/35 | 112 |
Việc một thanh toán sandbox qua 3DS không cần thử thách (frictionless), có thử thách (challenge) hay bị từ chối phụ thuộc vào số tiền, không phụ thuộc vào thẻ. Xem ngưỡng 3DS sandbox ở trang 3DS để kiểm thử cả ba kết quả.
Content Security Policy
Nếu trang checkout của bạn gửi header Content-Security-Policy, hãy cho phép các host Bahn của môi trường bạn dùng. Script SDK luôn được tải từ https://bn.cake.vn. Các iframe và API chạy trên host riêng của từng môi trường.
| Directive | Sandbox | Production | Lý do |
|---|---|---|---|
script-src | https://bn.cake.vn | https://bn.cake.vn | Bundle SDK |
frame-src | https://bn.cakedigibank.tech | https://bn.cake.vn | Các iframe thẻ, QR, Apple Pay, Google Pay và 3DS |
connect-src | https://bn.cakedigibank.tech | https://bn.cake.vn | getConfig(), bahn.applePay.* và lệnh cập nhật kết quả 3DS, do SDK gửi trực tiếp từ trang của bạn |
Một policy production ví dụ:
Content-Security-Policy:
script-src 'self' https://bn.cake.vn;
frame-src https://bn.cake.vn;
connect-src 'self' https://bn.cake.vnNếu bạn gọi bahn.isGooglePayAvailable(), SDK sẽ tải thêm https://pay.google.com/gp/p/js/pay.js của Google vào trang của bạn. Hãy thêm https://pay.google.com vào script-src, và làm theo hướng dẫn CSP của Google cho những gì pay.js cần thêm.
Dữ liệu thẻ không bao giờ đi qua trang của bạn, nên bạn không cần cho phép thêm origin nào khác của Bahn. Mọi thứ còn lại, như script Apple Pay, reCAPTCHA và trang thử thách 3DS, đều chạy bên trong các iframe của Bahn.
Trình duyệt được hỗ trợ
Các iframe thẻ, QR và 3DS được build cho các trình duyệt sau trở lên:
| Trình duyệt | Phiên bản tối thiểu |
|---|---|
| Chrome / Edge | 111 |
| Firefox | 111 |
| Safari (macOS) | 13 |
| Safari (iOS / iPadOS) | 13 |
- Bundle SDK nhắm tới ES2020.
- Trên Safari cũ hơn 15.4 (không có
BroadcastChannel), các ô nhập thẻ tự chuyển sang gửi message trực tiếp cho nhau. Bạn không cần làm gì thêm. - Các ví điện tử có yêu cầu khắt khe hơn. Xem Apple Pay → Hỗ trợ trình duyệt và Google Pay → Hỗ trợ trình duyệt.