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
                customerEmail: "",              // Email 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
                customerEmail = "", // Email 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;
    }
}