package com.tourguide.common.huifu; import com.alibaba.fastjson.JSONObject; import com.tourguide.modules.order.service.HuifuPaymentCallbackService; import com.tourguide.modules.order.service.HuifuRefundCallbackService; import com.tourguide.modules.finance.service.GuideWithdrawalService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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; /** * 斗拱回调入口。 * * 备注:该控制器只做参数校验、验签和日志记录,订单状态落库应在后续服务层按 req_seq_id 幂等处理。 */ @RestController @RequestMapping("/base/dougong") public class DouGongNotifyController { private static final Logger log = LoggerFactory.getLogger(DouGongNotifyController.class); private final HuifuCallbackVerifier callbackVerifier; private final HuifuPaymentCallbackService paymentCallbackService; private final HuifuRefundCallbackService refundCallbackService; private final GuideWithdrawalService withdrawalService; public DouGongNotifyController(HuifuCallbackVerifier callbackVerifier, HuifuPaymentCallbackService paymentCallbackService, HuifuRefundCallbackService refundCallbackService, GuideWithdrawalService withdrawalService) { this.callbackVerifier = callbackVerifier; this.paymentCallbackService = paymentCallbackService; this.refundCallbackService = refundCallbackService; this.withdrawalService = withdrawalService; } @PostMapping("/pay-notify") 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(@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(@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(@RequestParam(value = "sign", required = false) String sign, @RequestParam(value = "resp_data", required = false) String respData) { try { JSONObject body = callbackVerifier.verify(sign, respData); withdrawalService.handleCallback(body); return "200"; } catch (Exception exception) { log.warn("dougong-encashment callback failed: {}", exception.getMessage()); return "FAIL"; } } 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"; } } }