From 467fe3b3ec6aa9d449b094bdd9df4611323d88d1 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期五, 24 四月 2026 21:43:50 +0800
Subject: [PATCH] 代码生成

---
 server/web/src/main/java/com/doumee/api/web/PaymentCallback.java |  237 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 218 insertions(+), 19 deletions(-)

diff --git a/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java b/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
index f537df4..43989ac 100644
--- a/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
+++ b/server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
@@ -1,21 +1,34 @@
 package com.doumee.api.web;
 
 import com.doumee.config.wx.WxMiniConfig;
+import com.doumee.config.wx.WxPayV3Service;
 import com.doumee.core.constants.Constants;
 import com.doumee.core.utils.ID;
+import com.doumee.core.utils.aliyun.AliSmsService;
+import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.OrdersRefundMapper;
+import com.doumee.dao.business.OrdersMapper;
+import com.doumee.dao.business.SmsrecordMapper;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.Notice;
+import com.doumee.dao.business.model.Orders;
+import com.doumee.dao.business.model.OrdersRefund;
+import com.doumee.dao.business.model.Smsrecord;
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.service.business.NoticeService;
 import com.doumee.service.business.OrdersService;
 import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
 import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
+import com.wechat.pay.java.service.payments.model.Transaction;
+import com.wechat.pay.java.service.refund.model.RefundNotification;
+import com.wechat.pay.java.service.refund.model.Status;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
-import java.util.Date;
-import java.util.Objects;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 鏀粯鍥炶皟
@@ -31,39 +44,51 @@
     @Autowired
     private OrdersService ordersService;
 
