Skip to content

Tích hợp Web SDK ​

Thiết lập và scan khuôn mặt cho FaceAuthen bằng CAKE eKYC Web SDK. Thực thi bundle.js sẽ tạo object toàn cục window.ekyc.

Điều kiện tiên quyết ​

Thông tinMô tả
Thư mục assetsMột nơi để serve thư mục assets /ekyc.
HTTPSBắt buộc để truy cập camera.
Quyền WebViewTrên WebView của iOS, bật allowsInlineMediaPlayback.

Thiết lập HTML ​

Phần tử container với id cake-ekyc-sdk-container là bắt buộc và phải tồn tại trước khi khởi tạo.

html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>FaceAuth Integration</title>
    <style>
      #cake-ekyc-sdk-container {
        width: 100%;
        height: 100vh;
        position: relative;
      }
    </style>
  </head>
  <body>
    <div class="overlay" id="cake-ekyc-sdk-container"></div>

    <script src="/ekyc/bundle.js"></script>

    <script>
      // Code khởi tạo SDK đặt tại đây
    </script>
  </body>
</html>

Khởi tạo ​

typescript
type SDKConfigParams = {
  resourcePath?: string
  baseUrl: string
  token: string
  headers?: Record<string, string>
}
javascript
const sdk = await window.ekyc.initialize('cake-ekyc-sdk-container', {
  baseUrl: '<BASE_URL>',
  token: '<ACCESS_TOKEN>',
  resourcePath: '/ekyc/resources',
  headers: {
    'X-Client-Version': '1.0.0',
    'X-Platform': 'web'
  }
})
javascript
async function initializeSDK() {
  try {
    const container = document.getElementById('cake-ekyc-sdk-container');
    if (!container) {
      throw new Error('SDK container element not found');
    }

    if (!window.ekyc) {
      throw new Error('eKYC SDK not loaded. Ensure bundle.js is included.');
    }

    return await window.ekyc.initialize('cake-ekyc-sdk-container', {
      baseUrl: '<BASE_URL>',
      token: await fetch('/your-backend/ekyc-token').then((r) => r.text()), // lấy lúc chạy, không đóng gói vào bundle
      resourcePath: '/ekyc/resources'
    });
  } catch (error) {
    console.error('SDK initialization failed:', error);
    throw error;
  }
}

Scan một khuôn mặt ​

javascript
// Khách hàng New-to-Bank — đăng ký lần đầu
const enrolResult = await window.ekyc.scanStart(['face'], {
  isNTB: true,
  faceauthClientId: 'user_00000001',
  faceauthRefId: 'ref_00000001'
})

// Khách hàng quay lại — xác thực
const authResult = await window.ekyc.scanStart(['face'], {
  isNTB: false,
  faceauthClientId: 'user_00000001',
  faceauthRefId: 'ref_00000001'
})

Tham số:

Tham sốKiểuBắt buộcMặc địnhMô tả
typesstring[]Có—Truyền ['face'] cho một luồng FaceAuthen.
opts.isNTBbooleanKhông—true cho lần đăng ký đầu tiên, false để xác thực một hồ sơ đã có.
opts.faceauthClientIdstringKhông—Client ID cho xác thực khuôn mặt.
opts.faceauthRefIdstringKhông—Reference ID cho xác thực khuôn mặt.
opts.timeoutDurationnumberKhông—Timeout tính bằng mili-giây.

Response ​

typescript
interface FaceScanResult {
  faces: FaceData[];
  sanityResult: SanityResult[];
  livenessResult: LivenessResult;
}
TrườngKiểuMô tả
facesFaceData[]Các khuôn mặt đã chụp, mỗi khuôn mặt có image và gesture (left, right, portrait).
sanityResultSanityResult[]Kết luận sanity của ảnh chân dung và điểm số cho từng ảnh.
livenessResultLivenessResultis_live, score, kết quả theo từng ảnh và main_image_id.

Mỗi faces[].image mang theo id, label, bitmap và response của lần tải lên. Lấy các giá trị id và truyền chúng vào mảng faces cho Đăng ký khuôn mặt hoặc Xác minh Face Authen.

Chuyển đổi bitmap ​

bitmap là một object ImageData đi kèm hai hàm hỗ trợ:

javascript
const blob   = await bitmap.toBlob('image/jpeg')
const base64 = bitmap.toBase64('image/jpeg')

Trạng thái scan ​

javascript
const status = window.ekyc.getScanStatus()
console.log('Face scan completed:', status.faceCompleted)
TrườngKiểuMô tả
faceCompletedbooleanScan khuôn mặt đã hoàn tất hay chưa.
faceDataanyKết quả scan khuôn mặt, được điền sau khi scan.
timestampstringTimestamp tùy chọn.

Các trường front, back và qrcode cũng tồn tại trên cùng object này nhưng luôn là false trong một luồng FaceAuthen.

Lời gọi xác thực khuôn mặt ​

API dựa trên class expose trực tiếp bước xác minh, thay vì đi qua scanStart.

typescript
const authResponse = await ekycSDK.verifyFaceAuthentication(authParams);

verifyFaces(faceImages, isFaceAuth) nhận một cờ isFaceAuth chuyển đổi giữa một kiểm tra liveness thuần túy và một xác thực FaceAuthen.

WARNING

Không coi kết quả từ trình duyệt là quyết định cuối cùng. Nó chạy trên một thiết bị bạn không kiểm soát được. Hãy redeem authentication_key từ Xác minh Face Authen trên backend của bạn, sau đó đóng giao dịch bằng Xác minh khóa xác thực giao dịch.

Terminate ​

javascript
await ekyc.terminateScanner();

Giải phóng camera và dọn dẹp. Gọi hàm này khi luồng kết thúc.

INFO

Phương thức này có thể được expose là terminate hoặc terminateScanner tùy bundle — hãy kiểm tra bundle của bạn expose tên nào.

Xử lý lỗi ​

javascript
try {
  const result = await window.ekyc.scanStart(['face'], { isNTB: false })
  // Gửi kết quả về backend của bạn; không ghi log — nó chứa dữ liệu sinh trắc học.
} catch (error) {
  console.error('Scan failed:', error.message)
}

Response scan giữ nguyên cấu trúc khi thất bại và đặt chi tiết trong mảng error, cùng một sdkError tùy chọn mang theo kết luận riêng của SDK. Xem Tổng quan Web SDK § Mã lỗi của SDK.

Các vấn đề thường gặp ​

Thông tinMô tả
SDK không tải đượcKiểm tra đường dẫn script và đảm bảo nó tải trước khi sử dụng.
Truy cập cameraĐảm bảo dùng HTTPS và quyền camera đã được cấp.
Không tìm thấy containerXác nhận phần tử container tồn tại trong DOM.
Vấn đề mạngKiểm tra kết nối internet và các endpoint API.
typescript
if (typeof window.ekyc === 'undefined') {
    console.error('eKYC SDK not loaded');
}

navigator.mediaDevices.getUserMedia({ video: true })
    .then(stream => {
        stream.getTracks().forEach(track => track.stop());
    })
    .catch(error => {
        console.error('Camera access denied:', error);
    });

Bước tiếp theo ​

Developers