diff --git a/app/src/main/java/com/utsmm/kbz/ui/kpay/KPayViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/kpay/KPayViewModel.java index a83ff33..1b9913e 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/kpay/KPayViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/kpay/KPayViewModel.java @@ -446,4 +446,46 @@ public class KPayViewModel extends ViewModel { return repository.qrCloseOrder(request); } + public KPayQRRequest.QRQueryRefundRequest getQueryRefundRequest(String merchOrderId, String mid) { + String currentTime = String.valueOf(System.currentTimeMillis()); + String nonceStr = generateNonceStr(); + + Map bizContentMap = new HashMap<>(); + bizContentMap.put("appid", appId); + bizContentMap.put("merch_code", mid); + bizContentMap.put("merch_order_id", merchOrderId); + + Map requestMap = new HashMap<>(); + requestMap.put("timestamp", currentTime); + requestMap.put("nonce_str", nonceStr); + requestMap.put("method", "kbz.payment.queryrefund"); + requestMap.put("sign_type", "SHA256"); + requestMap.put("version", "1.0"); + requestMap.put("biz_content", bizContentMap); + + String sign = Sign.INSTANCE.generateSign(requestMap, appKey); + + KPayQRRequest.QRQueryRefundRequest.Request.BizContent bizContent = + new KPayQRRequest.QRQueryRefundRequest.Request.BizContent(appId, mid, merchOrderId); + + KPayQRRequest.QRQueryRefundRequest.Request requestBody = + new KPayQRRequest.QRQueryRefundRequest.Request( + currentTime, + nonceStr, + "kbz.payment.queryrefund", + "SHA256", + sign, + "1.0", + bizContent + ); + + return new KPayQRRequest.QRQueryRefundRequest(requestBody); + } + + public Observable checkRefundStatus(KPayQRRequest.QRQueryRefundRequest request) { + return repository.checkRefundStatus(request); + } + + + } \ No newline at end of file diff --git a/app/src/main/java/com/utsmm/kbz/ui/kpay/QRRefundFragment.java b/app/src/main/java/com/utsmm/kbz/ui/kpay/QRRefundFragment.java index 9226747..2c1133d 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/kpay/QRRefundFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/kpay/QRRefundFragment.java @@ -13,6 +13,7 @@ import androidx.annotation.Nullable; import com.utsmm.kbz.util.tms.TMSUtil; import com.utsmyanmar.baselib.fragment.DataBindingFragment; +import com.utsmyanmar.baselib.network.model.KPayQRRequest; import com.utsmyanmar.baselib.network.model.KPayRefund; //import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptQRRequest; import com.utsmyanmar.baselib.util.DataBindingConfig; @@ -56,6 +57,8 @@ public class QRRefundFragment extends DataBindingFragment { private boolean isPartialRefund = false; CompositeDisposable refundDisposable = new CompositeDisposable(); + + CompositeDisposable refundStatusDisposable = new CompositeDisposable(); CompositeDisposable retrieveUpdateDisposable = new CompositeDisposable(); private static final String TAG = QRRefundFragment.class.getSimpleName(); @@ -99,6 +102,7 @@ public class QRRefundFragment extends DataBindingFragment { public void onDestroyView() { super.onDestroyView(); refundDisposable.dispose(); + refundStatusDisposable.dispose(); retrieveUpdateDisposable.dispose(); } @@ -171,7 +175,7 @@ public class QRRefundFragment extends DataBindingFragment { .subscribe( response -> { dismissLoadingDialog(); - handleRefundResponse(response, referenceNo); + handleRefundResponse(response, referenceNo, originalAmount); }, throwable -> { dismissLoadingDialog(); @@ -186,7 +190,39 @@ public class QRRefundFragment extends DataBindingFragment { refundDisposable.add(refundDi); } - private void handleRefundResponse(KPayRefund.RefundResponse response, String referenceNo) { + private void callQueryRefund(String referenceNo, String orgAmount) { + String mid = payDetail.getMerchantNo(); + + KPayQRRequest.QRQueryRefundRequest request = KPayViewModel.getQueryRefundRequest(referenceNo, mid); + showLoadingDialog("Checking refund..."); + + refundStatusDisposable.add(KPayViewModel.checkRefundStatus(request) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(response -> { + dismissLoadingDialog(); + + if (response == null || response.getResponse() == null) { + LogUtil.d(TAG, "Query refund: null response"); + sharedViewModel.payDetail.setValue(payDetail); + navigateToNext(); + return; + } + + LogUtil.d(TAG, "Query refund result: " + response.getResponse().getResult()); + LogUtil.d(TAG, "Query refund status: " + response.getResponse().getRefundStatus()); + + handleRefundResponse(response, referenceNo, orgAmount); + + }, throwable -> { + throwable.printStackTrace(); + dismissLoadingDialog(); + sharedViewModel.payDetail.setValue(payDetail); + navigateToNext(); + })); + } + + private void handleRefundResponse(KPayRefund.RefundResponse response, String referenceNo, String orgAmount) { if (response != null && response.getResponse() != null && "REFUND_SUCCESS".equalsIgnoreCase(response.getResponse().getRefundStatus())) { LogUtil.d(TAG, "Refund successful!"); @@ -203,7 +239,11 @@ public class QRRefundFragment extends DataBindingFragment { retrievedUpdatePayDetail(referenceNo); - } else { + } else if (response != null && response.getResponse() != null + && "DUPLICATED_REFUND_REQ_NO".equalsIgnoreCase(response.getResponse().getCode())){ + LogUtil.d(TAG, "Duplicated refund request, querying actual result..."); + callQueryRefund(referenceNo , orgAmount); + }else { LogUtil.d(TAG, "Refund failed!"); payDetail.setQrTransStatus(-1); payDetail.setReferNo(referenceNo); diff --git a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundProcessFragment.java b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundProcessFragment.java index 00d008d..6e61c9e 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundProcessFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundProcessFragment.java @@ -173,7 +173,10 @@ public class QRRefundProcessFragment extends DataBindingFragment { retrievedUpdatePayDetail(referenceNo); - } else { + } else if (response != null && response.getResponse() != null && "DUPLICATED_REFUND_REQ_NO".equalsIgnoreCase(response.getResponse().getRefundStatus())) { + + } + else { LogUtil.d(TAG, "Refund failed!"); payDetail.setQrTransStatus(-1); payDetail.setReferNo(referenceNo); diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/network/KPayApiService.java b/baselib/src/main/java/com/utsmyanmar/baselib/network/KPayApiService.java index 55d8cb8..92f076f 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/network/KPayApiService.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/network/KPayApiService.java @@ -3,6 +3,7 @@ package com.utsmyanmar.baselib.network; import com.utsmyanmar.baselib.network.model.KPayQRQueryRequest; import com.utsmyanmar.baselib.network.model.KPayQRRequest; import com.utsmyanmar.baselib.network.model.KPayQRResponse; +import com.utsmyanmar.baselib.network.model.KPayRefund; import io.reactivex.rxjava3.core.Observable; import retrofit2.http.Body; @@ -27,4 +28,6 @@ public interface KPayApiService { @POST("closeorder") Observable closeOrder(@Body KPayQRRequest.CloseOrderRequest closeOrderRequest); + @POST("queryrefund") + Observable checkRefundStatus(@Body KPayQRRequest.QRQueryRefundRequest request); } diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/network/model/KPayQRRequest.java b/baselib/src/main/java/com/utsmyanmar/baselib/network/model/KPayQRRequest.java index a86a747..2bbd542 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/network/model/KPayQRRequest.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/network/model/KPayQRRequest.java @@ -575,4 +575,82 @@ public class KPayQRRequest { } } + public static class QRQueryRefundRequest { + + @SerializedName("Request") + private Request request; + + public QRQueryRefundRequest() {} + + public QRQueryRefundRequest(Request request) { + this.request = request; + } + + public Request getRequest() { return request; } + public void setRequest(Request request) { this.request = request; } + + public static class Request { + @SerializedName("timestamp") + private String timestamp; + + @SerializedName("nonce_str") + private String nonceStr; + + @SerializedName("method") + private String method; + + @SerializedName("sign_type") + private String signType; + + @SerializedName("sign") + private String sign; + + @SerializedName("version") + private String version; + + @SerializedName("biz_content") + private BizContent bizContent; + + public Request(String timestamp, String nonceStr, String method, + String signType, String sign, String version, BizContent bizContent) { + this.timestamp = timestamp; + this.nonceStr = nonceStr; + this.method = method; + this.signType = signType; + this.sign = sign; + this.version = version; + this.bizContent = bizContent; + } + + public String getTimestamp() { return timestamp; } + public String getNonceStr() { return nonceStr; } + public String getMethod() { return method; } + public String getSignType() { return signType; } + public String getSign() { return sign; } + public String getVersion() { return version; } + public BizContent getBizContent() { return bizContent; } + + public static class BizContent { + @SerializedName("appid") + private String appId; + + @SerializedName("merch_code") + private String merchCode; + + @SerializedName("merch_order_id") + private String merchOrderId; + + public BizContent(String appId, String merchCode, String merchOrderId) { + this.appId = appId; + this.merchCode = merchCode; + this.merchOrderId = merchOrderId; + } + + public String getAppId() { return appId; } + public String getMerchCode() { return merchCode; } + public String getMerchOrderId() { return merchOrderId; } + } + } + } + } \ No newline at end of file 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 045f421..5a23bc8 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java @@ -328,4 +328,8 @@ public class Repository { public LiveData> getAllQRHistory(){ return payDetailDao.getAllQRHistory();} public LiveData> getRefundableQRHistory(){ return payDetailDao.getRefundableQRHistory(); } + + public Observable checkRefundStatus(KPayQRRequest.QRQueryRefundRequest request) { + return kPayApiService.checkRefundStatus(request); + } }