feat(payment): 初始化支付模块核心代码
- 添加支付常量类PaymentConstants,定义支付状态、微信、支付宝、银联等相关常量 - 创建微信支付类型常量类WechatPayType,支持JSAPI、NATIVE、H5、APP支付方式 - 新增支付控制器PaymentController,提供创建支付、查询状态、退款等统一接口 - 实现支付回调控制器PaymentNotifyController,处理微信、支付宝、银联异步通知 - 添加支付请求数据传输对象PaymentRequest,支持多种支付方式参数校验 - 定义支付响应、状态更新请求等相关DTO类- 集成Swagger注解,完善接口文档说明- 添加参数校验和异常处理机制,确保支付流程安全可靠
This commit is contained in:
153
java/payment/exception/PaymentExceptionHandler.java
Normal file
153
java/payment/exception/PaymentExceptionHandler.java
Normal file
@@ -0,0 +1,153 @@
|
||||
package com.gxwebsoft.payment.exception;
|
||||
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.common.core.web.BaseController;
|
||||
import com.gxwebsoft.payment.constants.PaymentConstants;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.validation.BindException;
|
||||
import org.springframework.validation.FieldError;
|
||||
import org.springframework.web.bind.MethodArgumentNotValidException;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||
|
||||
import javax.validation.ConstraintViolation;
|
||||
import javax.validation.ConstraintViolationException;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 统一支付异常处理器
|
||||
* 处理所有支付相关的异常和参数验证异常
|
||||
*
|
||||
* @author 科技小王子
|
||||
* @since 2025-01-26
|
||||
*/
|
||||
@Slf4j
|
||||
@RestControllerAdvice(basePackages = {"com.gxwebsoft.payment.controller", "com.gxwebsoft.shop.controller"})
|
||||
public class PaymentExceptionHandler extends BaseController {
|
||||
|
||||
/**
|
||||
* 处理支付业务异常
|
||||
*/
|
||||
@ExceptionHandler(PaymentException.class)
|
||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||
public ApiResult<?> handlePaymentException(PaymentException e) {
|
||||
log.warn("支付业务异常: {}", e.getMessage());
|
||||
|
||||
// 记录详细的异常信息
|
||||
if (e.getTenantId() != null) {
|
||||
log.warn("异常租户ID: {}", e.getTenantId());
|
||||
}
|
||||
|
||||
if (e.getPaymentType() != null) {
|
||||
log.warn("异常支付类型: {}", e.getPaymentType());
|
||||
}
|
||||
|
||||
if (e.getOrderNo() != null) {
|
||||
log.warn("异常订单号: {}", e.getOrderNo());
|
||||
}
|
||||
|
||||
if (e.getErrorCode() != null) {
|
||||
log.warn("错误代码: {}", e.getErrorCode());
|
||||
}
|
||||
|
||||
return fail(e.getMessage());
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 处理参数验证异常(@Valid注解)
|
||||
*/
|
||||
@ExceptionHandler(MethodArgumentNotValidException.class)
|
||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||
public ApiResult<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
|
||||
List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
|
||||
|
||||
String errorMessage = fieldErrors.stream()
|
||||
.map(error -> error.getField() + ": " + error.getDefaultMessage())
|
||||
.collect(Collectors.joining("; "));
|
||||
|
||||
log.warn("参数验证失败: {}", errorMessage);
|
||||
|
||||
return fail(PaymentConstants.ErrorMessage.PARAM_ERROR + ": " + errorMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理绑定异常
|
||||
*/
|
||||
@ExceptionHandler(BindException.class)
|
||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||
public ApiResult<?> handleBindException(BindException e) {
|
||||
List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
|
||||
|
||||
String errorMessage = fieldErrors.stream()
|
||||
.map(error -> error.getField() + ": " + error.getDefaultMessage())
|
||||
.collect(Collectors.joining("; "));
|
||||
|
||||
log.warn("数据绑定失败: {}", errorMessage);
|
||||
|
||||
return fail(PaymentConstants.ErrorMessage.PARAM_ERROR + ": " + errorMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理约束违反异常(@Validated注解)
|
||||
*/
|
||||
@ExceptionHandler(ConstraintViolationException.class)
|
||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||
public ApiResult<?> handleConstraintViolationException(ConstraintViolationException e) {
|
||||
Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
|
||||
|
||||
String errorMessage = violations.stream()
|
||||
.map(violation -> violation.getPropertyPath() + ": " + violation.getMessage())
|
||||
.collect(Collectors.joining("; "));
|
||||
|
||||
log.warn("约束验证失败: {}", errorMessage);
|
||||
|
||||
return fail(PaymentConstants.ErrorMessage.PARAM_ERROR + ": " + errorMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理非法参数异常
|
||||
*/
|
||||
@ExceptionHandler(IllegalArgumentException.class)
|
||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||
public ApiResult<?> handleIllegalArgumentException(IllegalArgumentException e) {
|
||||
log.warn("非法参数异常: {}", e.getMessage());
|
||||
return fail(PaymentConstants.ErrorMessage.PARAM_ERROR + ": " + e.getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理空指针异常
|
||||
*/
|
||||
@ExceptionHandler(NullPointerException.class)
|
||||
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
public ApiResult<?> handleNullPointerException(NullPointerException e) {
|
||||
log.error("空指针异常", e);
|
||||
return fail(PaymentConstants.ErrorMessage.SYSTEM_ERROR);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理其他运行时异常
|
||||
*/
|
||||
@ExceptionHandler(RuntimeException.class)
|
||||
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
public ApiResult<?> handleRuntimeException(RuntimeException e) {
|
||||
log.error("运行时异常: {}", e.getMessage(), e);
|
||||
return fail(PaymentConstants.ErrorMessage.SYSTEM_ERROR);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理其他异常
|
||||
*/
|
||||
@ExceptionHandler(Exception.class)
|
||||
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
public ApiResult<?> handleException(Exception e) {
|
||||
log.error("未知异常: {}", e.getMessage(), e);
|
||||
return fail(PaymentConstants.ErrorMessage.SYSTEM_ERROR);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user