From b8bfd5d1a7f63eb70521bef4b66f6f783ef9576f Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 2 Jul 2026 13:39:50 +0630 Subject: [PATCH] signature send to backend --- .../main/java/com/utsmm/kbz/MainActivity.java | 1 + .../kbz/ui/core_ui/ProcessingFragment.java | 16 +- .../kbz/ui/core_ui/SignatureFragment.java | 14 +- .../ui/core_viewmodel/SharedViewModel.java | 147 +++++++++++------- .../main/res/xml/network_security_config.xml | 1 + .../utsmyanmar/baselib/repo/Repository.java | 41 ++++- .../core_utils/SystemParamsSettings.java | 1 + 7 files changed, 151 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/MainActivity.java b/app/src/main/java/com/utsmm/kbz/MainActivity.java index 7afa01f..dc14b0f 100644 --- a/app/src/main/java/com/utsmm/kbz/MainActivity.java +++ b/app/src/main/java/com/utsmm/kbz/MainActivity.java @@ -162,6 +162,7 @@ public class MainActivity extends AppCompatActivity implements // SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms-uat.kbzbank.com:8443/receipt"); SystemParamsOperation.getInstance().setTmsAddress("https://sirius-nest.utsmyanmar.com/api/v1"); SystemParamsOperation.getInstance().setEReceiptAddress("https://receipt-nest.utsmyanmar.com"); +// SystemParamsOperation.getInstance().setEReceiptAddress("https://receipt-nest.utsmyanmar.com"); PinPad pinPad = MyApplication.getInstance().deviceEngine.getPinPad(); byte[] encryptedPIK = SystemParamsOperation.getInstance().getPIK(); diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java index 8cca8e4..4c4ebaf 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java @@ -345,14 +345,14 @@ public class ProcessingFragment extends DataBindingFragment { handleAfterTransaction(); break; case SUCCESS: - sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, true, BaseErrorCode.getCode(payDetail.getTradeAnswerCode()))); - handleAfterTransaction(); -// if(requiresSignature()){ -// handleAfterTransaction(); -// }else{ -// sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, true, BaseErrorCode.getCode(payDetail.getTradeAnswerCode()))); -// handleAfterTransaction(); -// } +// sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, true, BaseErrorCode.getCode(payDetail.getTradeAnswerCode()))); +// handleAfterTransaction(); + if(requiresSignature()){ + handleAfterTransaction(); + }else{ + sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, true, BaseErrorCode.getCode(payDetail.getTradeAnswerCode()))); + handleAfterTransaction(); + } break; case OFFLINE_SUCCESS: if(SystemParamsOperation.getInstance().getDemoStatus()) { diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/SignatureFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/SignatureFragment.java index 7c1f492..647932a 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/SignatureFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/SignatureFragment.java @@ -142,13 +142,13 @@ public class SignatureFragment extends DataBindingFragment { payDetail.setESignBlob(blob); sharedViewModel.payDetail.setValue(payDetail); sharedViewModel.updateESignBlob(payDetail.voucherNo, blob); -// EReceiptCardRequest request = EReceiptHelper.buildEReceiptCardReceipt( -// requireContext(), -// payDetail, -// true, -// BaseErrorCode.getCode(payDetail.getTradeAnswerCode()), -// null); -// sharedViewModel.pushReceiptWithImage(request, blob); + EReceiptCardRequest request = EReceiptHelper.buildEReceiptCardReceipt( + requireContext(), + payDetail, + true, + BaseErrorCode.getCode(payDetail.getTradeAnswerCode()), + null); + sharedViewModel.pushReceiptWithImage(request, blob); } public class ClickEvent { diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java index b42883c..a04652a 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java @@ -7,6 +7,7 @@ import android.util.Log; import android.widget.ListView; import dagger.hilt.android.lifecycle.HiltViewModel; + import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; @@ -196,12 +197,13 @@ public class SharedViewModel extends ViewModel { } - public void setEmvTrans(boolean status) { isEmv.setValue(status); } - public SingleLiveEvent isEmvTrans() { return isEmv;} + public SingleLiveEvent isEmvTrans() { + return isEmv; + } private PayDetail getPayDetail() { return mPayDetail; @@ -231,9 +233,15 @@ public class SharedViewModel extends ViewModel { return amount; } - public void setPrintReceiptMsg(String msg) { this.printReceiptMsg.setValue(msg);} - public void postPrintReceiptMsg(String msg) { this.printReceiptMsg.postValue(msg);} - public void setPrintStatus(PrintStatus printStatus) { + public void setPrintReceiptMsg(String msg) { + this.printReceiptMsg.setValue(msg); + } + + public void postPrintReceiptMsg(String msg) { + this.printReceiptMsg.postValue(msg); + } + + public void setPrintStatus(PrintStatus printStatus) { // this.printStatus.postValue(printStatus); if (Looper.myLooper() == Looper.getMainLooper()) { this.printStatus.setValue(printStatus); @@ -242,36 +250,67 @@ public class SharedViewModel extends ViewModel { } } - public void postPrintStatus(PrintStatus printStatus) { this.printStatus.postValue(printStatus); } - public SingleLiveEvent getPrintStatus() { return this.printStatus; } + public void postPrintStatus(PrintStatus printStatus) { + this.printStatus.postValue(printStatus); + } - public void setIsFallback(boolean status) { isFallback.setValue(status);} + public SingleLiveEvent getPrintStatus() { + return this.printStatus; + } - public SingleLiveEvent getIsFallback() { return isFallback;} + public void setIsFallback(boolean status) { + isFallback.setValue(status); + } - public void setIsCardAppBlock(boolean status) { isCardAppBlock.setValue(status);} + public SingleLiveEvent getIsFallback() { + return isFallback; + } - public SingleLiveEvent getIsCardAppBlock() {return isCardAppBlock;} + public void setIsCardAppBlock(boolean status) { + isCardAppBlock.setValue(status); + } - public void setIsSeePhone(boolean status) { isSeePhone.setValue(status);} + public SingleLiveEvent getIsCardAppBlock() { + return isCardAppBlock; + } - public SingleLiveEvent getIsSeePhone() { return isSeePhone;} + public void setIsSeePhone(boolean status) { + isSeePhone.setValue(status); + } - public void setIsContactlessRestricted(boolean status) { isContactlessRestricted.setValue(status);} + public SingleLiveEvent getIsSeePhone() { + return isSeePhone; + } - public SingleLiveEvent getIsContactlessRestricted() {return isContactlessRestricted;} + public void setIsContactlessRestricted(boolean status) { + isContactlessRestricted.setValue(status); + } - public void setCardDataExist(boolean exist) { _isCardDataExist.setValue(exist);} + public SingleLiveEvent getIsContactlessRestricted() { + return isContactlessRestricted; + } - public SingleLiveEvent getCardDataExist() { return _isCardDataExist; } + public void setCardDataExist(boolean exist) { + _isCardDataExist.setValue(exist); + } - public void setAmountExist(boolean exist) { _isAmountExist.setValue(exist);} + public SingleLiveEvent getCardDataExist() { + return _isCardDataExist; + } - public SingleLiveEvent getAmountExist() { return _isAmountExist; } + public void setAmountExist(boolean exist) { + _isAmountExist.setValue(exist); + } + + public SingleLiveEvent getAmountExist() { + return _isAmountExist; + } - public MutableLiveData getManualEntryStatus() { return _manualEntryStatus;} + public MutableLiveData getManualEntryStatus() { + return _manualEntryStatus; + } public void setManualEntryStatus(boolean status) { _manualEntryStatus.setValue(status); @@ -289,11 +328,18 @@ public class SharedViewModel extends ViewModel { return _successFragmentMsg; } - public void set_currencyText(String msg) { this._currencyText.setValue(msg);} + public void set_currencyText(String msg) { + this._currencyText.setValue(msg); + } - public SingleLiveEvent get_currencyText() { return _currencyText; } + public SingleLiveEvent get_currencyText() { + return _currencyText; + } + + public void set_successFragmentMsg(String msg) { + this._successFragmentMsg.setValue(msg); + } - public void set_successFragmentMsg(String msg) { this._successFragmentMsg.setValue(msg);} public SingleLiveEvent getTransMenu() { return _transMenu; } @@ -331,10 +377,10 @@ public class SharedViewModel extends ViewModel { @Override public void onSuccess() { - if(isMerchantCopy) { + if (isMerchantCopy) { - if(!SystemParamsOperation.getInstance().getDemoStatus()) { - if(SystemParamsOperation.getInstance().getPrintISOStatus()) { + if (!SystemParamsOperation.getInstance().getDemoStatus()) { + if (SystemParamsOperation.getInstance().getPrintISOStatus()) { PrintXReceipt.getInstance().printSmileISoReceipt(payDetail.getValue()); } } @@ -348,7 +394,7 @@ public class SharedViewModel extends ViewModel { @Override public void onFailure() { - LogUtil.d(TAG,"Print Status Result Failure!"); + LogUtil.d(TAG, "Print Status Result Failure!"); printXStatus.postValue(PrintStatus.EMPTY_PAPER_ROLL); printReceiptButtons.postValue(0); } @@ -356,36 +402,34 @@ public class SharedViewModel extends ViewModel { } - - public void startPrintReceipt(boolean isFirstPrint) { /* * First Print is Merchant Copy.. * */ - if(payDetail.getValue() != null) { + if (payDetail.getValue() != null) { setPayDetail(payDetail.getValue()); } - LogUtil.d(TAG,"PayDetail trade Answer Code :"+getPayDetail().getTradeAnswerCode()); + LogUtil.d(TAG, "PayDetail trade Answer Code :" + getPayDetail().getTradeAnswerCode()); - LogUtil.d(TAG,"PayDetail trade Answer Code :"+payDetail.getValue().getTradeAnswerCode()); + LogUtil.d(TAG, "PayDetail trade Answer Code :" + payDetail.getValue().getTradeAnswerCode()); PrintXReceipt.getInstance().printSmileReceipt(getPayDetail(), isFirstPrint, new PrintXStatus() { @Override public void onSuccess() { - if(isFirstPrint) { + if (isFirstPrint) { - if(!SystemParamsOperation.getInstance().getDemoStatus()) { - if(SystemParamsOperation.getInstance().getPrintISOStatus()) { + if (!SystemParamsOperation.getInstance().getDemoStatus()) { + if (SystemParamsOperation.getInstance().getPrintISOStatus()) { PrintXReceipt.getInstance().printSmileISoReceipt(getPayDetail()); } } postPrintStatus(PrintStatus.FIRST_PRINT_DONE); - if(isEcr.getValue() != null && + if (isEcr.getValue() != null && isEcr.getValue() && SystemParamsOperation.getInstance().isAutoPrintCustomerCopy()) { printReceiptButtons.postValue(8); @@ -400,7 +444,7 @@ public class SharedViewModel extends ViewModel { @Override public void onFailure() { - LogUtil.d(TAG,"Print Status Result Failure!"); + LogUtil.d(TAG, "Print Status Result Failure!"); if (isFirstPrint) { setPrintStatus(PrintStatus.EMPTY_PAPER_ROLL_FIRST); } else { @@ -412,10 +456,9 @@ public class SharedViewModel extends ViewModel { } - @SuppressWarnings("ConstantConditions") public void startPrintProcess() { - LogUtil.d(TAG,"Print status :"+getPrintStatus().getValue()); + LogUtil.d(TAG, "Print status :" + getPrintStatus().getValue()); switch (getPrintStatus().getValue()) { case FIRST_PRINT: @@ -439,8 +482,8 @@ public class SharedViewModel extends ViewModel { } public void startPrintSettlement(PrintXStatus printXStatus) { - if(payDetail.getValue() == null) return; - if(payDetail.getValue().getTransactionType() == TransactionsType.SETTLEMENT.value) { + if (payDetail.getValue() == null) return; + if (payDetail.getValue().getTransactionType() == TransactionsType.SETTLEMENT.value) { startPrintProcessSettlement(printXStatus); } else { startPrintProcessQRSettlement(printXStatus); @@ -449,16 +492,15 @@ public class SharedViewModel extends ViewModel { public void startPrintProcessSettlement(PrintXStatus printXStatus) { - if(payDetail.getValue() == null) return; + if (payDetail.getValue() == null) return; - PrintXReceipt.getInstance().printSmileSettlementReport(payDetail.getValue(),printXStatus); + PrintXReceipt.getInstance().printSmileSettlementReport(payDetail.getValue(), printXStatus); } private void startPrintProcessQRSettlement(PrintXStatus printXStatus) { - - if(payDetail.getValue() == null && payDetails.getValue() == null) return; + if (payDetail.getValue() == null && payDetails.getValue() == null) return; PrintXReceipt.getInstance().printQRSettlementReport(payDetail.getValue(), QRSettleData.convertFromPayDetail(payDetails.getValue()), printXStatus); } @@ -469,7 +511,6 @@ public class SharedViewModel extends ViewModel { } - public LiveData getReversalTransaction(String voucherNo) { return repository.getReversalTransaction(voucherNo); } @@ -482,7 +523,7 @@ public class SharedViewModel extends ViewModel { return repository.getAllReversalTransactions(); } - public void updatePayDetail(PayDetail payDetail){ + public void updatePayDetail(PayDetail payDetail) { repository.updatePayDetail(payDetail); } @@ -490,10 +531,12 @@ public class SharedViewModel extends ViewModel { repository.updateESignBlob(voucherNo, blob); } - public void insertPayDetail(PayDetail payDetail) { repository.insertPayDetail(payDetail); } + public void insertPayDetail(PayDetail payDetail) { + repository.insertPayDetail(payDetail); + } - public void enableCardStatusIcon(boolean tapCard,boolean tapDevice,boolean insertCard, boolean swipeCard) { + public void enableCardStatusIcon(boolean tapCard, boolean tapDevice, boolean insertCard, boolean swipeCard) { tapCardStatus.setValue(tapCard ? 1 : 0); tapDeviceStatus.setValue(tapDevice ? 1 : 0); insertCardStatus.setValue(insertCard ? 1 : 0); @@ -502,14 +545,14 @@ public class SharedViewModel extends ViewModel { @SuppressLint("CheckResult") - public void pushReceipt(Object body){ + public void pushReceipt(Object body) { Log.d("push receipt", new Gson().toJson(body)); repository.sendReceipt(body) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( response -> { - Log.d("E-Receipt", "Success =>"+ response.getMessage()); + Log.d("E-Receipt", "Success =>" + response.getMessage()); postToastMsg("E-Receipt saved successfully"); }, error -> { @@ -569,7 +612,7 @@ public class SharedViewModel extends ViewModel { } - public void printTerminalHostConfigs(){ + public void printTerminalHostConfigs() { PrintXReceipt.getInstance().printTerminalHostConfig(new PrintXStatus() { @Override public void onSuccess() { diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml index c258417..741b1cf 100644 --- a/app/src/main/res/xml/network_security_config.xml +++ b/app/src/main/res/xml/network_security_config.xml @@ -9,6 +9,7 @@ api-uat.kbzpay.com sirius-nest.utsmyanmar.com 192.168.10.105 + 192.168.10.104 diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java b/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java index 5a23bc8..51fab5a 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java @@ -44,8 +44,10 @@ import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.utils.LogUtil; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.TreeMap; import javax.inject.Inject; import javax.inject.Provider; @@ -137,10 +139,9 @@ public class Repository { public Observable sendReceiptWithImage(EReceiptCardRequest request, byte[] imageBytes) { String apiSecret = BuildConfig.ERECEIPT_SECRET; String timestamp = String.valueOf(System.currentTimeMillis()); - request.setDE115(null); - String bodyString = new Gson().toJson(request); + String bodyString = buildMultipartSignaturePayload(request); String dataToHash = bodyString + apiSecret + timestamp; - LogUtil.d("HTTP", dataToHash); +// LogUtil.d("HTTP", dataToHash); String apiKey = EReceiptHelper.sha256(dataToHash); Map fields = buildFormFields(request); @@ -153,6 +154,40 @@ public class Repository { return eReceiptApiService.sendReceiptMultipart(timestamp, apiKey, fields, imagePart); } + private String buildMultipartSignaturePayload(EReceiptCardRequest request) { + Map flatBody = new LinkedHashMap<>(); + putIfNotEmpty(flatBody, "DE2", request.getDE2()); + putIfNotEmpty(flatBody, "DE3", request.getDE3()); + putIfNotEmpty(flatBody, "DE4", request.getDE4()); + putIfNotEmpty(flatBody, "DE7", request.getDE7()); + putIfNotEmpty(flatBody, "DE11", request.getDE11()); + putIfNotEmpty(flatBody, "DE14", request.getDE14()); + putIfNotEmpty(flatBody, "DE22", request.getDE22()); + putIfNotEmpty(flatBody, "DE37", request.getDE37()); + putIfNotEmpty(flatBody, "DE38", request.getDE38()); + putIfNotEmpty(flatBody, "DE39", request.getDE39()); + putIfNotEmpty(flatBody, "DE41", request.getDE41()); + putIfNotEmpty(flatBody, "DE42", request.getDE42()); + putIfNotEmpty(flatBody, "DE43", request.getDE43()); + putIfNotEmpty(flatBody, "DE48", request.getDE48()); + putIfNotEmpty(flatBody, "DE49", request.getDE49()); + putIfNotEmpty(flatBody, "DE55", request.getDE55()); + putIfNotEmpty(flatBody, "appId", request.getAppId()); + putIfNotEmpty(flatBody, "batchNumber", request.getBatchNumber()); + putIfNotEmpty(flatBody, "cardLabel", request.getCardLabel()); + putIfNotEmpty(flatBody, "description", request.getDescription()); + putIfNotEmpty(flatBody, "invoiceNumber", request.getInvoiceNumber()); + putIfNotEmpty(flatBody, "serial", request.getSerial()); + + return new Gson().toJson(new TreeMap<>(flatBody)); + } + + private void putIfNotEmpty(Map map, String key, String value) { + if (value != null && !value.trim().isEmpty()) { + map.put(key, value); + } + } + private Map buildFormFields(EReceiptCardRequest request) { Map map = new HashMap<>(); putField(map, "DE2", request.getDE2()); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java index 77c03c3..1246cb1 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java @@ -46,6 +46,7 @@ public class SystemParamsSettings implements Serializable { // private String ereceiptAddress = "https://api-tms-uat.kbzbank.com:8443/receipt"; private String tmsAddress = "https://sirius-nest.utsmyanmar.com/api/v1"; private String ereceiptAddress = "https://receipt-nest.utsmyanmar.com"; +// private String ereceiptAddress = "http://192.168.10.104:3003"; private String binValues = ""; private String restrictedBinValues = "";