Skip to content

JavaScript Bridge ​

Đọc chip CCCD từ một trang web chạy trong WebView của Android hoặc iOS. SDK native inject một object CESJsBridge vào trang; JavaScript của bạn gọi nó và lớp native thực hiện thao tác NFC. Phiên bản 1.0.8.

Cách hoạt động ​

Trang web không thể truy cập trực tiếp phần cứng NFC. Ứng dụng host nhúng CICReader native SDK, đăng ký một JavaScript interface trên WebView của nó, và trang gọi thông qua bridge đó.

text
Trang web  →  CESJsBridge  →  CICReader native SDK  →  Chip CCCD

CESJsBridge được inject khi trang tải lần đầu, nên hãy đợi callback báo trang đã tải xong trước khi gọi nó.

INFO

Bridge chỉ trả về dữ liệu chip thô — com, sod, dg1, dg2, dg13, dg14, dg15 và cloneStatus. Nó không trả về các trường thông tin công dân đã phân tích hay verificationKey. Gửi các data group đến Đọc NFC từ backend của bạn để lấy các thông tin đó.

Đọc chip ​

Dùng MRZ — số CCCD 9 chữ số, ngày sinh, ngày hết hạn ​

javascript
async function submitForm() {
  const idCard = document.getElementById("idcard").value;
  const dob = document.getElementById("dob").value;
  const exp = document.getElementById("exp").value;

  const result = await CESJsBridge.readNfc(idCard, dob, exp)
    .catch((reason) => { console.log("failed reason: ", reason); });
}
Tham sốKiểuBắt buộcMặc địnhMô tả
idCardstringCó—9 chữ số cuối của số CCCD.
dobstringCó—Ngày sinh, định dạng yyMMdd.
expstringCó—Ngày hết hạn của thẻ, định dạng yyMMdd.

Dùng CAN — số CCCD 12 chữ số ​

javascript
async function submitForm() {
  const idCard = document.getElementById("idcard").value;
  const result = await CESJsBridge.readNfc(idCard)
    .catch((reason) => { console.log("failed reason: ", reason); });
}
Tham sốKiểuBắt buộcMặc địnhMô tả
idCardstringCó—Số CCCD đầy đủ 12 chữ số.

Cùng một tên phương thức nhận một hoặc ba tham số — bridge chọn phương án dựa trên số lượng tham số truyền vào.

Kết quả ​

TrườngKiểuMô tả
comstringThông tin phiên bản Unicode và danh sách các data group hiện có. Base64.
sodstringDữ liệu SOD từ lần quét NFC. Base64.
dg1stringThông tin cơ bản của cá nhân — thông tin MRZ. Base64.
dg2stringẢnh khuôn mặt công dân đã mã hóa. Base64.
dg13stringThông tin liên quan đến công dân. Base64.
dg14stringDùng cho cơ chế truy cập EAC. Base64.
dg15stringPublic key, dùng cho Passive Authentication. Base64.
cloneStatusint0 chưa kiểm tra · 1 hợp lệ · 2 cảnh báo · 8 lỗi.

Lưu ý ở đây cloneStatus là một số nguyên, không phải enum như các SDK native trả về.

Lỗi ​

Các rejection mang theo { code, message }:

javascript
{ code: 600032, message: "NFC is not supported on this device" }
TrườngKiểuMô tả
NfcNotAvailable600103Thiết bị không hỗ trợ NFC.
NFCNotSupported600032NFC không được hỗ trợ trên thiết bị này.
SessionOnGoing600101Một phiên đọc khác đang diễn ra.
SystemResourceUnavailable600102Hệ thống NFC đang bận.
UserCancelled3Người dùng đã hủy.
Unspecified-1Lỗi không mong đợi.

Bảng đầy đủ nằm ở Mã lỗi.

Hàm dựng sẵn ​

javascript
async function checkNfcAvailability() {
  const result = await CESJsBridge.isNfcAvailable();
}

async function checkNfcEnable() {          // Chỉ Android
  const result = await CESJsBridge.isNfcEnable();
}

async function openNfcSetting() {          // Chỉ Android
  await CESJsBridge.openNfcSetting();
}

Thiết lập ứng dụng host ​

WARNING

Bridge trả dữ liệu chip thô cho bất kỳ trang nào đang được tải trong WebView. Chỉ tải các origin HTTPS của chính bạn, chặn điều hướng sang origin khác, và kiểm tra origin của trang trong native interface trước khi đọc chip.

Android ​

groovy
allprojects {
    repositories {
        maven { url "https://maven.google.com" }
        maven { url "https://jcenter.bintray.com" }
        maven { url "path/to/cic_reader" }
    }
}

dependencies {
    implementation("vn.cake:cic-reader:1.x.x")
}
kotlin
val jsInterface = CICJsInterface(activity, object : JavascriptEvaluator {
    override fun execute(jsFunc: String) {
        webView.evaluateJavascript(jsFunc) {}
    }
})
webView.addJavascriptInterface(jsInterface, CICJsInterface.JS_KEY)
webView.webViewClient = object : WebViewClient() {
    override fun onPageFinished(view: WebView?, url: String?) {
        super.onPageFinished(view, url)
        jsInterface.pageLoaded()   // gọi hàm này khi trang tải xong
    }
}

INFO

Artefact Android cho bridge là vn.cake:cic-reader, trong khi Android SDK độc lập dùng vn.cake.ekyc.sdk:eid. Hãy kiểm tra coordinate nào build của bạn đang cần.

iOS ​

swift
let jsInterface = CESNfcJsInterface()
wk.configuration.userContentController.addJavascriptInterface(jsInterface, forKey: CESNfcJsInterface.kJsKey)
jsInterface.delegate = self

// WKWebView — khi trang tải xong
func webView(_: WKWebView, didFinish _: WKNavigation!) {
    jsInterface.pageLoaded()
}

@objc func onJavascriptEvaluate(script: String) {
    webView.evaluateJavaScript(script)
}

iOS cũng cần capability NFC, key NFCReaderUsageDescription và ba ISO7816 identifier — xem Tích hợp iOS SDK.

Flutter ​

Dùng trực tiếp Flutter plugin thay vì bridge.

Bước tiếp theo ​

Developers