From 13378d4aa6192756e87e5851188653820b5021fb Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期四, 09 七月 2026 20:51:22 +0800
Subject: [PATCH] 用户端代为退款
---
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 54 insertions(+), 1 deletions(-)
diff --git a/DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
index 08cc508..3ca11cd 100644
--- a/DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
+++ b/DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -22,16 +22,25 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
+import java.util.concurrent.TimeUnit;
@Slf4j
@Service
public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService {
+
+ private static final String PREPAY_REFUND_PENDING_PREFIX = "PREPAY_REFUND_PENDING:";
@Resource
private OrderPrivateCarMapper orderPrivateCarMapper;
@@ -122,6 +131,9 @@
@Autowired
private PayMoneyUtil payMoneyUtil;
+
+ @Resource
+ private RestTemplate internalRestTemplate;
/**
@@ -967,7 +979,14 @@
request.setRefundOutRequestNo(refundNo);
request.setRefundAmount(toFen(refundMoney));
request.setRefundDesc("快车预支付多退退款");
- JSONObject response = CbyzxPayUtil.closePayOrder(request);
+ markPrepayRefundPending(1, orderPrivateCar.getId(), refundNo, refundMoney);
+ JSONObject response;
+ try {
+ response = requestUserServerPrepayRefund(request);
+ } catch (Exception e) {
+ clearPrepayRefundPending(1, orderPrivateCar.getId());
+ throw e;
+ }
if (isPrepayRefundSuccess(response)) {
String responseRefundNo = extractPrepayRefundNo(response);
if (ToolUtil.isNotEmpty(responseRefundNo)) {
@@ -975,6 +994,7 @@
}
finishPrepaidOrder(orderPrivateCar);
} else {
+ clearPrepayRefundPending(1, orderPrivateCar.getId());
System.err.println("快车微信先付退款申请失败:" + extractPrepayRefundMessage(response));
}
return;
@@ -1029,6 +1049,36 @@
private String buildPrepayRefundNo(Integer orderType, Integer orderId) {
return "PRF_" + orderType + "_" + orderId + "_" + System.currentTimeMillis();
+ }
+
+ private String buildPrepayRefundPendingKey(Integer orderType, Integer orderId) {
+ return PREPAY_REFUND_PENDING_PREFIX + orderType + ":" + orderId;
+ }
+
+ private void markPrepayRefundPending(Integer orderType, Integer orderId, String refundNo, Double refundMoney) {
+ JSONObject marker = new JSONObject();
+ marker.put("refundNo", refundNo);
+ marker.put("refundAmount", refundMoney);
+ marker.put("createTime", System.currentTimeMillis());
+ redisTemplate.opsForValue().set(buildPrepayRefundPendingKey(orderType, orderId), marker.toJSONString(), 2, TimeUnit.HOURS);
+ }
+
+ private void clearPrepayRefundPending(Integer orderType, Integer orderId) {
+ redisTemplate.delete(buildPrepayRefundPendingKey(orderType, orderId));
+ }
+
+ private JSONObject requestUserServerPrepayRefund(CbyzxPayUtil.ClosePayOrderRequest request) {
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+ MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+ params.add("outRequestNo", request.getOutRequestNo());
+ params.add("refundOutRequestNo", request.getRefundOutRequestNo());
+ params.add("refundAmount", String.valueOf(request.getRefundAmount()));
+ params.add("refundDesc", request.getRefundDesc());
+ HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
+ String response = internalRestTemplate.postForObject(
+ "http://user-server/base/internal/cbyzxPrepayRefund", requestEntity, String.class);
+ return JSON.parseObject(response);
}
private Integer toFen(Double amount) {
@@ -1086,9 +1136,11 @@
public void payPrepaidRefundCallback(Integer orderId, String refundNo, String refundId) throws Exception {
OrderPrivateCar orderPrivateCar = this.selectById(orderId);
if (orderPrivateCar == null || !Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) {
+ clearPrepayRefundPending(1, orderId);
return;
}
if (ToolUtil.isNotEmpty(orderPrivateCar.getPrepayRefundTime())) {
+ clearPrepayRefundPending(1, orderId);
return;
}
if (ToolUtil.isNotEmpty(orderPrivateCar.getPrepayRefundNo()) && !orderPrivateCar.getPrepayRefundNo().equals(refundNo)) {
@@ -1096,6 +1148,7 @@
}
finishPrepaidOrder(orderPrivateCar);
this.updateById(orderPrivateCar);
+ clearPrepayRefundPending(1, orderId);
pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState());
pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState());
new Thread(new Runnable() {
--
Gitblit v1.7.1