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
    )?,
  12. int? commandBalance,
  13. List<String>? brizziData,
  14. dynamic callbackState(
    1. String
    )?,
  15. String? reffNo,
  16. dynamic errorCode(
    1. String rc
    )?,
})

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,
    int? commandBalance,
    List<String>? brizziData,
    Function(String)? callbackState,
    String? reffNo,
    Function(String rc)? errorCode}) async {
  if (beforeBalance == null) beforeBalance = List<String>.filled(1, "");
  if (cardAttr == null) cardAttr = List<String>.filled(1, "");
  if (cardInfo == null) cardInfo = List<String>.filled(1, "");
  if (brizziData == null) brizziData = List<String>.filled(1, "");
  if (commandBalance == null)
    commandBalance = FlutterNfcKit.COMMAND_CHECK_BALANCE;

  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;

  String brizziToken = await _channel.invokeMethod('getBrizziToken');

  print("brizziToken $brizziToken");

  String reffNumber = (reffNo != null) ? reffNo : "";

  try {
    brizziData[0] = "";
    if (startPooling!) {
      callbackState!(WAITING_STATUS);

      NFCTag tag = await FlutterNfcKit.poll(
          commandOperation: commandBalance,
          iosAlertMessage: "Tempelkan kartumu pada iPhone",
          consumerToken: brizziToken,
          username: "wahyudi@mdd.co.id",
          consumerKey: "5L6AH60u3OVGroiN",
          consumerSecret: "WDXSFPoLnf9nvrgIyJGcDZG71VuYbwre",
          reffNo: reffNumber);
      cardUid[0] = tag.id;

      print("brizziResponse ${tag.brizziResponse}");

      if (tag.brizziResponse != "") {
        var brizziResponse = jsonDecode(tag.brizziResponse!);
        var activatedBalance =
            (brizziResponse['activated_balance'].toString() != "")
                ? brizziResponse['activated_balance'].toString()
                : "0";
        balance[0] = brizziResponse['last_balance'].toString();
        beforeBalance[0] =
            /*(int.parse(brizziResponse['last_balance'].toString()) -
                    int.parse(activatedBalance))
                .toString();*/
            brizziResponse['last_balance'].toString();
        cardNumber[0] = brizziResponse['card_no'].toString();
        bankName[0] = "BRI";
        brizziData[0] = tag.brizziResponse!;
        res = true;
        return res;
      }
    }

    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(",");
          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]) {
              rApduCardAttr =
                  await FlutterNfcKit.transceive(apduCardAttr.apdu);
            }
          }

          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);

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

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

          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 ?? "0";
        } 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) {
    String? rc;
    res = false;
    if (error.toString().toLowerCase().contains("polling tag timeout")){
      callbackTimeout!(true);
      rc=pollingTagTimeout;
    }
    if (error.toString().toLowerCase().contains("nfc not available") ||
        error
            .toString()
            .toLowerCase()
            .contains("stringindexoutofboundsexception")) {
      print("error nfc not support");
      errorNfc!(true);
      rc=errorNFC;
    }
    print("error operation ${error.toString()}");
    if (errorCode != null) {
      errorCode(rc!);
    }
  }
  return res;
}