getCardInfo static method

Future<bool> getCardInfo(
  1. List<String> cardUid,
  2. List<String> cardNumber,
  3. List<String> balance,
  4. List<String> bankName, {
  5. List<String?>? cardAttr,
  6. List<String?>? cardInfo,
  7. List<String?>? rrn,
  8. bool? startPooling,
  9. List<String?>? beforeBalance,
  10. dynamic callbackTimeout(
    1. bool
    )?,
  11. dynamic errorNfc(
    1. bool
    )?,
})

get card info

Implementation

static Future<bool> getCardInfo(List<String> cardUid, List<String> cardNumber,
    List<String> balance, List<String> bankName,
    {List<String?>? cardAttr,
    List<String?>? cardInfo,
    List<String?>? rrn,
    bool? startPooling,
    List<String?>? beforeBalance,
    Function(bool)? callbackTimeout,
    Function(bool)? errorNfc}) async {
  print("card info $cardInfo");
  print("card info is null = ${cardInfo == null}");
  if (beforeBalance == null) beforeBalance = [''];
  if (cardAttr == null) cardAttr = [''];
  if (cardInfo == null) cardInfo = [''];

  bool res = false;
  String apduClSelectApp = await _channel.invokeMethod('apduIsMyCard');
  String apduClCardInfo = await _channel.invokeMethod('apduCardInfo');
  String apduClBalance = await _channel.invokeMethod('apduBalance');
  String apduClCardAttr = await _channel.invokeMethod('apduCardAttr');
  String? selectApp;

  print('apduClSelectApp $apduClSelectApp');
  print('apduClCardInfo $apduClCardInfo');
  print('apduClBalance $apduClBalance');
  print('apduClCardAttr $apduClCardAttr');

  try {
    if (startPooling!) {
      NFCTag tag = await FlutterNfcKit.poll(
          iosAlertMessage: "Tempelkan kartumu pada iPhone");
      cardUid[0] = tag.id;
    }

    var dataSelect = jsonDecode(apduClSelectApp);
    var dataBalance = jsonDecode(apduClBalance);
    var dataCardAttr = jsonDecode(apduClCardAttr);

    List<ApduResponse> listData = dataSelect
        .map<ApduResponse>((result) => new ApduResponse.fromJson(result))
        .toList();
    List<ApduResponse> listApduBalance = dataBalance
        .map<ApduResponse>((result) => new ApduResponse.fromJson(result))
        .toList();
    List<ApduResponse> listApduCardAttr = dataCardAttr
        .map<ApduResponse>((result) => new ApduResponse.fromJson(result))
        .toList();

    /// apdu cl select app
    for (ApduResponse s in listData) {
      selectApp = await FlutterNfcKit.transceive(s.apdu);
      if (_apduIsOke(selectApp!)) {
        bankName[0] = s.bankType;
        print("bank name ${bankName[0]}");
        break;
      }
    }

    for (ApduResponse b in listApduBalance) {
      if (b.bankType == bankName[0]) {
        String rApduCardAttr = "";

        if (bankName[0] == "MANDIRI") {
          /// when bank name mandiri
          String apduBalance = await FlutterNfcKit.transceive(b.apdu);

          cardInfo[0] = await FlutterNfcKit.transceive(apduClCardInfo);
          for (ApduResponse apduCardAttr in listApduCardAttr) {
            if (apduCardAttr.bankType == bankName[0])
              rApduCardAttr =
                  await FlutterNfcKit.transceive(apduCardAttr.apdu);
          }

          String result = await _channel.invokeMethod(
              'parseBalance', <String, dynamic>{
            'apduBalance': "$apduBalance,${cardInfo[0]}",
            'bankType': bankName[0]
          });
          print("result $result");
          List<String> items = result.split(",");
          print("result = $result");
          balance[0] = items[0];
          beforeBalance[0] = items[0];
          cardNumber[0] = items[1];
          cardAttr[0] = rApduCardAttr;
        } else if (bankName[0] == "BNI") {
          /// when bank name bni
          for (ApduResponse apduCardAttr in listApduCardAttr) {
            if (apduCardAttr.bankType == bankName[0]) {
              print("apduCardAttr.apdu : ${apduCardAttr.apdu}");
              rApduCardAttr =
                  await FlutterNfcKit.transceive(apduCardAttr.apdu);
              print("rApduCardAttr : $rApduCardAttr");
            }
          }

          String apduBalance = await FlutterNfcKit.transceive(b.apdu);

          String purse = apduBalance.substring(0, apduBalance.length - 4);
          String crn = rApduCardAttr.substring(0, rApduCardAttr.length - 4);
          String rRrn = b.apdu.substring(14, 30);

          String subRrn = rRrn;
          print("purse : $purse");
          print("crn : $crn");
          print("subRrn : $subRrn");

          if (rrn != null) rrn[0] = rRrn;

          String rawInfo = purse + crn + rRrn;
          print("rawInfo : $rawInfo");

          String composeBni = await _channel.invokeMethod(
              'composeBNI', <String, dynamic>{'apduPurse': rawInfo});

          String result = await _channel.invokeMethod(
              'parseBalance', <String, dynamic>{
            'apduBalance': purse,
            'bankType': bankName[0]
          });
          print("result $result");
          List<String> items = result.split(",");
          balance[0] = items[0];
          beforeBalance[0] = items[0];
          cardNumber[0] = items[1];
          cardInfo[0] = composeBni;
        } else if (bankName[0] == "BCA") {
          /// when bank name bca
          List<String> listApduBca = b.apdu.split(",");
          // String apduFirst = listApduBca[0];
          String apduSecond = listApduBca[1];
          String apduLast = listApduBca[2];
          // String rApduFirst = await FlutterNfcKit.transceive(apduFirst);
          String rApduSecond = await FlutterNfcKit.transceive(apduSecond);
          String rApduLast = await FlutterNfcKit.transceive(apduLast +
              rApduSecond.substring(0, rApduSecond.length - 4) +
              "29");
          String result = await _channel.invokeMethod(
              'parseBalance', <String, dynamic>{
            'apduBalance': rApduLast,
            'bankType': bankName[0]
          });
          print("result $result");
          List<String> items = result.split(",");
          balance[0] = items[0];
          beforeBalance[0] = items[0];
          cardNumber[0] = items[1];
        } else if (bankName[0] == "DKI-NEW") {
          /// when bank name dki-new
          String rApduBalance = await FlutterNfcKit.transceive(b.apdu);
          String result = await _channel.invokeMethod(
              'parseBalance', <String, dynamic>{
            'apduBalance': "$selectApp,$rApduBalance",
            'bankType': "DKI"
          });
          print("result $result");
          List<String> items = result.split(",");
          balance[0] = items[0];
          beforeBalance[0] = items[0];
          cardNumber[0] = items[1];
        }

        print("cardNumber = ${cardNumber[0]}, balance ${balance[0]}");
        res = true;
      }
    }
  } catch (error, stack) {
    print("stack $stack");
    res = false;
    if (error.toString().toLowerCase().contains("polling tag timeout"))
      callbackTimeout!(true);
    if (error.toString().toLowerCase().contains("nfc not available"))
      errorNfc!(true);
    print("error operation ${error.toString()}");
  }
  return res;
}