pull/1121/head
梁宇奇 2025-05-13 16:06:07 +08:00
parent 3e22b86747
commit 2502dde831
7 changed files with 89 additions and 52 deletions

View File

@ -9,6 +9,7 @@ import com.ruoyi.common.core.controller.XktBaseController;
import com.ruoyi.xkt.domain.AlipayCallback;
import com.ruoyi.xkt.domain.FinanceBill;
import com.ruoyi.xkt.domain.StoreOrder;
import com.ruoyi.xkt.enums.EAlipayCallbackBizType;
import com.ruoyi.xkt.enums.EProcessStatus;
import com.ruoyi.xkt.manager.impl.AliPaymentMangerImpl;
import com.ruoyi.xkt.service.IAlipayCallbackService;
@ -85,6 +86,8 @@ public class AlipayCallbackController extends XktBaseController {
//1. 商家需要验证该通知数据中的 out_trade_no 是否为商家系统中创建的订单号。
StoreOrder order = storeOrderService.getByOrderNo(alipayCallback.getOutTradeNo());
if (order != null) {
//订单支付
alipayCallback.setBizType(EAlipayCallbackBizType.ORDER_PAY.getValue());
//2. 判断 total_amount 是否确实为该订单的实际金额(即商家订单创建时的金额)。
if (!NumberUtil.equals(order.getTotalAmount(), alipayCallback.getTotalAmount())) {
logger.warn("支付宝回调订单金额匹配失败:{}", params);
@ -114,6 +117,7 @@ public class AlipayCallbackController extends XktBaseController {
return SUCCESS;
} else {
//充值业务
alipayCallback.setBizType(EAlipayCallbackBizType.RECHARGE.getValue());
//1. 商家需要验证该通知数据中的 out_trade_no 是否为商家系统中创建的订单号。
FinanceBill bill = financeBillService.getByBillNo(alipayCallback.getOutTradeNo());
if (bill != null) {
@ -138,8 +142,8 @@ public class AlipayCallbackController extends XktBaseController {
return SUCCESS;
}
if (EProcessStatus.INIT.getValue().equals(info.getProcessStatus())) {
//充值到账
financeBillService.entryRechargeCollectionBill(bill.getBillNo());
//更新回调状态,收款单到账
alipayCallbackService.processRecharge(info);
} else {
logger.warn("支付回调重复请求处理: {}", info.getId());
}

View File

@ -1,6 +1,12 @@
package com.ruoyi.framework.web.exception;
import javax.servlet.http.HttpServletRequest;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.DemoModeException;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.html.EscapeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.access.AccessDeniedException;
@ -11,13 +17,8 @@ import org.springframework.web.bind.MissingPathVariableException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.DemoModeException;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.html.EscapeUtil;
import javax.servlet.http.HttpServletRequest;
/**
*
@ -58,7 +59,7 @@ public class GlobalExceptionHandler
@ExceptionHandler(ServiceException.class)
public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request)
{
log.error(e.getMessage(), e);
log.error("请求地址'{}',发生业务异常'{}'", request.getRequestURI(), e.getMessage());
Integer code = e.getCode();
return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage());
}
@ -68,8 +69,8 @@ public class GlobalExceptionHandler
* {@link cn.hutool.core.lang.Assert}
*/
@ExceptionHandler(IllegalArgumentException.class)
public AjaxResult illegalArgumentException(IllegalArgumentException e) {
log.error(e.getMessage(), e);
public AjaxResult illegalArgumentException(IllegalArgumentException e, HttpServletRequest request) {
log.error("请求地址'{}',发生校验异常'{}'", request.getRequestURI(), e.getMessage());
return AjaxResult.error(e.getMessage());
}

View File

@ -17,6 +17,10 @@ import java.math.BigDecimal;
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class AlipayCallback extends SimpleEntity {
/**
* [1: 2:]
*/
private Integer bizType;
/**
*
*/

View File

@ -0,0 +1,29 @@
package com.ruoyi.xkt.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author liangyq
* @date 2025-05-13 14:39
*/
@Getter
@AllArgsConstructor
public enum EAlipayCallbackBizType {
ORDER_PAY(1, "订单支付"),
RECHARGE(2, "充值"),
;
private final Integer value;
private final String label;
public static EAlipayCallbackBizType of(Integer value) {
for (EAlipayCallbackBizType e : EAlipayCallbackBizType.values()) {
if (e.getValue().equals(value)) {
return e;
}
}
return null;
}
}

View File

@ -30,4 +30,11 @@ public interface IAlipayCallbackService {
* @param info
*/
void processOrderPaid(AlipayCallback info);
/**
*
*
* @param info
*/
void processRecharge(AlipayCallback info);
}

View File

@ -58,4 +58,14 @@ public class AlipayCallbackServiceImpl implements IAlipayCallbackService {
//创建收款单
financeBillService.createOrderPaidCollectionBill(orderExt, info.getId(), EPayChannel.ALI_PAY);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void processRecharge(AlipayCallback info) {
//更新回调状态
info.setProcessStatus(EProcessStatus.SUCCESS.getValue());
alipayCallbackMapper.updateById(info);
//收款单到账
financeBillService.entryRechargeCollectionBill(info.getOutTradeNo());
}
}

View File

@ -383,19 +383,13 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
expressTracks.add(expressTrackDTO);
}
orderInfo.setExpressTracks(expressTracks);
Map<String, ExpressRegionDTO> regionMap = expressService.getRegionMapCache();
orderInfo.setDestinationProvinceName(Optional.ofNullable(regionMap.get(orderInfo.getDestinationProvinceCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
orderInfo.setDestinationCityName(Optional.ofNullable(regionMap.get(orderInfo.getDestinationCityCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
orderInfo.setDestinationCountyName(Optional.ofNullable(regionMap.get(orderInfo.getDestinationCountyCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
orderInfo.setOriginProvinceName(Optional.ofNullable(regionMap.get(orderInfo.getOriginProvinceCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
orderInfo.setOriginCityName(Optional.ofNullable(regionMap.get(orderInfo.getOriginCityCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
orderInfo.setOriginCountyName(Optional.ofNullable(regionMap.get(orderInfo.getOriginCountyCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
Map<String, String> regionMap = expressService.getRegionNameMapCache();
orderInfo.setDestinationProvinceName(regionMap.get(orderInfo.getDestinationProvinceCode()));
orderInfo.setDestinationCityName(regionMap.get(orderInfo.getDestinationCityCode()));
orderInfo.setDestinationCountyName(regionMap.get(orderInfo.getDestinationCountyCode()));
orderInfo.setOriginProvinceName(regionMap.get(orderInfo.getOriginProvinceCode()));
orderInfo.setOriginCityName(regionMap.get(orderInfo.getOriginCityCode()));
orderInfo.setOriginCountyName(regionMap.get(orderInfo.getOriginCountyCode()));
//商品信息
List<Long> spIds = detailInfos.stream().map(StoreOrderDetailInfoDTO::getStoreProdId).distinct()
.collect(Collectors.toList());
@ -426,21 +420,15 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
Map<Long, List<StoreOrderDetailInfoDTO>> orderDetailGroup = orderDetailList
.stream()
.collect(Collectors.groupingBy(StoreOrderDetailDTO::getStoreOrderId));
Map<String, ExpressRegionDTO> regionMap = expressService.getRegionMapCache();
Map<String, String> regionMap = expressService.getRegionNameMapCache();
for (StoreOrderPageItemDTO order : list) {
//物流信息
order.setDestinationProvinceName(Optional.ofNullable(regionMap.get(order.getDestinationProvinceCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
order.setDestinationCityName(Optional.ofNullable(regionMap.get(order.getDestinationCityCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
order.setDestinationCountyName(Optional.ofNullable(regionMap.get(order.getDestinationCountyCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
order.setOriginProvinceName(Optional.ofNullable(regionMap.get(order.getOriginProvinceCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
order.setOriginCityName(Optional.ofNullable(regionMap.get(order.getOriginCityCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
order.setOriginCountyName(Optional.ofNullable(regionMap.get(order.getOriginCountyCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
order.setDestinationProvinceName(regionMap.get(order.getDestinationProvinceCode()));
order.setDestinationCityName(regionMap.get(order.getDestinationCityCode()));
order.setDestinationCountyName(regionMap.get(order.getDestinationCountyCode()));
order.setOriginProvinceName(regionMap.get(order.getOriginProvinceCode()));
order.setOriginCityName(regionMap.get(order.getOriginCityCode()));
order.setOriginCountyName(regionMap.get(order.getOriginCountyCode()));
order.setOrderDetails(orderDetailGroup.get(order.getId()));
for (StoreOrderDetailInfoDTO detail : order.getOrderDetails()) {
//首图
@ -1434,19 +1422,13 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
//生成请求号
reqDTO.setExpressReqNo(IdUtil.simpleUUID());
//行政区划信息
Map<String, ExpressRegionDTO> regionMap = expressService.getRegionMapCache();
reqDTO.setDestinationProvinceName(Optional.ofNullable(regionMap.get(order.getDestinationProvinceCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
reqDTO.setDestinationCityName(Optional.ofNullable(regionMap.get(order.getDestinationCityCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
reqDTO.setDestinationCountyName(Optional.ofNullable(regionMap.get(order.getDestinationCountyCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
reqDTO.setOriginProvinceName(Optional.ofNullable(regionMap.get(order.getOriginProvinceCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
reqDTO.setOriginCityName(Optional.ofNullable(regionMap.get(order.getOriginCityCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
reqDTO.setOriginCountyName(Optional.ofNullable(regionMap.get(order.getOriginCountyCode()))
.map(ExpressRegionDTO::getRegionName).orElse(null));
Map<String, String> regionMap = expressService.getRegionNameMapCache();
reqDTO.setDestinationProvinceName(regionMap.get(order.getDestinationProvinceCode()));
reqDTO.setDestinationCityName(regionMap.get(order.getDestinationCityCode()));
reqDTO.setDestinationCountyName(regionMap.get(order.getDestinationCountyCode()));
reqDTO.setOriginProvinceName(regionMap.get(order.getOriginProvinceCode()));
reqDTO.setOriginCityName(regionMap.get(order.getOriginCityCode()));
reqDTO.setOriginCountyName(regionMap.get(order.getOriginCountyCode()));
//货物信息
List<ExpressShipReqDTO.OrderItem> orderItems = CollUtil.emptyIfNull(orderDetails).stream()
.map(o -> ExpressShipReqDTO.OrderItem