Merge remote-tracking branch 'origin/mpu' into merge_with_mpu
This commit is contained in:
commit
bb60828767
File diff suppressed because one or more lines are too long
@ -196,6 +196,10 @@ dependencies {
|
|||||||
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0'
|
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0'
|
||||||
|
|
||||||
|
|
||||||
|
androidTestImplementation 'androidx.test:core:1.5.0'
|
||||||
|
androidTestImplementation 'androidx.test:runner:1.5.2'
|
||||||
|
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||||
|
|
||||||
// Add Mockito dependency for mocking
|
// Add Mockito dependency for mocking
|
||||||
testImplementation 'org.mockito:mockito-core:3.12.4'
|
testImplementation 'org.mockito:mockito-core:3.12.4'
|
||||||
androidTestImplementation 'org.mockito:mockito-android:3.12.4'
|
androidTestImplementation 'org.mockito:mockito-android:3.12.4'
|
||||||
|
|||||||
BIN
app/release/app-release.apk
Normal file
BIN
app/release/app-release.apk
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -11,8 +11,8 @@
|
|||||||
"type": "SINGLE",
|
"type": "SINGLE",
|
||||||
"filters": [],
|
"filters": [],
|
||||||
"attributes": [],
|
"attributes": [],
|
||||||
"versionCode": 6,
|
"versionCode": 7,
|
||||||
"versionName": "1.06",
|
"versionName": "1.07",
|
||||||
"outputFile": "app-release.apk"
|
"outputFile": "app-release.apk"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@ -10,6 +10,29 @@ import org.junit.runner.RunWith;
|
|||||||
|
|
||||||
import static org.junit.Assert.*;
|
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;
|
||||||
|
import com.utsmyanmar.checkxread.util.CardTypeX;
|
||||||
|
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.PayDetail;
|
||||||
|
import com.utsmyanmar.paylibs.model.TradeData;
|
||||||
|
import com.utsmyanmar.paylibs.model.enums.TransCVM;
|
||||||
|
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.HostName;
|
||||||
|
import com.utsmyanmar.paylibs.utils.iso_utils.BitmapConfig;
|
||||||
|
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
|
||||||
|
import com.utsmyanmar.paylibs.utils.params.Params;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instrumented test, which will execute on an Android device.
|
* Instrumented test, which will execute on an Android device.
|
||||||
*
|
*
|
||||||
@ -23,4 +46,131 @@ public class ExampleInstrumentedTest {
|
|||||||
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
||||||
assertEquals("com.utsmm.kbz", appContext.getPackageName());
|
assertEquals("com.utsmm.kbz", appContext.getPackageName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testVoidPacket() {
|
||||||
|
|
||||||
|
CardDataX cardDataX = MockData.getInstance().generateMPUCard();
|
||||||
|
|
||||||
|
TradeData tradeData = TransactionUtil.getInstance().initMPUTransaction(cardDataX, CardTypeX.IC);
|
||||||
|
|
||||||
|
String bitmap = BitmapConfig.MPU_NEW_VOID;
|
||||||
|
MessageType messageType = MessageType.FINANCIAL;
|
||||||
|
|
||||||
|
ISOMsgX isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1987, ISOMode.ONLY_HEADER, HostName.FINEXUS)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
TradeData transTradeData = setUpRebuildTransactions(tradeData, TransactionsType.VOID, HostName.FINEXUS);
|
||||||
|
|
||||||
|
transTradeData.getPayDetail().setAmount(50000);
|
||||||
|
PayDetail transPayDetail = transTradeData.getPayDetail();
|
||||||
|
|
||||||
|
byte[] sendBytes;
|
||||||
|
try {
|
||||||
|
sendBytes = isoMsgX.buildISOPackets(transTradeData, bitmap, messageType);
|
||||||
|
|
||||||
|
System.out.println("Hex Str : "+ ByteUtil.bytes2HexStr(sendBytes));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private TradeData setUpRebuildTransactions(TradeData tradeData, TransactionsType transactionsType, HostName hostName) {
|
||||||
|
LogUtil.d(Constant.TAG, "Starting Online Transaction--" + hostName + "--" + transactionsType);
|
||||||
|
|
||||||
|
TradeData newTrade = Params.newTrade(true);
|
||||||
|
PayDetail newPay = newTrade.getPayDetail();
|
||||||
|
PayDetail oldPay = tradeData.getPayDetail();
|
||||||
|
|
||||||
|
newPay.setCardType(100);
|
||||||
|
newPay.setPINCipher("");
|
||||||
|
newPay.setHostName(hostName.name);
|
||||||
|
newPay.setTransType(transactionsType.name);
|
||||||
|
newPay.setProcessCode(transactionsType.processCode);
|
||||||
|
newPay.setCardNo(oldPay.getCardNo());
|
||||||
|
newPay.setCardHolderName(oldPay.getCardHolderName());
|
||||||
|
newPay.setEXPDate(oldPay.getEXPDate());
|
||||||
|
newPay.setTradeDate(oldPay.getTradeDate());
|
||||||
|
newPay.setTradeTime(oldPay.getTradeTime());
|
||||||
|
newPay.setAmount(oldPay.getAmount());
|
||||||
|
newPay.setTransactionType(transactionsType.value);
|
||||||
|
newPay.setAccountType(oldPay.getAccountType());
|
||||||
|
|
||||||
|
newPay.setCardInfo(oldPay.getCardInfo());
|
||||||
|
|
||||||
|
newPay.setSettlementEnabled(SystemParamsOperation.getInstance().getSettlementStatus());
|
||||||
|
|
||||||
|
// added on Nov, 13 2024
|
||||||
|
newPay.setICC55(oldPay.getICC55());
|
||||||
|
|
||||||
|
if(newPay.getICC55() != null && !newPay.getICC55().isEmpty()) {
|
||||||
|
newPay.setAppLabel(oldPay.getAppLabel());
|
||||||
|
newPay.setAppName(oldPay.getAppName());
|
||||||
|
newPay.setTSI(oldPay.getTSI());
|
||||||
|
newPay.setAID(oldPay.getAID());
|
||||||
|
newPay.setArqC(oldPay.getArqC());
|
||||||
|
newPay.setTVR(oldPay.getTVR());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(transactionsType != TransactionsType.PRE_AUTH_COMPLETE) {
|
||||||
|
|
||||||
|
newPay.setTradeDateTime(oldPay.getTradeDateTime());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (transactionsType == TransactionsType.VOID || transactionsType == TransactionsType.REFUND) {
|
||||||
|
String field60;
|
||||||
|
if(hostName == HostName.BPC) {
|
||||||
|
field60 = String.format(Locale.getDefault(), "%010d00", oldPay.getAmount());
|
||||||
|
} else {
|
||||||
|
field60 = String.format(Locale.getDefault(), "%012d", oldPay.getAmount());
|
||||||
|
}
|
||||||
|
// String field60 = String.format(Locale.getDefault(), "%010d00", oldPay.getAmount());
|
||||||
|
newPay.setReferNo(oldPay.getReferNo());
|
||||||
|
newPay.setTransCVM(TransCVM.SIGNATURE);
|
||||||
|
newTrade.setField60(field60);
|
||||||
|
} else if (transactionsType == TransactionsType.PRE_AUTH_VOID) {
|
||||||
|
newPay.setCardType(oldPay.getCardType());
|
||||||
|
newPay.setCustomOrderNo(oldPay.getVoucherNo());
|
||||||
|
newPay.setReferNo(oldPay.getReferNo());
|
||||||
|
newPay.setCardInfo(oldPay.getCardInfo());
|
||||||
|
newPay.setPINCipher(oldPay.getPINCipher());
|
||||||
|
newPay.setTempKSN(oldPay.getTempKSN());
|
||||||
|
newPay.setTransCVM(TransCVM.SIGNATURE);
|
||||||
|
// for manual entry reversal which need de 35
|
||||||
|
|
||||||
|
} else if (transactionsType == TransactionsType.TIP_ADJUSTMENT ) {
|
||||||
|
newPay.setReferNo(oldPay.getReferNo());
|
||||||
|
newPay.setApprovalCode(oldPay.getApprovalCode());
|
||||||
|
} else if (transactionsType == TransactionsType.PRE_AUTH_COMPLETE) {
|
||||||
|
newPay.setCardType(oldPay.getCardType());
|
||||||
|
newPay.setCardInfo(oldPay.getCardInfo());
|
||||||
|
newPay.setPINCipher(oldPay.getPINCipher());
|
||||||
|
newPay.setReferNo(oldPay.getReferNo());
|
||||||
|
newPay.setTempKSN(oldPay.getTempKSN());
|
||||||
|
} else if (transactionsType == TransactionsType.PRE_AUTH_COMPLETE_VOID) {
|
||||||
|
newPay.setVoucherNo(oldPay.getVoucherNo());
|
||||||
|
newPay.setCustomOrderNo(oldPay.getVoucherNo());
|
||||||
|
newPay.setReferNo(oldPay.getReferNo());
|
||||||
|
newPay.setCardInfo(oldPay.getCardInfo());
|
||||||
|
|
||||||
|
/*
|
||||||
|
* new requirements */
|
||||||
|
newPay.setCardType(AidlConstants.CardType.IC.getValue());
|
||||||
|
newPay.setPINCipher("55");
|
||||||
|
newPay.setTransCVM(TransCVM.SIGNATURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(oldPay.getAccountType().equals("MPU")){
|
||||||
|
// newPay.setIsFreeSign(true);
|
||||||
|
newPay.setTransCVM(TransCVM.SIGNATURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
newTrade.setPayDetail(newPay);
|
||||||
|
return newTrade;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -254,7 +254,6 @@ public class ProcessingFragment extends DataBindingFragment {
|
|||||||
case FAIL:
|
case FAIL:
|
||||||
case SUCCESS:
|
case SUCCESS:
|
||||||
case OFFLINE_SUCCESS:
|
case OFFLINE_SUCCESS:
|
||||||
LogUtil.d(TAG,"This was called!");
|
|
||||||
if(SystemParamsOperation.getInstance().getDemoStatus()) {
|
if(SystemParamsOperation.getInstance().getDemoStatus()) {
|
||||||
delayFunctionCall(()->{
|
delayFunctionCall(()->{
|
||||||
// updateData();
|
// updateData();
|
||||||
|
|||||||
@ -185,6 +185,15 @@ public class SharedViewModel extends ViewModel {
|
|||||||
printReceiptButtons.postValue(value);
|
printReceiptButtons.postValue(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setTransactionsType(TransactionsType transactionsType) {
|
||||||
|
this.transactionsType.setValue(transactionsType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SingleLiveEvent<TransactionsType> getTransactionsType() {
|
||||||
|
return transactionsType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrintReceiptMsg(String msg) { this.printReceiptMsg.setValue(msg);}
|
||||||
public void postPrintReceiptMsg(String msg) { this.printReceiptMsg.postValue(msg);}
|
public void postPrintReceiptMsg(String msg) { this.printReceiptMsg.postValue(msg);}
|
||||||
public void setPrintStatus(PrintStatus printStatus) { this.printStatus.setValue(printStatus); }
|
public void setPrintStatus(PrintStatus printStatus) { this.printStatus.setValue(printStatus); }
|
||||||
public void postPrintStatus(PrintStatus printStatus) { this.printStatus.postValue(printStatus); }
|
public void postPrintStatus(PrintStatus printStatus) { this.printStatus.postValue(printStatus); }
|
||||||
|
|||||||
@ -135,7 +135,7 @@ public class DashboardTransFragment extends DataBindingFragment {
|
|||||||
} else if (checkTid()) {
|
} else if (checkTid()) {
|
||||||
showDeclineDialog("Please Download Config!");
|
showDeclineDialog("Please Download Config!");
|
||||||
} else {
|
} else {
|
||||||
sharedViewModel.transactionsType.setValue(TransactionsType.VOID);
|
sharedViewModel.setTransactionsType(TransactionsType.VOID);
|
||||||
// sharedViewModel.transMenu.postValue(TransMenu.TRANSACTIONS);
|
// sharedViewModel.transMenu.postValue(TransMenu.TRANSACTIONS);
|
||||||
sharedViewModel.setTransMenu(TransMenu.TRANSACTIONS);
|
sharedViewModel.setTransMenu(TransMenu.TRANSACTIONS);
|
||||||
|
|
||||||
@ -147,16 +147,15 @@ public class DashboardTransFragment extends DataBindingFragment {
|
|||||||
|
|
||||||
public void onClickSettlement() {
|
public void onClickSettlement() {
|
||||||
sharedViewModel.settlementType.setValue(SettlementType.NORMAL);
|
sharedViewModel.settlementType.setValue(SettlementType.NORMAL);
|
||||||
sharedViewModel.transactionsType.setValue(TransactionsType.SETTLEMENT);
|
|
||||||
sharedViewModel.setTransMenu(TransMenu.SETTLEMENT);
|
sharedViewModel.setTransMenu(TransMenu.SETTLEMENT);
|
||||||
|
sharedViewModel.setTransactionsType(TransactionsType.SETTLEMENT);
|
||||||
|
|
||||||
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
|
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
|
||||||
safeRouteTo(currentId,routeId,hostId);
|
safeRouteTo(currentId,routeId,hostId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onClickRefund() {
|
public void onClickRefund() {
|
||||||
sharedViewModel.transactionsType.setValue(TransactionsType.REFUND);
|
sharedViewModel.setTransactionsType(TransactionsType.REFUND);
|
||||||
|
|
||||||
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
|
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
|
||||||
safeRouteTo(currentId,routeId,hostId);
|
safeRouteTo(currentId,routeId,hostId);
|
||||||
}
|
}
|
||||||
@ -167,8 +166,7 @@ public class DashboardTransFragment extends DataBindingFragment {
|
|||||||
} else if (checkTid()) {
|
} else if (checkTid()) {
|
||||||
showDeclineDialog("Please Download Config!");
|
showDeclineDialog("Please Download Config!");
|
||||||
} else {
|
} else {
|
||||||
sharedViewModel.transactionsType.setValue(TransactionsType.PRE_AUTH_SALE);
|
sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_SALE);
|
||||||
|
|
||||||
routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment;
|
routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment;
|
||||||
safeRouteTo(currentId,routeId,hostId);
|
safeRouteTo(currentId,routeId,hostId);
|
||||||
}
|
}
|
||||||
@ -176,7 +174,7 @@ public class DashboardTransFragment extends DataBindingFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onClickPreAuthCancel () {
|
public void onClickPreAuthCancel () {
|
||||||
sharedViewModel.transactionsType.setValue(TransactionsType.PRE_AUTH_VOID);
|
sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_VOID);
|
||||||
sharedViewModel.setTransMenu(TransMenu.PRE_AUTH_FULL_VOID);
|
sharedViewModel.setTransMenu(TransMenu.PRE_AUTH_FULL_VOID);
|
||||||
sharedViewModel.amount.postValue(null);
|
sharedViewModel.amount.postValue(null);
|
||||||
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
|
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
|
||||||
@ -185,14 +183,14 @@ public class DashboardTransFragment extends DataBindingFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onClickPreAuthComp () {
|
public void onClickPreAuthComp () {
|
||||||
sharedViewModel.transactionsType.setValue(TransactionsType.PRE_AUTH_COMPLETE);
|
sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_COMPLETE);
|
||||||
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
|
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
|
||||||
safeRouteTo(currentId,routeId,hostId);
|
safeRouteTo(currentId,routeId,hostId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onClickPreAuthCompCancel () {
|
public void onClickPreAuthCompCancel () {
|
||||||
sharedViewModel.transactionsType.setValue(TransactionsType.PRE_AUTH_COMPLETE_VOID);
|
sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_COMPLETE_VOID);
|
||||||
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
|
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
|
||||||
safeRouteTo(currentId,routeId,hostId);
|
safeRouteTo(currentId,routeId,hostId);
|
||||||
|
|
||||||
@ -200,7 +198,8 @@ public class DashboardTransFragment extends DataBindingFragment {
|
|||||||
|
|
||||||
|
|
||||||
public void onClickCashAdvance() {
|
public void onClickCashAdvance() {
|
||||||
sharedViewModel.transactionsType.setValue(TransactionsType.CASH_OUT);
|
sharedViewModel.setTransactionsType(TransactionsType.CASH_OUT);
|
||||||
|
sharedViewModel.setTransMenu(TransMenu.CASH_OUT);
|
||||||
routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment;
|
routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment;
|
||||||
safeRouteTo(currentId,routeId,hostId);
|
safeRouteTo(currentId,routeId,hostId);
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import com.nexgo.oaf.apiv3.SdkResult;
|
|||||||
import com.nexgo.oaf.apiv3.device.pinpad.AlgorithmModeEnum;
|
import com.nexgo.oaf.apiv3.device.pinpad.AlgorithmModeEnum;
|
||||||
import com.nexgo.oaf.apiv3.device.pinpad.OnPinPadInputListener;
|
import com.nexgo.oaf.apiv3.device.pinpad.OnPinPadInputListener;
|
||||||
import com.nexgo.oaf.apiv3.device.pinpad.PinAlgorithmModeEnum;
|
import com.nexgo.oaf.apiv3.device.pinpad.PinAlgorithmModeEnum;
|
||||||
|
import com.nexgo.oaf.apiv3.device.pinpad.PinKeyboardModeEnum;
|
||||||
import com.nexgo.oaf.apiv3.device.pinpad.PinKeyboardViewModeEnum;
|
import com.nexgo.oaf.apiv3.device.pinpad.PinKeyboardViewModeEnum;
|
||||||
import com.nexgo.oaf.apiv3.device.pinpad.PinPad;
|
import com.nexgo.oaf.apiv3.device.pinpad.PinPad;
|
||||||
import com.nexgo.oaf.apiv3.device.pinpad.PinPadKeyCode;
|
import com.nexgo.oaf.apiv3.device.pinpad.PinPadKeyCode;
|
||||||
@ -322,6 +323,8 @@ public class PinPadViewModel extends ViewModel {
|
|||||||
r.bottom = customPinPadKeyboard.getKey_ok().getHeight() + r.top;
|
r.bottom = customPinPadKeyboard.getKey_ok().getHeight() + r.top;
|
||||||
pinpadLayout.setKeyConfirm(r);
|
pinpadLayout.setKeyConfirm(r);
|
||||||
|
|
||||||
|
|
||||||
|
pinPad.setPinKeyboardMode(PinKeyboardModeEnum.FIXED);
|
||||||
byte[] number = pinPad.setPinpadLayout(pinpadLayout);
|
byte[] number = pinPad.setPinpadLayout(pinpadLayout);
|
||||||
|
|
||||||
if(number != null) {
|
if(number != null) {
|
||||||
@ -336,6 +339,8 @@ public class PinPadViewModel extends ViewModel {
|
|||||||
byte[] panBytes = pan.substring(length - 13).getBytes(StandardCharsets.US_ASCII);
|
byte[] panBytes = pan.substring(length - 13).getBytes(StandardCharsets.US_ASCII);
|
||||||
// byte[] panBytes = pan.substring(length - 13, length - 1).getBytes(StandardCharsets.US_ASCII);
|
// byte[] panBytes = pan.substring(length - 13, length - 1).getBytes(StandardCharsets.US_ASCII);
|
||||||
pinPad.setPinKeyboardViewMode(PinKeyboardViewModeEnum.DEFAULT);
|
pinPad.setPinKeyboardViewMode(PinKeyboardViewModeEnum.DEFAULT);
|
||||||
|
pinPad.setPinKeyboardMode(PinKeyboardModeEnum.FIXED);
|
||||||
|
|
||||||
// pinPad.setAlgorithmMode(AlgorithmModeEnum.DES);
|
// pinPad.setAlgorithmMode(AlgorithmModeEnum.DES);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -52,14 +52,25 @@ public class MockData {
|
|||||||
// .cardHolderName("KBZ Debit")
|
// .cardHolderName("KBZ Debit")
|
||||||
// .iccData("9503051034047056=30021015930000000000")
|
// .iccData("9503051034047056=30021015930000000000")
|
||||||
// .build();
|
// .build();
|
||||||
|
|
||||||
|
// mockCardData = new MockCardData.Builder()
|
||||||
|
// .cardNo("9505050161133125")
|
||||||
|
// .expDate("0127")
|
||||||
|
// .cardScheme("MPU")
|
||||||
|
// .cardHolderName("KBZ Credit")
|
||||||
|
// .iccData("9505050161133125=27011017250000000000")
|
||||||
|
// .build();
|
||||||
|
|
||||||
mockCardData = new MockCardData.Builder()
|
mockCardData = new MockCardData.Builder()
|
||||||
.cardNo("9505050161133125")
|
.cardNo("9503712156912514")
|
||||||
.expDate("0127")
|
.expDate("1229")
|
||||||
.cardScheme("MPU")
|
.cardScheme("MPU")
|
||||||
.cardHolderName("KBZ Credit")
|
.cardHolderName("Htin Kyaw Win")
|
||||||
.iccData("9505050161133125=27011017250000000000")
|
.iccData("9503712156912514=29121010000000000000")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// mockCardData = new MockCardData.Builder()
|
// mockCardData = new MockCardData.Builder()
|
||||||
// .cardNo("9503742975107251")
|
// .cardNo("9503742975107251")
|
||||||
// .expDate("0629")
|
// .expDate("0629")
|
||||||
|
|||||||
@ -171,7 +171,7 @@ public class TMSSetupsImpl implements TMSSetups{
|
|||||||
|
|
||||||
for (SiriusHost siriusHost: siriusHosts) {
|
for (SiriusHost siriusHost: siriusHosts) {
|
||||||
|
|
||||||
if( siriusHost.getName().toLowerCase().contains("mmqr") || siriusHost.getName().toLowerCase().contains("kbzpay") || siriusHost.getDescription().toLowerCase().contains("mmqr") || siriusHost.getDescription().toLowerCase().contains("qr")) {
|
if( siriusHost.getName().toLowerCase().contains("mmqr") || siriusHost.getName().toLowerCase().contains("kbzpay") || siriusHost.getName().toLowerCase().contains("mmqr") || siriusHost.getName().toLowerCase().contains("qr")) {
|
||||||
|
|
||||||
SystemParamsOperation.getInstance().setSecHostName(siriusHost.getName());
|
SystemParamsOperation.getInstance().setSecHostName(siriusHost.getName());
|
||||||
SystemParamsOperation.getInstance().setSecHostTerminalId(siriusHost.getTid());
|
SystemParamsOperation.getInstance().setSecHostTerminalId(siriusHost.getTid());
|
||||||
@ -688,7 +688,7 @@ public class TMSSetupsImpl implements TMSSetups{
|
|||||||
return value == 1;
|
return value == 1;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return false;
|
return Boolean.parseBoolean(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -147,7 +147,8 @@ public class TMSUtil {
|
|||||||
siriusRequest.setApplicationVersion(BuildConfig.VERSION_NAME);
|
siriusRequest.setApplicationVersion(BuildConfig.VERSION_NAME);
|
||||||
siriusRequest.setCurrentNetwork(getNetworkType(context));
|
siriusRequest.setCurrentNetwork(getNetworkType(context));
|
||||||
siriusRequest.setLastTransaction(lastTransName);
|
siriusRequest.setLastTransaction(lastTransName);
|
||||||
siriusRequest.setLastTranTime(lastTransTime);
|
siriusRequest.setLastTranTime(Long.parseLong(lastTransTime));
|
||||||
|
siriusRequest.setValue("YourValueHere");
|
||||||
|
|
||||||
return siriusRequest;
|
return siriusRequest;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,21 +32,21 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:padding="16dp"
|
android:padding="10dp"
|
||||||
android:paddingTop="24dp"
|
android:paddingTop="14dp"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
<!-- Trace Number Icon -->
|
<!-- Trace Number Icon -->
|
||||||
<ImageView
|
<ImageView
|
||||||
android:layout_width="48dp"
|
android:layout_width="36dp"
|
||||||
android:layout_height="48dp"
|
android:layout_height="36dp"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
android:layout_marginBottom="12dp"
|
android:layout_marginBottom="8dp"
|
||||||
android:src="@drawable/ic_txn_history"
|
android:src="@drawable/ic_txn_history"
|
||||||
app:tint="@color/colorPrimary"
|
app:tint="@color/colorPrimary"
|
||||||
android:alpha="0.9"
|
android:alpha="0.88"
|
||||||
android:padding="8dp"
|
android:padding="6dp"
|
||||||
android:background="@drawable/bg_oval" />
|
android:background="@drawable/bg_oval" />
|
||||||
|
|
||||||
<!-- Compact Title -->
|
<!-- Compact Title -->
|
||||||
@ -56,10 +56,10 @@
|
|||||||
android:text="@string/enter_trace_text"
|
android:text="@string/enter_trace_text"
|
||||||
android:textAlignment="center"
|
android:textAlignment="center"
|
||||||
android:textColor="@color/colorPrimary"
|
android:textColor="@color/colorPrimary"
|
||||||
android:textSize="22sp"
|
android:textSize="17sp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:fontFamily="sans-serif-medium"
|
android:fontFamily="sans-serif-medium"
|
||||||
android:layout_marginBottom="4dp" />
|
android:layout_marginBottom="2dp" />
|
||||||
|
|
||||||
<!-- Compact Subtitle -->
|
<!-- Compact Subtitle -->
|
||||||
<TextView
|
<TextView
|
||||||
@ -68,18 +68,18 @@
|
|||||||
android:text="Enter the transaction trace number"
|
android:text="Enter the transaction trace number"
|
||||||
android:textAlignment="center"
|
android:textAlignment="center"
|
||||||
android:textColor="@color/colorPrimary"
|
android:textColor="@color/colorPrimary"
|
||||||
android:textSize="14sp"
|
android:textSize="12sp"
|
||||||
android:alpha="0.75"
|
android:alpha="0.7"
|
||||||
android:fontFamily="sans-serif"
|
android:fontFamily="sans-serif"
|
||||||
android:layout_marginBottom="16dp" />
|
android:layout_marginBottom="10dp" />
|
||||||
|
|
||||||
<!-- Compact Trace Number Display Card -->
|
<!-- Compact Trace Number Display Card -->
|
||||||
<androidx.cardview.widget.CardView
|
<androidx.cardview.widget.CardView
|
||||||
android:id="@+id/traceCard"
|
android:id="@+id/traceCard"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="70dp"
|
android:layout_height="48dp"
|
||||||
android:layout_marginHorizontal="8dp"
|
android:layout_marginHorizontal="4dp"
|
||||||
app:cardCornerRadius="16dp"
|
app:cardCornerRadius="12dp"
|
||||||
app:cardElevation="0dp"
|
app:cardElevation="0dp"
|
||||||
app:cardBackgroundColor="@color/white">
|
app:cardBackgroundColor="@color/white">
|
||||||
|
|
||||||
@ -87,11 +87,11 @@
|
|||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_margin="2dp"
|
android:layout_margin="1dp"
|
||||||
android:background="@drawable/bg_edittext_primary_border"
|
android:background="@drawable/bg_edittext_primary_border"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:padding="16dp">
|
android:padding="8dp">
|
||||||
|
|
||||||
<!-- Trace number display -->
|
<!-- Trace number display -->
|
||||||
<TextView
|
<TextView
|
||||||
@ -102,22 +102,22 @@
|
|||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:text="@{inputTraceViewModel.invoiceNo}"
|
android:text="@{inputTraceViewModel.invoiceNo}"
|
||||||
android:textColor="@color/colorPrimary"
|
android:textColor="@color/colorPrimary"
|
||||||
android:textSize="28sp"
|
android:textSize="20sp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:letterSpacing="0.1"
|
android:letterSpacing="0.07"
|
||||||
android:fontFamily="monospace"
|
android:fontFamily="monospace"
|
||||||
android:hint="000000"
|
android:hint="000000"
|
||||||
android:textColorHint="@color/colorPrimary"
|
android:textColorHint="@color/colorPrimary"
|
||||||
android:alpha="0.6"
|
android:alpha="0.5"
|
||||||
tools:text="123456" />
|
tools:text="123456" />
|
||||||
|
|
||||||
<!-- Transaction indicator -->
|
<!-- Transaction indicator -->
|
||||||
<View
|
<View
|
||||||
android:layout_width="6dp"
|
android:layout_width="5dp"
|
||||||
android:layout_height="6dp"
|
android:layout_height="5dp"
|
||||||
android:background="@drawable/bg_oval"
|
android:background="@drawable/bg_oval"
|
||||||
android:backgroundTint="@color/colorPrimary"
|
android:backgroundTint="@color/colorPrimary"
|
||||||
android:alpha="0.6" />
|
android:alpha="0.5" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
@ -125,14 +125,14 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<!-- Number Keyboard - guaranteed space -->
|
<!-- Number Keyboard - guaranteed space, more compact -->
|
||||||
<com.utsmyanmar.baselib.ui.NumberKeyboard
|
<com.utsmyanmar.baselib.ui.NumberKeyboard
|
||||||
android:id="@+id/passwordKeyboard"
|
android:id="@+id/passwordKeyboard"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_marginHorizontal="16dp"
|
android:layout_marginHorizontal="8dp"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="4dp"
|
||||||
android:layout_marginBottom="8dp"
|
android:layout_marginBottom="4dp"
|
||||||
app:KeyClickCallback="@{inputTraceViewModel.onKeyClick}"
|
app:KeyClickCallback="@{inputTraceViewModel.onKeyClick}"
|
||||||
app:layout_constraintBottom_toTopOf="@+id/actionButtonsContainer"
|
app:layout_constraintBottom_toTopOf="@+id/actionButtonsContainer"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
@ -146,8 +146,8 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:padding="16dp"
|
android:padding="8dp"
|
||||||
android:paddingBottom="24dp"
|
android:paddingBottom="12dp"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent">
|
app:layout_constraintStart_toStartOf="parent">
|
||||||
|
|
||||||
@ -155,34 +155,34 @@
|
|||||||
<Button
|
<Button
|
||||||
android:id="@+id/btnCancel"
|
android:id="@+id/btnCancel"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="52dp"
|
android:layout_height="42dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="6dp"
|
||||||
android:text="@string/layout_cancel"
|
android:text="@string/layout_cancel"
|
||||||
android:textColor="@color/colorPrimary"
|
android:textColor="@color/colorPrimary"
|
||||||
android:textSize="15sp"
|
android:textSize="12sp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:background="@drawable/bg_rounded_btn_cancel_cv"
|
android:background="@drawable/bg_rounded_btn_cancel_cv"
|
||||||
android:fontFamily="sans-serif-medium"
|
android:fontFamily="sans-serif-medium"
|
||||||
android:onClick="@{()->click.onCancel()}"
|
android:onClick="@{()->click.onCancel()}"
|
||||||
android:elevation="2dp"
|
android:elevation="1dp"
|
||||||
android:textAllCaps="false" />
|
android:textAllCaps="false" />
|
||||||
|
|
||||||
<!-- Confirm Button -->
|
<!-- Confirm Button -->
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/btnConfirm"
|
android:id="@+id/btnConfirm"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="52dp"
|
android:layout_height="42dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:layout_marginStart="8dp"
|
android:layout_marginStart="6dp"
|
||||||
android:text="@string/layout_confirm"
|
android:text="@string/layout_confirm"
|
||||||
android:textColor="@color/white"
|
android:textColor="@color/white"
|
||||||
android:textSize="15sp"
|
android:textSize="12sp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:background="@drawable/bg_rounded_btn_cv"
|
android:background="@drawable/bg_rounded_btn_cv"
|
||||||
android:fontFamily="sans-serif-medium"
|
android:fontFamily="sans-serif-medium"
|
||||||
android:onClick="@{()->click.onConfirm()}"
|
android:onClick="@{()->click.onConfirm()}"
|
||||||
android:elevation="8dp"
|
android:elevation="3dp"
|
||||||
android:textAllCaps="false" />
|
android:textAllCaps="false" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|||||||
@ -6,5 +6,6 @@
|
|||||||
<domain includeSubdomains="true">128.199.170.203</domain>
|
<domain includeSubdomains="true">128.199.170.203</domain>
|
||||||
<domain includeSubdomains="true">152.42.199.193</domain>
|
<domain includeSubdomains="true">152.42.199.193</domain>
|
||||||
<domain includeSubdomains="true">api.kbzpay.com</domain>
|
<domain includeSubdomains="true">api.kbzpay.com</domain>
|
||||||
|
<domain includeSubdomains="true">sirius-nest.utsmyanmar.com</domain>
|
||||||
</domain-config>
|
</domain-config>
|
||||||
</network-security-config>
|
</network-security-config>
|
||||||
@ -14,4 +14,7 @@ public class ExampleUnitTest {
|
|||||||
public void addition_isCorrect() {
|
public void addition_isCorrect() {
|
||||||
assertEquals(4, 2 + 2);
|
assertEquals(4, 2 + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -11,6 +11,7 @@ import com.sunmi.pay.hardware.aidl.AidlConstants;
|
|||||||
import com.sunmi.pay.hardware.aidlv2.AidlConstantsV2;
|
import com.sunmi.pay.hardware.aidlv2.AidlConstantsV2;
|
||||||
import com.sunmi.pay.hardware.aidlv2.security.SecurityOptV2;
|
import com.sunmi.pay.hardware.aidlv2.security.SecurityOptV2;
|
||||||
import com.utsmyanmar.paylibs.Constant;
|
import com.utsmyanmar.paylibs.Constant;
|
||||||
|
import com.utsmyanmar.paylibs.PayLibNex;
|
||||||
import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil;
|
import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil;
|
||||||
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
|
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
|
||||||
import com.utsmyanmar.paylibs.utils.secure.TriDes;
|
import com.utsmyanmar.paylibs.utils.secure.TriDes;
|
||||||
@ -24,8 +25,11 @@ public final class TerminalKeyUtil {
|
|||||||
|
|
||||||
public static final String TAG = TerminalKeyUtil.class.getSimpleName();
|
public static final String TAG = TerminalKeyUtil.class.getSimpleName();
|
||||||
|
|
||||||
private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase());
|
// private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase()); // KBZ UAT
|
||||||
|
private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // MPU
|
||||||
private static final byte[] work_key_data = new byte[16];
|
private static final byte[] work_key_data = new byte[16];
|
||||||
|
|
||||||
|
|
||||||
public static void initNexKey() {
|
public static void initNexKey() {
|
||||||
byte[] IPEKByte = ByteUtil.hexStr2Bytes("5A4CFF6DE93F0488926166F3317EFD2F"); // IPEK
|
byte[] IPEKByte = ByteUtil.hexStr2Bytes("5A4CFF6DE93F0488926166F3317EFD2F"); // IPEK
|
||||||
byte[] IPEKKCVByte = ByteUtil.hexStr2Bytes("1F0C18");
|
byte[] IPEKKCVByte = ByteUtil.hexStr2Bytes("1F0C18");
|
||||||
@ -36,6 +40,8 @@ public final class TerminalKeyUtil {
|
|||||||
Arrays.fill(work_key_data, (byte) 0x31);
|
Arrays.fill(work_key_data, (byte) 0x31);
|
||||||
PinPad pinPad = BaseApplication.getInstance().deviceEngine.getPinPad();
|
PinPad pinPad = BaseApplication.getInstance().deviceEngine.getPinPad();
|
||||||
int result = pinPad.writeMKey(9, main_key_data, main_key_data.length);
|
int result = pinPad.writeMKey(9, main_key_data, main_key_data.length);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// int resultPINKEY = pinPad.writeWKey(0, WorkKeyTypeEnum.PINKEY, work_key_data, work_key_data.length);
|
// int resultPINKEY = pinPad.writeWKey(0, WorkKeyTypeEnum.PINKEY, work_key_data, work_key_data.length);
|
||||||
// int resultTDKEY = pinPad.writeWKey(0, WorkKeyTypeEnum.TDKEY, work_key_data, work_key_data.length);
|
// int resultTDKEY = pinPad.writeWKey(0, WorkKeyTypeEnum.TDKEY, work_key_data, work_key_data.length);
|
||||||
@ -47,6 +53,12 @@ public final class TerminalKeyUtil {
|
|||||||
// int result = pinPad.dukptKeyInject(9, DukptKeyTypeEnum.BDK,IPEKByte,16,ksn);
|
// int result = pinPad.dukptKeyInject(9, DukptKeyTypeEnum.BDK,IPEKByte,16,ksn);
|
||||||
|
|
||||||
LogUtil.d(TAG, "save tmk key result: "+result);
|
LogUtil.d(TAG, "save tmk key result: "+result);
|
||||||
|
|
||||||
|
byte[] encryptedPIK = SystemParamsOperation.getInstance().getKeyPIK().get(0);
|
||||||
|
|
||||||
|
result = pinPad.writeWKey(9, WorkKeyTypeEnum.PINKEY,encryptedPIK,encryptedPIK.length);
|
||||||
|
|
||||||
|
LogUtil.d(TAG, "save PIK key result: "+result);
|
||||||
// LogUtil.d(TAG, "save pin key result: "+resultPINKEY);
|
// LogUtil.d(TAG, "save pin key result: "+resultPINKEY);
|
||||||
// LogUtil.d(TAG, "save tdk key result: "+resultTDKEY);
|
// LogUtil.d(TAG, "save tdk key result: "+resultTDKEY);
|
||||||
// LogUtil.d(TAG, "save tek key result: "+resultTEK);
|
// LogUtil.d(TAG, "save tek key result: "+resultTEK);
|
||||||
|
|||||||
@ -34,10 +34,12 @@ public class SiriusInterceptor implements Interceptor {
|
|||||||
|
|
||||||
String hashed = "";
|
String hashed = "";
|
||||||
String nonce = TerminalUtil.getInstance().generateRandomNumbers();
|
String nonce = TerminalUtil.getInstance().generateRandomNumbers();
|
||||||
|
// String nonce = "1234567";
|
||||||
try {
|
try {
|
||||||
hashed = TerminalUtil.getInstance().generateHashedString(nonce);
|
// hashed = TerminalUtil.getInstance().generateHashedString(nonce); // old tms
|
||||||
|
hashed = TerminalUtil.getInstance().generateHashedString(nonce).toLowerCase(); // new tms
|
||||||
|
|
||||||
// LogUtil.d(TAG,"hashed :"+ hashed);
|
LogUtil.d(TAG,"hashed :"+ hashed);
|
||||||
} catch (NoSuchAlgorithmException e) {
|
} catch (NoSuchAlgorithmException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
@ -47,6 +49,7 @@ public class SiriusInterceptor implements Interceptor {
|
|||||||
// .addHeader("content-type", "application/json")
|
// .addHeader("content-type", "application/json")
|
||||||
.addHeader("request-id", hashed)
|
.addHeader("request-id", hashed)
|
||||||
.addHeader("request-code",nonce)
|
.addHeader("request-code",nonce)
|
||||||
|
// .addHeader("x-api-key","8f4df38d1001bcc4620b5c736c66a03eef4653eb3ba31105faa2f2ee294c4a46")
|
||||||
.build();
|
.build();
|
||||||
return chain.proceed(newRequest);
|
return chain.proceed(newRequest);
|
||||||
|
|
||||||
|
|||||||
@ -15,10 +15,12 @@ public class SiriusRequest {
|
|||||||
|
|
||||||
private String lastTransaction;
|
private String lastTransaction;
|
||||||
|
|
||||||
private String lastTranTime;
|
private Long lastTranTime;
|
||||||
|
|
||||||
|
private String value;
|
||||||
|
|
||||||
public SiriusRequest() {}
|
public SiriusRequest() {}
|
||||||
public SiriusRequest(String serial, String appPackage, String androidVersion, String firmwareVersion, String applicationVersion, String currentNetwork, String lastTransaction, String lastTranTime) {
|
public SiriusRequest(String serial, String appPackage, String androidVersion, String firmwareVersion, String applicationVersion, String currentNetwork, String lastTransaction, Long lastTranTime, String value) {
|
||||||
this.serial = serial;
|
this.serial = serial;
|
||||||
this.appPackage = appPackage;
|
this.appPackage = appPackage;
|
||||||
this.androidVersion = androidVersion;
|
this.androidVersion = androidVersion;
|
||||||
@ -27,6 +29,7 @@ public class SiriusRequest {
|
|||||||
this.currentNetwork = currentNetwork;
|
this.currentNetwork = currentNetwork;
|
||||||
this.lastTransaction = lastTransaction;
|
this.lastTransaction = lastTransaction;
|
||||||
this.lastTranTime = lastTranTime;
|
this.lastTranTime = lastTranTime;
|
||||||
|
this.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSerial(String serial) {
|
public void setSerial(String serial) {
|
||||||
@ -57,7 +60,7 @@ public class SiriusRequest {
|
|||||||
this.lastTransaction = lastTransaction;
|
this.lastTransaction = lastTransaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLastTranTime(String lastTranTime) {
|
public void setLastTranTime(Long lastTranTime) {
|
||||||
this.lastTranTime = lastTranTime;
|
this.lastTranTime = lastTranTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,7 +92,15 @@ public class SiriusRequest {
|
|||||||
return lastTransaction;
|
return lastTransaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLastTranTime() {
|
public Long getLastTranTime() {
|
||||||
return lastTranTime;
|
return lastTranTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -56,9 +56,15 @@ public class TerminalUtilsImpl implements TerminalUtils{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String generateRandom() {
|
public String generateRandom() {
|
||||||
|
|
||||||
Random rnd = new Random();
|
Random rnd = new Random();
|
||||||
StringBuilder sb = new StringBuilder((1000000 + rnd.nextInt(9000000)));
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(1000000 + rnd.nextInt(9000000));
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
|
|
||||||
|
// Random rnd = new Random();
|
||||||
|
// StringBuilder sb = new StringBuilder((1000000 + rnd.nextInt(9000000)));
|
||||||
|
// return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -4,6 +4,13 @@ import org.junit.Test;
|
|||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Example local unit test, which will execute on the development machine (host).
|
* Example local unit test, which will execute on the development machine (host).
|
||||||
*
|
*
|
||||||
@ -20,10 +27,63 @@ public class ExampleUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testUpperCase() {
|
public void testUpperCase() {
|
||||||
|
|
||||||
String keys = "875f63741753d18811a3449090d1777b".toUpperCase();
|
// String keys = "875f63741753d18811a3449090d1777b".toUpperCase();
|
||||||
|
String keys = "e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase();
|
||||||
System.out.println("Key: "+keys);
|
System.out.println("Key: "+keys);
|
||||||
|
|
||||||
String pan = "4216862078830572";
|
String pan = "4216862078830572";
|
||||||
System.out.println("sub pan: "+pan.substring(pan.length()-13));
|
System.out.println("sub pan: "+pan.substring(pan.length()-13));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void hashString() {
|
||||||
|
String sn = "N86PW400005";
|
||||||
|
String snPN = "com.utsmm.kbz";
|
||||||
|
String nonce = "1234567";
|
||||||
|
String text = sn + snPN + nonce;
|
||||||
|
// LogUtil.d(TAG,"Plain Text: "+text);
|
||||||
|
MessageDigest digest = null;
|
||||||
|
try {
|
||||||
|
digest = MessageDigest.getInstance("SHA-256");
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
|
||||||
|
|
||||||
|
|
||||||
|
String hashStr = ByteUtil.bytes2HexStr(hash);
|
||||||
|
|
||||||
|
System.out.println("Hash: "+hashStr.toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void generateRandomDigit() {
|
||||||
|
Random rnd = new Random();
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(1000000 + rnd.nextInt(9000000));
|
||||||
|
String random = sb.toString();
|
||||||
|
System.out.println("Random: " + random);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void hashTestString() {
|
||||||
|
String sn = "SN3123141";
|
||||||
|
String snPN = "default-package-1";
|
||||||
|
String nonce = "1234567";
|
||||||
|
String text = sn + snPN + nonce;
|
||||||
|
// LogUtil.d(TAG,"Plain Text: "+text);
|
||||||
|
MessageDigest digest = null;
|
||||||
|
try {
|
||||||
|
digest = MessageDigest.getInstance("SHA-256");
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
|
||||||
|
|
||||||
|
|
||||||
|
String hashStr = ByteUtil.bytes2HexStr(hash);
|
||||||
|
|
||||||
|
System.out.println("Hash: "+hashStr.toLowerCase());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -24,9 +24,208 @@ public class DecodePackage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static HashMap<String, MsgField> unAssembly(byte[] body, HostName hostName,boolean printLog) {
|
public static HashMap<String, MsgField> unAssembly(byte[] body, HostName hostName,boolean printLog) {
|
||||||
return unAssembly(body, FieldConfig.FieldTypeConfig128,hostName,printLog);
|
return unAssembly(body,hostName == HostName.BPC? FieldConfig.FieldTypeConfig128 : FieldConfig.FieldTypeConfigV1,hostName,printLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public synchronized static HashMap<String, MsgField> unAssembly(byte[] body, int[][] fieldConfig) {
|
||||||
|
HashMap<String, MsgField> resMap = new HashMap<>();
|
||||||
|
|
||||||
|
// Request header length 15
|
||||||
|
// Len[2] + tPDU[5] + Header[6] + Type[2]
|
||||||
|
int head = 7 + FieldConfig.MESSAGE_HEADER_LENGTH;
|
||||||
|
|
||||||
|
// Calculate the length of the message type
|
||||||
|
byte[] msgData = null;
|
||||||
|
int typeLength = FieldConfig.FieldTypeConfig128[0][2];
|
||||||
|
switch (FieldConfig.FieldTypeConfig128[0][3]) {
|
||||||
|
case FieldConfig.SDK_8583_DATA_BCD:
|
||||||
|
head += (typeLength + 1) / 2;
|
||||||
|
msgData = new byte[(typeLength + 1) / 2];
|
||||||
|
break;
|
||||||
|
case FieldConfig.SDK_8583_DATA_ASC:
|
||||||
|
case FieldConfig.SDK_8583_DATA_BIT:
|
||||||
|
head += typeLength;
|
||||||
|
msgData = new byte[typeLength];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Fetch header
|
||||||
|
byte[] headerData = new byte[FieldConfig.MESSAGE_HEADER_LENGTH];
|
||||||
|
System.arraycopy(body, 7, headerData, 0, FieldConfig.MESSAGE_HEADER_LENGTH);
|
||||||
|
MsgField headerFiled = new MsgField();
|
||||||
|
headerFiled.setFieldPos(-1);
|
||||||
|
headerFiled.setLengthType(fieldConfig[0][0]);
|
||||||
|
headerFiled.setLengthTypeEncode(fieldConfig[0][1]);
|
||||||
|
headerFiled.setDataType(fieldConfig[0][3]);
|
||||||
|
headerFiled.setAlignType(fieldConfig[0][4]);
|
||||||
|
headerFiled.setFillChar(fieldConfig[0][5]);
|
||||||
|
headerFiled.setDataLength(fieldConfig[0][2]);
|
||||||
|
headerFiled.setDataBytes(headerData);
|
||||||
|
headerFiled.setDataStr(Utils.byte2HexStr(headerData));
|
||||||
|
resMap.put("header", headerFiled);
|
||||||
|
String header = Utils.byte2HexStr(headerData);
|
||||||
|
LogUtil.d(TAG, "header:" + header);
|
||||||
|
|
||||||
|
// Get message type
|
||||||
|
System.arraycopy(body, 7 + FieldConfig.MESSAGE_HEADER_LENGTH, msgData, 0, msgData.length);
|
||||||
|
String msgType = "";
|
||||||
|
switch (FieldConfig.FieldTypeConfig128[0][3]) {
|
||||||
|
case FieldConfig.SDK_8583_DATA_BCD:
|
||||||
|
case FieldConfig.SDK_8583_DATA_BIT:
|
||||||
|
msgType = Utils.byte2HexStr(msgData);
|
||||||
|
break;
|
||||||
|
case FieldConfig.SDK_8583_DATA_ASC:
|
||||||
|
try {
|
||||||
|
msgType = new String(msgData, "ISO-8859-1");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
MsgField msgFiled = new MsgField();
|
||||||
|
msgFiled.setFieldPos(0);
|
||||||
|
msgFiled.setLengthType(fieldConfig[0][0]);
|
||||||
|
msgFiled.setLengthTypeEncode(fieldConfig[0][1]);
|
||||||
|
msgFiled.setDataType(fieldConfig[0][3]);
|
||||||
|
msgFiled.setAlignType(fieldConfig[0][4]);
|
||||||
|
msgFiled.setFillChar(fieldConfig[0][5]);
|
||||||
|
msgFiled.setDataLength(fieldConfig[0][2]);
|
||||||
|
msgFiled.setDataBytes(msgData);
|
||||||
|
msgFiled.setDataStr(msgType);
|
||||||
|
resMap.put("type", msgFiled);
|
||||||
|
LogUtil.d(TAG, "Message type:" + msgType);
|
||||||
|
|
||||||
|
// Get bitmap
|
||||||
|
boolean[] boolBitmap;
|
||||||
|
byte[] bitmap = new byte[8];
|
||||||
|
System.arraycopy(body, head, bitmap, 0, 8);
|
||||||
|
boolBitmap = Utils.getBinaryFromByte(bitmap);
|
||||||
|
if (boolBitmap[1]) {
|
||||||
|
//If the first bit is 1, it is an expandable bitmap, set to 16 bytes in length.
|
||||||
|
byte[] b = new byte[16];
|
||||||
|
System.arraycopy(body, head, b, 0, 16);
|
||||||
|
boolBitmap = Utils.getBinaryFromByte(b);
|
||||||
|
head += 16;
|
||||||
|
} else {
|
||||||
|
head += 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
int size = boolBitmap.length;
|
||||||
|
|
||||||
|
// Total length of request header and bitmap
|
||||||
|
int tmpLen = head;
|
||||||
|
|
||||||
|
// 0 1 Domain not used
|
||||||
|
for (int i = 2; i < size; i++) {
|
||||||
|
if (boolBitmap[i]) {
|
||||||
|
MsgField outField = new MsgField();
|
||||||
|
outField.setFieldPos(i);
|
||||||
|
outField.setLengthType(fieldConfig[i][0]);
|
||||||
|
outField.setLengthTypeEncode(fieldConfig[i][1]);
|
||||||
|
outField.setDataType(fieldConfig[i][3]);
|
||||||
|
outField.setAlignType(fieldConfig[i][4]);
|
||||||
|
outField.setFillChar(fieldConfig[i][5]);
|
||||||
|
// len is useless for variable length。
|
||||||
|
outField.setDataLength(fieldConfig[i][2]);
|
||||||
|
|
||||||
|
byte[] nextData;
|
||||||
|
|
||||||
|
//53 templen - 54
|
||||||
|
|
||||||
|
// Get the value of the variable length part
|
||||||
|
if (outField.getLengthType() > 0) {
|
||||||
|
// Get the length of the byte array
|
||||||
|
int varLen = (outField.getLengthType() + 1) / 2;
|
||||||
|
byte[] varValue = new byte[varLen];
|
||||||
|
if(i==62){
|
||||||
|
tmpLen++;
|
||||||
|
}
|
||||||
|
System.arraycopy(body, tmpLen, varValue, 0, varValue.length);
|
||||||
|
// Length of data length
|
||||||
|
tmpLen += varLen; //tmp len 54
|
||||||
|
|
||||||
|
// Number of bytes of variable length data
|
||||||
|
int datLen;
|
||||||
|
int bcdLength = Utils.bcdToint(varValue); //31
|
||||||
|
// Determine the data type (binary type data is not processed)
|
||||||
|
if (outField.getDataType() == FieldConfig.SDK_8583_DATA_BCD) {
|
||||||
|
datLen = (bcdLength / 2) + (bcdLength % 2);
|
||||||
|
outField.setDataLength(bcdLength); // Fill the variable length
|
||||||
|
} else if (outField.getDataType() == FieldConfig.SDK_8583_DATA_BIT) {
|
||||||
|
datLen = bcdLength;
|
||||||
|
outField.setDataLength(2 * bcdLength); // Fill the variable length
|
||||||
|
} else {
|
||||||
|
//asc
|
||||||
|
datLen = bcdLength;
|
||||||
|
outField.setDataLength(bcdLength); // Fill the variable length
|
||||||
|
}
|
||||||
|
// Take the value of the variable length part。
|
||||||
|
nextData = new byte[datLen];
|
||||||
|
|
||||||
|
//tmp len 55
|
||||||
|
System.arraycopy(body, tmpLen, nextData, 0, datLen);
|
||||||
|
//updated
|
||||||
|
/* if(body.length>tmpLen+datLen){
|
||||||
|
System.arraycopy(body, tmpLen, nextData, 0, datLen);
|
||||||
|
}else {
|
||||||
|
return null;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Data length
|
||||||
|
tmpLen += datLen;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Fixed-length data length
|
||||||
|
int datLen;
|
||||||
|
// Determine the data type (binary type data is not processed)
|
||||||
|
if (outField.getDataType() == FieldConfig.SDK_8583_DATA_BCD) {
|
||||||
|
datLen = (outField.getDataLength() / 2) + (outField.getDataLength() % 2);
|
||||||
|
} else if (outField.getDataType() == FieldConfig.SDK_8583_DATA_ASC) {
|
||||||
|
datLen = outField.getDataLength();
|
||||||
|
} else {
|
||||||
|
datLen = outField.getDataLength();
|
||||||
|
}
|
||||||
|
nextData = new byte[datLen];
|
||||||
|
System.arraycopy(body, tmpLen, nextData, 0, nextData.length);
|
||||||
|
tmpLen += nextData.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Data input
|
||||||
|
if (outField.getDataType() == FieldConfig.SDK_8583_DATA_ASC) {
|
||||||
|
String s = null;
|
||||||
|
try {
|
||||||
|
s = new String(nextData, "gbk");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if (!TextUtils.isEmpty(s) && Utils.isMessyCode(s)) {
|
||||||
|
LogUtil.d(TAG, "field pos:" + outField.getFieldPos() + " = " + Utils.byte2HexStr(nextData));
|
||||||
|
} else {
|
||||||
|
LogUtil.d(TAG, "field pos:" + outField.getFieldPos() + " = " + s);
|
||||||
|
}
|
||||||
|
// Determine whether it is GBK encoding or garbled
|
||||||
|
outField.setDataStr(new String(nextData));
|
||||||
|
} else if (outField.getDataType() == FieldConfig.SDK_8583_DATA_BIT) {
|
||||||
|
LogUtil.d(TAG, "field pos:" + outField.getFieldPos() + " = " + Utils.byte2HexStr(nextData));
|
||||||
|
outField.setDataStr(Utils.byte2HexStr(nextData));
|
||||||
|
} else if (outField.getDataType() == FieldConfig.SDK_8583_DATA_BCD) {
|
||||||
|
LogUtil.d(TAG, "field pos:" + outField.getFieldPos() + " = " + Utils.Bcd2String(nextData));
|
||||||
|
outField.setDataStr(Utils.Bcd2String(nextData));
|
||||||
|
}
|
||||||
|
|
||||||
|
outField.setDataBytes(nextData);
|
||||||
|
resMap.put("F" + String.format(Locale.getDefault(), "%03d", i), outField);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resMap;
|
||||||
|
}
|
||||||
public synchronized static HashMap<String, MsgField> unAssembly(byte[] body, int[][] fieldConfig,HostName hostName,boolean printLog) {
|
public synchronized static HashMap<String, MsgField> unAssembly(byte[] body, int[][] fieldConfig,HostName hostName,boolean printLog) {
|
||||||
HashMap<String, MsgField> resMap = new HashMap<>();
|
HashMap<String, MsgField> resMap = new HashMap<>();
|
||||||
|
|
||||||
@ -152,9 +351,17 @@ public class DecodePackage {
|
|||||||
|
|
||||||
// Get the value of the variable length part
|
// Get the value of the variable length part
|
||||||
if (outField.getLengthType() > 0) {
|
if (outField.getLengthType() > 0) {
|
||||||
|
int varLen;
|
||||||
|
if( hostName == HostName.BPC) {
|
||||||
|
varLen = outField.getLengthType();
|
||||||
|
} else {
|
||||||
|
varLen = (outField.getLengthType() + 1) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
// Get the length of the byte array
|
// Get the length of the byte array
|
||||||
// int varLen = (outField.getLengthType() + 1) / 2;
|
// int varLen = (outField.getLengthType() + 1) / 2;
|
||||||
int varLen = outField.getLengthType();
|
// varLen = outField.getLengthType();
|
||||||
|
|
||||||
byte[] varValue = new byte[varLen];
|
byte[] varValue = new byte[varLen];
|
||||||
if(i==62){
|
if(i==62){
|
||||||
tmpLen++;
|
tmpLen++;
|
||||||
@ -172,6 +379,7 @@ public class DecodePackage {
|
|||||||
bcdLength = Integer.parseInt(new String(varValue)); //31
|
bcdLength = Integer.parseInt(new String(varValue)); //31
|
||||||
} else {
|
} else {
|
||||||
bcdLength = Utils.bcdToint(varValue); //31
|
bcdLength = Utils.bcdToint(varValue); //31
|
||||||
|
// bcdLength = Integer.parseInt(new String(varValue)); //31
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine the data type (binary type data is not processed)
|
// Determine the data type (binary type data is not processed)
|
||||||
@ -197,8 +405,13 @@ public class DecodePackage {
|
|||||||
//tmp len 55
|
//tmp len 55
|
||||||
|
|
||||||
try {
|
try {
|
||||||
System.arraycopy(body, tmpLen, nextData, 0, datLen);
|
if(hostName == HostName.BPC) {
|
||||||
// System.arraycopy(body, tmpLen, nextData, 0, body.length-tmpLen);
|
System.arraycopy(body, tmpLen, nextData, 0, datLen);
|
||||||
|
} else {
|
||||||
|
System.arraycopy(body, tmpLen, nextData, 0, body.length-tmpLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
} catch (IndexOutOfBoundsException e){
|
} catch (IndexOutOfBoundsException e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,10 +19,12 @@ import java.util.Map;
|
|||||||
import com.utsmyanmar.paylibs.utils.LogUtil;
|
import com.utsmyanmar.paylibs.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 +139,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 +153,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 +168,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 +238,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;
|
||||||
@ -246,27 +270,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());
|
||||||
|
|||||||
@ -122,19 +122,43 @@ public abstract class BaseISOMsgX {
|
|||||||
|
|
||||||
return newBytes;
|
return newBytes;
|
||||||
} else if(isoMode == ISOMode.ONLY_HEADER) {
|
} else if(isoMode == ISOMode.ONLY_HEADER) {
|
||||||
|
byte[] outBytes = new byte[receiveBytes.length + 5];
|
||||||
|
|
||||||
byte[] outBytes = new byte[receiveBytes.length + 6];
|
byte[] fakeTPDU = ByteUtil.hexStr2Bytes("5555555555");
|
||||||
|
System.arraycopy(fakeTPDU, 0, outBytes, 2, 5);
|
||||||
|
System.arraycopy(receiveBytes, 2, outBytes, 7, receiveBytes.length-2 );
|
||||||
|
int hig = (outBytes.length - 2) / 256;
|
||||||
|
int low = (outBytes.length - 2) % 256;
|
||||||
|
outBytes[0] = (byte) hig;
|
||||||
|
outBytes[1] = (byte) low;
|
||||||
|
|
||||||
byte[] headBytes = ByteUtil.hexStr2Bytes("888888888888");
|
|
||||||
|
|
||||||
System.arraycopy(receiveBytes, 0, outBytes, 0, 7);
|
|
||||||
System.arraycopy(headBytes, 0, outBytes, 7, headBytes.length);
|
|
||||||
System.arraycopy(receiveBytes, 7, outBytes, 13, receiveBytes.length - 7);
|
|
||||||
|
|
||||||
log = "HexString:" + ByteUtil.bytes2HexStr(outBytes);
|
log = "HexString:" + ByteUtil.bytes2HexStr(outBytes);
|
||||||
LogUtil.d(Constant.TAG, log);
|
LogUtil.d(Constant.TAG, log);
|
||||||
|
|
||||||
return outBytes;
|
return outBytes;
|
||||||
|
// byte[] newBytes = new byte[outBytes.length + 6];
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// System.arraycopy(outBytes, 0, newBytes, 0, 7);
|
||||||
|
// System.arraycopy(headBytes, 0, newBytes, 7, headBytes.length);
|
||||||
|
// System.arraycopy(outBytes, 7, newBytes, 13, outBytes.length - 7);
|
||||||
|
//
|
||||||
|
// log = "HexString Packed:" + ByteUtil.bytes2HexStr(newBytes);
|
||||||
|
// LogUtil.d(Constant.TAG, log);
|
||||||
|
// return newBytes;
|
||||||
|
// byte[] outBytes = new byte[receiveBytes.length + 6];
|
||||||
|
//
|
||||||
|
// byte[] headBytes = ByteUtil.hexStr2Bytes("888888888888");
|
||||||
|
//
|
||||||
|
// System.arraycopy(receiveBytes, 0, outBytes, 0, 6);
|
||||||
|
// System.arraycopy(headBytes, 0, outBytes, 6, headBytes.length);
|
||||||
|
// System.arraycopy(receiveBytes, 6, outBytes, 12, receiveBytes.length - 6);
|
||||||
|
//
|
||||||
|
// log = "HexString:" + ByteUtil.bytes2HexStr(outBytes);
|
||||||
|
// LogUtil.d(Constant.TAG, log);
|
||||||
|
//
|
||||||
|
// return outBytes;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|||||||
@ -26,11 +26,15 @@ import java.security.KeyManagementException;
|
|||||||
import java.security.KeyStore;
|
import java.security.KeyStore;
|
||||||
import java.security.KeyStoreException;
|
import java.security.KeyStoreException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.SecureRandom;
|
||||||
import java.security.cert.Certificate;
|
import java.security.cert.Certificate;
|
||||||
import java.security.cert.CertificateException;
|
import java.security.cert.CertificateException;
|
||||||
import java.security.cert.CertificateFactory;
|
import java.security.cert.CertificateFactory;
|
||||||
import java.security.cert.X509Certificate;
|
import java.security.cert.X509Certificate;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
@ -65,6 +69,8 @@ import com.utsmyanmar.paylibs.utils.LogUtil;
|
|||||||
public class ISOSocket {
|
public class ISOSocket {
|
||||||
|
|
||||||
private static final int DEFAULT_TIMEOUT = 30 * 1000;
|
private static final int DEFAULT_TIMEOUT = 30 * 1000;
|
||||||
|
|
||||||
|
private static final String TAG = ISOSocket.class.getSimpleName();
|
||||||
private String serverIP;
|
private String serverIP;
|
||||||
private int serverPort;
|
private int serverPort;
|
||||||
private int connectTimeout = 20;
|
private int connectTimeout = 20;
|
||||||
@ -148,16 +154,15 @@ public class ISOSocket {
|
|||||||
private SSLSocketFactory getSSLSocketFactory()
|
private SSLSocketFactory getSSLSocketFactory()
|
||||||
throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException {
|
throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException {
|
||||||
CertificateFactory cf = CertificateFactory.getInstance("X.509");
|
CertificateFactory cf = CertificateFactory.getInstance("X.509");
|
||||||
InputStream caInput = context.getResources().openRawResource(R.raw.smile_uat); // this cert file stored in \app\src\main\res\raw folder path
|
InputStream caInput = context.getResources().openRawResource(R.raw.uat_test); // this cert file stored in \app\src\main\res\raw folder path
|
||||||
|
|
||||||
Certificate ca = cf.generateCertificate(caInput);
|
Certificate ca = cf.generateCertificate(caInput);
|
||||||
caInput.close();
|
caInput.close();
|
||||||
|
|
||||||
KeyStore keyStore = KeyStore.getInstance("BKS");
|
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); // BKS
|
||||||
keyStore.load(null, null);
|
keyStore.load(null, null);
|
||||||
keyStore.setCertificateEntry("ca", ca);
|
keyStore.setCertificateEntry("ca", ca);
|
||||||
|
|
||||||
|
|
||||||
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
|
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
|
||||||
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
|
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
|
||||||
tmf.init(keyStore);
|
tmf.init(keyStore);
|
||||||
@ -174,81 +179,118 @@ public class ISOSocket {
|
|||||||
|
|
||||||
private OkHttpClient getClient()
|
private OkHttpClient getClient()
|
||||||
throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException {
|
throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException {
|
||||||
|
// CertificateFactory cf = CertificateFactory.getInstance("X.509");
|
||||||
|
// InputStream caInput = context.getResources().openRawResource(R.raw.uat_test); // this cert file stored in \app\src\main\res\raw folder path
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Certificate ca = cf.generateCertificate(caInput);
|
||||||
|
// caInput.close();
|
||||||
|
//
|
||||||
|
// KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
|
||||||
|
// keyStore.load(null, null);
|
||||||
|
// keyStore.setCertificateEntry("ca", ca);
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
|
||||||
|
// TrustManagerFactory.getDefaultAlgorithm());
|
||||||
|
// trustManagerFactory.init(keyStore);
|
||||||
|
// TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
|
||||||
|
// if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
|
||||||
|
// throw new IllegalStateException("Unexpected default trust managers:"
|
||||||
|
// + Arrays.toString(trustManagers));
|
||||||
|
// }
|
||||||
|
// X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
|
||||||
|
// SSLContext sslContext = SSLContext.getInstance("TLS");
|
||||||
|
// sslContext.init(null, new TrustManager[]{trustManager}, null);
|
||||||
|
// SSLSocketFactory sslSocketFactory = getSSLSocketFactory();
|
||||||
|
//
|
||||||
|
// Interceptor dummyInterceptor = new Interceptor() {
|
||||||
|
// @NotNull
|
||||||
|
// @Override
|
||||||
|
// public Response intercept(@NotNull Chain chain) throws IOException {
|
||||||
|
// Request request = chain.request();
|
||||||
|
// Response response = chain.proceed(request);
|
||||||
|
// System.out.println("Dummy interceptor fired!\n\nRequest: " + request.headers() + "\nResponse: " + response.headers());
|
||||||
|
// return response;
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
// Interceptor dummyNetworkInterceptor = new Interceptor() {
|
||||||
|
// @NotNull
|
||||||
|
// @Override
|
||||||
|
// public Response intercept(@NotNull Chain chain) throws IOException {
|
||||||
|
// Request request = chain.request();
|
||||||
|
// Response response = chain.proceed(request);
|
||||||
|
// System.out.println("Dummy interceptor fired!\n\nRequest: " + request.headers() + "\nResponse: " + response.headers());
|
||||||
|
// return response;
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// Interceptor tlsIntercept = new Interceptor() {
|
||||||
|
// @NotNull
|
||||||
|
// @Override
|
||||||
|
// public Response intercept(@NotNull Chain chain) throws IOException {
|
||||||
|
// final Response response = chain.proceed(chain.request());
|
||||||
|
// Handshake handshake = response.handshake();
|
||||||
|
// if (handshake != null) {
|
||||||
|
// final CipherSuite cipherSuite = handshake.cipherSuite();
|
||||||
|
// final TlsVersion tlsVersion = handshake.tlsVersion();
|
||||||
|
// LogUtil.d(Constant.TAG, "TLS: " + tlsVersion + ", CipherSuite: " + cipherSuite);
|
||||||
|
// }
|
||||||
|
// return response;
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// return new OkHttpClient.Builder()
|
||||||
|
// .sslSocketFactory(sslSocketFactory, trustManager)
|
||||||
|
// .hostnameVerifier(new HostnameVerifier() {
|
||||||
|
// @Override
|
||||||
|
// public boolean verify(String hostname, SSLSession session) {
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// .addInterceptor(tlsIntercept)
|
||||||
|
// .connectTimeout(30000, TimeUnit.MILLISECONDS)
|
||||||
|
// .readTimeout(30000, TimeUnit.MILLISECONDS)
|
||||||
|
// .writeTimeout(30000, TimeUnit.MILLISECONDS)
|
||||||
|
// .retryOnConnectionFailure(true)
|
||||||
|
// .build();
|
||||||
|
|
||||||
|
// 1. Read the DER file into a byte array/InputStream
|
||||||
|
// (Assuming the file is bundled in your app's resources)
|
||||||
|
InputStream caInput = context.getResources().openRawResource(R.raw.uat_test); // Replace R.raw.cacert
|
||||||
|
|
||||||
|
// 2. Load the certificate from the InputStream
|
||||||
CertificateFactory cf = CertificateFactory.getInstance("X.509");
|
CertificateFactory cf = CertificateFactory.getInstance("X.509");
|
||||||
InputStream caInput = context.getResources().openRawResource(R.raw.smile_uat); // this cert file stored in \app\src\main\res\raw folder path
|
X509Certificate caCert = (X509Certificate) cf.generateCertificate(caInput);
|
||||||
|
String keyStoreType = KeyStore.getDefaultType();
|
||||||
Certificate ca = cf.generateCertificate(caInput);
|
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
|
||||||
caInput.close();
|
|
||||||
|
|
||||||
KeyStore keyStore = KeyStore.getInstance("BKS");
|
|
||||||
keyStore.load(null, null);
|
keyStore.load(null, null);
|
||||||
keyStore.setCertificateEntry("ca", ca);
|
keyStore.setCertificateEntry("ca", caCert); // 'ca' is an alias
|
||||||
|
|
||||||
|
// 3. Create a TrustManager that uses your custom KeyStore
|
||||||
|
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
|
||||||
|
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
|
||||||
|
tmf.init(keyStore);
|
||||||
|
|
||||||
|
TrustManager[] trustAll = new TrustManager[]{new X509TrustManager() {
|
||||||
|
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
|
||||||
|
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
|
||||||
|
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
|
||||||
|
}};
|
||||||
|
SSLContext ctx = SSLContext.getInstance("TLS");
|
||||||
|
ctx.init(null, trustAll, new SecureRandom());
|
||||||
|
|
||||||
|
SSLSocketFactory factory = ctx.getSocketFactory();
|
||||||
|
try (SSLSocket ssock = (SSLSocket) factory.createSocket()) {
|
||||||
|
|
||||||
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
|
|
||||||
TrustManagerFactory.getDefaultAlgorithm());
|
|
||||||
trustManagerFactory.init(keyStore);
|
|
||||||
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
|
|
||||||
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
|
|
||||||
throw new IllegalStateException("Unexpected default trust managers:"
|
|
||||||
+ Arrays.toString(trustManagers));
|
|
||||||
}
|
}
|
||||||
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
|
|
||||||
SSLContext sslContext = SSLContext.getInstance("TLS");
|
|
||||||
sslContext.init(null, new TrustManager[]{trustManager}, null);
|
|
||||||
SSLSocketFactory sslSocketFactory = getSSLSocketFactory();
|
|
||||||
|
|
||||||
Interceptor dummyInterceptor = new Interceptor() {
|
OkHttpClient client = new OkHttpClient.Builder()
|
||||||
@NotNull
|
.sslSocketFactory(ctx.getSocketFactory())
|
||||||
@Override
|
|
||||||
public Response intercept(@NotNull Chain chain) throws IOException {
|
|
||||||
Request request = chain.request();
|
|
||||||
Response response = chain.proceed(request);
|
|
||||||
System.out.println("Dummy interceptor fired!\n\nRequest: " + request.headers() + "\nResponse: " + response.headers());
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Interceptor dummyNetworkInterceptor = new Interceptor() {
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public Response intercept(@NotNull Chain chain) throws IOException {
|
|
||||||
Request request = chain.request();
|
|
||||||
Response response = chain.proceed(request);
|
|
||||||
System.out.println("Dummy interceptor fired!\n\nRequest: " + request.headers() + "\nResponse: " + response.headers());
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Interceptor tlsIntercept = new Interceptor() {
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public Response intercept(@NotNull Chain chain) throws IOException {
|
|
||||||
final Response response = chain.proceed(chain.request());
|
|
||||||
Handshake handshake = response.handshake();
|
|
||||||
if (handshake != null) {
|
|
||||||
final CipherSuite cipherSuite = handshake.cipherSuite();
|
|
||||||
final TlsVersion tlsVersion = handshake.tlsVersion();
|
|
||||||
LogUtil.d(Constant.TAG, "TLS: " + tlsVersion + ", CipherSuite: " + cipherSuite);
|
|
||||||
}
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
return new OkHttpClient.Builder()
|
|
||||||
.sslSocketFactory(sslSocketFactory, trustManager)
|
|
||||||
.hostnameVerifier(new HostnameVerifier() {
|
|
||||||
@Override
|
|
||||||
public boolean verify(String hostname, SSLSession session) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.addInterceptor(tlsIntercept)
|
|
||||||
.connectTimeout(30000, TimeUnit.MILLISECONDS)
|
|
||||||
.readTimeout(30000, TimeUnit.MILLISECONDS)
|
|
||||||
.writeTimeout(30000, TimeUnit.MILLISECONDS)
|
|
||||||
.retryOnConnectionFailure(true)
|
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isOnline() {
|
public boolean isOnline() {
|
||||||
@ -333,6 +375,8 @@ public class ISOSocket {
|
|||||||
serverPort = getSecondaryPort();
|
serverPort = getSecondaryPort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String formatDate(Date d) { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d); }
|
||||||
|
|
||||||
public void enqueue(byte[] sendBuff, int sendLen, boolean reversalTrans, ISOCallback listener) {
|
public void enqueue(byte[] sendBuff, int sendLen, boolean reversalTrans, ISOCallback listener) {
|
||||||
|
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
@ -384,8 +428,54 @@ public class ISOSocket {
|
|||||||
if (SystemParamsOperation.getInstance().isSslOn()) {
|
if (SystemParamsOperation.getInstance().isSslOn()) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
OkHttpClient client = getClient();
|
TrustManager[] trustAll = new TrustManager[]{new X509TrustManager() {
|
||||||
sslSocket = (SSLSocket) client.sslSocketFactory().createSocket();
|
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
|
||||||
|
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
|
||||||
|
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
|
||||||
|
}};
|
||||||
|
SSLContext ctx = SSLContext.getInstance("TLS");
|
||||||
|
ctx.init(null, trustAll, new SecureRandom());
|
||||||
|
|
||||||
|
SSLSocketFactory factory = ctx.getSocketFactory();
|
||||||
|
|
||||||
|
// try (SSLSocket sslsock = (SSLSocket) factory.createSocket()) {
|
||||||
|
//
|
||||||
|
// sslsock.setEnabledProtocols(new String[]{"TLSv1.2"});
|
||||||
|
//// while (!isSSLOnline(timeout,subscriber)) {
|
||||||
|
//// Thread.sleep(150);
|
||||||
|
//// subscriber.onError(new Throwable("java.net.SocketTimeoutException: connect timed out"));
|
||||||
|
//// }
|
||||||
|
//
|
||||||
|
// sslsock.setSoTimeout(60000);
|
||||||
|
// sslsock.connect(new InetSocketAddress(serverIP, serverPort), connectTimeout);
|
||||||
|
//
|
||||||
|
// sslsock.startHandshake();
|
||||||
|
//
|
||||||
|
// SSLSession session = sslsock.getSession();
|
||||||
|
//
|
||||||
|
// LogUtil.d(TAG, "SSL handshake success to " + serverIP + ":" + serverPort + "\n");
|
||||||
|
// LogUtil.d(TAG, "TLS handshake success to " + serverIP + ":" + serverPort + "\n");
|
||||||
|
// LogUtil.d(TAG, "TLS version: " + session.getProtocol() + "\n");
|
||||||
|
// LogUtil.d(TAG,"Cipher suite: " + session.getCipherSuite() + "\n");
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
// java.security.cert.Certificate[] chain = session.getPeerCertificates();
|
||||||
|
// if (chain != null && chain.length > 0) {
|
||||||
|
// LogUtil.d(TAG,"Peer certificates:\n");
|
||||||
|
// for (int i = 0; i < chain.length; i++) {
|
||||||
|
// X509Certificate x = (X509Certificate) chain[i];
|
||||||
|
// LogUtil.d(TAG, " [" + i + "] Subject: " + x.getSubjectX500Principal().getName() + "\n");
|
||||||
|
// LogUtil.d(TAG," Issuer: " + x.getIssuerX500Principal().getName() + "\n");
|
||||||
|
// LogUtil.d(TAG," Valid: " + formatDate(x.getNotBefore()) + " - " + formatDate(x.getNotAfter()) + "\n");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// } catch (Exception ignored) { }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// OkHttpClient client = getClient();
|
||||||
|
sslSocket = (SSLSocket) factory.createSocket();
|
||||||
|
sslSocket.setEnabledProtocols(new String[]{"TLSv1.2"});
|
||||||
|
// sslSocket.setEnabledProtocols(new String[]{"TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3"});
|
||||||
// while (!isSSLOnline(timeout,subscriber)) {
|
// while (!isSSLOnline(timeout,subscriber)) {
|
||||||
// Thread.sleep(150);
|
// Thread.sleep(150);
|
||||||
// subscriber.onError(new Throwable("java.net.SocketTimeoutException: connect timed out"));
|
// subscriber.onError(new Throwable("java.net.SocketTimeoutException: connect timed out"));
|
||||||
@ -394,6 +484,28 @@ public class ISOSocket {
|
|||||||
sslSocket.setSoTimeout(60000);
|
sslSocket.setSoTimeout(60000);
|
||||||
sslSocket.connect(new InetSocketAddress(serverIP, serverPort), connectTimeout);
|
sslSocket.connect(new InetSocketAddress(serverIP, serverPort), connectTimeout);
|
||||||
|
|
||||||
|
sslSocket.startHandshake();
|
||||||
|
|
||||||
|
SSLSession session = sslSocket.getSession();
|
||||||
|
|
||||||
|
LogUtil.d(TAG, "SSL handshake success to " + serverIP + ":" + serverPort + "\n");
|
||||||
|
LogUtil.d(TAG, "TLS handshake success to " + serverIP + ":" + serverPort + "\n");
|
||||||
|
LogUtil.d(TAG, "TLS version: " + session.getProtocol() + "\n");
|
||||||
|
LogUtil.d(TAG,"Cipher suite: " + session.getCipherSuite() + "\n");
|
||||||
|
|
||||||
|
try {
|
||||||
|
java.security.cert.Certificate[] chain = session.getPeerCertificates();
|
||||||
|
if (chain != null && chain.length > 0) {
|
||||||
|
LogUtil.d(TAG,"Peer certificates:\n");
|
||||||
|
for (int i = 0; i < chain.length; i++) {
|
||||||
|
X509Certificate x = (X509Certificate) chain[i];
|
||||||
|
LogUtil.d(TAG, " [" + i + "] Subject: " + x.getSubjectX500Principal().getName() + "\n");
|
||||||
|
LogUtil.d(TAG," Issuer: " + x.getIssuerX500Principal().getName() + "\n");
|
||||||
|
LogUtil.d(TAG," Valid: " + formatDate(x.getNotBefore()) + " - " + formatDate(x.getNotAfter()) + "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ignored) { }
|
||||||
|
|
||||||
inputStream = sslSocket.getInputStream();
|
inputStream = sslSocket.getInputStream();
|
||||||
outputStream = sslSocket.getOutputStream();
|
outputStream = sslSocket.getOutputStream();
|
||||||
|
|
||||||
@ -421,7 +533,7 @@ public class ISOSocket {
|
|||||||
subscriber.onComplete();
|
subscriber.onComplete();
|
||||||
|
|
||||||
|
|
||||||
} catch (CertificateException | KeyStoreException | IOException |
|
} catch ( IOException |
|
||||||
NoSuchAlgorithmException | KeyManagementException e) {
|
NoSuchAlgorithmException | KeyManagementException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
subscriber.onError(e);
|
subscriber.onError(e);
|
||||||
@ -495,7 +607,9 @@ public class ISOSocket {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNext(byte[] aByte) {
|
public void onNext(byte[] aByte) {
|
||||||
LogUtil.d(Constant.TAG, "onNext");
|
LogUtil.d(Constant.TAG, "onNext raw:"+ByteUtil.bytes2HexStr(aByte));
|
||||||
|
|
||||||
|
|
||||||
//rlen =47 MPU 5:44pm 21/9/2020
|
//rlen =47 MPU 5:44pm 21/9/2020
|
||||||
listener.onReceive(recBuff, rLen);
|
listener.onReceive(recBuff, rLen);
|
||||||
isReversal = false;
|
isReversal = false;
|
||||||
|
|||||||
@ -706,7 +706,7 @@ public abstract class BaseXPrint {
|
|||||||
String cvmText = "NO SIGNATURE REQUIRED";
|
String cvmText = "NO SIGNATURE REQUIRED";
|
||||||
switch (payDetail.getTransCVM()) {
|
switch (payDetail.getTransCVM()) {
|
||||||
case SIGNATURE:
|
case SIGNATURE:
|
||||||
cvmText = "SIGN : -----------------------------";
|
cvmText = "SIGN : --------------";
|
||||||
break;
|
break;
|
||||||
case ONLINE_PIN:
|
case ONLINE_PIN:
|
||||||
cvmText = "ONLINE PIN VERIFIED";
|
cvmText = "ONLINE PIN VERIFIED";
|
||||||
|
|||||||
@ -40,7 +40,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
|
|||||||
SimpleDateFormat dfm = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.getDefault());
|
SimpleDateFormat dfm = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.getDefault());
|
||||||
currentTime = dfm.format(new Date());
|
currentTime = dfm.format(new Date());
|
||||||
BitmapFactory.Options opts = new BitmapFactory.Options();
|
BitmapFactory.Options opts = new BitmapFactory.Options();
|
||||||
bitmap = BitmapFactory.decodeResource(resources, R.drawable.print_kbz_logo, opts);
|
bitmap = BitmapFactory.decodeResource(resources, R.drawable.print_logo_mpu, opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -49,7 +49,7 @@ public class ReversalAction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ReversalAction() {
|
private ReversalAction() {
|
||||||
isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.BOTH_HEADER_TPDU,HostName.BPC)
|
isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.ONLY_HEADER,HostName.FINEXUS)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -47,7 +47,7 @@ public class EchoTestProcess {
|
|||||||
private EchoTestProcess() {
|
private EchoTestProcess() {
|
||||||
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.ONLY_HEADER,HostName.FINEXUS)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -51,7 +51,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.ONLY_HEADER,HostName.FINEXUS)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ public class SignOnProcess {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.BPC_SIGN_ON, MessageType.NETWORK_MANAGEMENT);
|
byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, BitmapConfig.MPU_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) {
|
||||||
@ -107,7 +107,9 @@ public class SignOnProcess {
|
|||||||
byte[] field62 = Objects.requireNonNull(responseMap.get("F062")).getDataBytes();
|
byte[] field62 = Objects.requireNonNull(responseMap.get("F062")).getDataBytes();
|
||||||
byte[] encryptedPIK = new byte[16];
|
byte[] encryptedPIK = new byte[16];
|
||||||
|
|
||||||
System.arraycopy(field62, 2, encryptedPIK, 0, 16);
|
System.arraycopy(field62, 0, encryptedPIK, 0, 8);
|
||||||
|
System.arraycopy(field62, 0, encryptedPIK, 8, 8);
|
||||||
|
// System.arraycopy(field62, 0, encryptedPIK, 0, 16);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
byte[] kcv = ByteUtil.hexStr2Bytes(TriDes.getKcv(encryptedPIK));
|
byte[] kcv = ByteUtil.hexStr2Bytes(TriDes.getKcv(encryptedPIK));
|
||||||
@ -118,6 +120,9 @@ public class SignOnProcess {
|
|||||||
tmkIndex = Integer.parseInt(SystemParamsOperation.getInstance().getTMKIndex());
|
tmkIndex = Integer.parseInt(SystemParamsOperation.getInstance().getTMKIndex());
|
||||||
}
|
}
|
||||||
LogUtil.d(TAG, "TMK Index:" + tmkIndex);
|
LogUtil.d(TAG, "TMK Index:" + tmkIndex);
|
||||||
|
|
||||||
|
SystemParamsOperation.getInstance().saveKeyPIK(encryptedPIK, kcv);
|
||||||
|
|
||||||
int res = PayLibNex.getInstance().deviceEngine.getPinPad().writeWKey(9, WorkKeyTypeEnum.PINKEY,encryptedPIK,encryptedPIK.length);
|
int res = PayLibNex.getInstance().deviceEngine.getPinPad().writeWKey(9, WorkKeyTypeEnum.PINKEY,encryptedPIK,encryptedPIK.length);
|
||||||
// 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;
|
||||||
|
|||||||
@ -82,7 +82,7 @@ public class TransactionsOperation {
|
|||||||
TradeData transTradeData;
|
TradeData transTradeData;
|
||||||
PayDetail transPayDetail;
|
PayDetail transPayDetail;
|
||||||
|
|
||||||
isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.BOTH_HEADER_TPDU, hostName)
|
isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1987, ISOMode.ONLY_HEADER, hostName)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
if (transactionsType == TransactionsType.SALE || transactionsType == TransactionsType.PRE_AUTH_SALE || transactionsType == TransactionsType.CASH_OUT) {
|
if (transactionsType == TransactionsType.SALE || transactionsType == TransactionsType.PRE_AUTH_SALE || transactionsType == TransactionsType.CASH_OUT) {
|
||||||
@ -102,7 +102,6 @@ public class TransactionsOperation {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
transPayDetail.setSendBag(sendBytes);
|
transPayDetail.setSendBag(sendBytes);
|
||||||
|
|
||||||
|
|
||||||
@ -349,7 +348,13 @@ public class TransactionsOperation {
|
|||||||
|
|
||||||
|
|
||||||
if (transactionsType == TransactionsType.VOID || transactionsType == TransactionsType.REFUND) {
|
if (transactionsType == TransactionsType.VOID || transactionsType == TransactionsType.REFUND) {
|
||||||
String field60 = String.format(Locale.getDefault(), "%010d00", oldPay.getAmount());
|
String field60;
|
||||||
|
if(hostName == HostName.BPC) {
|
||||||
|
field60 = String.format(Locale.getDefault(), "%010d00", oldPay.getAmount());
|
||||||
|
} else {
|
||||||
|
field60 = String.format(Locale.getDefault(), "%012d", oldPay.getAmount());
|
||||||
|
}
|
||||||
|
// String field60 = String.format(Locale.getDefault(), "%010d00", oldPay.getAmount());
|
||||||
newPay.setReferNo(oldPay.getReferNo());
|
newPay.setReferNo(oldPay.getReferNo());
|
||||||
newPay.setTransCVM(TransCVM.SIGNATURE);
|
newPay.setTransCVM(TransCVM.SIGNATURE);
|
||||||
newTrade.setField60(field60);
|
newTrade.setField60(field60);
|
||||||
|
|||||||
@ -41,7 +41,8 @@ public class SystemParamsSettings implements Serializable {
|
|||||||
private boolean checkExpSwitch = false;
|
private boolean checkExpSwitch = false;
|
||||||
|
|
||||||
// private String tmsAddress = "https://tms.smile-mm.com";
|
// private String tmsAddress = "https://tms.smile-mm.com";
|
||||||
private String tmsAddress = "http://128.199.170.203";
|
// private String tmsAddress = "http://128.199.170.203";
|
||||||
|
private String tmsAddress = "http://sirius-nest.utsmyanmar.com";
|
||||||
|
|
||||||
private String terminalCapability = "E0E8C8";
|
private String terminalCapability = "E0E8C8";
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,8 @@ public enum TransMenu {
|
|||||||
|
|
||||||
REVERSAL,
|
REVERSAL,
|
||||||
|
|
||||||
|
CASH_OUT,
|
||||||
|
|
||||||
CLEAR_BATCH,
|
CLEAR_BATCH,
|
||||||
CLEAR_REVERSAL,
|
CLEAR_REVERSAL,
|
||||||
SUMMARY_REPORT,
|
SUMMARY_REPORT,
|
||||||
|
|||||||
@ -27,63 +27,63 @@ 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.MPU_NEW_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.MPU_NEW_CASH_ADVANCE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VOID:
|
case VOID:
|
||||||
if (hostName == HostName.BPC) {
|
if (hostName == HostName.BPC) {
|
||||||
bitmap = BitmapConfig.BPC_VOID;
|
bitmap = BitmapConfig.BPC_VOID;
|
||||||
} else {
|
} else {
|
||||||
bitmap = BitmapConfig.FINEXUS_VOID;
|
bitmap = BitmapConfig.MPU_NEW_VOID;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SETTLEMENT:
|
case SETTLEMENT:
|
||||||
if (hostName == HostName.BPC) {
|
if (hostName == HostName.BPC) {
|
||||||
bitmap = BitmapConfig.BPC_SETTLEMENT;
|
bitmap = BitmapConfig.BPC_SETTLEMENT;
|
||||||
} else {
|
} else {
|
||||||
bitmap = BitmapConfig.FINEXUS_BATCH_UPLOAD;
|
bitmap = BitmapConfig.MPU_NEW_BATCH_UPLOAD;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PRE_AUTH_SALE:
|
case PRE_AUTH_SALE:
|
||||||
if (hostName == HostName.BPC) {
|
if (hostName == HostName.BPC) {
|
||||||
bitmap = BitmapConfig.BPC_PRE_AUTH_SALE;
|
bitmap = BitmapConfig.BPC_PRE_AUTH_SALE;
|
||||||
} else {
|
} else {
|
||||||
bitmap = BitmapConfig.FUND_TRANSFER_PRE_CHECK;
|
bitmap = BitmapConfig.MPU_NEW_PRE_AUTH;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PRE_AUTH_VOID:
|
case PRE_AUTH_VOID:
|
||||||
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.MPU_NEW_PRE_AUTH_CANCEL;
|
||||||
}
|
}
|
||||||
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.MPU_NEW_PRE_AUTH_COMPLETE_BITMAP;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PRE_AUTH_COMPLETE_VOID:
|
case PRE_AUTH_COMPLETE_VOID:
|
||||||
if (hostName == HostName.BPC) {
|
if (hostName == HostName.BPC) {
|
||||||
bitmap = BitmapConfig.BPC_VOID;
|
bitmap = BitmapConfig.BPC_VOID;
|
||||||
} else {
|
} else {
|
||||||
bitmap = BitmapConfig.FINEXUS_PRE_AUTH_VOID;
|
bitmap = BitmapConfig.MPU_NEW_PRE_AUTH_COMPLETE_CANCEL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case REFUND:
|
case REFUND:
|
||||||
if (hostName == HostName.BPC) {
|
if (hostName == HostName.BPC) {
|
||||||
bitmap = BitmapConfig.BPC_REFUND;
|
bitmap = BitmapConfig.BPC_REFUND;
|
||||||
} else {
|
} else {
|
||||||
bitmap = BitmapConfig.FINEXUS_SALE;
|
bitmap = BitmapConfig.MPU_NEW_REFUND;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TIP_ADJUSTMENT:
|
case TIP_ADJUSTMENT:
|
||||||
|
|||||||
@ -200,7 +200,7 @@ public class FieldConfig {
|
|||||||
public static int[][] FieldTypeConfigV1 =
|
public static int[][] FieldTypeConfigV1 =
|
||||||
{
|
{
|
||||||
/* FLD 00 */ {0, SDK_8583_LEN_BCD, 4, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
|
/* FLD 00 */ {0, SDK_8583_LEN_BCD, 4, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
|
||||||
/* FLD 01 */ {0, SDK_8583_LEN_BCD, 8, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, 0},
|
/* FLD 01 */ {0, SDK_8583_LEN_BCD, 8, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, 0}, // 8
|
||||||
|
|
||||||
/* FLD 02 */ {2, SDK_8583_LEN_BCD, 19, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
|
/* FLD 02 */ {2, SDK_8583_LEN_BCD, 19, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
|
||||||
|
|
||||||
@ -242,12 +242,12 @@ public class FieldConfig {
|
|||||||
/* FLD 34 */ {0, SDK_8583_LEN_BCD, 40, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '},
|
/* FLD 34 */ {0, SDK_8583_LEN_BCD, 40, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '},
|
||||||
|
|
||||||
//MPU is fine with this config
|
//MPU is fine with this config
|
||||||
// /* FLD 35 */ {2, SDK_8583_LEN_BCD, 37, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
|
/* FLD 35 */ {2, SDK_8583_LEN_BCD, 37, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
|
||||||
//For Finexus
|
//For Finexus
|
||||||
// for TTIP MPU
|
// for TTIP MPU
|
||||||
// /* FLD 35 */ {2, SDK_8583_LEN_BCD, 37, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
|
// /* FLD 35 */ {2, SDK_8583_LEN_BCD, 37, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
|
||||||
|
|
||||||
/* FLD 35 */ {2, SDK_8583_LEN_BCD, 37, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
|
// /* FLD 35 */ {2, SDK_8583_LEN_BCD, 37, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
|
||||||
/* FLD 36 */ {3, SDK_8583_LEN_BCD, 999, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, '0'},
|
/* FLD 36 */ {3, SDK_8583_LEN_BCD, 999, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, '0'},
|
||||||
|
|
||||||
/* 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'},
|
||||||
@ -269,8 +269,8 @@ public class FieldConfig {
|
|||||||
// /* FLD 48 */ {0, SDK_8583_LEN_BCD, 999, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, 0}, // Jun4 2023 BPC
|
// /* FLD 48 */ {0, SDK_8583_LEN_BCD, 999, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, 0}, // Jun4 2023 BPC
|
||||||
/* FLD 48 */ {3, SDK_8583_LEN_BCD, 322, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
|
/* FLD 48 */ {3, SDK_8583_LEN_BCD, 322, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
|
||||||
|
|
||||||
// /* FLD 49 */ {0, SDK_8583_LEN_BCD, 3, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
|
/* FLD 49 */ {0, SDK_8583_LEN_BCD, 3, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
|
||||||
/* FLD 49 */ {0, SDK_8583_LEN_BCD, 3, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, ' '},
|
// /* FLD 49 */ {0, SDK_8583_LEN_BCD, 3, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, ' '},
|
||||||
/* FLD 50 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
|
/* FLD 50 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
|
||||||
/* FLD 51 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
|
/* FLD 51 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
|
||||||
/* FLD 52 */ {0, SDK_8583_LEN_BCD, 8, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, 0},
|
/* FLD 52 */ {0, SDK_8583_LEN_BCD, 8, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, 0},
|
||||||
@ -289,11 +289,11 @@ public class FieldConfig {
|
|||||||
/* FLD 59 */ {3, SDK_8583_LEN_BCD, 999, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
|
/* FLD 59 */ {3, SDK_8583_LEN_BCD, 999, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
|
||||||
|
|
||||||
// original /* FLD 60 */ {3, SDK_8583_LEN_BCD, 17, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
|
// original /* FLD 60 */ {3, SDK_8583_LEN_BCD, 17, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
|
||||||
// MPU /*FLD 60 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '},
|
/*FLD 60 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '}, // MPU //2
|
||||||
/*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'}, // Jun 1 2023
|
/* FLD 62 */ {2, 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, ' '},
|
||||||
// /* 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, ' '},
|
||||||
|
|||||||
@ -257,12 +257,23 @@ public class FieldUtils {
|
|||||||
switch (fieldPos) {
|
switch (fieldPos) {
|
||||||
case 2: //PAN
|
case 2: //PAN
|
||||||
|
|
||||||
if (payDetail.getCardType() == -1) { //manual entry
|
if(payDetail.getHostName().equals(Constant.HOST_BPC)) {
|
||||||
String cardNumber = payDetail.getCardNo();
|
if (payDetail.getCardType() == -1) { //manual entry
|
||||||
field.setDataStr(cardNumber);
|
String cardNumber = payDetail.getCardNo();
|
||||||
|
field.setDataStr(cardNumber);
|
||||||
|
} else {
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
iterator.remove();
|
if (!payDetail.getCardNo().isEmpty()) {
|
||||||
|
String cardNumber = payDetail.getCardNo();
|
||||||
|
field.setDataStr(cardNumber);
|
||||||
|
} else {
|
||||||
|
iterator.remove();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 3: // processing code
|
case 3: // processing code
|
||||||
String code = payDetail.getProcessCode();
|
String code = payDetail.getProcessCode();
|
||||||
@ -360,7 +371,8 @@ public class FieldUtils {
|
|||||||
break;
|
break;
|
||||||
case 24: //Network International Identifier NII
|
case 24: //Network International Identifier NII
|
||||||
|
|
||||||
String nii = processField24(payDetail);
|
String nii = "609";
|
||||||
|
// String nii = processField24(payDetail); // BPC
|
||||||
field.setDataStr(nii);
|
field.setDataStr(nii);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -500,6 +512,7 @@ public class FieldUtils {
|
|||||||
case 60: //Private(oldMPU) //original Amount Void(new MPU)
|
case 60: //Private(oldMPU) //original Amount Void(new MPU)
|
||||||
String field60 = tradeData.getField60();
|
String field60 = tradeData.getField60();
|
||||||
String lengthValue = String.format(Locale.getDefault(),"%04d", field60.length())+field60;
|
String lengthValue = String.format(Locale.getDefault(),"%04d", field60.length())+field60;
|
||||||
|
// String lengthValue = String.format(Locale.getDefault(),"%04d", field60.length())+field60;
|
||||||
field.setDataStr(lengthValue);
|
field.setDataStr(lengthValue);
|
||||||
break;
|
break;
|
||||||
case 61:
|
case 61:
|
||||||
@ -526,8 +539,8 @@ public class FieldUtils {
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case 63: //Private Use
|
case 63: //Private Use
|
||||||
// String settleData = payDetail.getSettleData();
|
String settleData = payDetail.getSettleData();
|
||||||
// field.setDataStr(settleData);
|
field.setDataStr(settleData);
|
||||||
break;
|
break;
|
||||||
case 64: //Message Authentication Code (MAC) Required when the 39 field in the response message is "00"
|
case 64: //Message Authentication Code (MAC) Required when the 39 field in the response message is "00"
|
||||||
field.setDataStr("0000000000000000");
|
field.setDataStr("0000000000000000");
|
||||||
|
|||||||
@ -9,13 +9,13 @@ public enum TransactionsType {
|
|||||||
|
|
||||||
REFUND("REFUND",4,"200000"),
|
REFUND("REFUND",4,"200000"),
|
||||||
|
|
||||||
PRE_AUTH_SALE("PRE-AUTH",5,"930000"),
|
PRE_AUTH_SALE("PRE-AUTH",5,"300000"), //930000
|
||||||
|
|
||||||
PRE_AUTH_VOID("PREAUTH CANCELLATION",6,"020000"), //200000
|
PRE_AUTH_VOID("PREAUTH CANCELLATION",6,"020000"), //200000
|
||||||
|
|
||||||
PRE_AUTH_COMPLETE("PREAUTH COMPLETION",7,"940000"),
|
PRE_AUTH_COMPLETE("PREAUTH COMPLETION",7,"000000"), //940000
|
||||||
|
|
||||||
PRE_AUTH_COMPLETE_VOID("VOID PREAUTH COMPLETE",8,"940000"),
|
PRE_AUTH_COMPLETE_VOID("VOID PREAUTH COMPLETE",8,"000000"),//940000
|
||||||
CASH_OUT("CASH_OUT",9,"010000"),
|
CASH_OUT("CASH_OUT",9,"010000"),
|
||||||
|
|
||||||
REVERSAL("REVERSAL",10,"00"),
|
REVERSAL("REVERSAL",10,"00"),
|
||||||
@ -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"), // bpc 990000
|
||||||
SETTLEMENT_UPLOAD("SETTLEMENT_UPLOAD",17,"960000"),
|
SETTLEMENT_UPLOAD("SETTLEMENT_UPLOAD",17,"960000"),
|
||||||
|
|
||||||
TIP_ADJUSTMENT("TIP_ADJUSTMENT",18,"190000"),
|
TIP_ADJUSTMENT("TIP_ADJUSTMENT",18,"190000"),
|
||||||
|
|||||||
@ -82,7 +82,8 @@ 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("BPC");
|
||||||
|
payDetail.setHostName("FINEXUS");
|
||||||
|
|
||||||
payDetail.setOriginalTransDate(SystemDateTime.getMMDD()+SystemDateTime.getYYYY());
|
payDetail.setOriginalTransDate(SystemDateTime.getMMDD()+SystemDateTime.getYYYY());
|
||||||
|
|
||||||
|
|||||||
BIN
paylibs/src/main/res/drawable/print_logo_mpu.png
Normal file
BIN
paylibs/src/main/res/drawable/print_logo_mpu.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
22
paylibs/src/main/res/raw/ca_cert_uat.pem
Normal file
22
paylibs/src/main/res/raw/ca_cert_uat.pem
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDnzCCAoegAwIBAgIBATANBgkqhkiG9w0BAQUFADBqMQswCQYDVQQGEwJNTTEL
|
||||||
|
MAkGA1UECAwCTU0xDDAKBgNVBAoMA01QVTEMMAoGA1UECwwDTVBVMREwDwYDVQQD
|
||||||
|
DAh1YXRfdGVzdDEfMB0GCSqGSIb3DQEJARYQdWF0X3Rlc3RAbXB1LmNvbTAeFw0y
|
||||||
|
NDA4MjMwODU5NTNaFw0yNzA4MjMwODU5NTNaMGoxCzAJBgNVBAYTAk1NMQswCQYD
|
||||||
|
VQQIDAJNTTEMMAoGA1UECgwDTVBVMQwwCgYDVQQLDANNUFUxETAPBgNVBAMMCHVh
|
||||||
|
dF90ZXN0MR8wHQYJKoZIhvcNAQkBFhB1YXRfdGVzdEBtcHUuY29tMIIBIjANBgkq
|
||||||
|
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnhwFBnMvyuRldNggsrrHMuFTTfTcJLIR
|
||||||
|
sz+n+WBVxcYhiJWK1QR8CvvOhcvAiiFte+3qy98APBGTRtKwgvGI7bNgV+fBbdgI
|
||||||
|
UmXzvrU/3XykjlbPV8IPWmgugQ1PBcJ/M8NN8VVephR8300VaGgvMmFuv7ybaGFV
|
||||||
|
iEHOhXgZOu5d4Hhn41n0GNCpmDZHzEFXcUcELTOZTelh+Hmr9agcY1NkPoitasNA
|
||||||
|
qvT+J0FfCRWQnbbmy2Fou93fKBxg/76+Lu9ZuuGfsmFenA/6vdgPjNxHivz5WycA
|
||||||
|
l6hPR4YmfLGpfCO/WHmXhcf4Fy77s52daLOpWYSvw2FID94h08czRQIDAQABo1Aw
|
||||||
|
TjAdBgNVHQ4EFgQUvgnkWvwGg5YxSQf3VyB1iup1AAUwHwYDVR0jBBgwFoAUvgnk
|
||||||
|
WvwGg5YxSQf3VyB1iup1AAUwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOC
|
||||||
|
AQEAUtSEqdJ36X4SD+HsAWZ7Eu4jnjOq6sCk8uaQSOU1fr+ABYIx/AuJ77OvyMj1
|
||||||
|
biEO7YQ+t0dxF5upAeb4e4tiEddS3XgntGbg6jEfjyyxfsZfTV3OzlPw3dUD8pHA
|
||||||
|
8ej3iSSRdhiywrHRQP1fEAZhcYa9yElkGJlsH/AUTlbv236AkyUvqf992QJRsw1T
|
||||||
|
YBYUDjONt1jxiW1/4SKcWN/9MlCpXLCTqNxgUHXuINi1vVI4gsjkQgvoMDdL7BdZ
|
||||||
|
8kvMh/CjqYHngqwruAQ9SPRZAfp63dHwXsi4HvkqsVdw4TkjEYMi2FuBCUvr7Eww
|
||||||
|
mU11cvvzhOXUxzpnEegAXsDVxg==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
79
paylibs/src/main/res/raw/ca_latest.pem
Normal file
79
paylibs/src/main/res/raw/ca_latest.pem
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
Certificate:
|
||||||
|
Data:
|
||||||
|
Version: 3 (0x2)
|
||||||
|
Serial Number: 1 (0x1)
|
||||||
|
Signature Algorithm: sha1WithRSAEncryption
|
||||||
|
Issuer: C=MM, ST=MM, O=MPU, OU=MPU, CN=uat_test/emailAddress=uat_test@mpu.com
|
||||||
|
Validity
|
||||||
|
Not Before: Aug 23 08:59:53 2024 GMT
|
||||||
|
Not After : Aug 23 08:59:53 2027 GMT
|
||||||
|
Subject: C=MM, ST=MM, O=MPU, OU=MPU, CN=uat_test/emailAddress=uat_test@mpu.com
|
||||||
|
Subject Public Key Info:
|
||||||
|
Public Key Algorithm: rsaEncryption
|
||||||
|
Public-Key: (2048 bit)
|
||||||
|
Modulus:
|
||||||
|
00:9e:1c:05:06:73:2f:ca:e4:65:74:d8:20:b2:ba:
|
||||||
|
c7:32:e1:53:4d:f4:dc:24:b2:11:b3:3f:a7:f9:60:
|
||||||
|
55:c5:c6:21:88:95:8a:d5:04:7c:0a:fb:ce:85:cb:
|
||||||
|
c0:8a:21:6d:7b:ed:ea:cb:df:00:3c:11:93:46:d2:
|
||||||
|
b0:82:f1:88:ed:b3:60:57:e7:c1:6d:d8:08:52:65:
|
||||||
|
f3:be:b5:3f:dd:7c:a4:8e:56:cf:57:c2:0f:5a:68:
|
||||||
|
2e:81:0d:4f:05:c2:7f:33:c3:4d:f1:55:5e:a6:14:
|
||||||
|
7c:df:4d:15:68:68:2f:32:61:6e:bf:bc:9b:68:61:
|
||||||
|
55:88:41:ce:85:78:19:3a:ee:5d:e0:78:67:e3:59:
|
||||||
|
f4:18:d0:a9:98:36:47:cc:41:57:71:47:04:2d:33:
|
||||||
|
99:4d:e9:61:f8:79:ab:f5:a8:1c:63:53:64:3e:88:
|
||||||
|
ad:6a:c3:40:aa:f4:fe:27:41:5f:09:15:90:9d:b6:
|
||||||
|
e6:cb:61:68:bb:dd:df:28:1c:60:ff:be:be:2e:ef:
|
||||||
|
59:ba:e1:9f:b2:61:5e:9c:0f:fa:bd:d8:0f:8c:dc:
|
||||||
|
47:8a:fc:f9:5b:27:00:97:a8:4f:47:86:26:7c:b1:
|
||||||
|
a9:7c:23:bf:58:79:97:85:c7:f8:17:2e:fb:b3:9d:
|
||||||
|
9d:68:b3:a9:59:84:af:c3:61:48:0f:de:21:d3:c7:
|
||||||
|
33:45
|
||||||
|
Exponent: 65537 (0x10001)
|
||||||
|
X509v3 extensions:
|
||||||
|
X509v3 Subject Key Identifier:
|
||||||
|
BE:09:E4:5A:FC:06:83:96:31:49:07:F7:57:20:75:8A:EA:75:00:05
|
||||||
|
X509v3 Authority Key Identifier:
|
||||||
|
keyid:BE:09:E4:5A:FC:06:83:96:31:49:07:F7:57:20:75:8A:EA:75:00:05
|
||||||
|
|
||||||
|
X509v3 Basic Constraints:
|
||||||
|
CA:TRUE
|
||||||
|
Signature Algorithm: sha1WithRSAEncryption
|
||||||
|
52:d4:84:a9:d2:77:e9:7e:12:0f:e1:ec:01:66:7b:12:ee:23:
|
||||||
|
9e:33:aa:ea:c0:a4:f2:e6:90:48:e5:35:7e:bf:80:05:82:31:
|
||||||
|
fc:0b:89:ef:b3:af:c8:c8:f5:6e:21:0e:ed:84:3e:b7:47:71:
|
||||||
|
17:9b:a9:01:e6:f8:7b:8b:62:11:d7:52:dd:78:27:b4:66:e0:
|
||||||
|
ea:31:1f:8f:2c:b1:7e:c6:5f:4d:5d:ce:ce:53:f0:dd:d5:03:
|
||||||
|
f2:91:c0:f1:e8:f7:89:24:91:76:18:b2:c2:b1:d1:40:fd:5f:
|
||||||
|
10:06:61:71:86:bd:c8:49:64:18:99:6c:1f:f0:14:4e:56:ef:
|
||||||
|
db:7e:80:93:25:2f:a9:ff:7d:d9:02:51:b3:0d:53:60:16:14:
|
||||||
|
0e:33:8d:b7:58:f1:89:6d:7f:e1:22:9c:58:df:fd:32:50:a9:
|
||||||
|
5c:b0:93:a8:dc:60:50:75:ee:20:d8:b5:bd:52:38:82:c8:e4:
|
||||||
|
42:0b:e8:30:37:4b:ec:17:59:f2:4b:cc:87:f0:a3:a9:81:e7:
|
||||||
|
82:ac:2b:b8:04:3d:48:f4:59:01:fa:7a:dd:d1:f0:5e:c8:b8:
|
||||||
|
1e:f9:2a:b1:57:70:e1:39:23:11:83:22:d8:5b:81:09:4b:eb:
|
||||||
|
ec:4c:30:99:4d:75:72:fb:f3:84:e5:d4:c7:3a:67:11:e8:00:
|
||||||
|
5e:c0:d5:c6
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDnzCCAoegAwIBAgIBATANBgkqhkiG9w0BAQUFADBqMQswCQYDVQQGEwJNTTEL
|
||||||
|
MAkGA1UECAwCTU0xDDAKBgNVBAoMA01QVTEMMAoGA1UECwwDTVBVMREwDwYDVQQD
|
||||||
|
DAh1YXRfdGVzdDEfMB0GCSqGSIb3DQEJARYQdWF0X3Rlc3RAbXB1LmNvbTAeFw0y
|
||||||
|
NDA4MjMwODU5NTNaFw0yNzA4MjMwODU5NTNaMGoxCzAJBgNVBAYTAk1NMQswCQYD
|
||||||
|
VQQIDAJNTTEMMAoGA1UECgwDTVBVMQwwCgYDVQQLDANNUFUxETAPBgNVBAMMCHVh
|
||||||
|
dF90ZXN0MR8wHQYJKoZIhvcNAQkBFhB1YXRfdGVzdEBtcHUuY29tMIIBIjANBgkq
|
||||||
|
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnhwFBnMvyuRldNggsrrHMuFTTfTcJLIR
|
||||||
|
sz+n+WBVxcYhiJWK1QR8CvvOhcvAiiFte+3qy98APBGTRtKwgvGI7bNgV+fBbdgI
|
||||||
|
UmXzvrU/3XykjlbPV8IPWmgugQ1PBcJ/M8NN8VVephR8300VaGgvMmFuv7ybaGFV
|
||||||
|
iEHOhXgZOu5d4Hhn41n0GNCpmDZHzEFXcUcELTOZTelh+Hmr9agcY1NkPoitasNA
|
||||||
|
qvT+J0FfCRWQnbbmy2Fou93fKBxg/76+Lu9ZuuGfsmFenA/6vdgPjNxHivz5WycA
|
||||||
|
l6hPR4YmfLGpfCO/WHmXhcf4Fy77s52daLOpWYSvw2FID94h08czRQIDAQABo1Aw
|
||||||
|
TjAdBgNVHQ4EFgQUvgnkWvwGg5YxSQf3VyB1iup1AAUwHwYDVR0jBBgwFoAUvgnk
|
||||||
|
WvwGg5YxSQf3VyB1iup1AAUwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOC
|
||||||
|
AQEAUtSEqdJ36X4SD+HsAWZ7Eu4jnjOq6sCk8uaQSOU1fr+ABYIx/AuJ77OvyMj1
|
||||||
|
biEO7YQ+t0dxF5upAeb4e4tiEddS3XgntGbg6jEfjyyxfsZfTV3OzlPw3dUD8pHA
|
||||||
|
8ej3iSSRdhiywrHRQP1fEAZhcYa9yElkGJlsH/AUTlbv236AkyUvqf992QJRsw1T
|
||||||
|
YBYUDjONt1jxiW1/4SKcWN/9MlCpXLCTqNxgUHXuINi1vVI4gsjkQgvoMDdL7BdZ
|
||||||
|
8kvMh/CjqYHngqwruAQ9SPRZAfp63dHwXsi4HvkqsVdw4TkjEYMi2FuBCUvr7Eww
|
||||||
|
mU11cvvzhOXUxzpnEegAXsDVxg==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
22
paylibs/src/main/res/raw/caca.pem
Normal file
22
paylibs/src/main/res/raw/caca.pem
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDnzCCAoegAwIBAgIBATANBgkqhkiG9w0BAQUFADBqMQswCQYDVQQGEwJNTTEL
|
||||||
|
MAkGA1UECAwCTU0xDDAKBgNVBAoMA01QVTEMMAoGA1UECwwDTVBVMREwDwYDVQQD
|
||||||
|
DAh1YXRfdGVzdDEfMB0GCSqGSIb3DQEJARYQdWF0X3Rlc3RAbXB1LmNvbTAeFw0y
|
||||||
|
NDA4MjMwODU5NTNaFw0yNzA4MjMwODU5NTNaMGoxCzAJBgNVBAYTAk1NMQswCQYD
|
||||||
|
VQQIDAJNTTEMMAoGA1UECgwDTVBVMQwwCgYDVQQLDANNUFUxETAPBgNVBAMMCHVh
|
||||||
|
dF90ZXN0MR8wHQYJKoZIhvcNAQkBFhB1YXRfdGVzdEBtcHUuY29tMIIBIjANBgkq
|
||||||
|
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnhwFBnMvyuRldNggsrrHMuFTTfTcJLIR
|
||||||
|
sz+n+WBVxcYhiJWK1QR8CvvOhcvAiiFte+3qy98APBGTRtKwgvGI7bNgV+fBbdgI
|
||||||
|
UmXzvrU/3XykjlbPV8IPWmgugQ1PBcJ/M8NN8VVephR8300VaGgvMmFuv7ybaGFV
|
||||||
|
iEHOhXgZOu5d4Hhn41n0GNCpmDZHzEFXcUcELTOZTelh+Hmr9agcY1NkPoitasNA
|
||||||
|
qvT+J0FfCRWQnbbmy2Fou93fKBxg/76+Lu9ZuuGfsmFenA/6vdgPjNxHivz5WycA
|
||||||
|
l6hPR4YmfLGpfCO/WHmXhcf4Fy77s52daLOpWYSvw2FID94h08czRQIDAQABo1Aw
|
||||||
|
TjAdBgNVHQ4EFgQUvgnkWvwGg5YxSQf3VyB1iup1AAUwHwYDVR0jBBgwFoAUvgnk
|
||||||
|
WvwGg5YxSQf3VyB1iup1AAUwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOC
|
||||||
|
AQEAUtSEqdJ36X4SD+HsAWZ7Eu4jnjOq6sCk8uaQSOU1fr+ABYIx/AuJ77OvyMj1
|
||||||
|
biEO7YQ+t0dxF5upAeb4e4tiEddS3XgntGbg6jEfjyyxfsZfTV3OzlPw3dUD8pHA
|
||||||
|
8ej3iSSRdhiywrHRQP1fEAZhcYa9yElkGJlsH/AUTlbv236AkyUvqf992QJRsw1T
|
||||||
|
YBYUDjONt1jxiW1/4SKcWN/9MlCpXLCTqNxgUHXuINi1vVI4gsjkQgvoMDdL7BdZ
|
||||||
|
8kvMh/CjqYHngqwruAQ9SPRZAfp63dHwXsi4HvkqsVdw4TkjEYMi2FuBCUvr7Eww
|
||||||
|
mU11cvvzhOXUxzpnEegAXsDVxg==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
23
paylibs/src/main/res/raw/cacert.pem
Normal file
23
paylibs/src/main/res/raw/cacert.pem
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDnzCCAoegAwIBAgIBATANBgkqhkiG9w0BAQUFADBqMQswCQYDVQQGEwJNTTEL
|
||||||
|
MAkGA1UECAwCTU0xDDAKBgNVBAoMA01QVTEMMAoGA1UECwwDTVBVMREwDwYDVQQD
|
||||||
|
DAh1YXRfdGVzdDEfMB0GCSqGSIb3DQEJARYQdWF0X3Rlc3RAbXB1LmNvbTAeFw0y
|
||||||
|
NDA4MjMwODU5NTNaFw0yNzA4MjMwODU5NTNaMGoxCzAJBgNVBAYTAk1NMQswCQYD
|
||||||
|
VQQIDAJNTTEMMAoGA1UECgwDTVBVMQwwCgYDVQQLDANNUFUxETAPBgNVBAMMCHVh
|
||||||
|
dF90ZXN0MR8wHQYJKoZIhvcNAQkBFhB1YXRfdGVzdEBtcHUuY29tMIIBIjANBgkq
|
||||||
|
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnhwFBnMvyuRldNggsrrHMuFTTfTcJLIR
|
||||||
|
sz+n+WBVxcYhiJWK1QR8CvvOhcvAiiFte+3qy98APBGTRtKwgvGI7bNgV+fBbdgI
|
||||||
|
UmXzvrU/3XykjlbPV8IPWmgugQ1PBcJ/M8NN8VVephR8300VaGgvMmFuv7ybaGFV
|
||||||
|
iEHOhXgZOu5d4Hhn41n0GNCpmDZHzEFXcUcELTOZTelh+Hmr9agcY1NkPoitasNA
|
||||||
|
qvT+J0FfCRWQnbbmy2Fou93fKBxg/76+Lu9ZuuGfsmFenA/6vdgPjNxHivz5WycA
|
||||||
|
l6hPR4YmfLGpfCO/WHmXhcf4Fy77s52daLOpWYSvw2FID94h08czRQIDAQABo1Aw
|
||||||
|
TjAdBgNVHQ4EFgQUvgnkWvwGg5YxSQf3VyB1iup1AAUwHwYDVR0jBBgwFoAUvgnk
|
||||||
|
WvwGg5YxSQf3VyB1iup1AAUwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOC
|
||||||
|
AQEAUtSEqdJ36X4SD+HsAWZ7Eu4jnjOq6sCk8uaQSOU1fr+ABYIx/AuJ77OvyMj1
|
||||||
|
biEO7YQ+t0dxF5upAeb4e4tiEddS3XgntGbg6jEfjyyxfsZfTV3OzlPw3dUD8pHA
|
||||||
|
8ej3iSSRdhiywrHRQP1fEAZhcYa9yElkGJlsH/AUTlbv236AkyUvqf992QJRsw1T
|
||||||
|
YBYUDjONt1jxiW1/4SKcWN/9MlCpXLCTqNxgUHXuINi1vVI4gsjkQgvoMDdL7BdZ
|
||||||
|
8kvMh/CjqYHngqwruAQ9SPRZAfp63dHwXsi4HvkqsVdw4TkjEYMi2FuBCUvr7Eww
|
||||||
|
mU11cvvzhOXUxzpnEegAXsDVxg==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
BIN
paylibs/src/main/res/raw/uat_cert.crt
Normal file
BIN
paylibs/src/main/res/raw/uat_cert.crt
Normal file
Binary file not shown.
BIN
paylibs/src/main/res/raw/uat_test.der
Normal file
BIN
paylibs/src/main/res/raw/uat_test.der
Normal file
Binary file not shown.
7
paylibs/src/test/java/android/text/TextUtils.java
Normal file
7
paylibs/src/test/java/android/text/TextUtils.java
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package android.text;
|
||||||
|
|
||||||
|
public class TextUtils {
|
||||||
|
public static boolean isEmpty(CharSequence str) {
|
||||||
|
return str == null || str.length() == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
paylibs/src/test/java/android/util/Log.java
Normal file
25
paylibs/src/test/java/android/util/Log.java
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package android.util;
|
||||||
|
|
||||||
|
public class Log {
|
||||||
|
public static int d(String tag, String msg) {
|
||||||
|
System.out.println("DEBUG: " + tag + ": " + msg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int i(String tag, String msg) {
|
||||||
|
System.out.println("INFO: " + tag + ": " + msg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int w(String tag, String msg) {
|
||||||
|
System.out.println("WARN: " + tag + ": " + msg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int e(String tag, String msg) {
|
||||||
|
System.out.println("ERROR: " + tag + ": " + msg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add other methods if required...
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user