Tích hợp Flutter
Yêu cầu
Yêu cầu Dart >= 3.1.5
Bước 1: Tải module và cấu hình
- Copy thư mục vnpt_smartca_module vào trong project
- Trong pubspec.yaml bổ sung đường dẫn tới thư mục vnpt_smartca_module
vnpt_smartca_module:
path: ../vnpt_smartca_module
- Trong main.dart bổ sung đoạn code sau
('vm:entry-point')
void VNPTSmartCAEntryponit() => bootstrapSmartCAApp();
- Bổ sung MethodChannel tương tác giữa Flutter và Native code
static const platform = MethodChannel("com.vnpt.flutter/partner");
Future<void> getAuthentication() async {
await platform.invokeMethod('getAuthentication');
}
Future<void> getWaitingTransaction() async {
await platform.invokeMethod('getWaitingTransaction',"trandId");
}
Future<void> toMainPage() async {
await platform.invokeMethod('getMainInfo');
}
Future<void> createAccount() async {
await platform.invokeMethod('createAccount');
}
Future<void> signOut() async {
await platform.invokeMethod('signOut');
}
initMethod(BuildContext context) {
platform.setMethodCallHandler((call) async {
if (call.method == "getAuthenticationResult") {
debugPrint("getAuthenticationResult");
if (call.arguments is Map && call.arguments["status"] == 0) {
// Xử lý khi thành công
showDialogMessage(context, call.arguments["data"]);
} else {
// Xử lý khi thất bại
}
} else if (call.method == "getMainInfoResult") {
debugPrint("getMainInfoResult");
} else if (call.method == "getWaitingTransactionResult") {
debugPrint("getWaitingTransactionResult");
if (call.arguments is Map && call.arguments["status"] == 0) {
// Xử lý khi thành công
showDialogMessage(
context, "Giao dịch thành công: ${call.arguments["statusDesc"]}");
} else {
// Xử lý khi thất bại
showDialogMessage(
context, "Giao dịch thất bại: ${call.arguments["statusDesc"]}");
}
} else if (call.method == "signOutResult") {
debugPrint("signOut success");
showDialogMessage(context, "Đăng xuất thành công");
} else if (call.method == "createAccountResult") {
debugPrint("createAccountResult");
}
});
}
Tích hợp native iOS
Bước 1: Tải SDK và cấu hình Project
- Thực hiện các Bước 1 theo hướng dẫn tại đây
Bước 2: Khởi tạo SDK tại nơi bắt đầu kết nối
- Code tại AppDelegate
import UIKit
import Flutter
import SmartCASDK
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
var channelFlutter: FlutterMethodChannel?
var vnptSmartCASDK: VNPTSmartCASDK?
override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
//...
if let rootView = window?.rootViewController as? FlutterViewController {
let customParams = CustomParams(
customerId: "", // Số CCCD, giấy tờ của KH đăng nhập SDK, để trống KH tự nhập
borderRadiusBtn: 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
customerPhone: "", // Số ĐT của KH
packageDefault: "", // Gói mặc định hiển thị khi mua Chứng thư số
password: "", // Mật khẩu mặc định khi tạo tài khoản
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......"
)
let config = SDKConfig(
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
environment: ENVIRONMENT.DEMO, // Môi trường kết nối DEMO/PROD
lang: LANG.VI, // Ngôn ngữ vi/en
isFlutterApp: false, // true nếu ứng dụng phát triển bằng Flutter, hoặc tích hợp Flutter module
customParams: customParams
)
self.vnptSmartCASDK = VNPTSmartCASDK(viewController: rootView, config: config)
GeneratedPluginRegistrant.register(with: self.vnptSmartCASDK?.flutterEngine as! FlutterPluginRegistry);
let channel = FlutterMethodChannel(name: "com.vnpt.flutter/partner", binaryMessenger: rootView.binaryMessenger)
channel.setMethodCallHandler({ (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
self.channelFlutter = channel
if call.method == "getAuthentication" {
self.getAuthentication()
} else if call.method == "getMainInfo" {
self.getMainInfo()
} else if call.method == "getWaitingTransaction" {
let transactionId = call.arguments as? String ?? ""
self.getWaitingTransaction(transactionId: transactionId)
} else if call.method == "signOut"{
self.signOut()
} else if call.method == "createAccount" {
self.createAccount()
}
})
}
GeneratedPluginRegistrant.register(with: self)
GeneratedPluginRegistrant.register(with: self.vnptSmartCASDK?.flutterEngine as! FlutterPluginRegistry);
//...
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
// Lấy thông tin về AccessToken & CredentialId & Serial
func getAuthentication() {
self.vnptSmartCASDK?.getAuthentication(callback: { result in
self.channelFlutter?.invokeMethod("getAuthenticationResult", arguments: result.toJson())
});
}
func getMainInfo() {
self.vnptSmartCASDK?.getMainInfo(callback: { result in
self.channelFlutter?.invokeMethod("getMainInfoResult", arguments: result.toJson())
})
}
// Khách hàng xác nhận / hủy giao dịch.
// Luôn phải gọi getAuthentication trước
func getWaitingTransaction(transactionId: String) {
self.vnptSmartCASDK?.getWaitingTransaction(tranId: transactionId, callback: { result in
self.channelFlutter?.invokeMethod("getWaitingTransactionResult", arguments: result.toJson())
})
}
func signOut() {
self.vnptSmartCASDK?.signOut(callback: { result in
self.channelFlutter?.invokeMethod("signOutResult", arguments: result.toJson())
})
}
func createAccount() {
self.vnptSmartCASDK?.createAccount(callback: { result in
self.channelFlutter?.invokeMethod("createAccountResult", arguments: result.toJson())
})
}
}
Bước 3: Chi tiết các hàm chính
Tích hợp native Android
Bước 1: Tải SDK và cấu hình Project
- Thực hiện các Bước 1 theo hướng dẫn tại đây
Bước 2: Khởi tạo SDK tại nơi bắt đầu kết nối
- Thêm đoạn code dưới đây tại MainActivity:
import android.os.Handler
import com.vnpt.smartca.*
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity : FlutterFragmentActivity() {
var vnptSmartCA = VNPTSmartCASDK()
lateinit var methodChannel: MethodChannel
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
//...
try {
var customParams = CustomParams(
customerId = "", // Số CCCD, giấy tờ của KH đăng nhập SDK, để trống KH tự nhập
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
customerPhone = "", // Số ĐT mặc định của KH
packageDefault = "", // Gói mặc định hiển thị khi mua Chứng thư số, ví dụ: PS0
password = "", // Mật khẩu mặc định khi tạo tài khoản
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)
methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.vnpt.flutter/partner")
methodChannel.setMethodCallHandler { call, result ->
when (call.method) {
"createAccount" -> createAccount();
"getAuthentication" -> getAuthentication();
"getMainInfo" -> getMainInfo()
"getWaitingTransaction" -> (call.arguments as? String)?.let { getWaitingTransaction(it) };
"signOut" -> signOut()
}
}
} catch (ex: Exception) {
throw ex;
}
}
private fun createAccount() {
try {
vnptSmartCA.createAccount { result ->
methodChannel.invokeMethod("createAccountResult", getMap(result))
}
} catch (ex: Exception) {
throw ex;
}
}
private fun getAuthentication() {
try {
vnptSmartCA.getAuthentication { result ->
methodChannel.invokeMethod("getAuthenticationResult", getMap(result))
}
} catch (ex: Exception) {
throw ex;
}
}
private fun getMainInfo() {
try {
vnptSmartCA.getMainInfo { result ->
methodChannel.invokeMethod("getMainInfoResult", getMap(result))
}
} catch (ex: Exception) {
throw ex;
}
}
private fun getWaitingTransaction(transId: String) {
try {
vnptSmartCA.getWaitingTransaction(transId,"") { result ->
methodChannel.invokeMethod("getWaitingTransactionResult", getMap(result))
}
} catch (ex: Exception) {
throw ex;
}
}
private fun signOut() {
try {
vnptSmartCA.signOut { result ->
methodChannel.invokeMethod("signOutResult", getMap(result))
}
} catch (ex: Exception) {
throw ex;
}
}
fun getMap(result: SmartCAResult) : HashMap<String, Any> {
var hashMap = HashMap<String, Any> ()
hashMap.put("status", result.status)
result.statusDesc?.let { hashMap.put("statusDesc", it) }
result.data?.let { hashMap.put("data", it) }
return hashMap;
}
}