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');
}
Future<void> toMainPage() async {
await platform.invokeMethod('getMainInfo');
}
Future<void> signOut() async {
await platform.invokeMethod('signOut');
}
initMethod(BuildContext context) {
platform.setMethodCallHandler((call) async {
if (call.method == "getAuthenticationResult") {
if (call.arguments is Map && call.arguments["status"] == 0) {
// Xử lý khi thành công
} else {
// Xử lý khi thất bại
}
} else if (call.method == "getMainInfoResult") {
debugPrint("getMainInfoResult");
} else if (call.method == "getWaitingTransactionResult") {
if (call.arguments is Map && call.arguments["status"] == 0) {
// Xử lý khi thành công
} else {
// Xử lý khi thất bại
}
} else if (call.method == "signOutResult") {
debugPrint("signOut success");
showDialogMessage(context, "Đăng xuất thành công");
}
});
}
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 {
self.vnptSmartCASDK = VNPTSmartCASDK(
viewController: rootView,
partnerId: "CLIENT_ID",
environment: VNPTSmartCASDK.ENVIRONMENT.DEMO,
lang: VNPTSmartCASDK.LANG.VI,
isFlutterApp: true)
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()
}
})
}
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
// Lấy thông tin về AccessToken & CredentialId
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.
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())
})
}
}
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.ConfigSDK
import com.vnpt.smartca.SmartCAEnvironment
import com.vnpt.smartca.SmartCALanguage
import com.vnpt.smartca.SmartCAResult
import com.vnpt.smartca.VNPTSmartCASDK
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 {
val config = ConfigSDK()
config.context = this
//clientId của đối tác được VNPTSmartCA cung cấp khi yêu cầu tích hợp
config.partnerId = "CLIENT_ID"
config.environment = SmartCAEnvironment.DEMO_ENV
config.lang = SmartCALanguage.VI
config.isFlutter = true
VNPTSmartCA.initSDK(config)
methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.vnpt.flutter/partner")
methodChannel.setMethodCallHandler { call, result ->
when (call.method) {
"getAuthentication" -> getAuthentication();
"getMainInfo" -> getMainInfo()
"getWaitingTransaction" -> (call.arguments as? String)?.let { getWaitingTransaction(it) };
"signOut" -> signOut()
}
}
} 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;
}
}