From af9ef8367c60d20f237bc47acf546a71681124eb Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:55:21 +0630 Subject: [PATCH] fixed signature --- CHANGELOG.md | 7 ++- app/build.gradle | 4 +- .../kbz/ui/core_ui/ProcessingFragment.java | 1 + .../kbz/ui/core_ui/SignatureFragment.java | 10 ++- .../utsmm/kbz/ui/qr_pay/QRPayFragment.java | 2 +- .../utsmm/kbz/util/helper/EReceiptHelper.java | 1 + .../com/utsmm/kbz/util/tms/TMSSetupsImpl.java | 2 +- .../java/com/utsmm/kbz/SignGenerateTest.java | 15 ++++- .../baselineProfiles/0/app-uat-release.dm | Bin 3275 -> 3244 bytes .../baselineProfiles/1/app-uat-release.dm | Bin 3192 -> 3157 bytes app/uat/release/output-metadata.json | 4 +- .../baselib/emv/EmvParamOperation.java | 2 +- .../model/e_receipt/EReceiptCardRequest.java | 9 +++ .../utsmyanmar/baselib/repo/Repository.java | 59 ++++++++++-------- baselib/src/main/res/raw/contacts_config.json | 6 +- .../core_utils/SystemParamsSettings.java | 1 - 16 files changed, 83 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22261b7..3a397e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -89,4 +89,9 @@ Refund - 1000 - 6. Reprint Last Settlement Report - Same process with settlement \ No newline at end of file + Same process with settlement + +## [2.41] + - clear batch time fix + - removed mock qr button + - support Id fix for signature \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 2fcc547..c1a4f47 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,8 +39,8 @@ android { applicationId "com.utsmm.kbz.uat" versionNameSuffix "-uat" resValue "string", "app_name", "KBZ-UAT" - versionCode 44 - versionName "2.39" + versionCode 46 + versionName "2.41" } prod { 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 4c4ebaf..1d07631 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 @@ -573,6 +573,7 @@ public class ProcessingFragment extends DataBindingFragment { request.setDE39(isSuccess ? "A" : "E"); request.setDE41(terminalId); request.setDE42(merchantId); + request.setHostId(SystemParamsOperation.getInstance().getHostId()); request.setDE49(mapCurrency(payDetail.getCurrencyCode())); request.setSerial(serial); request.setInvoiceNumber(payDetail.getInvoiceNo()); 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 647932a..c26f46b 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 @@ -169,7 +169,15 @@ public class SignatureFragment extends DataBindingFragment { } else { // Handle manual signature on paper sharedViewModel.signBitmap = null; // No digital signature - LogUtil.d(TAG, "Manual signature on paper selected - no digital signature stored"); + PayDetail payDetail = sharedViewModel.payDetail.getValue(); + EReceiptCardRequest request = EReceiptHelper.buildEReceiptCardReceipt( + requireContext(), + payDetail, + true, + BaseErrorCode.getCode(payDetail.getTradeAnswerCode()), + null); + sharedViewModel.pushReceipt(request); + LogUtil.d(TAG, "Manual signature on paper selected - receipt submitted without image"); callNextScreen(); } } diff --git a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRPayFragment.java b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRPayFragment.java index 4d8b27f..1962a26 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRPayFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRPayFragment.java @@ -63,7 +63,7 @@ public class QRPayFragment extends DataBindingFragment { features.add(new QRPayItem("Refund", R.drawable.ic_refund, true)); } features.add(new QRPayItem("History", R.drawable.ic_history, true)); - features.add(new QRPayItem("Mock QR", R.drawable.ic_qr_pay, true)); +// features.add(new QRPayItem("Mock QR", R.drawable.ic_qr_pay, true)); // List features = List.of( // new QRPayItem("Sale", R.drawable.ic_qr_pay, true), diff --git a/app/src/main/java/com/utsmm/kbz/util/helper/EReceiptHelper.java b/app/src/main/java/com/utsmm/kbz/util/helper/EReceiptHelper.java index 35e7cb8..e244eb1 100644 --- a/app/src/main/java/com/utsmm/kbz/util/helper/EReceiptHelper.java +++ b/app/src/main/java/com/utsmm/kbz/util/helper/EReceiptHelper.java @@ -56,6 +56,7 @@ public class EReceiptHelper { request.setDE39(isSuccess ? "A" : "E"); request.setDE41(terminalId); request.setDE42(merchantId); + request.setHostId(SystemParamsOperation.getInstance().getHostId()); request.setDE49(mapCurrency(payDetail.getCurrencyCode())); request.setSerial(serial); request.setInvoiceNumber(payDetail.getInvoiceNo()); diff --git a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java index f2faffe..1632244 100644 --- a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java +++ b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java @@ -460,7 +460,7 @@ public class TMSSetupsImpl implements TMSSetups{ SystemParamsOperation.getInstance().setRandomPinPad(parseBoolean(data)); } else if (TextUtils.equals(name,"clear_batch_time")) { - SystemParamsOperation.getInstance().setClearBatchTime("22:00"); + SystemParamsOperation.getInstance().setClearBatchTime(data); } else if (TextUtils.equals(name,"alert_sound_enable")) { SystemParamsOperation.getInstance().setAlertSound(parseBoolean(data)); diff --git a/app/src/test/java/com/utsmm/kbz/SignGenerateTest.java b/app/src/test/java/com/utsmm/kbz/SignGenerateTest.java index 17e9159..5ec0c57 100644 --- a/app/src/test/java/com/utsmm/kbz/SignGenerateTest.java +++ b/app/src/test/java/com/utsmm/kbz/SignGenerateTest.java @@ -12,6 +12,19 @@ import java.util.TreeMap; public class SignGenerateTest { + @Test + public void tmsSignatureMatchesToolForFixedTimestamp() { + String secret = "y812J21lhha11OS"; + String timestamp = "1786609802730"; + + String signature = EReceiptHelper.sha256("{}" + secret + timestamp); + + assertEquals( + "3f1bfe50289d706074560fa22f424f3665c9c3022362aa89a6ea9c37469a0774", + signature + ); + } + private static final String APP_KEY = "UTSMMuat@2025"; private static final String EXPECTED_SIGN = "D86AE09024C6581273C27B95A3BDBDBF3AC8EC20191365C8047ED6C42FC00DA5"; @@ -425,4 +438,4 @@ public class SignGenerateTest { // This test is for debugging - it doesn't need to pass assertTrue("This test is for debugging purposes", true); } -} \ No newline at end of file +} diff --git a/app/uat/release/baselineProfiles/0/app-uat-release.dm b/app/uat/release/baselineProfiles/0/app-uat-release.dm index 8218f27cc3259dcab2a77b369a5b66ee225ad6dd..d07737f7a18c9f3252705fe9abee023b1d3962c1 100644 GIT binary patch literal 3244 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 literal 3192 zcmZ`*3pf*8A0J}n(o`a5rX)m-MCLY^w-$2AB}*PCAU&d?j=#=?#(6S zI+cXP++{Pgy{>ax!>8|i-!Jd?Jm3F3=lTE7bI$*q=luSc=VxOfutNf{bLUQg`1Ltw zz%~)xvIFo}{oL`P#{=;G-h61`w52Trpst|~;K#=U0Jg#aKnUNT&SA0km-i!9I@lfT z$O$ZET*hy3UxD-IBa|^ExiSrRR09d+4olb20568Qs^G zBF%`-seX2* zeTeECDSIDcd5FY6w#~wF7 z`J$LCaFIPloULVE2=!In>v9I}v9K!|$`&(++Ih$llYuALjz{Ah%vBpevVj%06x*_H zjhu&j(Pc+R3wMydV;l+{g&&GX^5khM*}FZ|ft#=Q{@E@VuR8@@kWl0rA*Bryjpqb} z^2DTTI}=zYpNq*fkk_)-krIVd#bn4lTWT@k2%#C`)6} z8{!t=z+?qER#dEhaW=GXdfXKt zN?SnKJzu0)UY5Z{C~#<(=6IIC1=_ymPGFFv3fVMaeX`D&I#OJJO1T8utO?_xpzy3* zF~WyAQ|GKP6KYDV`|c^SG)LqS*1plHi*#=O~p9@6W{LBR2i(bQv}j91I2JHERjvUC{@ zDaPe2)rE^eG_d*$P=Y|ma6N2U$VxAWSeuoRc0C|?y*Q~@yN!WTAP5+CYDBAQYEx)c z^?76zO&SSiI%~r5C!#hO?dM&juG10)s`C3Ldff}3>MWM-4ljnbH=tuy4@DU?MHkJ+ zwrprf)>@h|3mSsHWTs(mK*Rf?Zb{Q3R!~OvIV%X^NgC~GQ}vKROG%vb$44}&Yd5UT z+1O#9{-vTnG;;HE5kYgf^-Ax7Z*C9)u*Vf}{64!?`g$h({Y9w=c?RDR8Y{;fo38f& z9ymwWXhef`nGkdDW8B2WCCatAr^J`nuGMHXwHPCu&sE528BtWKs$kYkeb+)WCVN+1 zGYI~KGV~`|W93N1T*JKO`pHM3q5w3r38NH0jCrJ8q+5e{ zd#evltE6<=ow4SnQmd7Y`q|$^VBTf2yj^L-`pI8_gr387Q+!n=+RWRKW|=#;V-FNS zhbj~<*X-Tsy$fcQC^1d+c^a1u@KdOJ8*``qv4&htkdFz_Ltm%wq@5QN?b7Ta_O&X* zM%~%1tst`RP%jR?E|mwtV;YBDQPl9FJiCcZt+C zUU;TVOc{bEulb@n0rV3{7k5K-E!xA6<35O_Xn+*0beg~pO=F+o}VNowT668wY|$NH}4z= zZq(V<_F7Gcp-c-twGIr>8kGZnyP)4);%EEJ0u#hAek3$8x~PunqD!t}JXD{Zf4}}M z?QOS(r8BVNXnN!iT)fbyiB?BO!B`TF5P0Z3_XAW~K1 zQIKPxR?Neq)xyLuhN|2JTU8cAc&WWPKUEy5u={}H3Hqs>d7{_(T@(vTPq5#JnZ6TO z-yzEPZ*@kPJbaClc4%s=xCF21XdERN7IrnGHx1W!WM^WsWsd`!@dXK_2}RkoG=&LA z-CkRN!v|*>dP}9tvY$0$a-G7{h9@wOt+1cWXI?r_s;QjKrZiQZ(@*I}r#8K%w3?-R zKFi3{L};~N=k0+KKc5=#Y81L3ABs5ZbyM&*4us{kL`_ZmW-GZ5fO6y}l@2Jn@j8}Q z_wIi&ZNJ#z*Z;CE!n=Hahupn)P)-L{ow~+g?H3fq5>OM6$> zZguexq#tBf1-x9nP!o(L8FR6r?Z}E$h3O^X0$7)m!(&qK`cU~XWJbSUtr^$J|4Y5t ztrq%K;SV1p=$8w>`~W7@6S?U??2=dQS*y?dfo}r`FXcm!`w_=rCVQAM5f6Ecd`d7F*aoHidgQijYsE2W=1!a-#xU{;p|i?ko?#kwQEVpj}9<4)BbgWXpO zozEWNG(Yq-t!11P%UBzGaeS@o`6b2Gai-s=`P%dM;Uf*-)wD^odqSLHF%m1S6m5=q z%5s^{%mrutsyrMs<-=y8VztpZzJz>N+BlhFMJ-WuDDY2e&A8n# zgF3IHgPvJ)8kl*%%=O9$UJU6M2hw2MQ%01$0_N{haXU0RnARX=_h1j?9hCuI=r%pw zM6+ozlJjj{OixVzrUXSo9x22Zy(XgK95UOu7yD(@1{HFgsFS`LyctF&-TmuCSEc_- z+oH&uP$cI))z(J0{WEK#7}ib7?x8L8;y(8TNV5bLuRV4Y_p5(kuROLz17!5I~EjH^Z`HyV>PoESecijcl)3tPK z$_oGa+8I^;Z&&=-;X{4(e5iUOO&bf~&b#gxq_1qTOZ3*X`M(TR?0*=lAD;*xXCnab z2T)f(0pJJp^8o;BTW3P}T+ZuZ`86bD2W!|saofl8T{(b*e9y)tUS6p*67THt+c(o9 zh`%YJQVCE5W_f!1nLY?#AaJ~y1__lAcXC&M$F^OXZdP*sE_M&TI?PA$ zm&E;qGP(+uBfbTM$kw#6;NzD7{G$8YVg5 sendReceipt(Object body){ String apiSecret = BuildConfig.ERECEIPT_SECRET; -// LogUtil.d("kmk", "receipt secret =>" + apiSecret); String timestamp = String.valueOf(System.currentTimeMillis()); String bodyString = new Gson().toJson(body); String dataToHash = bodyString + apiSecret + timestamp; @@ -141,7 +137,6 @@ public class Repository { String timestamp = String.valueOf(System.currentTimeMillis()); String bodyString = buildMultipartSignaturePayload(request); String dataToHash = bodyString + apiSecret + timestamp; -// LogUtil.d("HTTP", dataToHash); String apiKey = EReceiptHelper.sha256(dataToHash); Map fields = buildFormFields(request); @@ -155,31 +150,33 @@ public class Repository { } private String buildMultipartSignaturePayload(EReceiptCardRequest request) { - Map flatBody = new LinkedHashMap<>(); + Map flatBody = new TreeMap<>(); 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, "DE3", request.getDE3()); 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()); + putIfNotEmpty(flatBody, "DE49", request.getDE49()); + putIfNotEmpty(flatBody, "DE37", request.getDE37()); + putIfNotEmpty(flatBody, "DE7", request.getDE7()); + putIfNotEmpty(flatBody, "DE4", request.getDE4()); + putIfNotEmpty(flatBody, "appId", request.getAppId()); + putIfNotEmpty(flatBody, "hostId", request.getHostId()); + putIfNotEmpty(flatBody, "invoiceNumber", request.getInvoiceNumber()); + putIfNotEmpty(flatBody, "DE11", request.getDE11()); + putIfNotEmpty(flatBody, "description", request.getDescription()); + putIfNotEmpty(flatBody, "DE38", request.getDE38()); + putIfNotEmpty(flatBody, "batchNumber", request.getBatchNumber()); + putValueOrEmpty(flatBody, "DE55", request.getDE55()); + putIfNotEmpty(flatBody, "DE14", request.getDE14()); + putIfNotEmpty(flatBody, "cardLabel", request.getCardLabel()); + putIfNotEmpty(flatBody, "DE43", request.getDE43()); + putValueOrEmpty(flatBody, "DE48", request.getDE48()); - return new Gson().toJson(new TreeMap<>(flatBody)); + // DE115 is intentionally omitted because it is sent as the image part. + return new Gson().toJson(flatBody); } private void putIfNotEmpty(Map map, String key, String value) { @@ -188,8 +185,12 @@ public class Repository { } } + private void putValueOrEmpty(Map map, String key, String value) { + map.put(key, value == null || value.trim().isEmpty() ? "" : value); + } + private Map buildFormFields(EReceiptCardRequest request) { - Map map = new HashMap<>(); + Map map = new TreeMap<>(); putField(map, "DE2", request.getDE2()); putField(map, "DE3", request.getDE3()); putField(map, "DE4", request.getDE4()); @@ -203,10 +204,11 @@ public class Repository { putField(map, "DE41", request.getDE41()); putField(map, "DE42", request.getDE42()); putField(map, "DE43", request.getDE43()); - putField(map, "DE48", request.getDE48()); + putFieldValueOrEmpty(map, "DE48", request.getDE48()); putField(map, "DE49", request.getDE49()); - putField(map, "DE55", request.getDE55()); + putFieldValueOrEmpty(map, "DE55", request.getDE55()); putField(map, "appId", request.getAppId()); + putField(map, "hostId", request.getHostId()); putField(map, "batchNumber", request.getBatchNumber()); putField(map, "cardLabel", request.getCardLabel()); putField(map, "description", request.getDescription()); @@ -221,6 +223,11 @@ public class Repository { } } + private void putFieldValueOrEmpty(Map map, String key, String value) { + String normalizedValue = value == null || value.trim().isEmpty() ? "" : value; + map.put(key, RequestBody.create(MediaType.parse("text/plain"), normalizedValue)); + } + public void insertPayDetail(PayDetail payDetail){ payDetailDao.insert(payDetail);} public Completable insertPay(PayDetail payDetail) { return payDetailDao.insertPay(payDetail); } diff --git a/baselib/src/main/res/raw/contacts_config.json b/baselib/src/main/res/raw/contacts_config.json index e4066af..dedb685 100644 --- a/baselib/src/main/res/raw/contacts_config.json +++ b/baselib/src/main/res/raw/contacts_config.json @@ -530,7 +530,7 @@ "currencyCode": "0104" }, { - "aidEnable": false, + "aidEnable": true, "aid": "A00000006510", "cardScheme": "JCB", "applicationVersion": "0200", @@ -553,7 +553,7 @@ "currencyCode": "0104" }, { - "aidEnable": false, + "aidEnable": true, "aid": "A0000000651010", "cardScheme": "JCB", "applicationVersion": "0200", @@ -576,7 +576,7 @@ "currencyCode": "0104" }, { - "aidEnable": false, + "aidEnable": true, "aid": "A0000001570040", "cardScheme": "JCB", "applicationVersion": "0200", 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 8d4b4fe..172e37e 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,7 +46,6 @@ 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 = "";