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
- Tải về bộ tích hợp SDK tại https://github.com/VNPT-SmartCA/android_vnptsmartca_sdk_lite/releases và giải nén ra thư mục.
- Sau khi giải nén, copy các file .aar và thư mục repo vào thư mục
android/app/libscủa project Android (nếu chưa có thư mụclibsthì tạo mới)
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
- Kotlin
- Java
// ...
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)
//...
}
// ...
import com.google.gson.Gson
import com.vnpt.smartca.*
public class MainActivity extends AppCompatActivity {
//...
VNPTSmartCASDK mVNPTSmartCA = new VNPTSmartCASDK();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
CustomParams customParams = new CustomParams();
customParams.setBorderRadiusBtn(999.0); // Border radius của button
customParams.setColorPrimaryBtn(""); // Màu background nút phụ ví dụ: #FFFFFF
customParams.setColorSecondBtn(""); // Màu background nút chính ví dụ: #4788FF
customParams.setFeaturesLink(""); // Đường dẫn tới trang hướng dẫn sử dụng các tính năng sdk
ConfigSDK config = new 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
customParams,
SmartCALanguage.INSTANCE.getVI(), // Ngôn ngữ vi/en
SmartCAEnvironment.INSTANCE.getDEMO_ENV(), // Môi trường kết nối DEMO_ENV/PROD_ENV
false // true nếu ứng dụng phát triển bằng Flutter, hoặc tích hợp Flutter module
);
mVNPTSmartCA.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
- Kotlin
- Java
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;
}
}
private void getAuthentication(String customerId) {
try {
mVNPTSmartCA.getAuthentication(customerId, smartCAResult -> {
if (smartCAResult.getStatus() == SmartCAResultCode.INSTANCE.getSUCCESS_CODE()) {
try {
CallbackResult obj;
String jsonString = smartCAResult.getData().toString();
Gson gson = new Gson();
obj = gson.fromJson(jsonString, CallbackResult.class);
String token = obj.getAccessToken();
String credentialId = obj.getCredentialId();
} catch (JsonParseException e) {
e.printStackTrace();
}
}
else{
// Xử lý lỗi
}
return null;
});
} catch (Exception ex) {
throw ex;
}
}
📦 Xác nhận giao dịch ký số (getWaitingTransaction)
- Phải gọi hàm getAuthentication trước
- Kotlin
- Java
// 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;
}
}
private void confirmTrans(String transId) {
if (transId.isEmpty()) {
editTextTran.setError("Vui lòng điền Id giao dịch");
return;
}
mVNPTSmartCA.getWaitingTransaction(transId,
smartCAResult -> {
if (smartCAResult.getStatus() == SmartCAResultCode.INSTANCE.getSUCCESS_CODE()) {
// Xử lý khi confirm thành công
} else {
// Xử lý khi confirm thất bại
// smartCAResult.getStatusDesc, smartCAResult.getData
}
return null;
});
}
📦 Hàm hủy kết nối với SDK (destroySDK)
- Kotlin
- Java
override fun onDestroy() {
VNPTSmartCA.destroySDK()
super.onDestroy()
}
@Override
protected void onDestroy() {
super.onDestroy();
mVNPTSmartCA.destroySDK();
}