فهرست منبع

微信支付通知回调响应修改

zuy 2 سال پیش
والد
کامیت
fc16c09d83

+ 27 - 6
miniapp/src/main/java/com/kym/miniapp/controller/PaymentController.java

@@ -1,22 +1,32 @@
 package com.kym.miniapp.controller;
 
+import cn.hutool.core.util.XmlUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.kym.common.R;
 import com.kym.common.annotation.ApiLog;
 import com.kym.service.wechat.WxPayService;
 import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.SneakyThrows;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.HashMap;
+import java.util.Map;
+
 
 /**
  * @author skyline
  * @description
  * @date 2023-07-22 20:36
  */
-@RestController
 @RequestMapping("/payment")
 public class PaymentController {
+    private Logger logger = LoggerFactory.getLogger(PaymentController.class);
 
     private final WxPayService wxPayService;
 
@@ -34,9 +44,20 @@ public class PaymentController {
     @ApiLog(value = "微信回调", ignoreParams = true)
     @SneakyThrows
     @PostMapping("/notify")
-    @ResponseBody
-    ResponseEntity.BodyBuilder notify(HttpServletRequest request) {
-        return wxPayService.wxNotify(request);
+    String notify(HttpServletRequest request, HttpServletResponse response) {
+        response.setContentType("text/xml");
+        Map<String,String> result = new HashMap<>();
+        try {
+            wxPayService.wxNotify(request);
+            result.put("return_code","SUCCESS");
+            result.put("return_msg","OK");
+        } catch (Exception e) {
+            result.put("return_code","FAIL");
+            result.put("return_msg",e.getMessage());
+        }
+        String resp = XmlUtil.mapToXmlStr(result);
+        logger.info("wxpay notify result>>>:{}",resp);
+        return resp;
     }
 
 

+ 1 - 1
service/src/main/java/com/kym/service/wechat/WxPayService.java

@@ -24,5 +24,5 @@ public interface WxPayService {
 
     PrepayWithRequestPaymentResponse wxPay(JSONObject rechargeAmount);
 
-    ResponseEntity.BodyBuilder wxNotify(HttpServletRequest request) throws IOException;
+   void  wxNotify(HttpServletRequest request) throws IOException;
 }

+ 6 - 7
service/src/main/java/com/kym/service/wechat/impl/WxPayServiceImpl.java

@@ -231,7 +231,7 @@ public class WxPayServiceImpl implements WxPayService {
     @SneakyThrows
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ResponseEntity.BodyBuilder wxNotify(HttpServletRequest request) {
+    public void wxNotify(HttpServletRequest request) {
         var notifyRes = handleWxNotify(request);
 
         try {
@@ -240,7 +240,7 @@ public class WxPayServiceImpl implements WxPayService {
             LOGGER.info("微信支付回调{}:验签解密完毕,数据:\n{}", notifyRes[2], transaction);
             // 判断是否已经接收处理过通知
             if (payLogService.lambdaQuery().eq(PayLog::getOutTradeNo, transaction.getOutTradeNo()).one() != null) {
-                return ResponseEntity.status(HttpStatus.OK);
+                return ;
             }
 
             DateTime dt = DateUtil.parse(transaction.getSuccessTime());
@@ -280,16 +280,15 @@ public class WxPayServiceImpl implements WxPayService {
 
             } else {
                 LOGGER.error("微信支付通知处理异常,资金流水为空,回调信息:{}", transaction);
-                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR);
+//                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR);
+                throw new BusinessException("处理异常");
             }
         } catch (ValidationException e) {
             // 签名验证失败,返回 401 UNAUTHORIZED 状态码
             LOGGER.error("微信支付通知验签失败", e);
-            return ResponseEntity.status(HttpStatus.UNAUTHORIZED);
+            throw new BusinessException("验签失败");
+//            return ResponseEntity.status(HttpStatus.UNAUTHORIZED);
         }
-
-        // 处理成功,返回 200 OK 状态码
-        return ResponseEntity.status(HttpStatus.OK);
     }