From 13378d4aa6192756e87e5851188653820b5021fb Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期四, 09 七月 2026 20:51:22 +0800
Subject: [PATCH] 用户端代为退款
---
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java | 148 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 145 insertions(+), 3 deletions(-)
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
index 581ab6d..ac4353b 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -43,7 +43,13 @@
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.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@@ -151,6 +157,9 @@
@Resource
private RedisTemplate<String, Object> redisTemplate;
+
+ @Resource
+ private RestTemplate internalRestTemplate;
@Resource
private ISystemPriceCityService systemPriceCityService;
@@ -1722,9 +1731,39 @@
*/
@ResponseBody
@PostMapping("/base/cbyzxCancelOrderTaxi")
- public Map<String, Object> cbyzxCancelOrderTaxi(HttpServletRequest request, HttpServletResponse response) {
- // 不做处理 退款已同步处理
- return buildCbyzxCallbackResponse(0, "success");
+ public Map<String, Object> cbyzxCancelOrderTaxi(@RequestBody(required = false) String params,
+ HttpServletRequest request, HttpServletResponse response) {
+ try {
+ JSONObject payload = parseCbyzxCallbackPayload(params, request);
+ String refundNo = firstNotBlank(payload,
+ "refundOutRequestNo", "refund_out_request_no", "outRefundNo", "out_refund_no",
+ "merchantRefundSerialNo", "merchant_refund_serial_no");
+ if (StringUtils.isBlank(refundNo)) {
+ return buildCbyzxCallbackResponse(0, "success");
+ }
+ if (!refundNo.startsWith("PRF_")) {
+ return buildCbyzxCallbackResponse(0, "success");
+ }
+ String[] split = refundNo.split("_");
+ if (split.length < 4 || !StringUtils.isNumeric(split[1]) || !StringUtils.isNumeric(split[2])) {
+ return buildCbyzxCallbackResponse(1, "invalid refundOutRequestNo");
+ }
+ Integer orderType = Integer.valueOf(split[1]);
+ Integer orderId = Integer.valueOf(split[2]);
+ String refundId = firstNotBlank(payload,
+ "refundId", "refund_id", "gatewaySerialNo", "gateway_serial_no",
+ "thirdRefundNo", "third_refund_no", "merchantRefundSerialNo", "merchant_refund_serial_no");
+ Map<String, Object> driverResult = notifyDriverPrepayRefund(orderId, orderType, refundNo, refundId);
+ Object code = driverResult == null ? null : driverResult.get("code");
+ if (code != null && "200".equals(String.valueOf(code))) {
+ return buildCbyzxCallbackResponse(0, "success");
+ }
+ log.error("创博优退款回调转发司机端失败,payload={}, driverResult={}", payload, driverResult);
+ return buildCbyzxCallbackResponse(1, "driver callback fail");
+ } catch (Exception e) {
+ log.error("创博优退款回调处理失败", e);
+ return buildCbyzxCallbackResponse(1, "fail");
+ }
// try {
// Map<String, String> map = payMoneyUtil.weixinpayCallback(request);
@@ -1759,6 +1798,46 @@
// } catch (Exception e) {
// e.printStackTrace();
// }
+ }
+
+ /**
+ * 内部服务调用:创博优微信先付订单退款。
+ * 只负责调用退款网关并返回原始结果,不修改司机端订单业务状态。
+ */
+ @ResponseBody
+ @PostMapping("/base/internal/cbyzxPrepayRefund")
+ public JSONObject cbyzxPrepayRefund(String outRequestNo, String refundOutRequestNo,
+ Integer refundAmount, String refundDesc) {
+ JSONObject error = new JSONObject();
+ if (ToolUtil.isEmpty(outRequestNo)) {
+ error.put("code", 1);
+ error.put("msg", "missing outRequestNo");
+ return error;
+ }
+ if (ToolUtil.isEmpty(refundOutRequestNo)) {
+ error.put("code", 1);
+ error.put("msg", "missing refundOutRequestNo");
+ return error;
+ }
+ if (refundAmount == null || refundAmount <= 0) {
+ error.put("code", 1);
+ error.put("msg", "invalid refundAmount");
+ return error;
+ }
+ try {
+ CbyzxPayUtil.ClosePayOrderRequest closeRequest = new CbyzxPayUtil.ClosePayOrderRequest();
+ closeRequest.setOutRequestNo(outRequestNo);
+ closeRequest.setRefundOutRequestNo(refundOutRequestNo);
+ closeRequest.setRefundAmount(refundAmount);
+ closeRequest.setRefundDesc(ToolUtil.isNotEmpty(refundDesc) ? refundDesc : "微信先付订单退款");
+ return CbyzxPayUtil.closePayOrder(closeRequest);
+ } catch (Exception e) {
+ log.error("内部创博优先付退款失败,outRequestNo={}, refundOutRequestNo={}",
+ outRequestNo, refundOutRequestNo, e);
+ error.put("code", 1);
+ error.put("msg", e.getMessage());
+ return error;
+ }
}
/**
@@ -2089,6 +2168,69 @@
return result;
}
+ private JSONObject parseCbyzxCallbackPayload(String params, HttpServletRequest request) {
+ JSONObject payload = new JSONObject();
+ if (StringUtils.isNotBlank(params)) {
+ try {
+ JSONObject body = JSONObject.parseObject(params);
+ if (body != null) {
+ payload.putAll(body);
+ }
+ } catch (Exception e) {
+ log.warn("创博优回调body不是JSON,params={}", params);
+ }
+ }
+ if (request != null && request.getParameterMap() != null) {
+ for (String key : request.getParameterMap().keySet()) {
+ String[] values = request.getParameterValues(key);
+ if (values == null || values.length == 0) {
+ continue;
+ }
+ payload.put(key, values.length == 1 ? values[0] : Arrays.asList(values));
+ }
+ }
+ return payload;
+ }
+
+ private String firstNotBlank(JSONObject payload, String... keys) {
+ if (payload == null || keys == null) {
+ return null;
+ }
+ for (String key : keys) {
+ Object value = payload.get(key);
+ if (value == null) {
+ continue;
+ }
+ if (value instanceof Collection) {
+ for (Object item : (Collection<?>) value) {
+ String text = item == null ? null : String.valueOf(item);
+ if (StringUtils.isNotBlank(text)) {
+ return text;
+ }
+ }
+ } else {
+ String text = String.valueOf(value);
+ if (StringUtils.isNotBlank(text)) {
+ return text;
+ }
+ }
+ }
+ return null;
+ }
+
+ private Map<String, Object> notifyDriverPrepayRefund(Integer orderId, Integer orderType, String refundNo, String refundId) {
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+ MultiValueMap<String, Object> postParams = new LinkedMultiValueMap<>();
+ postParams.add("orderId", orderId);
+ postParams.add("orderType", orderType);
+ postParams.add("refundNo", refundNo);
+ postParams.add("refundId", refundId);
+ HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(postParams, headers);
+ return internalRestTemplate.postForObject(
+ "http://driver-server/base/internal/prepayRefundCallback", requestEntity, Map.class);
+ }
+
/**
* 小件物流差价微信支付回调
--
Gitblit v1.7.1