diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/pinpad/PinPadViewModel.kt b/app/src/main/java/com/mob/utsmyanmar/ui/pinpad/PinPadViewModel.kt index 8914840..e1fec34 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/pinpad/PinPadViewModel.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/pinpad/PinPadViewModel.kt @@ -8,6 +8,7 @@ import android.view.View import android.view.ViewTreeObserver import android.widget.TextView import androidx.lifecycle.ViewModel +import com.kizzy.cmhl.utils.ByteUtils import com.mob.utsmyanmar.config.Constants import com.mob.utsmyanmar.config.SunmiPayManager import com.mob.utsmyanmar.model.PinPadStatus @@ -554,10 +555,13 @@ class PinPadViewModel @Inject constructor( private fun getPanBytes(pan: String): ByteArray { + LogUtil.d(TAG,"pan : $pan") if (pan.length < 13) { return ByteArray(0) } - + LogUtil.d(TAG,"pan bytes : ${ByteUtils.byteArrayToHexString(pan + .substring(pan.length - 13, pan.length - 1) + .toByteArray(StandardCharsets.US_ASCII))}") return pan .substring(pan.length - 13, pan.length - 1) .toByteArray(StandardCharsets.US_ASCII) diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostRoute.kt b/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostRoute.kt index 15a0619..ff5d20e 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostRoute.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostRoute.kt @@ -52,7 +52,7 @@ fun ProcessingRoute( } } else { LaunchedEffect(Unit) { - transProcessViewModel.resetTransactionStatus() +// transProcessViewModel.resetTransactionStatus() transProcessViewModel.startOnlineProcess() } diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/settlement/SettlementViewModel.kt b/app/src/main/java/com/mob/utsmyanmar/ui/settlement/SettlementViewModel.kt index d9f0f90..236edc3 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/settlement/SettlementViewModel.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/settlement/SettlementViewModel.kt @@ -341,6 +341,11 @@ class SettlementViewModel @Inject constructor( currentPayDetail.settleData = settlementData currentPayDetail.amount = totalAmount } else { + + LogUtil.d(TAG,"sale count :$totalSaleCount") + LogUtil.d(TAG,"sale amount :$totalSaleAmount") + LogUtil.d(TAG,"refund count :$totalRefundCount") + LogUtil.d(TAG,"refund amount :$totalRefundAmount") currentPayDetail.settleData = totalSaleCount + totalSaleAmount + diff --git a/app/src/main/java/com/mob/utsmyanmar/utils/MockCard.kt b/app/src/main/java/com/mob/utsmyanmar/utils/MockCard.kt index 043ce7b..43047d1 100644 --- a/app/src/main/java/com/mob/utsmyanmar/utils/MockCard.kt +++ b/app/src/main/java/com/mob/utsmyanmar/utils/MockCard.kt @@ -30,6 +30,7 @@ object MockData { // iccData="9503220100322798=300110100000942" // ) + //debit private val mockCardData: MockCardData = MockCardData( cardNo="9503032443884321", expDate="3102", @@ -38,6 +39,14 @@ object MockData { iccData="9503032443884321=310220100" ) +// private val mockCardData: MockCardData = MockCardData( +// cardNo="6244310039574344", +// expDate="3011", +// cardScheme="MPU", +// cardHolderName="Htin Kyaw Win", +// iccData="6244310039574344=30112011558125900000" +// ) + fun generateMPUCard(): CardDataX = CardDataX().apply { pan = mockCardData.cardNo exp = mockCardData.expDate diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java index be0ca8c..3d295b6 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java @@ -29,7 +29,8 @@ public final class TerminalKeyUtil { SecurityOptV2 mSecurityOptV2 = BaseApplication.getInstance().mSecurityOptV2; byte[] cvByte = ByteUtil.hexStr2Bytes("B7B520"); // byte[] dataByte = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // mpu - byte[] dataByte = ByteUtil.hexStr2Bytes("05FFB893726A5F1E59692D24E72E36AC"); +// byte[] dataByte = ByteUtil.hexStr2Bytes("05FFB893726A5F1E59692D24E72E36AC"); + byte[] dataByte = ByteUtil.hexStr2Bytes("DB7887664E3A06873342B753171896B1"); byte[] makBytes = ByteUtil.hexStr2Bytes("250738083EC15BD3BA67D66B8A7AA13B"); // byte[] makCvBytes = ByteUtil.hexStr2Bytes("204E449B97"); @@ -47,11 +48,11 @@ public final class TerminalKeyUtil { int result = 0; SystemParamsOperation.getInstance().setTMKIndex("9"); -// SystemParamsOperation.getInstance().setInjectOnce(false); + SystemParamsOperation.getInstance().setInjectOnce(false); if(!SystemParamsOperation.getInstance().isInjectOnce()) { try { // result = mSecurityOptV2.saveKeyDukpt(AidlConstantsV2.Security.KEY_TYPE_DUPKT_IPEK,IPEKByte,IPEKKCVByte,KSNByte,AidlConstantsV2.Security.KEY_ALG_TYPE_3DES,9); - result = mSecurityOptV2.savePlaintextKey(AidlConstantsV2.Security.KEY_TYPE_TMK,dataByte,cvByte,AidlConstantsV2.Security.KEY_ALG_TYPE_3DES,9); + result = mSecurityOptV2.savePlaintextKey(AidlConstantsV2.Security.KEY_TYPE_TMK,dataByte,null,AidlConstantsV2.Security.KEY_ALG_TYPE_3DES,9); LogUtil.d(ContentValues.TAG, "save TMK result:" + result); if (result != 0) { LogUtil.d(TAG, "save TMK fail"); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/batch_upload/BatchUploadProcess.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/batch_upload/BatchUploadProcess.java index 2611391..66c4a70 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/batch_upload/BatchUploadProcess.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/batch_upload/BatchUploadProcess.java @@ -42,7 +42,7 @@ public class BatchUploadProcess { } private BatchUploadProcess() { - isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.BOTH_HEADER_TPDU,HostName.BPC) + isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.ONLY_HEADER,HostName.CARDZONE) .build(); } @@ -78,7 +78,7 @@ public class BatchUploadProcess { public void startBatchUpload(BatchListener batchListener) { HostName hostName = HostName.BPC; LogUtil.d(TAG, "Starting Batch Upload"); - byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.BPC_BATCH_UPLOAD, MessageType.BATCH_UPLOAD); + byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.CZ_BATCH_UPLOAD, MessageType.BATCH_UPLOAD); ISOSocket.getInstance().enqueue(sendBytes, sendBytes.length,false, new ISOCallback() { @Override public void onReceive(byte[] bytes, int length) { 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 64c0894..32ae247 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/DecodePackage.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/DecodePackage.java @@ -409,7 +409,8 @@ public class DecodePackage { if(hostName == HostName.BPC) { System.arraycopy(body, tmpLen, nextData, 0, datLen); } else { - System.arraycopy(body, tmpLen, nextData, 0, body.length-tmpLen); +// System.arraycopy(body, tmpLen, nextData, 0, body.length-tmpLen); + System.arraycopy(body, tmpLen, nextData, 0, datLen); } // 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 537b932..ac45800 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/EncodePackage.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/EncodePackage.java @@ -280,6 +280,7 @@ public class EncodePackage { System.arraycopy(fieldBody.getBytes(StandardCharsets.ISO_8859_1), 0, body, index, fieldBody.length()); index += fieldBody.length(); } else { + // MPU String fieldHead = msgField.getDataStr().substring(0,4); int bcdLen = (fieldHead.length() / 2) + (fieldHead.length() % 2); byte dat[] = new byte[bcdLen]; diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/builderx/ISOMsgX.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/builderx/ISOMsgX.java index 4cd0c31..bd7c630 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/builderx/ISOMsgX.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/isobuilder/builderx/ISOMsgX.java @@ -106,6 +106,9 @@ public class ISOMsgX extends BaseISOMsgX{ MTI = "0400"; // MTI = "0420"; break; + case CZ_REVERSAL: + MTI = "0420"; + break; case NETWORK_MANAGEMENT: MTI = "0800"; break; diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/network/ISOSocket.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/network/ISOSocket.java index 9f5d0cc..879082c 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/network/ISOSocket.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/network/ISOSocket.java @@ -356,11 +356,7 @@ public class ISOSocket { reversalSwitchFlag = SystemParamsOperation.getInstance().isReversalOn(); if (reversalSwitchFlag) { - if (reversalTrans) { - reversalTestCaseFlag = true; - } else { - reversalTestCaseFlag = false; - } + reversalTestCaseFlag = reversalTrans; } else { reversalTestCaseFlag = true; } diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java index a7dfafc..b51dddf 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java @@ -58,14 +58,14 @@ public class PrintXImpl extends BaseXPrint implements PrintX { opts.inJustDecodeBounds = true; // Step 1: Only read dimensions first - BitmapFactory.decodeResource(resources, R.drawable.print_logo_mpu, opts); + BitmapFactory.decodeResource(resources, R.drawable.mob_print_logo, opts); // Step 2: Calculate sample size so width <= 384px opts.inSampleSize = calculateInSampleSize(opts, 384, 384); opts.inJustDecodeBounds = false; // Step 3: Decode scaled-down bitmap - bitmap = BitmapFactory.decodeResource(resources, R.drawable.print_logo_mpu, opts); + bitmap = BitmapFactory.decodeResource(resources, R.drawable.mob_print_logo, opts); } @Override diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/reversal/ReversalAction.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/reversal/ReversalAction.java index 3060ccd..3588fda 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/reversal/ReversalAction.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/reversal/ReversalAction.java @@ -50,14 +50,14 @@ public class ReversalAction { } private ReversalAction() { - isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.ONLY_HEADER,HostName.FINEXUS) + isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.ONLY_HEADER,HostName.CARDZONE) .build(); } public ReversalAction setData(TradeData tradeData) { this.tradeData = tradeData; payDetail = tradeData.getPayDetail(); - payDetail.setTransactionType(TransactionType.REVERSAL); + payDetail.setTransactionType(TransactionsType.REVERSAL.value); // payDetail.setTransType(REVERSAL); if (TextUtils.equals(payDetail.getAccountType(), MPU)) { BITMAP = getBitmapMPU(payDetail); @@ -129,7 +129,7 @@ public class ReversalAction { public void startReversal(ReversalListener reversalListener) { HostName hostName = HostName.BPC; LogUtil.d(TAG, "Starting Reversal...."); - byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.MPU_NEW_REVERSAL, MessageType.REVERSAL); + byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.CZ_REVERSAL, MessageType.CZ_REVERSAL); // byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.BPC_AUTOMATIC_REVERSAL, MessageType.REVERSAL); ISOSocket.getInstance().enqueue(sendBytes, sendBytes.length,true, new ISOCallback() { @Override diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/MessageType.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/MessageType.java index 8873087..c1220d9 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/MessageType.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/MessageType.java @@ -5,6 +5,7 @@ public enum MessageType { AUTHORIZATION, AUTHORIZATION_COMPLETE, REVERSAL, + CZ_REVERSAL, NETWORK_MANAGEMENT, TC_ADVICE, BATCH_UPLOAD, diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/host_utils/HostUtils.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/host_utils/HostUtils.java index 3e4ca4f..04499bc 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/host_utils/HostUtils.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/host_utils/HostUtils.java @@ -86,7 +86,7 @@ public class HostUtils { if (hostName == HostName.MPU) { bitmap = BitmapConfig.MPU_NEW_REFUND; } else { - bitmap = BitmapConfig.CZ_SALE; + bitmap = BitmapConfig.CZ_REFUND; } break; case TIP_ADJUSTMENT: diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/BitmapConfig.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/BitmapConfig.java index dcb8b89..db99191 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/BitmapConfig.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/BitmapConfig.java @@ -193,7 +193,10 @@ public class BitmapConfig { public static final String MPU_NEW_CASH_ADVANCE="7020058020C09000"; public static final String CZ_SALE="7020058020C09000"; - public static final String CZ_VOID="723805802CC08010"; + public static final String CZ_VOID="7038058008C08010"; + public static final String CZ_REFUND="703C058008C08000"; + public static final String CZ_REVERSAL="7020078000C08000"; + public static final String CZ_BATCH_UPLOAD="703805800CC00010"; public static final String UPI_SALE = "7020058020C09200"; diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/FieldUtils.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/FieldUtils.java index 0bf2ddb..d84bc0b 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/FieldUtils.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/FieldUtils.java @@ -361,7 +361,7 @@ public class FieldUtils { // } else { // iterator.remove(); // } - field.setDataStr("001"); + field.setDataStr("000"); break; case 24: //Network International Identifier NII @@ -379,8 +379,9 @@ public class FieldUtils { if (payDetail.getTransactionType() == PRE_AUTH_SALE.value) { field.setDataStr("06"); } - else if(payDetail.getTransactionType() == REFUND.value) { - field.setDataStr("00"); // MPU + else if(payDetail.getTransactionType() == REFUND.value || payDetail.getTransactionType() == REVERSAL.value) { +// field.setDataStr("00"); // MPU + field.setDataStr("61"); // CZ } else if(payDetail.getCardType() == -1) { field.setDataStr("08"); } @@ -506,12 +507,16 @@ public class FieldUtils { break; case 60: //Private(oldMPU) //original Amount Void(new MPU) - +// String field60 = tradeData.getField60(); String lengthValue = String.format(Locale.getDefault(),"%04d", field60.length())+field60; field.setDataStr(lengthValue); + // for CardZone +// String field60 = tradeData.getField60(); +// String lengthValue = String.format(Locale.getDefault(),"%04d", field60.length())+field60; +// field.setDataStr(field60); break; case 61: // TODO @@ -538,7 +543,9 @@ public class FieldUtils { break; case 63: //Private Use String settleData = payDetail.getSettleData(); - field.setDataStr(settleData); + String settleValue = String.format(Locale.getDefault(),"%04d", settleData.length())+settleData; + field.setDataStr(settleValue); +// field.setDataStr(settleData); break; case 64: //Message Authentication Code (MAC) Required when the 39 field in the response message is "00" field.setDataStr("0000000000000000"); diff --git a/paylibs/src/main/res/drawable/mob_print_logo.jpeg b/paylibs/src/main/res/drawable/mob_print_logo.jpeg new file mode 100644 index 0000000..c5557f2 Binary files /dev/null and b/paylibs/src/main/res/drawable/mob_print_logo.jpeg differ