Nhảy tới nội dung

Tích hợp 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
//......

// Bỏ qua nếu app tích hợp viết bằng Flutter
<activity android:name="io.flutter.embedding.android.FlutterFragmentActivity"
android:theme="@style/Theme.Smartca_android_example"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"/>

</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

  • Thêm code kết nối với SDK tại Activity muốn sử dụng các chức năng:
    // ...
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
logoCustom = "", // Logo của đối tác theo mã hoá Base64 dạng "iVBORw0KGgoAAAANSUhEUgAAANgAAA......"
backgroundLogin = "" // Background của đối tác theo mã hoá Base64 dạng "iVBORw0KGgoAAAANSUhEUgAAANgAAA......"
);

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/PROD
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 xác thực người dùng (accessToken & credentiald & serial)
  • Xác nhận / Hủy giao dịch ký số
  • Hủy kết nối SDK

📦 Lấy thông tin người dùng, chứng thư số

  • Lấy accessToken, credentialId hoặc serial của chứng thư để tạo giao dịch phía backend. SDK sẽ tự kiểm tra tài khoản như: đã kích hoạt hay chưa, chứng thư hợp lệ hay không, tự động làm mới token khi hết hạn,...
  • Trường hợp người dùng có >=2 chứng thư đang hoạt động thì SDK hiện giao diện chọn chứng thư muốn dùng để ký số
  • Sau khi lấy được thông tin đối tác tạo giao dịch từ phía backend của mình với hệ thống backend VNPT SmartCA để lấy tranId sau đó gọi hàm getWaitingTransaction.
  • Đối tác tự bắn Notifycation về ứng dụng của mình để thông báo cho người dùng sau khi tạo giao dịch phía backend thành công, SDK VNPT SmartCA sẽ không bắn.
  • Tài liệu tích hợp phía backend được cung cấp khi đăng ký tích hợp.
Lưu ý

tranId là mã giao dịch do hệ thống VNPT SmartCA sinh ra và trả về cho đối tác trong API v1/signatures/sign trường tran_code. Ví dụ trandId: "48b7d184-bbf4-4fa2-a661-3a223dcb716a"


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 / Huỷ giao dịch ký số

  • Sau khi lấy lấy được tranId từ phía backend đối tác gọi hàm này để người dùng Xác nhận / Huỷ giao dịch ký số.
  • Luôn 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

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