From 6b5de29c0953e323d71fe51038736b9a194eee1b Mon Sep 17 00:00:00 2001 From: zhangli <123879394@qq.com> Date: Sat, 27 Sep 2025 15:03:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=85=8D=E6=8A=BC?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AliPayNotifyController.java | 56 +++++++++++++++++++ .../com/sczx/pay/mapper/OrderPayMapper.java | 7 +++ .../com/sczx/pay/service/AlipayService.java | 6 +- .../pay/service/impl/AlipayServiceImpl.java | 23 +++++++- 4 files changed, 89 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sczx/pay/controller/AliPayNotifyController.java b/src/main/java/com/sczx/pay/controller/AliPayNotifyController.java index 0e54192..db4bf3a 100644 --- a/src/main/java/com/sczx/pay/controller/AliPayNotifyController.java +++ b/src/main/java/com/sczx/pay/controller/AliPayNotifyController.java @@ -138,6 +138,62 @@ public class AliPayNotifyController { } } + /** + * 支付宝退款结果通知 + */ + @ApiOperation(value = "支付宝免押通知") + @PostMapping("/freeze/notify") + public String alipayFreezeNotify(HttpServletRequest request) { + try { + // 读取支付宝退款回调数据 + Map params = new HashMap<>(); + Map requestParams = request.getParameterMap(); + for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { + String name = iter.next(); + String[] values = requestParams.get(name); + String valueStr = ""; + for (int i = 0; i < values.length; i++) { + valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; + } + params.put(name, valueStr); + } + + log.info("收到支付宝免押结果通知, 数据: {}", params); + + // 验证签名 + // 注意:支付宝退款通知的签名验证方式可能与支付通知不同 + // 这里简化处理,实际应根据支付宝文档实现 + + + String orderStatus = params.get("order_status"); + + if (!"AUTHORIZED".equals(orderStatus)) { + log.warn("支付宝免押通知状态失败: {}", orderStatus); + return buildResponse("success"); + } + + // 处理免押通知 + String outOrderNo = params.get("out_order_no"); +// String outRequestNo = params.get("out_request_no"); + String authNo = params.get("auth_no"); + + // 更新数据库中的免押支付状态 + boolean success = alipayService.processFreezeNotify(outOrderNo,authNo); + if (success) { + log.info("支付宝免押处理完成,支付单号: {}, 支付宝授权资金订单号: {}", + outOrderNo, authNo); + return buildResponse("success"); + } else { + log.error("支付宝免押处理状态失败,订单号: {}, 支付宝授权资金订单号: {}", outOrderNo, authNo); + return buildResponse("failure"); + } + + } catch (Exception e) { + log.error("处理支付宝退款通知异常", e); + return buildResponse("failure"); + } + } + private String buildResponse(String result) { return result; } diff --git a/src/main/java/com/sczx/pay/mapper/OrderPayMapper.java b/src/main/java/com/sczx/pay/mapper/OrderPayMapper.java index 9630be6..6a1b551 100644 --- a/src/main/java/com/sczx/pay/mapper/OrderPayMapper.java +++ b/src/main/java/com/sczx/pay/mapper/OrderPayMapper.java @@ -70,4 +70,11 @@ public interface OrderPayMapper { @Select("select * from zc_order_sub where payment_id = #{paymentId} order by suborder_id desc limit 1") OrderSub getSubOrderByTradeNo(@Param("paymentId") String paymentId); + /** + * 免押成功,更新子订单状态 + */ + @Update("update zc_order_sub set transaction_id = #{transactionId},pay_status = 'SUCCESS'" + + " where payment_id = #{authNo}") + int updateFreezeSubOrderPaymentStatus(@Param("authNo") String authNo, + @Param("transactionId") String transactionId); } diff --git a/src/main/java/com/sczx/pay/service/AlipayService.java b/src/main/java/com/sczx/pay/service/AlipayService.java index 4ec9519..53bb8b9 100644 --- a/src/main/java/com/sczx/pay/service/AlipayService.java +++ b/src/main/java/com/sczx/pay/service/AlipayService.java @@ -1,7 +1,6 @@ package com.sczx.pay.service; import com.sczx.pay.dto.*; -import org.springframework.web.bind.annotation.RequestBody; import java.util.Map; @@ -65,4 +64,9 @@ public interface AlipayService { * 处理退款通知 */ boolean processRefundNotify(Map notifyMap); + + /** + * 处理免押通知 + */ + boolean processFreezeNotify(String outOrderNo,String authNo); } diff --git a/src/main/java/com/sczx/pay/service/impl/AlipayServiceImpl.java b/src/main/java/com/sczx/pay/service/impl/AlipayServiceImpl.java index 9adbcad..d8f6384 100644 --- a/src/main/java/com/sczx/pay/service/impl/AlipayServiceImpl.java +++ b/src/main/java/com/sczx/pay/service/impl/AlipayServiceImpl.java @@ -42,6 +42,10 @@ public class AlipayServiceImpl implements AlipayService { @Value("${alipay.refund-notify-url}") private String refundNotifyUrl; + @Value("${alipay.freeze-notify-url}") + private String freezeNotifyUrl; + + @Value("${alipay.alipay-public-cert-path}") private String alipayPublicCertPath; @@ -339,6 +343,9 @@ public class AlipayServiceImpl implements AlipayService { model.setDepositProductMode("DEPOSIT_ONLY"); request.setBizModel(model); + + // 设置异步通知地址 + request.setNotifyUrl(freezeNotifyUrl); log.info("免押冻结请求 : {}",request); AlipayFundAuthOrderAppFreezeResponse fundAuthOrderAppFreezeResponse = alipaySdkUtil.execute(request); log.info("免押冻结响应 : {}",fundAuthOrderAppFreezeResponse.getBody()); @@ -611,15 +618,27 @@ public class AlipayServiceImpl implements AlipayService { log.info("支付宝退款记录状态已更新,退款单号: {}, 支付宝退款单号: {}, 状态: {}", outRequestNo, outRequestNo, refundStatus); return true; } else { - log.warn("未找到对应的微信退款记录,退款单号: {}", outRequestNo); + log.warn("未找到对应的支付宝退款记录,退款单号: {}", outRequestNo); return false; } } catch (Exception e) { - log.error("处理微信退款通知异常,退款单号: {}", notifyMap.get("out_request_no"), e); + log.error("处理支付宝退款通知异常,退款单号: {}", notifyMap.get("out_request_no"), e); return false; } } + @Override + public boolean processFreezeNotify(String outOrderNo, String authNo) { + try { + log.info("处理支付宝免押支付成功通知, 更新状态,订单号: {}, 授权号: {}", outOrderNo, authNo); + int result = orderPayMapper.updateFreezeSubOrderPaymentStatus(outOrderNo, authNo); + return result>0; + } catch (Exception e) { + log.error("处理支付宝免押支付成功通知异常,订单号: {}", outOrderNo, e); + } + return false; + } + /** * 记录支付信息到数据库 */