From e9e42b621afdf6ac94f5327ee843b32b10a401b4 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 04 八月 2026 17:45:14 +0800
Subject: [PATCH] update

---
 backend/src/main/java/com/tourguide/common/huifu/DouGongNotifyController.java |   93 +++++++++++++++++++++++++++-------------------
 1 files changed, 54 insertions(+), 39 deletions(-)

diff --git a/backend/src/main/java/com/tourguide/common/huifu/DouGongNotifyController.java b/backend/src/main/java/com/tourguide/common/huifu/DouGongNotifyController.java
index 3c33f5e..86252cd 100644
--- a/backend/src/main/java/com/tourguide/common/huifu/DouGongNotifyController.java
+++ b/backend/src/main/java/com/tourguide/common/huifu/DouGongNotifyController.java
@@ -1,17 +1,14 @@
 package com.tourguide.common.huifu;
 
 import com.alibaba.fastjson.JSONObject;
-import com.huifu.bspay.sdk.opps.core.utils.RsaUtils;
-import com.tourguide.common.huifu.properties.HuiFuProperties;
+import com.tourguide.modules.order.service.HuifuPaymentCallbackService;
+import com.tourguide.modules.order.service.HuifuRefundCallbackService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
-
-import javax.servlet.http.HttpServletRequest;
 
 /**
  * 斗拱回调入口。
@@ -23,53 +20,71 @@
 public class DouGongNotifyController {
     private static final Logger log = LoggerFactory.getLogger(DouGongNotifyController.class);
 
-    @Autowired
-    private HuiFuProperties huiFuProperties;
+    private final HuifuCallbackVerifier callbackVerifier;
+    private final HuifuPaymentCallbackService paymentCallbackService;
+    private final HuifuRefundCallbackService refundCallbackService;
+
+    public DouGongNotifyController(HuifuCallbackVerifier callbackVerifier,
+                                   HuifuPaymentCallbackService paymentCallbackService,
+                                   HuifuRefundCallbackService refundCallbackService) {
+        this.callbackVerifier = callbackVerifier;
+        this.paymentCallbackService = paymentCallbackService;
+        this.refundCallbackService = refundCallbackService;
+    }
 
     @PostMapping("/pay-notify")
-    public String payNotify(HttpServletRequest request) {
-        return handleNotify("dougong-pay", request);
+    public String payNotify(@RequestParam(value = "sign", required = false) String sign,
+                            @RequestParam(value = "resp_data", required = false) String respData) {
+        try {
+            JSONObject body = callbackVerifier.verify(sign, respData);
+            paymentCallbackService.handle(body);
+            return "200";
+        } catch (Exception exception) {
+            log.warn("dougong-pay callback failed: {}", exception.getMessage());
+            return "FAIL";
+        }
+    }
+
+    @PostMapping("/refund-notify")
+    public String refundNotify(@RequestParam(value = "sign", required = false) String sign,
+                               @RequestParam(value = "resp_data", required = false) String respData) {
+        try {
+            JSONObject body = callbackVerifier.verify(sign, respData);
+            refundCallbackService.handle(body);
+            return "200";
+        } catch (Exception exception) {
+            log.warn("dougong-refund callback failed: {}", exception.getMessage());
+            return "FAIL";
+        }
     }
 
     @PostMapping("/refund-logistics")
-    public String refundLogistics(HttpServletRequest request) {
-        return handleNotify("dougong-refund-logistics", request);
+    public String refundLogistics(@RequestParam(value = "sign", required = false) String sign,
+                                  @RequestParam(value = "resp_data", required = false) String respData) {
+        return handleNotify("dougong-refund-logistics", sign, respData);
     }
 
     @PostMapping("/refund-crosscity")
-    public String refundCrossCity(HttpServletRequest request) {
-        return handleNotify("dougong-refund-crosscity", request);
+    public String refundCrossCity(@RequestParam(value = "sign", required = false) String sign,
+                                  @RequestParam(value = "resp_data", required = false) String respData) {
+        return handleNotify("dougong-refund-crosscity", sign, respData);
     }
 
     @PostMapping("/encashment")
-    public String encashment(HttpServletRequest request) {
-        return handleNotify("dougong-encashment", request);
+    public String encashment(@RequestParam(value = "sign", required = false) String sign,
+                             @RequestParam(value = "resp_data", required = false) String respData) {
+        return handleNotify("dougong-encashment", sign, respData);
     }
 
-    private String handleNotify(String bizName, HttpServletRequest request) {
-        String sign = request.getParameter("sign");
-        String respData = request.getParameter("resp_data");
-        if (!StringUtils.hasText(sign) || !StringUtils.hasText(respData)) {
-            log.warn("{} missing params, sign={}, resp_data={}", bizName, sign, respData);
+    private String handleNotify(String bizName, String sign, String respData) {
+        try {
+            JSONObject body = callbackVerifier.verify(sign, respData);
+            log.info("{} verified, req_seq_id={}, org_req_seq_id={}, trans_stat={}", bizName,
+                    body.getString("req_seq_id"), body.getString("org_req_seq_id"), body.getString("trans_stat"));
+            return "200";
+        } catch (Exception exception) {
+            log.warn("{} callback failed: {}", bizName, exception.getMessage());
             return "FAIL";
         }
-
-        // 备注:斗拱回调可能把括号转义为带空格的 HTML 实体,验签前必须恢复原文,否则签名会不一致。
-        String normalizedRespData = respData.replaceAll("& #40;", "(").replaceAll("& #41;", ")");
-        boolean verified = RsaUtils.verify(normalizedRespData, huiFuProperties.getRsaPublicKey(), sign);
-        if (!verified) {
-            log.warn("{} signature verify failed, resp_data={}", bizName, normalizedRespData);
-            return "FAIL";
-        }
-
-        JSONObject body = JSONObject.parseObject(normalizedRespData);
-        // 备注:当前阶段先记录回调关键流水,后续订单支付确认、退款确认、提现确认都应从这里分发到幂等服务。
-        log.info("{} verified, req_seq_id={}, org_req_seq_id={}, trans_stat={}, body={}",
-                bizName,
-                body.getString("req_seq_id"),
-                body.getString("org_req_seq_id"),
-                body.getString("trans_stat"),
-                body);
-        return "200";
     }
 }

--
Gitblit v1.7.1