Nhảy tới nội dung

Sample code tương tác giữa eKYC và eContract trên native code (đối với các hình thức ký eKYC)

Code mẫu tích hợp

a. Android:

class MainActivity: FlutterActivity() {
private val methodChannel: MethodChannel? = null
var results: MethodChannel.Result? = null
lateinit var data: ByteArray
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
configureFlutterEngine(FlutterEngine(this))
// QRCodeArchKernel.init(this);
}

override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
MethodChannel(
getFlutterEngine()!!.dartExecutor.binaryMessenger,
CHANNELEKYC
).setMethodCallHandler { call, result ->
results = result
if (call.method == "eKYC") {
typeEkyc = call.argument("type")
var language: String? = ""
language = call.argument("language")
doDinhDanhEkyc(typeEkyc, language)
}
}
……

private fun doDinhDanhEkyc(type: String?, language: String?) {
AICamera.navigateToCameraAI(this, type, language!!)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode != RESULT_OK || data == null) {
return
}
// ekyc
if (requestCode == Constants.RequestCode.SELECT_EKYC_AI) {
data.extras
val dataEkyc = JSONObject()
val infoDataJson =
if (data.getStringExtra("INFO_RESULT") == null) "" else data.getStringExtra(
"INFO_RESULT"
)!!
val imageFont =
if (data.getStringExtra("FRONT_IMAGE") == null) "" else data.getStringExtra(
"FRONT_IMAGE"
)!!
val imageRear =
if (data.getStringExtra("REAR_IMAGE") == null) "" else data.getStringExtra(
"REAR_IMAGE"
)!!
val hashFront =
if (data.getStringExtra("HASH_FRONT") == null) "" else data.getStringExtra(
"HASH_FRONT"
)!!
val strLivenessCardFront =
if (data.getStringExtra("LIVENESS_CARD_FRONT_RESULT") == null) "" else data.getStringExtra(
"LIVENESS_CARD_FRONT_RESULT"
)!!
val strLivenessCardRear =
if (data.getStringExtra("LIVENESS_CARD_REAR_RESULT") == null) "" else data.getStringExtra(
"LIVENESS_CARD_REAR_RESULT"
)!!
val imageUser =
if (data.getStringExtra("PORTRAIT_IMAGE") == null) "" else data.getStringExtra(
"PORTRAIT_IMAGE"
)!!
val imageFarUser =
if (data.getStringExtra("PORTRAIT_FAR_IMAGE") == null) "" else data.getStringExtra(
"PORTRAIT_FAR_IMAGE"
)!!
val imageNearUser =
if (data.getStringExtra("PORTRAIT_NEAR_IMAGE") == null) "" else data.getStringExtra(
"PORTRAIT_NEAR_IMAGE"
)!!
val strDataLivenessFace =
if (data.getStringExtra("LIVENESS_FACE_RESULT") == null) "" else data.getStringExtra(
"LIVENESS_FACE_RESULT"
)!!
val strDataCompare =
if (data.getStringExtra("COMPARE_RESULT") == null) "" else data.getStringExtra(
"COMPARE_RESULT"
)!!
val imageUserResult: String
imageUserResult = if (!TextUtils.isEmpty(imageUser)) {
imageUser
} else if (!TextUtils.isEmpty(imageFarUser)) {
imageFarUser
} else {
imageNearUser
}
if (infoDataJson.isNotEmpty() && imageUserResult.isNotEmpty()) {
try {
dataEkyc.put("status", true)
dataEkyc.put("message", "")
dataEkyc.put("ekycType", typeEkyc)
dataEkyc.put("imageUser", imageUserResult)
dataEkyc.put("compareResult", strDataCompare)
dataEkyc.put("livenessUserFace", strDataLivenessFace)
dataEkyc.put("imageFront", imageFont)
dataEkyc.put("imageRear", imageRear)
dataEkyc.put("hashFront", hashFront)
dataEkyc.put("livenessCardFront", strLivenessCardFront)
dataEkyc.put("livenessCardRear", strLivenessCardRear)
dataEkyc.put("dataOcr", infoDataJson)
results!!.success(dataEkyc.toString())
} catch (e: JSONException) {
e.printStackTrace()
}
} else {
try {
val dataEkyc = JSONObject()
dataEkyc.put("status", false)
dataEkyc.put("ekycType", typeEkyc)
dataEkyc.put(
"message",
"Không xác thực được hoặc không kết nối được với hệ thống eKYC!"
)
results!!.success(dataEkyc.toString())
} catch (e: JSONException) {
e.printStackTrace()
}
}
}

companion object {
private const val CHANNELEKYC = "vn.vnptit.econtract/eKYC"
private const val CHANNELEOPENSMARTCAAPP = "vn.vnptit.econtract/openSmartCAAPP"
private var typeEkyc: String? = "0"
}

b.IOS:

@available(iOS 13.0, *)
@main
@objc class AppDelegate: FlutterAppDelegate {
func ekycNetworkDidCallApi() {
print("")
}

var ekycResult: FlutterResult?
var typeEkyc: String = "0"
private var channeleKYC : FlutterMethodChannel?

#if !targetEnvironment(simulator)
var typeDoc : TypeDocument?
#endif

override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if #available(iOS 13.0, *) {
UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
}
FirebaseApp.configure()
GeneratedPluginRegistrant.register(with: self)
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
}

