diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index a7ec23d..da6c8f6 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -13,6 +13,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/androidTest/java/com/utsmm/kbz/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/utsmm/kbz/ExampleInstrumentedTest.java
index b258c1b..61fbc0b 100644
--- a/app/src/androidTest/java/com/utsmm/kbz/ExampleInstrumentedTest.java
+++ b/app/src/androidTest/java/com/utsmm/kbz/ExampleInstrumentedTest.java
@@ -10,7 +10,6 @@ import org.junit.runner.RunWith;
import static org.junit.Assert.*;
-import com.sunmi.pay.hardware.aidl.AidlConstants;
import com.utsmm.kbz.util.MockData;
import com.utsmm.kbz.util.TransactionUtil;
import com.utsmyanmar.checkxread.model.CardDataX;
@@ -19,6 +18,7 @@ import com.utsmyanmar.paylibs.Constant;
import com.utsmyanmar.paylibs.isobuilder.ISOMode;
import com.utsmyanmar.paylibs.isobuilder.builderx.ISOMsgX;
import com.utsmyanmar.paylibs.isobuilder.builderx.ISOVersion;
+import com.utsmyanmar.paylibs.model.MsgField;
import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.model.enums.TransCVM;
@@ -26,12 +26,15 @@ import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.MessageType;
import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
+import com.utsmyanmar.paylibs.utils.enums.BaseCardType;
import com.utsmyanmar.paylibs.utils.enums.HostName;
import com.utsmyanmar.paylibs.utils.iso_utils.BitmapConfig;
+import com.utsmyanmar.paylibs.utils.iso_utils.TransactionType;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
import com.utsmyanmar.paylibs.utils.params.Params;
import java.util.Locale;
+import java.util.Map;
/**
* Instrumented test, which will execute on an Android device.
@@ -76,6 +79,58 @@ public class ExampleInstrumentedTest {
}
}
+ @Test
+ public void testSalePacket() {
+
+ CardDataX cardDataX = MockData.getInstance().generateMPUCard();
+
+ TradeData tradeData = TransactionUtil.getInstance().initEMVTransaction(cardDataX, CardTypeX.IC);
+
+ PayDetail payDetail = tradeData.getPayDetail();
+
+ payDetail.setTransactionType(TransactionType.SALE);
+ String bitmap = BitmapConfig.BPC_SALE;
+ MessageType messageType = MessageType.FINANCIAL;
+
+ ISOMsgX isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.BOTH_HEADER_TPDU, HostName.BPC)
+ .build();
+
+
+ byte[] sendBytes;
+ try {
+ sendBytes = isoMsgX.buildISOPackets(tradeData, bitmap, messageType);
+
+ System.out.println("Hex Str : "+ ByteUtil.bytes2HexStr(sendBytes));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testResponseSalePacket() {
+
+ String resp = "0071600000051730323130723000000A80820031363437363137333130303030303030323730303030303030303030303030353530303030313039313634353532303030303033323630313039313731353532303031303030303735343431393130303030343733343531303400048A023936";
+
+ byte[] response = ByteUtil.hexStr2Bytes(resp);
+
+ String bitmap = BitmapConfig.BPC_SALE;
+ MessageType messageType = MessageType.FINANCIAL;
+
+ ISOMsgX isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.BOTH_HEADER_TPDU, HostName.BPC)
+ .build();
+
+ Map responseMap = isoMsgX.parseISOPackets(response,response.length);
+
+ System.out.println("Resp Str : "+ responseMap);
+
+// try {
+// responseMap = isoMsgX.parseISOPackets(response,response.length);
+//
+// System.out.println("Resp Str : "+ responseMap);
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+ }
private TradeData setUpRebuildTransactions(TradeData tradeData, TransactionsType transactionsType, HostName hostName) {
LogUtil.d(Constant.TAG, "Starting Online Transaction--" + hostName + "--" + transactionsType);
@@ -159,7 +214,7 @@ public class ExampleInstrumentedTest {
/*
* new requirements */
- newPay.setCardType(AidlConstants.CardType.IC.getValue());
+ newPay.setCardType(BaseCardType.IC.getValue());
newPay.setPINCipher("55");
newPay.setTransCVM(TransCVM.SIGNATURE);
}
diff --git a/app/src/main/java/com/utsmm/kbz/util/TransactionUtil.java b/app/src/main/java/com/utsmm/kbz/util/TransactionUtil.java
index 1cb43f5..1406d5e 100644
--- a/app/src/main/java/com/utsmm/kbz/util/TransactionUtil.java
+++ b/app/src/main/java/com/utsmm/kbz/util/TransactionUtil.java
@@ -66,6 +66,25 @@ public class TransactionUtil {
return tradeData;
}
+ public TradeData initEMVTransaction(CardDataX cardDataX,CardTypeX cardTypeX) {
+ LogUtil.d(TAG,"CardDataX : "+cardDataX.toString());
+ TradeData tradeData = Params.newTrade(false);
+ PayDetail payDetail = tradeData.getPayDetail();
+ payDetail.setCardNo(cardDataX.getPan());
+ payDetail.setEXPDate(cardDataX.getExp());
+ payDetail.setCardType(cardTypeX.value);
+ payDetail.setAccountType("VISA");
+ payDetail.setAmount(100000);
+ payDetail.setCardHolderName(cardDataX.getCardHolderName());
+ CardInfo cardInfo = new CardInfo();
+ MAGCardInfo magCardInfo = new MAGCardInfo();
+ magCardInfo.setTrack2Cipher(cardDataX.getTrack2());
+ cardInfo.setMAGCardInfo(magCardInfo);
+ payDetail.setCardInfo(cardInfo);
+ payDetail.setICC55("5F2A0201045F340100820218008407A0000000031010950580800080009A032601099C01009F02060000000500009F03060000000000009F090200209F100706011203A0B8009F1A0201049F1E0820202020202020209F26088D3992CD453684B69F2701809F3303E0E8C89F34031E03009B0268009F3501229F360200049F370416C252349F41030000019F530152");
+ return tradeData;
+ }
+
public TradeData initMagStripeTransaction(CardDataX cardDataX,boolean isFallback) {
diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/DecodePackage.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/DecodePackage.java
index 25230ef..825f829 100644
--- a/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/DecodePackage.java
+++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/DecodePackage.java
@@ -353,7 +353,12 @@ public class DecodePackage {
if (outField.getLengthType() > 0) {
int varLen;
if( hostName == HostName.BPC) {
- varLen = outField.getLengthType();
+ if(outField.getFieldPos() == 55) {
+ varLen = (outField.getLengthType() + 1) / 2;
+ } else {
+ varLen = outField.getLengthType();
+ }
+
} else {
varLen = (outField.getLengthType() + 1) / 2;
}
@@ -376,7 +381,13 @@ public class DecodePackage {
int datLen;
int bcdLength = 0;
if( hostName == HostName.BPC) {
- bcdLength = Integer.parseInt(new String(varValue)); //31
+ if(outField.getFieldPos() == 55) {
+ bcdLength = Utils.bcdToint(varValue); //31
+
+ } else {
+ bcdLength = Integer.parseInt(new String(varValue)); //31
+ }
+
} else {
bcdLength = Utils.bcdToint(varValue); //31
// bcdLength = Integer.parseInt(new String(varValue)); //31
diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/EncodePackage.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/EncodePackage.java
index 727e704..e96e804 100644
--- a/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/EncodePackage.java
+++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/EncodePackage.java
@@ -233,14 +233,27 @@ public class EncodePackage {
// Data is variable length: spelling variable length values
int dataType = msgField.getDataType();
if (dataType == FieldConfig.SDK_8583_DATA_BIT) {
- byte[] varValue = (String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength()/2)).getBytes();
-// byte[] varValue = Utils.StrToBCDBytes(String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength() / 2));
+ byte[] varValue;
+ if(entry.getKey().equals("F055")) {
+ varValue = Utils.StrToBCDBytes(String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength() / 2));
+ } else {
+ varValue = (String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength()/2)).getBytes();
+ }
+
+//
System.arraycopy(varValue, 0, body, index, varValue.length);
index += varValue.length;
} else if (dataType == FieldConfig.SDK_8583_DATA_BCD) {
byte[] varValue;
- if(hostName == HostName.BPC) {
- varValue = (String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength()/2)).getBytes();
+
+
+ if(hostName == HostName.BPC ) {
+ if(msgField.getLengthType() == 4) {
+ varValue = Utils.StrToBCDBytes(String.format("%0"+msgField.getLengthType() + "d",msgField.getDataLength()));
+ } else {
+ varValue = (String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength()/2)).getBytes();
+ }
+
} else {
varValue = Utils.StrToBCDBytes(String.format("%0"+msgField.getLengthType() + "d",msgField.getDataLength()));
}
diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java
index ec557b8..674bb4d 100644
--- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java
+++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java
@@ -536,7 +536,7 @@ public abstract class BaseXPrint {
lineBreak();
} else {
- lineBreak();
+// lineBreak();
emptyLine(1);
printer.appendPrnStr(BaseErrorCode.getCode(payDetail.getTradeAnswerCode()), fontNormal, AlignEnum.CENTER,true);
emptyLine(1);
diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/transactions/TransactionsOperation.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/transactions/TransactionsOperation.java
index 80002a8..b9fd679 100644
--- a/paylibs/src/main/java/com/utsmyanmar/paylibs/transactions/TransactionsOperation.java
+++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/transactions/TransactionsOperation.java
@@ -441,10 +441,12 @@ public class TransactionsOperation {
field39 = resp.get("F039");
field55 = resp.get("F055");
- LogUtil.d(TAG,"Field 38:"+field38);
- LogUtil.d(TAG,"Field 39:"+field39);
- LogUtil.d(TAG,"Field 55:"+field55);
- emvOnlineResult.setAuthCode(field38.getDataStr());
+ if(equals)
+ LogUtil.d(TAG,"Field 38:"+field38.getDataStr());
+ LogUtil.d(TAG,"Field 39:"+field39.getDataStr());
+ LogUtil.d(TAG,"Field 55:"+field55.getDataStr());
+ if(equals)
+ emvOnlineResult.setAuthCode(field38.getDataStr());
emvOnlineResult.setRejCode(field39.getDataStr());
emvOnlineResult.setRecvField55(ByteUtil.hexStr2Bytes(field55.getDataStr()));
}
diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/FieldConfig.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/FieldConfig.java
index f1edc7b..1d1d8df 100644
--- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/FieldConfig.java
+++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/FieldConfig.java
@@ -108,8 +108,8 @@ public class FieldConfig {
/* FLD 53 */ {2, SDK_8583_LEN_ASC, 32, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
/* FLD 54 */ {3, SDK_8583_LEN_BCD, 40, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '},
-// /* FLD 55 */ {3, SDK_8583_LEN_ASC, 255, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, '0'},
- /* FLD 55 */ {4, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, '0'},
+ /* FLD 55 */ {3, SDK_8583_LEN_ASC, 255, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, '0'},
+// /* FLD 55 */ {4, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, '0'},
/* FLD 56 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
// /* FLD 57 */ {3, SDK_8583_LEN_BCD, 999, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'},
diff --git a/paylibs/src/test/java/com/utsmyanmar/paylibs/ExampleUnitTest.java b/paylibs/src/test/java/com/utsmyanmar/paylibs/ExampleUnitTest.java
index f8aae8d..977e0be 100644
--- a/paylibs/src/test/java/com/utsmyanmar/paylibs/ExampleUnitTest.java
+++ b/paylibs/src/test/java/com/utsmyanmar/paylibs/ExampleUnitTest.java
@@ -4,7 +4,10 @@ import org.junit.Test;
import static org.junit.Assert.*;
+import com.utsmyanmar.paylibs.model.MsgField;
import com.utsmyanmar.paylibs.print.PrintUtils;
+import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil;
+import com.utsmyanmar.paylibs.utils.core_utils.Utils;
/**
* Example local unit test, which will execute on the development machine (host).
@@ -25,5 +28,12 @@ public class ExampleUnitTest {
String converted = PrintUtils.getInstance().getSeparatorOnlyNumberFormat(num);
System.out.println("Converted Number: " + converted);
+
+ MsgField msgField = new MsgField();
+ msgField.setLengthType(4);
+ msgField.setDataLength(255);
+ byte[] res = Utils.StrToBCDBytes(String.format("%0"+msgField.getLengthType() + "d",msgField.getDataLength()));
+
+ System.out.println("result : "+ ByteUtil.bytes2HexStr(res));
}
}
\ No newline at end of file