Nhảy tới nội dung

Android

Yêu cầu
  • Yêu cầu Android >= 6.0 (API level 23).

Bước 1: Tải SDK và cấu hình Project

Lưu ý

Ứng dụng viết bằng Flutter hoặc tích hợp Flutter module không copy thư mục repo

  • Thêm thông tin cấu hình vào file settings.gradle như dưới:
pluginManagement {  
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}

// Bỏ qua nếu ứng dụng viết bằng Flutter hoặc tích hợp Flutter module
String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"

dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
jcenter()
maven { url "https://jitpack.io" }

// Bỏ qua nếu ứng dụng viết bằng Flutter hoặc tích hợp Flutter module
maven {
//Đường dẫn thư mục chứa **repo** ở bước 1
url 'app/libs/repo'
}
// Bỏ qua nếu ứng dụng viết bằng Flutter hoặc tích hợp Flutter module
maven {
url "$storageUrl/download.flutter.io"
}

}
}
  • Thêm các thông tin cấu hình vào app/build.gradle
//...
aaptOptions {
noCompress "tflite"
noCompress "lite"
noCompress "bic"
}

dependencies {
//...
// Bỏ qua nếu ứng dụng viết bằng Flutter hoặc tích hợp Flutter module
implementation 'com.vnpt.smartca.module.vnpt_smartca_module:flutter_release:1.0'

// Đường dẫn tới các file aar
implementation files("libs/sdk_vnpt_smartca_library-release.aar")
implementation files("libs/ekyc_sdk-release-v3.6.6.aar")
implementation files("libs/scanqr_ic_sdk-release-v1.0.6.aar")

// AndroidX core dependencies
implementation "androidx.core:core-ktx:1.12.0"
implementation "androidx.annotation:annotation:1.7.0"

implementation "androidx.multidex:multidex:2.0.1"
implementation "androidx.appcompat:appcompat:1.6.1"
implementation "com.google.android.material:material:1.11.0"
implementation "androidx.constraintlayout:constraintlayout:2.1.4"
implementation "com.squareup.okhttp3:okhttp:4.12.0"
implementation "com.squareup.okhttp3:logging-interceptor:4.12.0"
implementation "com.google.code.gson:gson:2.10.1"
implementation "com.google.android.play:app-update-ktx:2.1.0"
implementation "me.dm7.barcodescanner:zxing:1.9.8" {
exclude group: "com.android.support"
}
implementation "androidx.core:core:1.12.0"
implementation "org.bouncycastle:bcpkix-jdk15on:1.70"
implementation "com.airbnb.android:lottie:6.3.0"
}

//..
  • Thêm FlutterActivity trong file AndroidManifest.xml như sau:
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
//......
<application
//......
<activity android:name="io.flutter.embedding.android.FlutterFragmentActivity"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
android:exported="true"/>

</application>
  • Bổ sung thuộc tính dưới đây vào file gradle.properties
    android.enableJetifier=true
  • Bổ sung thuộc tính dưới đây vào file proguard-rules.pro
-keep class ai.icenter.face3d.native_lib.Face3DConfig { *; }
-keep class ai.icenter.face3d.native_lib.CardConfig { *; }

Bước 2: Khởi tạo SDK tại nơi muốn bắt đầu kết nối

  • Code tại MainActivity hoặc Activity muốn kết nối
    // ...
import com.google.gson.Gson
import com.vnpt.smartca.*

class MainActivity: AppCompatActivity() {
//...
var VNPTSmartCA = VNPTSmartCASDK()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

//...
var customParams = CustomParams(
borderRadiusBtn = 999.0, // Border radius của button
colorSecondBtn = "", // Màu background nút phụ ví dụ: #FFFFFF
colorPrimaryBtn = "", // Màu background nút chính ví dụ: #4788FF
featuresLink = "", // Đường dẫn tới trang hướng dẫn sử dụng các tính năng sdk
);

var config = ConfigSDK(
clientId = "", // clientId tương ứng với môi trường được cấp qua email
clientSecret = "", // clientSecret tương ứng với môi trường được cấp qua email
env = SmartCAEnvironment.DEMO_ENV, // Môi trường kết nối DEMO_ENV/PROD_ENV
customParams = customParams,
lang = SmartCALanguage.VI, // Ngôn ngữ vi/en
isFlutter = true, // true nếu ứng dụng phát triển bằng Flutter, hoặc tích hợp Flutter module
)

VNPTSmartCA.initSDK(this, config)
//...

}

Bước 3: Sử dụng các hàm chính

📦 Lấy thông tin chứng thư số (getAuthentication)

  • customerId là số CCCD

data class CallbackResult(
val credentialId: String,
val accessToken: String,
val serial: String,
)

private fun getAuthentication(customerId: String) {
try {
VNPTSmartCA.getAuthentication(customerId) { result ->
when (result.status) {
SmartCAResultCode.SUCCESS_CODE -> {
val obj: CallbackResult = Gson().fromJson(
result.data.toString(), CallbackResult::class.java
)
// SDK trả lại token, credential, serial của khách hàng
// Đối tác tạo transaction cho khách hàng để lấy transId, sau đó gọi getWaitingTransaction
val token = obj.accessToken
val credentialId = obj.credentialId
val serial = obj.serial
//...
}
else -> {
// Xử lý lỗi
// result.statusDesc, result.data
}
}
}
} catch (ex: Exception) {
throw ex;
}
}

📦 Xác nhận giao dịch ký số (getWaitingTransaction)

  • Phải gọi hàm getAuthentication trước
// tạo giao dịch từ backend, lấy tranId từ hệ thống VNPT SmartCA trả về
private fun getWaitingTransaction(transId: String) {
try {
if (transId.isNullOrEmpty()) {
editTextTrans.setError("Vui lòng điền Id giao dịch");
return
}

VNPTSmartCA.getWaitingTransaction(transId) { result ->
when (result.status) {
SmartCAResultCode.SUCCESS_CODE -> {
// Xử lý khi thành công
}
else -> {
// Xử lý khi thất bại
// result.statusDesc, result.data
}
}

}
} catch (ex: Exception) {
throw ex;
}
}

📦 Hàm hủy kết nối với SDK (destroySDK)

override fun onDestroy() {
VNPTSmartCA.destroySDK()
super.onDestroy()
}