sign on and sale work now

This commit is contained in:
kizzy 2026-05-25 23:11:26 +07:00
parent 5e2cfa3821
commit f80c7c5d1b
16 changed files with 148 additions and 70 deletions

View File

@ -351,9 +351,11 @@ fun AppNavGraph(
composable(Routes.Processing.route) { composable(Routes.Processing.route) {
val sharedViewModel: SharedViewModel = hiltViewModel(activity) val sharedViewModel: SharedViewModel = hiltViewModel(activity)
val transProcessViewModel: TransProcessViewModel = hiltViewModel(activity)
ProcessingRoute( ProcessingRoute(
sharedViewModel = sharedViewModel, sharedViewModel = sharedViewModel,
transProcessViewModel = transProcessViewModel,
onNavigateTransactionResult = { onNavigateTransactionResult = {
navController.navigate(Routes.TransactionResult.route) { navController.navigate(Routes.TransactionResult.route) {
popUpTo(Routes.Processing.route) { popUpTo(Routes.Processing.route) {

View File

@ -58,7 +58,7 @@ class PinPadViewModel @Inject constructor(
private var mCancelCoordinate = intArrayOf(0, 48) private var mCancelCoordinate = intArrayOf(0, 48)
private var dukptIndex = 0 private var dukptIndex = 0
private var tmkIndex = 9 private var tmkIndex = 9
private val PIK_INDEX = 1 private val PIK_INDEX = 11
private var tradeData: TradeData? = null private var tradeData: TradeData? = null
private var payDetail: PayDetail? = null private var payDetail: PayDetail? = null
private var pan: String = "" private var pan: String = ""
@ -145,7 +145,7 @@ class PinPadViewModel @Inject constructor(
return return
} }
initData() initData()
testInjectPIK() // testInjectPIK()
initPinPad(customPinPadKeyboard) initPinPad(customPinPadKeyboard)
} }
@ -210,7 +210,7 @@ class PinPadViewModel @Inject constructor(
maxInput = 6 maxInput = 6
minInput = 0 minInput = 0
pinPadType = 1 // custom keyboard pinPadType = 1 // custom keyboard
algorithmType = AidlConstants.Security.KEY_ALG_TYPE_3DES algorithmType = 0
pinType = mPinType pinType = mPinType
this.timeout = timeout * 1000 this.timeout = timeout * 1000
isOrderNumKey = pinPadOrder isOrderNumKey = pinPadOrder
@ -461,9 +461,10 @@ class PinPadViewModel @Inject constructor(
status: Int, status: Int,
pinBlock: ByteArray? pinBlock: ByteArray?
) { ) {
LogUtil.e( LogUtil.e(
TAG, TAG,
"onConfirm status:$status" "onConfirm status:$status and pinblock :${ByteUtil.bytes2HexStr(pinBlock)}"
) )
if (status != PIN_CONFIRM_SUCCESS_STATUS) { if (status != PIN_CONFIRM_SUCCESS_STATUS) {
_alertMsg.value = "PinPad confirm failed: $status" _alertMsg.value = "PinPad confirm failed: $status"

View File

@ -2,20 +2,43 @@ package com.mob.utsmyanmar.ui.sending_to_host
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.mob.utsmyanmar.model.TransResultStatus
import com.mob.utsmyanmar.viewmodel.SharedViewModel import com.mob.utsmyanmar.viewmodel.SharedViewModel
import com.mob.utsmyanmar.viewmodel.TransProcessViewModel
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import androidx.compose.runtime.getValue
import com.mob.utsmyanmar.viewmodel.ProcessingTransaction
private const val MOCK_HOST_DELAY_MS = 2000L private const val MOCK_HOST_DELAY_MS = 2000L
@Composable @Composable
fun ProcessingRoute( fun ProcessingRoute(
sharedViewModel: SharedViewModel, sharedViewModel: SharedViewModel,
transProcessViewModel: TransProcessViewModel,
onNavigateTransactionResult: () -> Unit onNavigateTransactionResult: () -> Unit
) { ) {
val transStatus by transProcessViewModel.transResultStatus.collectAsStateWithLifecycle()
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
sharedViewModel.saveMockHostResultForTesting() transProcessViewModel.startOnlineProcess()
delay(MOCK_HOST_DELAY_MS) }
onNavigateTransactionResult() LaunchedEffect(transStatus) {
// sharedViewModel.saveMockHostResultForTesting()
// delay(MOCK_HOST_DELAY_MS)
when(transStatus) {
TransResultStatus.SUCCESS -> onNavigateTransactionResult()
TransResultStatus.FAIL -> onNavigateTransactionResult()
else -> {}
}
} }
ProcessingScreen() ProcessingScreen()

View File

@ -47,10 +47,11 @@ public final class TerminalKeyUtil {
if(!SystemParamsOperation.getInstance().isInjectOnce()) { if(!SystemParamsOperation.getInstance().isInjectOnce()) {
try { try {
result = mSecurityOptV2.saveKeyDukpt(AidlConstantsV2.Security.KEY_TYPE_DUPKT_IPEK,IPEKByte,IPEKKCVByte,KSNByte,AidlConstantsV2.Security.KEY_ALG_TYPE_3DES,9); // result = mSecurityOptV2.saveKeyDukpt(AidlConstantsV2.Security.KEY_TYPE_DUPKT_IPEK,IPEKByte,IPEKKCVByte,KSNByte,AidlConstantsV2.Security.KEY_ALG_TYPE_3DES,9);
LogUtil.d(ContentValues.TAG, "save IPEK result:" + result); result = mSecurityOptV2.savePlaintextKey(AidlConstantsV2.Security.KEY_TYPE_TMK,IPEKByte,IPEKKCVByte,AidlConstantsV2.Security.KEY_ALG_TYPE_3DES,9);
LogUtil.d(ContentValues.TAG, "save TMK result:" + result);
if (result != 0) { if (result != 0) {
LogUtil.d(TAG, "save IPEK fail"); LogUtil.d(TAG, "save TMK fail");
} else { } else {
SystemParamsOperation.getInstance().setInjectOnce(true); SystemParamsOperation.getInstance().setInjectOnce(true);
} }

View File

@ -197,8 +197,8 @@ public class DecodePackage {
//tmp len 55 //tmp len 55
try { try {
System.arraycopy(body, tmpLen, nextData, 0, datLen); // System.arraycopy(body, tmpLen, nextData, 0, datLen); 25/May/2026
// System.arraycopy(body, tmpLen, nextData, 0, body.length-tmpLen); System.arraycopy(body, tmpLen, nextData, 0, body.length-tmpLen);
} catch (IndexOutOfBoundsException e){ } catch (IndexOutOfBoundsException e){
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -16,13 +16,16 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import sunmi.sunmiui.utils.LogUtil; import sunmi.sunmiui.utils.LogUtil;
/** /**
* Package * Package with MPU certification ready.
*/ */
public class EncodePackage { public class EncodePackage {
public static Map<String, MsgField> preAssemblyBase(String bitmapHexString,HostName hostName) { public static Map<String, MsgField> preAssemblyBase(String bitmapHexString,HostName hostName) {
int [][] fieldTypeViaHost = hostName == HostName.BPC ? FieldConfig.FieldTypeConfig128 : FieldConfig.FieldTypeConfigV1; int [][] fieldTypeViaHost = hostName == HostName.BPC ? FieldConfig.FieldTypeConfig128 : FieldConfig.FieldTypeConfigV1;
return preAssembly(bitmapHexString, fieldTypeViaHost ); return preAssembly(bitmapHexString, fieldTypeViaHost );
@ -137,7 +140,12 @@ public class EncodePackage {
if (fieldDataType == FieldConfig.SDK_8583_DATA_BCD) { if (fieldDataType == FieldConfig.SDK_8583_DATA_BCD) {
if (msgField.getLengthType() > 0) { if (msgField.getLengthType() > 0) {
// F035 enter into this step // F035 enter into this step
len += msgField.getLengthType() + ( msgField.getDataLength() / 2); // len += msgField.getLengthType() + ( msgField.getDataLength() / 2);
if(hostName == HostName.BPC) {
len += msgField.getLengthType() + ( msgField.getDataLength() / 2);
} else {
len += (msgField.getLengthType() + 1) / 2 + (msgField.getDataLength() / 2) + (msgField.getDataLength() % 2);
}
// len += (msgField.getLengthType() + 1) / 2 + (msgField.getDataLength() / 2) + (msgField.getDataLength() % 2); // len += (msgField.getLengthType() + 1) / 2 + (msgField.getDataLength() / 2) + (msgField.getDataLength() % 2);
} else { } else {
len += (msgField.getDataLength() / 2) + (msgField.getDataLength() % 2); len += (msgField.getDataLength() / 2) + (msgField.getDataLength() % 2);
@ -146,7 +154,12 @@ public class EncodePackage {
if (msgField.getLengthType() > 0) { if (msgField.getLengthType() > 0) {
// commended at Oct4 , 2023 ( for BPC DE55) // commended at Oct4 , 2023 ( for BPC DE55)
// len += (msgField.getLengthType() + 1) / 2 + (msgField.getDataLength() / 2); // len += (msgField.getLengthType() + 1) / 2 + (msgField.getDataLength() / 2);
len += msgField.getLengthType() + (msgField.getDataLength() / 2); if(hostName == HostName.BPC) {
len += msgField.getLengthType() + (msgField.getDataLength() / 2);
} else {
len += (msgField.getLengthType() + 1) / 2 + (msgField.getDataLength() / 2);
}
} else { } else {
len += msgField.getDataLength(); len += msgField.getDataLength();
@ -156,8 +169,14 @@ public class EncodePackage {
// 12:51pm jan 26 / 21 comment switch cuz of getting error at field 57 // 12:51pm jan 26 / 21 comment switch cuz of getting error at field 57
// fixing bcd ASCII length odd number eg.3 // fixing bcd ASCII length odd number eg.3
// need to fix this one later for field 62 // need to fix this one later for field 62
if(hostName == HostName.BPC) {
len += msgField.getLengthType() + msgField.getDataLength();
} else {
// len += (msgField.getLengthType() + 1) / 2 + msgField.getDataLength(); // Nov19,2025
len += msgField.getDataLength();
}
// len += (msgField.getLengthType() + 1) / 2 + msgField.getDataLength(); // len += (msgField.getLengthType() + 1) / 2 + msgField.getDataLength();
len += msgField.getLengthType() + msgField.getDataLength(); // len += msgField.getLengthType() + msgField.getDataLength();
// msgField.getLengthType() => 2 // msgField.getLengthType() => 2
// len+=msgField.getDataLength()-msgField.getLengthType(); // len+=msgField.getDataLength()-msgField.getLengthType();
@ -220,7 +239,13 @@ public class EncodePackage {
System.arraycopy(varValue, 0, body, index, varValue.length); System.arraycopy(varValue, 0, body, index, varValue.length);
index += varValue.length; index += varValue.length;
} else if (dataType == FieldConfig.SDK_8583_DATA_BCD) { } else if (dataType == FieldConfig.SDK_8583_DATA_BCD) {
byte[] varValue = (String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength()/2)).getBytes(); byte[] varValue;
if(hostName == HostName.BPC) {
varValue = (String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength()/2)).getBytes();
} else {
varValue = Utils.StrToBCDBytes(String.format("%0"+msgField.getLengthType() + "d",msgField.getDataLength()));
}
// byte[] varValue = (String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength()/2)).getBytes();
// byte[] varValue = Utils.StrToBCDBytes(String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength())); // byte[] varValue = Utils.StrToBCDBytes(String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength()));
System.arraycopy(varValue, 0, body, index, varValue.length); System.arraycopy(varValue, 0, body, index, varValue.length);
index += varValue.length; index += varValue.length;
@ -230,12 +255,15 @@ public class EncodePackage {
// System.arraycopy(ByteUtil.bytes2HexStr(varValue).getBytes(), 0, body, index, varValue.length); // System.arraycopy(ByteUtil.bytes2HexStr(varValue).getBytes(), 0, body, index, varValue.length);
/* /*
* for Smart Vista >>>>>>> Aug 29 , 2023 <<<<<<<< * for Smart Vista >>>>>>> Aug 29 , 2023 <<<<<<<<
* */ * */
if(hostName == HostName.BPC) {
byte[] varValue = (String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength())).getBytes();
System.arraycopy(varValue, 0, body, index, varValue.length);
index += varValue.length;
}
byte[] varValue = (String.format("%0" + msgField.getLengthType() + "d", msgField.getDataLength())).getBytes();
System.arraycopy(varValue, 0, body, index, varValue.length);
index += varValue.length;
} }
} }
LogUtil.d(Constant.TAG, "Pack Field[" + msgField.getFieldPos() + "]: " + msgField.getDataStr()); LogUtil.d(Constant.TAG, "Pack Field[" + msgField.getFieldPos() + "]: " + msgField.getDataStr());
@ -246,27 +274,40 @@ public class EncodePackage {
if (msgField.getDataType() == FieldConfig.SDK_8583_DATA_ASC) { if (msgField.getDataType() == FieldConfig.SDK_8583_DATA_ASC) {
if (msgField.getLengthType() == 2) { if (msgField.getLengthType() == 2) {
/* Field 60 issue with TTIP*/ /* Field 60 issue with TTIP*/
/* String fieldHead = msgField.getDataStr().substring(0,4);
int bcdLen = (fieldHead.length() / 2) + (fieldHead.length() % 2);
byte dat[] = new byte[bcdLen];
Utils.BCDEncode(fieldHead, dat, msgField.getAlignType(), msgField.getFillChar());
System.arraycopy(dat, 0, body, index, bcdLen);
index += bcdLen;
String fieldBody=msgField.getDataStr().substring(4,msgField.getDataLength());
*/
String fieldBody = msgField.getDataStr(); if(hostName == HostName.BPC) {
System.arraycopy(fieldBody.getBytes(StandardCharsets.ISO_8859_1), 0, body, index, fieldBody.length()); String fieldBody = msgField.getDataStr();
index += fieldBody.length(); System.arraycopy(fieldBody.getBytes(StandardCharsets.ISO_8859_1), 0, body, index, fieldBody.length());
index += fieldBody.length();
} else {
String fieldHead = msgField.getDataStr().substring(0,4);
int bcdLen = (fieldHead.length() / 2) + (fieldHead.length() % 2);
byte dat[] = new byte[bcdLen];
Utils.BCDEncode(fieldHead, dat, msgField.getAlignType(), msgField.getFillChar());
System.arraycopy(dat, 0, body, index, bcdLen);
index += bcdLen;
String fieldBody = msgField.getDataStr().substring(4,msgField.getDataLength());
System.arraycopy(fieldBody.getBytes(StandardCharsets.ISO_8859_1), 0, body, index, fieldBody.length());
LogUtil.d(Constant.TAG,"fieldBody : "+fieldBody);
index += fieldBody.length();
}
} else { } else {
LogUtil.d(Constant.TAG, " msgField ------ " + entry.getKey()); LogUtil.d(Constant.TAG, " msgField ------ " + entry.getKey());
try {
if(hostName == HostName.BPC) {
try {
System.arraycopy(msgField.getDataStr().getBytes(StandardCharsets.ISO_8859_1), 0, body, index, msgField.getDataLength());
index += msgField.getDataLength();
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
} else {
System.arraycopy(msgField.getDataStr().getBytes(StandardCharsets.ISO_8859_1), 0, body, index, msgField.getDataLength()); System.arraycopy(msgField.getDataStr().getBytes(StandardCharsets.ISO_8859_1), 0, body, index, msgField.getDataLength());
index += msgField.getDataLength(); index += msgField.getDataLength();
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
} }
} }
// try { // try {
// LogUtil.d(Constant.TAG, " msgField ------ " + entry.getKey()); // LogUtil.d(Constant.TAG, " msgField ------ " + entry.getKey());

View File

@ -329,8 +329,10 @@ public class ISOSocket {
public void switchIp() { public void switchIp() {
isSwitchIp = true; isSwitchIp = true;
serverIP = getSecondaryIp(); serverIP = "192.168.0.107";
serverPort = getSecondaryPort(); serverPort = 5001;
// serverIP = getSecondaryIp();
// serverPort = getSecondaryPort();
} }
public void enqueue(byte[] sendBuff, int sendLen, boolean reversalTrans, ISOCallback listener) { public void enqueue(byte[] sendBuff, int sendLen, boolean reversalTrans, ISOCallback listener) {
@ -351,7 +353,7 @@ public class ISOSocket {
// serverPort = getPort(); // serverPort = getPort();
// serverIP = "posuat.myanmarorientalbank.com"; // serverIP = "posuat.myanmarorientalbank.com";
// serverPort = 5033; // serverPort = 5033;
serverIP = "192.168.100.2"; serverIP = "192.168.0.107";
serverPort = 5001; serverPort = 5001;
} else { } else {
isSwitchIp = false; isSwitchIp = false;

View File

@ -50,7 +50,7 @@ public class SignOnProcess {
private SignOnProcess() { private SignOnProcess() {
tradeData = Params.newTrade(true); tradeData = Params.newTrade(true);
// payDetail = tradeData.getPayDetail(); // payDetail = tradeData.getPayDetail();
isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.BOTH_HEADER_TPDU,HostName.BPC) isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.BOTH_HEADER_TPDU,HostName.CARDZONE)
.build(); .build();
} }
@ -65,9 +65,9 @@ public class SignOnProcess {
payDetail.setProcessCode(TransactionsType.SIGN_ON.processCode); payDetail.setProcessCode(TransactionsType.SIGN_ON.processCode);
payDetail.setTransType(TransactionsType.SIGN_ON.name); payDetail.setTransType(TransactionsType.SIGN_ON.name);
payDetail.setTransactionType(TransactionsType.SIGN_ON.value); payDetail.setTransactionType(TransactionsType.SIGN_ON.value);
payDetail.setHostName(HostName.CARDZONE.name);
byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.CZ_SIGN_ON, MessageType.NETWORK_MANAGEMENT);
byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.BPC_SIGN_ON, MessageType.NETWORK_MANAGEMENT);
ISOSocket.getInstance().enqueue(sendBytes, sendBytes.length,false, new ISOCallback() { ISOSocket.getInstance().enqueue(sendBytes, sendBytes.length,false, new ISOCallback() {
@Override @Override
public void onReceive(byte[] bytes, int length) { public void onReceive(byte[] bytes, int length) {
@ -100,6 +100,7 @@ public class SignOnProcess {
if (!TextUtils.equals(SystemParamsOperation.getInstance().getTMKIndex(), "")) { if (!TextUtils.equals(SystemParamsOperation.getInstance().getTMKIndex(), "")) {
tmkIndex = Integer.parseInt(SystemParamsOperation.getInstance().getTMKIndex()); tmkIndex = Integer.parseInt(SystemParamsOperation.getInstance().getTMKIndex());
} }
LogUtil.d(TAG, "TMK Index:" + tmkIndex); LogUtil.d(TAG, "TMK Index:" + tmkIndex);
int res = PayLibsUtils.getInstance().securityOptV2.saveCiphertextKey(AidlConstantsV2.Security.KEY_TYPE_PIK, encryptedPIK, null, tmkIndex, AidlConstantsV2.Security.KEY_ALG_TYPE_3DES, 11); int res = PayLibsUtils.getInstance().securityOptV2.saveCiphertextKey(AidlConstantsV2.Security.KEY_TYPE_PIK, encryptedPIK, null, tmkIndex, AidlConstantsV2.Security.KEY_ALG_TYPE_3DES, 11);
resultCode = res; resultCode = res;

View File

@ -28,7 +28,7 @@ public class SystemParamsSettings implements Serializable {
private String comp2 = "9D4FEF8C75DAE3FDBCD3BF899E196E20"; private String comp2 = "9D4FEF8C75DAE3FDBCD3BF899E196E20";
private String tmkIndex = "15"; private String tmkIndex = "9";
private String hostResponseTimeout = ""; private String hostResponseTimeout = "";

View File

@ -2,7 +2,8 @@ package com.utsmyanmar.paylibs.utils.enums;
public enum HostName { public enum HostName {
BPC("BPC"), BPC("BPC"),
FINEXUS("FINEXUS"); FINEXUS("FINEXUS"),
CARDZONE("CARDZONE");
public final String name; public final String name;

View File

@ -29,14 +29,14 @@ public class HostUtils {
if (hostName == HostName.BPC){ if (hostName == HostName.BPC){
bitmap = BitmapConfig.BPC_SALE; bitmap = BitmapConfig.BPC_SALE;
} else { } else {
bitmap = BitmapConfig.FINEXUS_SALE; bitmap = BitmapConfig.CZ_SALE;
} }
break; break;
case CASH_OUT: case CASH_OUT:
if (hostName == HostName.BPC) { if (hostName == HostName.BPC) {
bitmap = BitmapConfig.BPC_SALE; bitmap = BitmapConfig.BPC_SALE;
} else { } else {
bitmap = BitmapConfig.FINEXUS_SALE; bitmap = BitmapConfig.CZ_SALE;
} }
break; break;
case VOID: case VOID:
@ -69,14 +69,14 @@ public class HostUtils {
if (hostName == HostName.BPC) { if (hostName == HostName.BPC) {
bitmap = BitmapConfig.BPC_PRE_AUTH_SALE_VOID_REVERSAL; bitmap = BitmapConfig.BPC_PRE_AUTH_SALE_VOID_REVERSAL;
} else { } else {
bitmap = BitmapConfig.FINEXUS_SALE; bitmap = BitmapConfig.CZ_SALE;
} }
break; break;
case PRE_AUTH_COMPLETE: case PRE_AUTH_COMPLETE:
if (hostName == HostName.BPC) { if (hostName == HostName.BPC) {
bitmap = BitmapConfig.BPC_PRE_AUTH_SALE_COMPLETE; bitmap = BitmapConfig.BPC_PRE_AUTH_SALE_COMPLETE;
} else { } else {
bitmap = BitmapConfig.FINEXUS_SALE; bitmap = BitmapConfig.CZ_SALE;
} }
break; break;
case PRE_AUTH_COMPLETE_VOID: case PRE_AUTH_COMPLETE_VOID:
@ -90,14 +90,14 @@ public class HostUtils {
if (hostName == HostName.BPC) { if (hostName == HostName.BPC) {
bitmap = BitmapConfig.BPC_REFUND; bitmap = BitmapConfig.BPC_REFUND;
} else { } else {
bitmap = BitmapConfig.FINEXUS_SALE; bitmap = BitmapConfig.CZ_SALE;
} }
break; break;
case TIP_ADJUSTMENT: case TIP_ADJUSTMENT:
if (hostName == HostName.BPC) { if (hostName == HostName.BPC) {
bitmap = BitmapConfig.BPC_TIP_ADJUSTMENTS; bitmap = BitmapConfig.BPC_TIP_ADJUSTMENTS;
} else { } else {
bitmap = BitmapConfig.FINEXUS_SALE; bitmap = BitmapConfig.CZ_SALE;
} }
break; break;

View File

@ -44,6 +44,7 @@ public class BitmapConfig {
/*-----------------------------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------------------------*/
/* BPC HOST*/ /* BPC HOST*/
public static final String BPC_SIGN_ON = "2220010000C00000"; public static final String BPC_SIGN_ON = "2220010000C00000";
public static final String CZ_SIGN_ON = "2220010000C00000";
// public static final String BPC_ECHO_TEST = "2220010000800000"; // only TID // public static final String BPC_ECHO_TEST = "2220010000800000"; // only TID
public static final String BPC_ECHO_TEST = "2220010000C00000"; // TID,MID public static final String BPC_ECHO_TEST = "2220010000C00000"; // TID,MID
@ -191,7 +192,7 @@ public class BitmapConfig {
public static final String MPU_NEW_CASH_ADVANCE="7020058020C09000"; public static final String MPU_NEW_CASH_ADVANCE="7020058020C09000";
public static final String FINEXUS_SALE="3020078020C00204"; public static final String CZ_SALE="703C058020C09200";
public static final String UPI_SALE = "7020058020C09200"; public static final String UPI_SALE = "7020058020C09200";

View File

@ -33,7 +33,7 @@ public class FieldConfig {
/* FLD 02 */ {2, SDK_8583_LEN_ASC, 19, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, /* FLD 02 */ {2, SDK_8583_LEN_ASC, 19, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
/* FLD 03 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, /* FLD 03 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
/* FLD 04 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'}, /* FLD 04 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'},
/* FLD 05 */ {0, SDK_8583_LEN_BCD, 13, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, //SDK_8583_ALIGN_R /* FLD 05 */ {0, SDK_8583_LEN_BCD, 13, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, //SDK_8583_ALIGN_R
/* FLD 06 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'}, /* FLD 06 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'},
@ -41,10 +41,10 @@ public class FieldConfig {
/* FLD 08 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, /* FLD 08 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
/* FLD 09 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, /* FLD 09 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
/* FLD 10 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, /* FLD 10 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
/* FLD 11 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'}, /* FLD 11 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
// /* FLD 12 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'}, /* FLD 12 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
/* FLD 12 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, // BPC HOST // /* FLD 12 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, // BPC HOST
/* FLD 13 */ {0, SDK_8583_LEN_BCD, 4, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, /* FLD 13 */ {0, SDK_8583_LEN_BCD, 4, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
/* FLD 14 */ {0, SDK_8583_LEN_BCD, 4, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, /* FLD 14 */ {0, SDK_8583_LEN_BCD, 4, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
/* FLD 15 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, /* FLD 15 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
/* FLD 16 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, /* FLD 16 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
@ -58,8 +58,8 @@ public class FieldConfig {
/* FLD 23 */ {0, SDK_8583_LEN_BCD, 3, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, /* FLD 23 */ {0, SDK_8583_LEN_BCD, 3, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
/* FLD 24 */ {0, SDK_8583_LEN_BCD, 3, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'}, /* FLD 24 */ {0, SDK_8583_LEN_BCD, 3, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
/* FLD 25 */ {0, SDK_8583_LEN_BCD, 2, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, /* FLD 25 */ {0, SDK_8583_LEN_BCD, 2, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
/* FLD 26 */ {0, SDK_8583_LEN_BCD, 2, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, /* FLD 26 */ {0, SDK_8583_LEN_BCD, 2, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
/* FLD 27 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, /* FLD 27 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
/* FLD 28 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, /* FLD 28 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
@ -81,8 +81,8 @@ public class FieldConfig {
/* FLD 37 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'}, /* FLD 37 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'},
/* FLD 38 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'}, /* FLD 38 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'},
// /* FLD 39 */ {0, SDK_8583_LEN_BCD, 2, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'}, /* FLD 39 */ {0, SDK_8583_LEN_BCD, 2, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'},
/* FLD 39 */ {0, SDK_8583_LEN_BCD, 3, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'}, //BPC // /* FLD 39 */ {0, SDK_8583_LEN_BCD, 3, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, '0'}, //BPC
/* FLD 40 */ {0, SDK_8583_LEN_BCD, 40, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '}, /* FLD 40 */ {0, SDK_8583_LEN_BCD, 40, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '},
/* FLD 41 */ {0, SDK_8583_LEN_BCD, 8, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '}, /* FLD 41 */ {0, SDK_8583_LEN_BCD, 8, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '},
/* FLD 42 */ {0, SDK_8583_LEN_BCD, 15, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '}, /* FLD 42 */ {0, SDK_8583_LEN_BCD, 15, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '},
@ -123,7 +123,7 @@ public class FieldConfig {
/*FLD 60 */ {3, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, /*FLD 60 */ {3, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
/* FLD 61 */ {3, SDK_8583_LEN_BCD, 29, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'}, /* FLD 61 */ {3, SDK_8583_LEN_BCD, 29, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
/* FLD 62 */ {3, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, /* FLD 62 */ {3, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
// Jun 1 2023 /* FLD 62 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '}, // /* FLD 62 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '}, //Jun 1 2023
// /* FLD 62 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, // /* FLD 62 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
// original /* FLD 63 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '}, // original /* FLD 63 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '},

View File

@ -294,13 +294,13 @@ public class FieldUtils {
field.setDataStr(voucherNo); field.setDataStr(voucherNo);
break; break;
case 12: //Time(HHMMSS) case 12: //Time(HHMMSS)
if(payDetail.getHostName().equals(Constant.HOST_BPC)) { // if(payDetail.getHostName().equals(Constant.HOST_BPC)) {
//
// field.setDataStr("230908105833"); //// field.setDataStr("230908105833");
field.setDataStr(payDetail.getTradeDateTime()); // field.setDataStr(payDetail.getTradeDateTime());
} else { // } else {
field.setDataStr(payDetail.getTradeTime()); field.setDataStr(payDetail.getTradeTime());
} // }
break; break;
case 13: //Date(MMDD) case 13: //Date(MMDD)
@ -359,7 +359,7 @@ public class FieldUtils {
// } else { // } else {
// iterator.remove(); // iterator.remove();
// } // }
field.setDataStr("0001"); field.setDataStr("001");
break; break;
case 24: //Network International Identifier NII case 24: //Network International Identifier NII

View File

@ -24,7 +24,7 @@ public enum TransactionsType {
CASH_DEPOSIT("CASH_DEPOSIT",13,"210000"), CASH_DEPOSIT("CASH_DEPOSIT",13,"210000"),
FUND_TRANSFER("FUND_TRANSFER",14,""), FUND_TRANSFER("FUND_TRANSFER",14,""),
SETTLEMENT_CUT_OVER("SETTLEMENT_CUT_OVER",15,""), SETTLEMENT_CUT_OVER("SETTLEMENT_CUT_OVER",15,""),
SIGN_ON("SIGN_ON",16,"990000"), SIGN_ON("SIGN_ON",16,"920000"),
SETTLEMENT_UPLOAD("SETTLEMENT_UPLOAD",17,"960000"), SETTLEMENT_UPLOAD("SETTLEMENT_UPLOAD",17,"960000"),
TIP_ADJUSTMENT("TIP_ADJUSTMENT",18,"190000"), TIP_ADJUSTMENT("TIP_ADJUSTMENT",18,"190000"),

View File

@ -82,7 +82,7 @@ public class Params {
payDetail.setIsCanceled(false); payDetail.setIsCanceled(false);
payDetail.transNum = System.currentTimeMillis() / 1000; payDetail.transNum = System.currentTimeMillis() / 1000;
// need to add host logic in another place // need to add host logic in another place
payDetail.setHostName("BPC"); payDetail.setHostName("CARDZONE");
payDetail.setOriginalTransDate(SystemDateTime.getMMDD()+SystemDateTime.getYYYY()); payDetail.setOriginalTransDate(SystemDateTime.getMMDD()+SystemDateTime.getYYYY());
@ -104,6 +104,11 @@ public class Params {
payDetail.setTransTime(strTransTime); payDetail.setTransTime(strTransTime);
// mock tid,mid
payDetail.setTerminalNo("00000001");
payDetail.setMerchantNo("100000122234567");
// 4, Nov ,2024 // 4, Nov ,2024
payDetail.setTransCVM(TransCVM.NO_CVM); payDetail.setTransCVM(TransCVM.NO_CVM);