+    @Autowired
+    private WxPayV3Service wxPayV3Service;
+
+    @Autowired
+    private OrdersRefundMapper ordersRefundMapper;
+
+    @Autowired
+    private OrdersMapper ordersMapper;
+
+    @Autowired
+    private NoticeService noticeService;
+
+    @Autowired
+    private SmsrecordMapper smsrecordMapper;
+
+    @Autowired
+    private MemberMapper memberMapper;
+
+
+    // ==================== V2 鍥炶皟 ====================
 
     @PostMapping("/web/api/wxPayNotify")
     public String wxPay_notify(@RequestBody String xmlResult) {
         String wxId = ID.nextGUID();
-        log.info("鏀粯鍥炶皟淇℃伅("+wxId+") = > "  + xmlResult);
-        if (StringUtils.isEmpty(xmlResult)){
+        log.info("V2鏀粯鍥炶皟淇℃伅(" + wxId + ") => " + xmlResult);
+        if (StringUtils.isEmpty(xmlResult)) {
             return null;
         }
         try {
             WxPayOrderNotifyResult result = WxMiniConfig.wxPayService.parseOrderNotifyResult(xmlResult);
-            //鑷畾涔夎鍗曞彿
             String outTradeNo = result.getOutTradeNo();
-            //寰俊璁㈠崟鍙�
             String paymentNo = result.getTransactionId();
 
-
-
             if (Constants.SUCCESS.equals(result.getReturnCode())) {
-                // 鏀粯鎴愬姛
                 switch (result.getAttach()) {
-                    //瀵勫瓨璁㈠崟
                     case "storageOrder": {
                         ordersService.handleStorageOrderPayNotify(outTradeNo, paymentNo);
                         break;
                     }
-                    //搴楅摵鎶奸噾璁㈠崟
                     case "shopDeposit": {
-
+                        ordersService.handleShopDepositPayNotify(outTradeNo, paymentNo);
                         break;
                     }
-                    //閫炬湡璐圭敤璁㈠崟
                     case "overdueFee": {
-
+                        ordersService.handleOverdueFeePayNotify(outTradeNo, paymentNo);
                         break;
                     }
                 }
@@ -72,11 +97,185 @@
             return WxPayNotifyResponse.fail(result.getReturnMsg());
         } catch (Exception e) {
             e.printStackTrace();
-            log.error("寰俊鍥炶皟缁撴灉寮傚父,寮傚父鍘熷洜{}", e.getLocalizedMessage());
+            log.error("V2寰俊鍥炶皟缁撴灉寮傚父,寮傚父鍘熷洜{}", e.getLocalizedMessage());
             return WxPayNotifyResponse.fail(e.getMessage());
         }
     }
 
+    // ==================== V3 鍥炶皟 ====================
 
+    /**
+     * V3鏀粯鍥炶皟
+     */
+    @PostMapping("/web/api/wxPayV3Notify")
+    public Map<String, String> wxPayV3Notify(
+            @RequestHeader("Wechatpay-Serial") String serialNumber,
+            @RequestHeader("Wechatpay-Timestamp") String timestamp,
+            @RequestHeader("Wechatpay-Nonce") String nonce,
+            @RequestHeader("Wechatpay-Signature") String signature,
+            @RequestBody String body) {
+        String wxId = ID.nextGUID();
+        log.info("V3鏀粯鍥炶皟淇℃伅({}) => {}", wxId, body);
+        try {
+            Transaction transaction = wxPayV3Service.parsePayNotify(
+                    serialNumber, timestamp, nonce, signature, body);
+
+            String outTradeNo = transaction.getOutTradeNo();
+            String paymentNo = transaction.getTransactionId();
+
+            if (Transaction.TradeStateEnum.SUCCESS.equals(transaction.getTradeState())) {
+                String attach = transaction.getAttach();
+                if (StringUtils.isNotBlank(attach)) {
+                    switch (attach) {
+                        case "storageOrder":
+                            ordersService.handleStorageOrderPayNotify(outTradeNo, paymentNo);
+                            break;
+                        case "shopDeposit":
+                            ordersService.handleShopDepositPayNotify(outTradeNo, paymentNo);
+                            break;
+                        case "overdueFee":
+                            ordersService.handleOverdueFeePayNotify(outTradeNo, paymentNo);
+                            break;
+                    }
+                }
+            }
+
+            Map<String, String> response = new HashMap<>();
+            response.put("code", "SUCCESS");
+            response.put("message", "澶勭悊鎴愬姛");
+            return response;
+        } catch (Exception e) {
+            log.error("V3鏀粯鍥炶皟寮傚父,寮傚父鍘熷洜{}", e.getLocalizedMessage());
+            Map<String, String> response = new HashMap<>();
+            response.put("code", "FAIL");
+            response.put("message", e.getMessage());
+            return response;
+        }
+    }
+
+    /**
+     * V3閫�娆惧洖璋�
+     */
+    @PostMapping("/web/api/wxRefundV3Notify")
+    public Map<String, String> wxRefundV3Notify(
+            @RequestHeader("Wechatpay-Serial") String serialNumber,
+            @RequestHeader("Wechatpay-Timestamp") String timestamp,
+            @RequestHeader("Wechatpay-Nonce") String nonce,
+            @RequestHeader("Wechatpay-Signature") String signature,
+            @RequestBody String body) {
+        String wxId = ID.nextGUID();
+        log.info("V3閫�娆惧洖璋冧俊鎭�({}) => {}", wxId, body);
+        try {
+            RefundNotification refundNotification = wxPayV3Service.parseRefundNotify(
+                    serialNumber, timestamp, nonce, signature, body);
+
+            log.info("V3閫�娆惧洖璋冪粨鏋�, outTradeNo={}, outRefundNo={}, refundStatus={}",
+                    refundNotification.getOutTradeNo(),
+                    refundNotification.getOutRefundNo(),
+                    refundNotification.getRefundStatus());
+
+            // 鏍规嵁閫�娆惧崟鍙锋洿鏂伴��娆捐褰曠姸鎬�
+            String outRefundNo = refundNotification.getOutRefundNo();
+            OrdersRefund refundRecord = ordersRefundMapper.selectOne(
+                    new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<OrdersRefund>().lambda()
+                            .eq(OrdersRefund::getRefundCode, outRefundNo)
+                            .eq(OrdersRefund::getDeleted, Constants.ZERO)
+                            .last("limit 1"));
+            if (refundRecord != null) {
+                Status refundStatus = refundNotification.getRefundStatus();
+
+                // 骞傜瓑鍒ゆ柇锛氬凡鎴愬姛/宸插け璐ョ殑涓嶉噸澶嶅鐞�
+                if (!Constants.equalsInteger(refundRecord.getStatus(), Constants.ZERO)) {
+                    log.info("閫�娆捐褰曞凡澶勭悊, refundRecordId={}, status={}, 璺宠繃", refundRecord.getId(), refundRecord.getStatus());
+                } else {
+                    if (Status.SUCCESS.equals(refundStatus)) {
+                        refundRecord.setStatus(Constants.ONE); // 閫�娆炬垚鍔�
+                        refundRecord.setRefundTime(new java.util.Date());
+                    } else if (Status.CLOSED.equals(refundStatus) || Status.ABNORMAL.equals(refundStatus)) {
+                        refundRecord.setStatus(Constants.TWO); // 閫�娆惧け璐�
+                        refundRecord.setRemark("寰俊閫�娆惧け璐�: " + refundStatus.name());
+                    }
+                    // PROCESSING 鐘舵�佹棤鍙樺寲锛屼笉鏇存柊
+                    ordersRefundMapper.updateById(refundRecord);
+                    log.info("閫�娆捐褰曠姸鎬佸凡鏇存柊, refundRecordId={}, status={}", refundRecord.getId(), refundRecord.getStatus());
+
+                    // 閫�娆炬垚鍔� 鈫� 閫氱煡浼氬憳
+                    if (Status.SUCCESS.equals(refundStatus) && refundRecord.getOrderId() != null) {
+                        Orders refundOrder = ordersMapper.selectById(refundRecord.getOrderId());
+                        if (refundOrder != null) {
+                            Notice notice = new Notice();
+                            notice.setUserType(0);
+                            notice.setUserId(refundOrder.getMemberId());
+                            notice.setTitle(Constants.MemberOrderNotify.REFUNDED.getTitle());
+                            notice.setContent(Constants.MemberOrderNotify.REFUNDED.format(
+                                    "orderNo", refundOrder.getCode(),
+                                    "amount", String.valueOf(Constants.getFormatMoney(refundOrder.getRefundAmount() != null ? refundOrder.getRefundAmount() : 0L))));
+                            notice.setObjId(refundOrder.getId());
+                            notice.setObjType(0);
+                            notice.setStatus(0);
+                            notice.setIsdeleted(Constants.ZERO);
+                            notice.setCreateDate(new java.util.Date());
+                            noticeService.create(notice);
+
+                            // 鐭俊閫氱煡浼氬憳锛氶��娆惧凡瀹屾垚
+                            Member refundMember = memberMapper.selectById(refundOrder.getMemberId());
+                            if (refundMember != null && StringUtils.isNotBlank(refundMember.getTelephone())) {
+                                String smsContent = Constants.SmsNotify.MEMBER_REFUNDED.format(
+                                        "orderNo", refundOrder.getCode(),
+                                        "money", String.valueOf(Constants.getFormatMoney(
+                                                refundOrder.getRefundAmount() != null ? refundOrder.getRefundAmount() : 0L)));
+                                try {
+                                    JSONObject templateParam = new JSONObject();
+                                    templateParam.put("orderNo", refundOrder.getCode());
+                                    templateParam.put("money", String.valueOf(Constants.getFormatMoney(
+                                            refundOrder.getRefundAmount() != null ? refundOrder.getRefundAmount() : 0L)));
+                                    boolean smsResult = AliSmsService.sendSms(refundMember.getTelephone(),
+                                            Constants.SmsNotify.MEMBER_REFUNDED.getTemplateCode(),
+                                            templateParam.toJSONString());
+                                    if (smsResult) {
+                                        log.info("閫�娆剧煭淇″彂閫佹垚鍔�: phone={}", refundMember.getTelephone());
+                                    } else {
+                                        log.warn("閫�娆剧煭淇″彂閫佸け璐�: phone={}", refundMember.getTelephone());
+                                    }
+                                    // 瀛樺偍鐭俊璁板綍
+                                    Smsrecord smsRecord = new Smsrecord();
+                                    smsRecord.setPhone(refundMember.getTelephone());
+                                    smsRecord.setContent(smsContent);
+                                    smsRecord.setType(Constants.ONE);
+                                    smsRecord.setStatus(smsResult ? Constants.ONE : Constants.ZERO);
+                                    smsRecord.setCreateTime(new java.util.Date());
+                                    smsRecord.setDeleted(Constants.ZERO);
+                                    smsrecordMapper.insert(smsRecord);
+                                } catch (Exception smsEx) {
+                                    log.error("閫�娆剧煭淇″彂閫佸紓甯�: {}", smsEx.getMessage());
+                                    try {
+                                        Smsrecord smsRecord = new Smsrecord();
+                                        smsRecord.setPhone(refundMember.getTelephone());
+                                        smsRecord.setContent(smsContent);
+                                        smsRecord.setType(Constants.ONE);
+                                        smsRecord.setStatus(Constants.ZERO);
+                                        smsRecord.setCreateTime(new java.util.Date());
+                                        smsRecord.setDeleted(Constants.ZERO);
+                                        smsrecordMapper.insert(smsRecord);
+                                    } catch (Exception ignored) {}
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            Map<String, String> response = new HashMap<>();
+            response.put("code", "SUCCESS");
+            response.put("message", "澶勭悊鎴愬姛");
+            return response;
+        } catch (Exception e) {
+            log.error("V3閫�娆惧洖璋冨紓甯�,寮傚父鍘熷洜{}", e.getLocalizedMessage());
+            Map<String, String> response = new HashMap<>();
+            response.put("code", "FAIL");
+            response.put("message", e.getMessage());
+            return response;
+        }
+    }
 
 }

--
Gitblit v1.9.3