getCardInfo static method
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;
}