let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let channeleKYC = FlutterMethodChannel(name: "vn.vnptit.econtract/eKYC", binaryMessenger: controller.binaryMessenger)
channeleKYC.setMethodCallHandler({
(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
self.ekycResult = result
switch call.method {
case "eKYC":
guard let args = call.arguments as? [String:String] else {return}
self.typeEkyc = args["type"] ?? ""
let language = args["language"] ?? "vi"
switch self.typeEkyc{
case "0":
self.typeDoc = IdentityCard
case "5":
self.typeDoc = IDCardChipBased
case "2":
self.typeDoc = Passport
default:
self.typeDoc = IdentityCard
}

DispatchQueue.main.async {
self.openSDKeKYC(controller, types: self.typeDoc,lang: language)
}
default:
self.ekycResult!("")
}
})

import ICSdkEKYC
@available(iOS 13.0, *)
extension AppDelegate: ICEkycCameraDelegate {
func icEkycGetResult() {
DispatchQueue.main.async {
self.ekycResult!(self.getInformationCard())
}
}

func openSDKeKYC(_ controller:UIViewController, types: TypeDocument?, lang: String) {
let objCamera = ICEkycCameraRouter.createModule() as! ICEkycCameraViewController
objCamera.cameraDelegate = self
objCamera.versionSdk = ProOval
objCamera.flowType = full
objCamera.isCheckLivenessCard = true
objCamera.isEnableCompare = true
objCamera.checkLivenessFace = IBeta
objCamera.isEnableWaterMark = true
objCamera.urlOcr = "https://api.idg.vnpt.vn/ai/v2/ocr/id"
objCamera.urlCompare = "https://api.idg.vnpt.vn/ai/v2/face/compare"
objCamera.urlCheckLivenessCard = "https://api.idg.vnpt.vn/ai/v2/card/liveness"
objCamera.urlCheckMaskFace = "https://api.idg.vnpt.vn/ai/v2/face/mask"
objCamera.urlLivenessFace = "https://api.idg.vnpt.vn/ai/v2/face/liveness"
objCamera.urlLivenessFace3D = "https://api.idg.vnpt.vn/ai/v2/face/liveness-3d"
objCamera.isShowSwitchCamera = true
objCamera.documentType = types!
objCamera.isEnableGotIt = true
objCamera.languageSdk = lang // thay đổi ngôn ngữ
objCamera.isShowTrademark = true
objCamera.isValidatePostcode = true
// objCamera.isEnableScanQRCode = typeEkyc == "1"
objCamera.isCheckMaskedFace = true
objCamera.challengeCode = ""
objCamera.modalPresentationStyle = .fullScreen
objCamera.modalTransitionStyle = .coverVertical
controller.present(objCamera, animated: true, completion: nil)
}

func getResult() {
DispatchQueue.main.async {
self.ekycResult!(self.getInformationCard())
}

}

func getInformationCard() -> String {
do {
let result = ICEKYCSavedData.shared().ocrResult
let imageFront = ICEKYCSavedData.shared().imageCropedFront
let imageRear = ICEKYCSavedData.shared().imageCropedBack
let livenessCardFront = ICEKYCSavedData.shared().livenessCardFrontResult
let livenessCardRear = ICEKYCSavedData.shared().livenessCardBackResult
let hashFront = ICEKYCSavedData.shared().hashImageFront
let imageFrontURL = storeImage(image: imageFront, forKey: "imageFront", withStorageType: StorageType.fileSystem)
let imageRearURL = storeImage(image: imageRear, forKey: "imageRear", withStorageType: StorageType.fileSystem)
let compareResult = ICEKYCSavedData.shared().compareFaceResult
let livenessUserFace = ICEKYCSavedData.shared().livenessFaceResult
let imageFaceUser = ICEKYCSavedData.shared().imageCropedFaceFar
let imageFaceUserURL = storeImage(image: imageFaceUser, forKey: "imageFaceUser", withStorageType: StorageType.fileSystem)
if (result.isEmpty && compareResult.isEmpty){
let jsonObject: [String: Any] = [
"status" : false,
"ekycType" : self.typeEkyc,
"message" : "Khong the dinh danh hoac khong the ket noi voi he thong ekyc!",

]
let jsonString = convertIntoJSONString(arrayObject: jsonObject);
return jsonString!;
} else{
let jsonObject: [String: Any] = [
"status" : true,
"message" : "",
"ekycType" : self.typeEkyc,
"imageUser" : imageFaceUserURL,
"compareResult" : compareResult,
"livenessUserFace" : livenessUserFace,
"dataOcr" : result,
"livenessCardFront" : livenessCardFront,
"livenessCardRear" : livenessCardRear,
"imageFront": imageFrontURL,
"imageRear" : imageRearURL,
"hashFront" : hashFront
]
let jsonString = convertIntoJSONString(arrayObject: jsonObject);
return jsonString!;
}
} catch {
let jsonObject: [String: Any] = [
"status" : false,
"ekycType" : self.typeEkyc,
"message" : "Khong the dinh danh hoac khong the ket noi voi he thong ekyc!",

]
let jsonString = convertIntoJSONString(arrayObject: jsonObject);
return jsonString!;

}
}
}