fixed QR Settlement & History

This commit is contained in:
kizzy 2025-12-15 23:12:51 +07:00
parent c697d6c3f9
commit 4e26b2ec4d
39 changed files with 304 additions and 240 deletions

File diff suppressed because one or more lines are too long

View File

@ -4,6 +4,14 @@
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2025-12-11T11:35:06.715134Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=0123456789ABCDEF" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
</selectionStates>
</component>

View File

@ -853,9 +853,14 @@ public class MainFragment extends DataBindingFragment {
}
public void onClickQR(){
// navigate to new QR Pay fragment
routeId = R.id.action_nav_main_to_qrFragment;
safeNavigateToRouteId();
if(TMSUtil.getInstance().checkQRParams().isStatus() == ValidityStatus.FAILURE) {
showDeclineDialog(getResourceString(R.string.txt_please_download_config)+"\n"+TMSUtil.getInstance().checkQRParams().getMessage());
} else {
routeId = R.id.action_nav_main_to_qrFragment;
safeNavigateToRouteId();
}
}
public void onClickQRPay() {

View File

@ -58,7 +58,6 @@ public class SettingsFragment extends DataBindingFragment {
private int count = 0;
// Data binding will handle view access automatically
private FragmentSettingsModernBinding binding;
@Inject
@ -66,14 +65,12 @@ public class SettingsFragment extends DataBindingFragment {
@Override
protected void initViewModel() {
// Initialize ViewModels in initViewModel as per pattern
settlementViewModel = getFragmentScopeViewModel(SettlementViewModel.class);
mainViewModel = getFragmentScopeViewModel(MainViewModel.class);
}
@Override
protected DataBindingConfig getDataBindingConfig() {
// This is the key method that links the XML and fragment properly
return new DataBindingConfig(R.layout.fragment_settings_modern, 0, null)
.addBindingParam(BR.click, new ClickEvent());
}
@ -97,19 +94,14 @@ public class SettingsFragment extends DataBindingFragment {
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
try {
LogUtil.d(TAG, "onViewCreated called");
SystemParamsOperation.getInstance().setDemoStatus(false);
// Get the binding from the base class - this is automatically created
binding = (FragmentSettingsModernBinding) mBinding;
updateDemoSettings();
LogUtil.d(TAG, "Updating settings...");
updateSettings();
LogUtil.d(TAG, "Settings fragment initialized successfully");
} catch (Exception e) {
LogUtil.e(TAG, "Error initializing fragment: " + e.getMessage());
e.printStackTrace();
}
@ -118,12 +110,7 @@ public class SettingsFragment extends DataBindingFragment {
@Override
public void onResume() {
super.onResume();
try {
setToolBarTitleWithBackIcon("Settings");
LogUtil.d(TAG, "Settings screen resumed");
} catch (Exception e) {
LogUtil.e(TAG, "Error in onResume: " + e.getMessage());
}
setToolBarTitleWithBackIcon("Settings");
}
@ -304,7 +291,6 @@ public class SettingsFragment extends DataBindingFragment {
public void onUpdateConfigClick() {
try {
LogUtil.d(TAG, "Update config clicked");
settlementViewModel.getSettlementPOS().observe(getViewLifecycleOwner(), payDetails -> {
try {
if (payDetails != null && payDetails.size() > 0) {

View File

@ -84,14 +84,12 @@ public class SignatureFragment extends DataBindingFragment {
@Override
public void onSigned() {
LogUtil.d(TAG,"ON Signed !");
isSigned = true;
}
@Override
public void onClear() {
isSigned = false;
LogUtil.d(TAG,"ON Clear !");
}
});
}

View File

@ -121,7 +121,7 @@ public class TransactionResultFragment extends DataBindingFragment implements Da
}
setToolBarTitleWithoutBackIcon(getResourceString(R.string.txt_title_trans_result));
} else if(qrStatus == 1 || qrStatus == -1 || qrStatus == 2 || qrStatus == 3 ) {
/* WAVE QR STATUS */
/* QR STATUS */
setToolBarTitleWithoutBackIcon(getResourceString(R.string.txt_title_qr_pay));
} else {
setToolBarTitleWithoutBackIcon(getResourceString(R.string.txt_title_error));

View File

@ -71,7 +71,7 @@ public class TMSProcessViewModel extends ViewModel {
}
public void loadEmvParameters() {
emvParamOperation.loadAidRids();
// emvParamOperation.loadAidRids();
emvParamOperation.loadEmvTerminalParam();
}

View File

@ -344,6 +344,8 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
EReceiptRequest request = EReceiptUtil.getInstance().generateQRReceipt(payDetail, TransResultStatus.FAIL);
sharedViewModel.pushReceipt(request);
sharedViewModel.insertPayDetail(payDetail);
sharedViewModel.payDetail.postValue(payDetail);
safeNavigateToRouteId();
@ -353,14 +355,20 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
LogUtil.d(TAG, "On Exception::");
// sharedViewModel.pushReceipt(buildEReceiptQRReceipt(payDetail, false, "QR Failed! :" + e.getMessage()));
e.printStackTrace();
EReceiptRequest request = EReceiptUtil.getInstance().generateQRReceipt(payDetail, TransResultStatus.TIME_OUT);
sharedViewModel.pushReceipt(request);
if (count == totalCount) {
if(payDetail.getQrTransStatus() != -1) {
payDetail.setQrTransStatus(2);
}
EReceiptRequest request = EReceiptUtil.getInstance().generateQRReceipt(payDetail, TransResultStatus.TIME_OUT);
sharedViewModel.pushReceipt(request);
sharedViewModel.insertPayDetail(payDetail);
sharedViewModel.payDetail.postValue(payDetail);
safeNavigateToRouteId();
}

View File

@ -299,10 +299,10 @@ public class ReprintAnyTransactionFragment extends DataBindingFragment {
//
// LogUtil.d(TAG,"----------------------------------------------------------");
if(sharedViewModel.transactionsType.getValue() != null && sharedViewModel.transactionsType.getValue() == TransactionsType.MMQR_INQUIRY_STATUS) {
if(sharedViewModel.transactionsType.getValue() != null && sharedViewModel.transactionsType.getValue() == TransactionsType.MMQR_HISTORY) {
// Wave Inquiry Status::
// April 2, 2024 QR Inquiry status check is for unsuccessful transactions.
if(yesterday.compareTo(transDate) <= 0 && pay.getTransactionType() == TransactionsType.MMQR.value && pay.getQrTransStatus() != 1) {
if(yesterday.compareTo(transDate) <= 0 && pay.getTransactionType() == TransactionsType.MMQR.value ) {
filteredLists.add(pay);
}

View File

@ -130,6 +130,7 @@ public class QRPayFragment extends DataBindingFragment {
private void onClickHistory(){
sharedViewModel.hostType.setValue(HostType.QR);
sharedViewModel.setTransactionsType(TransactionsType.MMQR_HISTORY);
routeId = R.id.action_qrFragment_to_qrHistory;
safeNavigateToRouteId();
}

View File

@ -282,7 +282,7 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
delayFunctionCall(()->{
routeId = R.id.action_QRSettlementTransactionFragment_to_transactionResultFragment;
safeNavigateToRouteId();
},500);
},1000);
}
@ -322,7 +322,7 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
if(sharedViewModel.getTransMenu().getValue() == TransMenu.SETTLEMENT) {
if (!qrTransactionsList.isEmpty()) {
for (PayDetail payDetail : qrTransactionsList) {
settlementViewModel.deletePayDetail(payDetail);
// settlementViewModel.deletePayDetail(payDetail);
}
updateData();

View File

@ -45,7 +45,7 @@ public class EReceiptUtil {
serialNum = TMSUtil.getInstance().getSerialNumber();
packageName = BuildConfig.APPLICATION_ID;
qrTerminalId = SystemParamsOperation.getInstance().getSecHostTerminalId();
qrMerchantId = SystemParamsOperation.getInstance().getSecHostMerchantId();
qrMerchantId = SystemParamsOperation.getInstance().getShortCode();
}
public EReceiptRequest generateQRReceipt(PayDetail payDetail, TransResultStatus status) {

View File

@ -251,6 +251,28 @@ public class TMSUtil {
return tmsValidity;
}
public TMSValidity checkQRParams() {
TMSValidity tmsValidity;
String shortCode = SystemParamsOperation.getInstance().getShortCode();
String appId = SystemParamsOperation.getInstance().getAppId();
String appKey = SystemParamsOperation.getInstance().getAppKey();
if(shortCode.length() == 11 && !appId.isEmpty() && !appKey.isEmpty()) {
tmsValidity = new TMSValidity(ValidityStatus.SUCCESS,"Success");
} else if(shortCode.length() != 11) {
tmsValidity = new TMSValidity(ValidityStatus.FAILURE,"Invalid Short Code!");
} else if(appId.isEmpty() ) {
tmsValidity = new TMSValidity(ValidityStatus.FAILURE,"Invalid AppId!");
} else {
tmsValidity = new TMSValidity(ValidityStatus.FAILURE,"Invalid AppKey!");
}
return tmsValidity;
}
public TMSValidity checkSecHostParams() {
TMSValidity tmsValidity;

View File

@ -101,21 +101,16 @@ public class BaseApplication extends Application {
TerminalKeyUtil.initNexKey();
emvParamOperation.loadAidRids();
} catch (UnsatisfiedLinkError e) {
// Handle missing native library gracefully
android.util.Log.e("BaseApplication", "Failed to initialize NexGo SDK due to missing native library: " + e.getMessage());
// You can set a flag here to indicate that NexGo functionality is unavailable
// and handle this condition in your app's UI/logic
} catch (Exception e) {
android.util.Log.e("BaseApplication", "Failed to initialize NexGo SDK: " + e.getMessage());
}
}
private void initFallbackMode() {
// Initialize basic functionality without NexGo SDK
android.util.Log.w("BaseApplication", "Running in fallback mode without NexGo SDK");
// You can add basic initialization here that doesn't depend on the device SDK
try {
// Only load EMV parameters if emvParamOperation is available
if (emvParamOperation != null) {
emvParamOperation.loadAidRids();
}

View File

@ -37,4 +37,7 @@ public interface JSpeedyDao {
@Query("DELETE FROM j_speedy")
Completable deleteAll();
@Query("UPDATE j_speedy SET ttq = :ttq")
Completable updateTTQ(String ttq);
}

View File

@ -39,4 +39,7 @@ public interface PayPassDao {
@Query("DELETE FROM pay_pass")
Completable deleteAll();
@Query("UPDATE pay_pass SET ttq = :ttq")
Completable updateTTQ(String ttq);
}

View File

@ -37,4 +37,7 @@ public interface PayWaveDao {
@Query("DELETE FROM pay_wave")
Completable deleteAll();
@Query("UPDATE pay_wave SET ttq = :ttq")
Completable updateTTQ(String ttq);
}

View File

@ -503,7 +503,7 @@ public class EmvParamHelper {
capkV2.setRid(ridEntity.getRid());
}
if (ridEntity.getIndx() != null && !ridEntity.getIndx().isEmpty()) {
capkV2.setCapkIdx(Integer.parseInt(ridEntity.getIndx()));
capkV2.setCapkIdx(Integer.parseInt(ridEntity.getIndx(),16));
}
if (ridEntity.getHashInd() != null && !ridEntity.getHashInd().isEmpty()) {
capkV2.setHashInd(Integer.parseInt(ridEntity.getHashInd()));

View File

@ -119,13 +119,15 @@ public class EmvParamOperation extends ParamOperation{
processPayPass();
processQuickPass();
processJSpeedy();
// processMPUCtls();
processMPUCtls();
processChips();
processRids();
}
public void loadEmvTerminalParam() {
initEmvTerminalParam();
// initEmvTerminalParam();
loadAidRids();
}
private void initEmvTerminalParam() {
@ -255,10 +257,10 @@ public class EmvParamOperation extends ParamOperation{
}
public void updateQuickPassTTQ(String ttq) {
processUpdateQuickPassTTQ(quickPassEntityRxUtil, quickPassRepository, ttq, new RxCallbackUpdateX() {
processUpdateTTQ(quickPassEntityRxUtil, quickPassRepository, ttq, new RxCallbackUpdateX() {
@Override
public void onError(Throwable throwable) {
LogUtil.d(TAG,"Error occur updating JCB Ctls CurrencyCode");
LogUtil.d(TAG,"Error occur updating UPI Ctls ttq");
}
@Override
@ -267,6 +269,48 @@ public class EmvParamOperation extends ParamOperation{
}
});
}
public void updateJSpeedyTTQ(String ttq) {
processUpdateTTQ(jSpeedyEntityRxUtil, jSpeedyRepository, ttq, new RxCallbackUpdateX() {
@Override
public void onError(Throwable throwable) {
LogUtil.d(TAG,"Error occur updating JCB Ctls ttq");
}
@Override
public void onComplete() {
LogUtil.d(TAG,"Updated UPI TTQ to "+ttq);
}
});
}
public void updatePayWaveTTQ(String ttq) {
processUpdateTTQ(payWaveEntityRxUtil, payWaveRepository, ttq, new RxCallbackUpdateX() {
@Override
public void onError(Throwable throwable) {
LogUtil.d(TAG,"Error occur updating visa Ctls ttq");
}
@Override
public void onComplete() {
LogUtil.d(TAG,"Updated visa TTQ to "+ttq);
}
});
}
public void updatePayPassTTQ(String ttq) {
processUpdateTTQ(payPassEntityRxUtil, payPassRepository, ttq, new RxCallbackUpdateX() {
@Override
public void onError(Throwable throwable) {
LogUtil.d(TAG,"Error occur updating master Ctls ttq");
}
@Override
public void onComplete() {
LogUtil.d(TAG,"Updated master TTQ to "+ttq);
}
});
}
public void updateJCBCurrencyCode(String currencyCode) {
processUpdateCtlsCurrencyCode(jSpeedyEntityRxUtil, jSpeedyRepository, currencyCode, new RxCallbackUpdateX() {
@Override

View File

@ -82,7 +82,7 @@ public class ParamOperation {
});
}
protected <T> void processUpdateQuickPassTTQ(RxHelper<T> rxHelper, QuickPassRepository paramRepository, String ttq, RxCallbackUpdateX rxCallbackUpdateX) {
protected <T> void processUpdateTTQ(RxHelper<T> rxHelper, ParamRepository paramRepository, String ttq, RxCallbackUpdateX rxCallbackUpdateX) {
rxHelper.updateData(paramRepository.updateTTQ(ttq), new RxCallbackUpdateX() {
@Override
public void onError(Throwable throwable) {
@ -96,6 +96,7 @@ public class ParamOperation {
});
}
protected <T> void processUpdateCtlsCurrencyCode(RxHelper<T> rxHelper, ParamRepository<T> paramRepository, String currencyCode, RxCallbackUpdateX rxCallbackUpdateX) {
rxHelper.updateData(paramRepository.updateCurrencyCode(currencyCode), new RxCallbackUpdateX() {
@Override
@ -129,27 +130,25 @@ public class ParamOperation {
rxHelper.queryData(paramRepository.getAll(), new RxCallbackX<List<T>>() {
@Override
public void onSuccess(List<T> data) {
List<T> list = loadJsonConfig(id, clazz);
if (data.isEmpty() || list.size() != data.size()) {
deleteAll(rxHelper, paramRepository, new RxCallbackUpdateX() {
@Override
public void onError(Throwable throwable) {
throwable.printStackTrace();
}
@Override
public void onComplete() {
insertData(paramRepository, list);
LogUtil.d(TAG, clazz.getSimpleName() + "json file extract size: " + list.size());
result.onSuccess(list);
}
});
} else {
if (data != null && !data.isEmpty()) {
LogUtil.d(TAG, clazz.getSimpleName() + " loaded from DB: " + data.size());
result.onSuccess(data);
LogUtil.d(TAG, clazz.getSimpleName() + " db size: " + data.size());
return;
}
List<T> list = loadJsonConfig(id, clazz);
deleteAll(rxHelper, paramRepository, new RxCallbackUpdateX() {
@Override
public void onError(Throwable throwable) {
throwable.printStackTrace();
}
@Override
public void onComplete() {
insertData(paramRepository, list);
LogUtil.d(TAG, clazz.getSimpleName() + "json file extract size: " + list.size());
result.onSuccess(list);
}
});
}
@Override

View File

@ -62,4 +62,9 @@ public class BinRepository implements ParamRepository<BinEntity> {
public Completable deleteAll() {
return binDao.deleteAll();
}
@Override
public Completable updateTTQ(String ttq) {
return null;
}
}

View File

@ -64,6 +64,11 @@ public class ChipAidRepository implements ParamRepository<ChipAidEntity> {
return chipAidDao.deleteAll();
}
@Override
public Completable updateTTQ(String ttq) {
return null;
}
public Completable updateChipCVM(String scheme, long cvmLimit) { return chipAidDao.updateCVMByScheme(scheme,cvmLimit);}
public Completable updateAidByAid(boolean aidEnable,String aid) {

View File

@ -61,4 +61,9 @@ public class JSpeedyRepository implements ParamRepository<JSpeedyEntity> {
public Completable deleteAll() {
return jSpeedyDao.deleteAll();
}
@Override
public Completable updateTTQ(String ttq) {
return null;
}
}

View File

@ -60,4 +60,9 @@ public class MPUCtlsRepository implements ParamRepository<MPUCtlsEntity> {
public Completable deleteAll() {
return mpuCtlsDao.deleteAll();
}
@Override
public Completable updateTTQ(String ttq) {
return null;
}
}

View File

@ -24,4 +24,6 @@ public interface ParamRepository <T>{
Completable deleteAll();
Completable updateTTQ(String ttq);
}

View File

@ -61,4 +61,9 @@ public class PayPassRepository implements ParamRepository<PayPassEntity> {
public Completable deleteAll() {
return payPassDao.deleteAll();
}
@Override
public Completable updateTTQ(String ttq) {
return null;
}
}

View File

@ -63,4 +63,9 @@ public class PayWaveRepository implements ParamRepository<PayWaveEntity> {
public Completable deleteAll() {
return payWaveDao.deleteAll();
}
@Override
public Completable updateTTQ(String ttq) {
return null;
}
}

View File

@ -63,4 +63,9 @@ public class RidRepository implements ParamRepository<RidEntity> {
public Completable deleteAll() {
return ridDao.deleteAll();
}
@Override
public Completable updateTTQ(String ttq) {
return null;
}
}

View File

@ -17,6 +17,7 @@ import com.nexgo.oaf.apiv3.SdkResult;
import com.nexgo.oaf.apiv3.device.pinpad.AlgorithmModeEnum;
import com.nexgo.oaf.apiv3.device.pinpad.OnPinPadInputListener;
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.PinPad;
import com.nexgo.oaf.apiv3.device.pinpad.PinPadKeyCode;
@ -64,6 +65,7 @@ import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@ -601,20 +603,21 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
pinPad.setPinKeyboardViewMode(PinKeyboardViewModeEnum.DEFAULT);
pinPad.setAlgorithmMode(AlgorithmModeEnum.DES);
pinPad.setPinKeyboardMode(PinKeyboardModeEnum.FIXED);
// pinPad.setAlgorithmMode(AlgorithmModeEnum.DES);
if(cardNo == null){
cardNo = emvHandler.getEmvCardDataInfo().getCardNo();
}
// int length = cardNo.length();
// byte[] panBytes = cardNo.substring(length - 13).getBytes(StandardCharsets.US_ASCII);
int length = cardNo.length();
byte[] panBytes = cardNo.substring( length- 13).getBytes(StandardCharsets.US_ASCII);
LogUtil.d(TAG,"card num :"+cardNo);
LogUtil.d(TAG,"Is Online Pin:"+isOnlinePin);
// pinPad.inputOnlinePin(supperLen, 60, pan, 0, PinAlgorithmModeEnum.ISO9564FMT0, pinPadInputListener);
if (isOnlinePin) {
pinPad.inputOnlinePin(supperLen, 60, cardNo, pinIndex, PinAlgorithmModeEnum.ISO9564FMT0, pinPadInputListener);
pinPad.inputOnlinePin(supperLen, 60, panBytes, pinIndex, PinAlgorithmModeEnum.ISO9564FMT0, pinPadInputListener);
} else {
mPayDetail.transCVM = TransCVM.OFFLINE_PIN;
@ -775,7 +778,6 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
byte[] tlv_95 = emvHandler.getTlv(new byte[]{(byte) 0x95}, EmvDataSourceEnum.FROM_KERNEL);
LogUtil.d(TAG, "tlv_95--" + ByteUtils.byteArray2HexString(tlv_95));
byte[] tlv_84 = emvHandler.getTlv(new byte[]{(byte) 0x84}, EmvDataSourceEnum.FROM_KERNEL);
LogUtil.d(TAG, "tlv_84--" + ByteUtils.byteArray2HexString(tlv_84));
@ -1216,8 +1218,9 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
byte[] TTQ;
byte[] kernelTTQ = emvHandler.getTlv(ByteUtils.hexString2ByteArray("9F66"), EmvDataSourceEnum.FROM_KERNEL);
LogUtil.d(TAG, "configPaywaveParameters, TTQ" + ByteUtils.byteArray2HexString(kernelTTQ));
//default TTQ value
TTQ = ByteUtils.hexString2ByteArray("36004000");
TTQ = ByteUtils.hexString2ByteArray("36A04000");
kernelTTQ[0] = TTQ[0];
kernelTTQ[2] = TTQ[2];
kernelTTQ[3] = TTQ[3];

View File

@ -390,6 +390,29 @@
"cateCode": "2701",
"currencyCode": "0104"
},
{
"aidEnable": true,
"aid": "A0000000043060",
"cardScheme": "MASTERCARD",
"applicationVersion": "0002",
"emvDDOL": "9F3704",
"emvTDOL": "9F3704",
"partialAidSelection": false,
"targetPercent": "99",
"maxTargetPercent": "99",
"threshold": "00000040",
"tacDefault": "FE50B8A000",
"tacOnline": "FE50B8F800",
"tacDenial": "0000000000",
"floorLimit": "000000000000",
"cvmLimit": 75000,
"transLimit": "999999999999",
"transLimitCDV": "999999999999",
"terminalCapability": "0000000000000000",
"riskManageData": "6C7A800000000000",
"cateCode": "2701",
"currencyCode": "0104"
},
{
"aidEnable": true,
"aid": "A000000333010101",

View File

@ -3,26 +3,26 @@
"aidEnable": true,
"aid": "A0000000651010",
"cardLabel": "JCB",
"applicationVersion": "0021",
"applicationVersion": "0020",
"emvDDOL": "9F3704",
"emvTDOL": "9F3704",
"partialAidSelection": false,
"targetPercent": "00",
"maxTargetPercent": "00",
"targetPercent": "99",
"maxTargetPercent": "99",
"threshold": "00000000",
"tacDefault": "0000000000",
"tacOnline": "D84000A800",
"tacDefault": "D84000A800",
"tacOnline": "DC4004F800",
"tacDenial": "0000000000",
"floorLimit": "00000000",
"floorLimit": "000000000000",
"cvmLimit": 75000,
"transLimit": "9999999999",
"transLimitCDV": "9999999999",
"transLimit": "999999999999",
"transLimitCDV": "999999999999",
"terminalCapability": "0000000000000000",
"riskManageData": "01",
"kernelType": "06",
"ttq": "32004000",
"cateCode": "2701",
"currencyCode": "0104"
"currencyCode": "0840"
}

View File

@ -20,8 +20,9 @@
"terminalCapability": "0000000000000000",
"riskManageData": "01",
"kernelType": "02",
"ttq": "36800000",
"ttq": "32800000",
"cateCode": "2701",
"currencyCode": "0104"
}
]
]

View File

@ -17,7 +17,7 @@
"cvmLimit": 75000,
"transLimit": "999999999999",
"transLimitCDV": "999999999999",
"terminalCapability": "E0F828",
"terminalCapability": "E0F8F8",
"riskManageData": "6C7A800000000000",
"kernelType": "02",
"ttq": "36804000",
@ -43,7 +43,7 @@
"cvmLimit": 75000,
"transLimit": "999999999999",
"transLimitCDV": "999999999999",
"terminalCapability": "E0F828",
"terminalCapability": "E0F8F8",
"riskManageData": "6C7A800000000000",
"kernelType": "02",
"ttq": "36804000",
@ -68,7 +68,7 @@
"cvmLimit": 75000,
"transLimit": "999999999999",
"transLimitCDV": "999999999999",
"terminalCapability": "E0F828",
"terminalCapability": "E0F8F8",
"riskManageData": "6C7A800000000000",
"kernelType": "02",
"ttq": "36804000",

View File

@ -1,29 +1,4 @@
[
{
"aidEnable": true,
"aid": "A000000003",
"cardLabel": "VISA",
"applicationVersion": "008C",
"emvDDOL": "9F3704",
"emvTDOL": "9F3704",
"partialAidSelection": false,
"targetPercent": "00",
"maxTargetPercent": "00",
"threshold": "00000040",
"tacDefault": "DC4000A800",
"tacOnline": "DC4004F800",
"tacDenial": "0000000000",
"floorLimit": "000000000000",
"cvmLimit": 75000,
"transLimit": "4000000000",
"transLimitCDV": "9999999",
"terminalCapability": "0000000000000000",
"riskManageData": "01",
"kernelType": "03",
"ttq": "36A00000",
"cateCode": "2701",
"currencyCode": "0104"
},
{
"aidEnable": true,
"aid": "A0000000031010",
@ -39,13 +14,13 @@
"tacOnline": "DC4004F800",
"tacDenial": "0000000000",
"floorLimit": "000000000000",
"cvmLimit": 75000,
"cvmLimit": 70000,
"transLimit": "999999999999",
"transLimitCDV": "999999999999",
"terminalCapability": "0000000000000000",
"riskManageData": "01",
"kernelType": "03",
"ttq": "36A04000",
"ttq": "32A04000",
"cateCode": "2701",
"currencyCode": "0104"
},
@ -64,13 +39,13 @@
"tacOnline": "DC4004F800",
"tacDenial": "0000000000",
"floorLimit": "000000000000",
"cvmLimit": 75000,
"cvmLimit": 70000,
"transLimit": "999999999999",
"transLimitCDV": "999999999999",
"terminalCapability": "0000000000000000",
"riskManageData": "01",
"kernelType": "03",
"ttq": "36A04000",
"ttq": "32A04000",
"cateCode": "2701",
"currencyCode": "0104"
},
@ -89,13 +64,13 @@
"tacOnline": "DC4004F800",
"tacDenial": "0000000000",
"floorLimit": "000000000000",
"cvmLimit": 75000,
"cvmLimit": 70000,
"transLimit": "999999999999",
"transLimitCDV": "999999999999",
"terminalCapability": "0000000000000000",
"riskManageData": "01",
"kernelType": "03",
"ttq": "36A04000",
"ttq": "32A04000",
"cateCode": "2701",
"currencyCode": "0104"
},
@ -114,13 +89,13 @@
"tacOnline": "DC4004F800",
"tacDenial": "0000000000",
"floorLimit": "000000000000",
"cvmLimit": 75000,
"cvmLimit": 70000,
"transLimit": "999999999999",
"transLimitCDV": "999999999999",
"terminalCapability": "0000000000000000",
"riskManageData": "01",
"kernelType": "03",
"ttq": "36A04000",
"ttq": "32A04000",
"cateCode": "2701",
"currencyCode": "0104"
}

View File

@ -7,24 +7,23 @@
"emvDDOL": "9F3704",
"emvTDOL": "9F3704",
"partialAidSelection": false,
"targetPercent": "00",
"maxTargetPercent": "00",
"targetPercent": "99",
"maxTargetPercent": "99",
"threshold": "00000000",
"tacDefault": "084000A800",
"tacDefault": "D84000A800",
"tacOnline": "DC4004F800",
"tacDenial": "0010000000",
"tacDenial": "0000000000",
"floorLimit": "000000000000",
"cvmLimit": 300,
"transLimit": "999999999",
"transLimitCDV": "999999999",
"cvmLimit": 75000,
"transLimit": "9999999999",
"transLimitCDV": "9999999999",
"terminalCapability": "0000000000000000",
"riskManageData": "0CB0800000000000",
"kernelType": "",
"ttq": "30004000",
"riskManageData": "01",
"kernelType": "01",
"ttq": "36800000",
"cateCode": "2701",
"currencyCode": "0104"
},
{
"aidEnable": true,
"aid": "A000000333010102",
@ -33,119 +32,19 @@
"emvDDOL": "9F3704",
"emvTDOL": "9F3704",
"partialAidSelection": false,
"targetPercent": "00",
"maxTargetPercent": "00",
"targetPercent": "99",
"maxTargetPercent": "99",
"threshold": "00000000",
"tacDefault": "D84000A800",
"tacOnline": "DC4004F800",
"tacDenial": "0000000000",
"floorLimit": "000000000000",
"cvmLimit": 300,
"transLimit": "999999999",
"transLimitCDV": "999999999",
"cvmLimit": 75000,
"transLimit": "9999999999",
"transLimitCDV": "9999999999",
"terminalCapability": "0000000000000000",
"riskManageData": "0CB0800000000000",
"kernelType": "",
"ttq": "30004000",
"cateCode": "2701",
"currencyCode": "0104"
},
{
"aidEnable": true,
"aid": "A000000333010103",
"cardLabel": "UPI",
"applicationVersion": "0002",
"emvDDOL": "9F3704",
"emvTDOL": "9F3704",
"partialAidSelection": false,
"targetPercent": "00",
"maxTargetPercent": "00",
"threshold": "00000000",
"tacDefault": "D84000A800",
"tacOnline": "DC4004F800",
"tacDenial": "0000000000",
"floorLimit": "000000000000",
"cvmLimit": 300,
"transLimit": "999999999",
"transLimitCDV": "999999999",
"terminalCapability": "0000000000000000",
"riskManageData": "0CB0800000000000",
"kernelType": "",
"ttq": "36800000",
"cateCode": "2701",
"currencyCode": "0104"
},
{
"aidEnable": true,
"aid": "A000000333010106",
"cardLabel": "UPI",
"applicationVersion": "0002",
"emvDDOL": "9F3704",
"emvTDOL": "9F3704",
"partialAidSelection": false,
"targetPercent": "00",
"maxTargetPercent": "00",
"threshold": "00000000",
"tacDefault": "D84000A800",
"tacOnline": "DC4004F800",
"tacDenial": "0000000000",
"floorLimit": "000000000000",
"cvmLimit": 300,
"transLimit": "999999999",
"transLimitCDV": "999999999",
"terminalCapability": "0000000000000000",
"riskManageData": "0CB0800000000000",
"kernelType": "",
"ttq": "36800000",
"cateCode": "2701",
"currencyCode": "0104"
},
{
"aidEnable": true,
"aid": "A000000333010108",
"cardLabel": "UPI",
"applicationVersion": "0002",
"emvDDOL": "9F3704",
"emvTDOL": "9F3704",
"partialAidSelection": false,
"targetPercent": "00",
"maxTargetPercent": "00",
"threshold": "00000000",
"tacDefault": "D84000A800",
"tacOnline": "DC4004F800",
"tacDenial": "0000000000",
"floorLimit": "000000000000",
"cvmLimit": 300,
"transLimit": "999999999",
"transLimitCDV": "999999999",
"terminalCapability": "0000000000000000",
"riskManageData": "0CB0800000000000",
"kernelType": "",
"ttq": "36800000",
"cateCode": "2701",
"currencyCode": "0104"
},
{
"aidEnable": true,
"aid": "A0000003330101021111111111111111",
"cardLabel": "UPI",
"applicationVersion": "0002",
"emvDDOL": "9F3704",
"emvTDOL": "9F3704",
"partialAidSelection": false,
"targetPercent": "00",
"maxTargetPercent": "00",
"threshold": "00000000",
"tacDefault": "D84000A800",
"tacOnline": "DC4004F800",
"tacDenial": "0000000000",
"floorLimit": "000000000000",
"cvmLimit": 300,
"transLimit": "999999999",
"transLimitCDV": "999999999",
"terminalCapability": "0000000000000000",
"riskManageData": "0CB0800000000000",
"kernelType": "",
"riskManageData": "01",
"kernelType": "01",
"ttq": "36800000",
"cateCode": "2701",
"currencyCode": "0104"

View File

@ -1,7 +1,7 @@
[
{
"rid": "A000000333",
"indx": "10",
"indx": "0A",
"hashInd": "01",
"arithInd": "01",
"modul": "B2AB1B6E9AC55A75ADFD5BBC34490E53C4C3381F34E60E7FAC21CC2B26DD34462B64A6FAE2495ED1DD383B8138BEA100FF9B7A111817E7B9869A9742B19E5C9DAC56F8B8827F11B05A08ECCF9E8D5E85B0F7CFA644EFF3E9B796688F38E006DEB21E101C01028903A06023AC5AAB8635F8E307A53AC742BDCE6A283F585F48EF",
@ -31,10 +31,10 @@
},
{
"rid": "A000000333",
"indx": "11",
"indx": "0B",
"hashInd": "01",
"arithInd": "01",
"modul": "51E35BD2290A0792BA55AEA169F5BCC33E96BF06E4A021301A97E73A85A7777A40494033433DD945E568065F3BE56255B26BB5CF3F8700AF734A0D5564DE1AFA5F9014704EA42BF929B64BEC7BFABA8D68ADDFECBDFEDEBF36C50DC7FCF0BD8CE33A8A3290216337B02AE6515D7C727F837DA6A18D794CCE62DACFBDB5B4EBE15F79553E05A5562CAE6A7B2C0587ECB362F4080DAC37D4F288440820B422D3692D5E8C57015D3AE21F558ED4733967B3",
"modul": "CF9FDF46B356378E9AF311B0F981B21A1F22F250FB11F55C958709E3C7241918293483289EAE688A094C02C344E2999F315A72841F489E24B1BA0056CFAB3B479D0E826452375DCDBB67E97EC2AA66F4601D774FEAEF775ACCC621BFEB65FB0053FC5F392AA5E1D4C41A4DE9FFDFDF1327C4BB874F1F63A599EE3902FE95E729FD78D4234DC7E6CF1ABABAA3F6DB29B7F05D1D901D2E76A606A8CBFFFFECBD918FA2D278BDB43B0434F5D45134BE1C2781D157D501FF43E5F1C470967CD57CE53B64D82974C8275937C5D8502A1252A8A5D6088A259B694F98648D9AF2CB0EFD9D943C69F896D49FA39702162ACB5AF29B90BADE005BC157",
"exponent": "03",
"expDate": "3230333031323331",
"checkSum": "BD331F9996A490B33C13441066A09AD3FEB5F66C"
@ -78,6 +78,56 @@
"exponent": "03",
"expDate": "3230333431323331",
"checkSum": "C4A3C43CCF87327D136B804160E47D43B60E6E0F"
},
{
"rid": "A000000003",
"indx": "95",
"hashInd": "01",
"arithInd": "01",
"modul": "BE9E1FA5E9A803852999C4AB432DB28600DCD9DAB76DFAAA47355A0FE37B1508AC6BF38860D3C6C2E5B12A3CAAF2A7005A7241EBAA7771112C74CF9A0634652FBCA0E5980C54A64761EA101A114E0F0B5572ADD57D010B7C9C887E104CA4EE1272DA66D997B9A90B5A6D624AB6C57E73C8F919000EB5F684898EF8C3DBEFB330C62660BED88EA78E909AFF05F6DA627B",
"exponent": "03",
"expDate": "3230323831323331",
"checkSum": "EE1511CEC71020A9B90443B37B1D5F6E703030F6"
},
{
"rid": "A000000003",
"indx": "99",
"hashInd": "01",
"arithInd": "01",
"modul": "AB79FCC9520896967E776E64444E5DCDD6E13611874F3985722520425295EEA4BD0C2781DE7F31CD3D041F565F747306EED62954B17EDABA3A6C5B85A1DE1BEB9A34141AF38FCF8279C9DEA0D5A6710D08DB4124F041945587E20359BAB47B7575AD94262D4B25F264AF33DEDCF28E09615E937DE32EDC03C54445FE7E382777",
"exponent": "03",
"expDate": "3230333431323331",
"checkSum": "4ABFFD6B1C51212D05552E431C5B17007D2F5E6D"
},
{
"rid": "A000000003",
"indx": "09",
"hashInd": "01",
"arithInd": "01",
"modul": "9D912248DE0A4E39C1A7DDE3F6D2588992C1A4095AFBD1824D1BA74847F2BC4926D2EFD904B4B54954CD189A54C5D1179654F8F9B0D2AB5F0357EB642FEDA95D3912C6576945FAB897E7062CAA44A4AA06B8FE6E3DBA18AF6AE3738E30429EE9BE03427C9D64F695FA8CAB4BFE376853EA34AD1D76BFCAD15908C077FFE6DC5521ECEF5D278A96E26F57359FFAEDA19434B937F1AD999DC5C41EB11935B44C18100E857F431A4A5A6BB65114F174C2D7B59FDF237D6BB1DD0916E644D709DED56481477C75D95CDD68254615F7740EC07F330AC5D67BCD75BF23D28A140826C026DBDE971A37CD3EF9B8DF644AC385010501EFC6509D7A41",
"exponent": "03",
"expDate": "3230333431323331",
"checkSum": "1FF80A40173F52D7D27E0F26A146A1C8CCB29046"
},
{
"rid": "A000000004",
"indx": "F1",
"hashInd": "01",
"arithInd": "01",
"modul": "A0DCF4BDE19C3546B4B6F0414D174DDE294AABBB828C5A834D73AAE27C99B0B053A90278007239B6459FF0BBCD7B4B9C6C50AC02CE91368DA1BD21AAEADBC65347337D89B68F5C99A09D05BE02DD1F8C5BA20E2F13FB2A27C41D3F85CAD5CF6668E75851EC66EDBF98851FD4E42C44C1D59F5984703B27D5B9F21B8FA0D93279FBBF69E090642909C9EA27F898959541AA6757F5F624104F6E1D3A9532F2A6E51515AEAD1B43B3D7835088A2FAFA7BE7",
"exponent": "03",
"expDate": "3230333431323331",
"checkSum": "D8E68DA167AB5A85D8C3D55ECB9B0517A1A5B4BB"
},
{
"rid": "A000000004",
"indx": "EF",
"hashInd": "01",
"arithInd": "01",
"modul": "A191CB87473F29349B5D60A88B3EAEE0973AA6F1A082F358D849FDDFF9C091F899EDA9792CAF09EF28F5D22404B88A2293EEBBC1949C43BEA4D60CFD879A1539544E09E0F09F60F065B2BF2A13ECC705F3D468B9D33AE77AD9D3F19CA40F23DCF5EB7C04DC8F69EBA565B1EBCB4686CD274785530FF6F6E9EE43AA43FDB02CE00DAEC15C7B8FD6A9B394BABA419D3F6DC85E16569BE8E76989688EFEA2DF22FF7D35C043338DEAA982A02B866DE5328519EBBCD6F03CDD686673847F84DB651AB86C28CF1462562C577B853564A290C8556D818531268D25CC98A4CC6A0BDFFFDA2DCCA3A94C998559E307FDDF915006D9A987B07DDAEB3B",
"exponent": "03",
"expDate": "3230333431323331",
"checkSum": "21766EBB0EE122AFB65D7845B73DB46BAB65427A"
}
]

Binary file not shown.

View File

@ -81,10 +81,9 @@ public abstract class BaseXPrint {
protected final int FONT_SIZE_NORMAL = 24;
protected final int FONT_SIZE_BIG = 24;
protected int fontSmall = 20;
// protected FontEntity fontSmall = new FontEntity(DotMatrixFontEnum.CH_SONG_20X20, DotMatrixFontEnum.ASC_SONG_8X16);
protected int fontSmall = 16;
protected int fontNormal = 25;
protected int fontNormal = 20;
// protected FontEntity fontNormal = new FontEntity(DotMatrixFontEnum.CH_SONG_24X24, DotMatrixFontEnum.ASC_SONG_12X24);
protected FontEntity fontBold = new FontEntity(DotMatrixFontEnum.CH_SONG_24X24, DotMatrixFontEnum.ASC_SONG_BOLD_16X24);
@ -117,7 +116,7 @@ public abstract class BaseXPrint {
Resources resources = PayLibsUtils.getInstance().context.getResources();
// Typeface typeface = ResourcesCompat.getFont(PayLibsUtils.getInstance().context, R.font.consolas);
// printer.setTypeface(typeface);
printer.setTypeface(Typeface.createFromAsset(PayLibsUtils.getInstance().context.getAssets(), "fonts/consolab.ttf"));
printer.setTypeface(Typeface.createFromAsset(PayLibsUtils.getInstance().context.getAssets(), "fonts/victor_mono.ttf"));
printer.setGray(getGrayLevel());
}

View File

@ -49,7 +49,9 @@ public enum TransactionsType {
DETAIL_REPORT("DETAIL_REPORT",33,"000000"),
MMQR_REFUND("QR_REFUND",34,"000000"),
MMQR_SETTLEMENT("QR_SETTLEMENT",35,"000000");
MMQR_SETTLEMENT("QR_SETTLEMENT",35,"000000"),
MMQR_HISTORY("QR_HISTORY",36,"000000");
public final String name;