From ab9cd2c82bd64de8e33510db1d1e78a5b3b4de70 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期一, 20 四月 2026 19:37:20 +0800
Subject: [PATCH] 代码生成
---
server/web/src/main/java/com/doumee/api/web/PaymentCallback.java | 274 +++++++++++++++++++++++++++++++++---------------------
1 files changed, 167 insertions(+), 107 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 0aae790..40e530d 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,23 +1,28 @@
-package com.doumee.api.web.mall;
+package com.doumee.api.web;
-import com.doumee.api.web.ApiController;
-import com.doumee.core.utils.Constants;
+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.wx.WxMiniConfig;
-import com.doumee.dao.business.model.ActivitySign;
-import com.doumee.dao.business.model.Fund;
-import com.doumee.dao.business.model.Goodsorder;
+import com.doumee.dao.business.OrdersRefundMapper;
+import com.doumee.dao.business.OrdersMapper;
+import com.doumee.dao.business.model.Notice;
+import com.doumee.dao.business.model.Orders;
+import com.doumee.dao.business.model.OrdersRefund;
+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.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.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
-import java.util.Date;
-import java.util.Objects;
+import java.util.HashMap;
+import java.util.Map;
/**
* 鏀粯鍥炶皟
@@ -30,128 +35,183 @@
@CrossOrigin
public class PaymentCallback extends ApiController {
+ @Autowired
+ private OrdersService ordersService;
+
+ @Autowired
+ private WxPayV3Service wxPayV3Service;
+
+ @Autowired
+ private OrdersRefundMapper ordersRefundMapper;
+
+ @Autowired
+ private OrdersMapper ordersMapper;
+
+ @Autowired
+ private NoticeService noticeService;
+
+
+ // ==================== 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_STR.equals(result.getReturnCode())) {
- // 鏀粯鎴愬姛
+ if (Constants.SUCCESS.equals(result.getReturnCode())) {
switch (result.getAttach()) {
- //娲诲姩鍙備笌鏀粯
- case "ActivitySign": {
- ActivitySign activitySign = activitySignService.findById(Integer.valueOf(outTradeNo));
- if(Objects.isNull(activitySign)){
- return WxPayNotifyResponse.fail( "鏀粯鍥炶皟淇℃伅("+ wxId + ") = > 鏈煡璇㈠埌鏀粯瀵硅薄淇℃伅!");
- }
- if(activitySign.getStatus().equals(Constants.ONE)){
- return WxPayNotifyResponse.success("澶勭悊鎴愬姛!");
- }
- activitySign.setPayStatus(Constants.ONE);
- activitySign.setPayDate(new Date());
- activitySign.setPayOrderId(paymentNo);
- activitySign.setStatus(Constants.ONE);
- activitySignService.updateById(activitySign);
+ case "storageOrder": {
+ ordersService.handleStorageOrderPayNotify(outTradeNo, paymentNo);
break;
}
- case "terraceMall": {
- Goodsorder DBGoodsOrder = new Goodsorder();
- DBGoodsOrder.setCode(Long.valueOf(outTradeNo));
- Goodsorder goodsOrder = goodsorderService.findOne(DBGoodsOrder);
- if(Objects.isNull(goodsOrder)){
- return WxPayNotifyResponse.fail( "鏀粯鍥炶皟淇℃伅("+ wxId + ") = > 鏈煡璇㈠埌鏀粯瀵硅薄淇℃伅!");
- }
- if(goodsOrder.getStatus().equals(Constants.ONE)){
- return WxPayNotifyResponse.success("澶勭悊鎴愬姛!");
- }
- goodsOrder.setPayStatus(Constants.ONE);
- goodsOrder.setPayDate(new Date());
- goodsOrder.setPayOrderId(paymentNo);
- goodsOrder.setStatus(Constants.OrderStatus.PAY_DONE.getKey());
- goodsOrder.setPayMethod(Constants.ZERO);
- goodsorderService.updateById(goodsOrder);
- //鐢熸垚 鍜栧暋璁″垝璁㈠崟鏄庣粏琛�
- if(goodsOrder.getType().equals(Constants.TWO)){
- planorderDetailService.createPlanOrderDetail(goodsOrder);
- }
- Fund fund = new Fund();
- fund.setOrderCode(goodsOrder.getPayOrderId());
- fund.setCreator(goodsOrder.getMemberId());
- fund.setCreateDate(new Date());
- fund.setIsdeleted(Constants.ZERO);
- fund.setRemark(goodsOrder.getCode().toString());
- fund.setMemberId(goodsOrder.getMemberId());
- fund.setTitle("璁㈠崟鏀粯");
- fund.setContent("璁㈠崟鏀粯");
- fund.setObjId(goodsOrder.getId());
- fund.setObjType(Constants.ONE);
- fund.setType(Constants.ZERO);
- fund.setNum(goodsOrder.getPrice());
- fundService.create(fund);
+ case "shopDeposit": {
+ ordersService.handleShopDepositPayNotify(outTradeNo, paymentNo);
break;
}
- case "shopGoods": {
- Goodsorder DBGoodsOrder = new Goodsorder();
- DBGoodsOrder.setCode(Long.valueOf(outTradeNo));
- Goodsorder goodsOrder = goodsorderService.findOne(DBGoodsOrder);
- if(Objects.isNull(goodsOrder)){
- return WxPayNotifyResponse.fail( "鏀粯鍥炶皟淇℃伅("+ wxId + ") = > 鏈煡璇㈠埌鏀粯瀵硅薄淇℃伅!");
- }
- if(goodsOrder.getStatus().equals(Constants.ONE)){
- return WxPayNotifyResponse.success("澶勭悊鎴愬姛!");
- }
- goodsOrder.setPayStatus(Constants.ONE);
- goodsOrder.setPayDate(new Date());
- goodsOrder.setPayOrderId(paymentNo);
- goodsOrder.setStatus(Constants.OrderStatus.PAY_DONE.getKey());
- //鐢熸垚鏍搁攢鐮�
- if(Constants.equalsInteger(goodsOrder.getReceiveType(),Constants.ONE)){
- goodsOrder.setExchangeCode(goodsorderService.createExchangeCode());
- }
- goodsOrder.setPayMethod(Constants.ZERO);
- goodsorderService.updateById(goodsOrder);
- if(Objects.nonNull(goodsOrder.getPickUpShopId())){
- //鍙戦�佺珯鍐呬俊 - 缁忛攢鍟�
- noticeService.orderPayNotice(goodsOrder.getPickUpShopId(),goodsOrder.getId(),goodsOrder.getReceiveType());
- }
- Fund fund = new Fund();
- fund.setOrderCode(goodsOrder.getPayOrderId());
- fund.setCreator(goodsOrder.getMemberId());
- fund.setCreateDate(new Date());
- fund.setIsdeleted(Constants.ZERO);
- fund.setRemark(goodsOrder.getCode().toString());
- fund.setMemberId(goodsOrder.getMemberId());
- fund.setTitle("璁㈠崟鏀粯");
- fund.setContent("璁㈠崟鏀粯");
- fund.setObjId(goodsOrder.getId());
- fund.setObjType(Constants.ONE);
- fund.setType(Constants.ZERO);
- fund.setNum(goodsOrder.getPrice());
- fundService.create(fund);
+ case "overdueFee": {
+ ordersService.handleOverdueFeePayNotify(outTradeNo, paymentNo);
break;
}
-
}
return WxPayNotifyResponse.success("澶勭悊鎴愬姛!");
}
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 (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); // 閫�娆惧け璐�
+ }
+ 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);
+ }
+ }
+ }
+
+ 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