feat(payment): 初始化支付模块核心代码
- 添加支付常量类PaymentConstants,定义支付状态、微信、支付宝、银联等相关常量 - 创建微信支付类型常量类WechatPayType,支持JSAPI、NATIVE、H5、APP支付方式 - 新增支付控制器PaymentController,提供创建支付、查询状态、退款等统一接口 - 实现支付回调控制器PaymentNotifyController,处理微信、支付宝、银联异步通知 - 添加支付请求数据传输对象PaymentRequest,支持多种支付方式参数校验 - 定义支付响应、状态更新请求等相关DTO类- 集成Swagger注解,完善接口文档说明- 添加参数校验和异常处理机制,确保支付流程安全可靠
This commit is contained in:
158
java/payment/dto/PaymentWithOrderRequest.java
Normal file
158
java/payment/dto/PaymentWithOrderRequest.java
Normal file
@@ -0,0 +1,158 @@
|
||||
package com.gxwebsoft.payment.dto;
|
||||
|
||||
import com.gxwebsoft.payment.enums.PaymentType;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import javax.validation.constraints.*;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 支付与订单创建请求DTO
|
||||
* 用于统一支付模块中的订单创建和支付
|
||||
*
|
||||
* @author 科技小王子
|
||||
* @since 2025-01-26
|
||||
*/
|
||||
@Data
|
||||
@Schema(name = "PaymentWithOrderRequest", description = "支付与订单创建请求")
|
||||
public class PaymentWithOrderRequest {
|
||||
|
||||
// ========== 支付相关字段 ==========
|
||||
|
||||
@Schema(description = "支付类型", required = true)
|
||||
@NotNull(message = "支付类型不能为空")
|
||||
private PaymentType paymentType;
|
||||
|
||||
@Schema(description = "支付金额", required = true)
|
||||
@NotNull(message = "支付金额不能为空")
|
||||
@DecimalMin(value = "0.01", message = "支付金额必须大于0")
|
||||
@Digits(integer = 10, fraction = 2, message = "支付金额格式不正确")
|
||||
private BigDecimal amount;
|
||||
|
||||
@Schema(description = "订单标题", required = true)
|
||||
@NotBlank(message = "订单标题不能为空")
|
||||
@Size(max = 60, message = "订单标题长度不能超过60个字符")
|
||||
private String subject;
|
||||
|
||||
@Schema(description = "订单描述")
|
||||
@Size(max = 500, message = "订单描述长度不能超过500个字符")
|
||||
private String description;
|
||||
|
||||
@Schema(description = "租户ID", required = true)
|
||||
@NotNull(message = "租户ID不能为空")
|
||||
@Positive(message = "租户ID必须为正数")
|
||||
private Integer tenantId;
|
||||
|
||||
// ========== 订单相关字段 ==========
|
||||
|
||||
@Schema(description = "订单信息", required = true)
|
||||
@Valid
|
||||
@NotNull(message = "订单信息不能为空")
|
||||
private OrderInfo orderInfo;
|
||||
|
||||
/**
|
||||
* 订单信息
|
||||
*/
|
||||
@Data
|
||||
@Schema(name = "OrderInfo", description = "订单信息")
|
||||
public static class OrderInfo {
|
||||
|
||||
@Schema(description = "订单类型,0商城订单 1预定订单/外卖 2会员卡")
|
||||
@NotNull(message = "订单类型不能为空")
|
||||
@Min(value = 0, message = "订单类型值无效")
|
||||
@Max(value = 2, message = "订单类型值无效")
|
||||
private Integer type;
|
||||
|
||||
@Schema(description = "收货人姓名")
|
||||
@Size(max = 50, message = "收货人姓名长度不能超过50个字符")
|
||||
private String realName;
|
||||
|
||||
@Schema(description = "收货地址")
|
||||
@Size(max = 200, message = "收货地址长度不能超过200个字符")
|
||||
private String address;
|
||||
|
||||
@Schema(description = "关联收货地址ID")
|
||||
private Integer addressId;
|
||||
|
||||
@Schema(description = "快递/自提,0快递 1自提")
|
||||
private Integer deliveryType;
|
||||
|
||||
@Schema(description = "下单渠道,0小程序预定 1俱乐部训练场 3活动订场")
|
||||
private Integer channel;
|
||||
|
||||
@Schema(description = "商户ID")
|
||||
private Long merchantId;
|
||||
|
||||
@Schema(description = "商户名称")
|
||||
private String merchantName;
|
||||
|
||||
@Schema(description = "使用的优惠券ID")
|
||||
private Integer couponId;
|
||||
|
||||
@Schema(description = "备注")
|
||||
@Size(max = 500, message = "备注长度不能超过500字符")
|
||||
private String comments;
|
||||
|
||||
@Schema(description = "订单商品列表", required = true)
|
||||
@Valid
|
||||
@NotEmpty(message = "订单商品列表不能为空")
|
||||
private List<OrderGoodsItem> goodsItems;
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单商品项
|
||||
*/
|
||||
@Data
|
||||
@Schema(name = "OrderGoodsItem", description = "订单商品项")
|
||||
public static class OrderGoodsItem {
|
||||
|
||||
@Schema(description = "商品ID", required = true)
|
||||
@NotNull(message = "商品ID不能为空")
|
||||
@Positive(message = "商品ID必须为正数")
|
||||
private Integer goodsId;
|
||||
|
||||
@Schema(description = "商品SKU ID")
|
||||
private Integer skuId;
|
||||
|
||||
@Schema(description = "商品数量", required = true)
|
||||
@NotNull(message = "商品数量不能为空")
|
||||
@Min(value = 1, message = "商品数量必须大于0")
|
||||
private Integer quantity;
|
||||
|
||||
@Schema(description = "规格信息,如:颜色:红色|尺寸:L")
|
||||
private String specInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取格式化的金额字符串
|
||||
*/
|
||||
public String getFormattedAmount() {
|
||||
if (amount == null) {
|
||||
return "0.00";
|
||||
}
|
||||
return String.format("%.2f", amount);
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证订单商品总金额是否与支付金额一致
|
||||
*/
|
||||
public boolean isAmountConsistent() {
|
||||
if (amount == null || orderInfo == null || orderInfo.getGoodsItems() == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 这里可以添加商品金额计算逻辑
|
||||
// 实际实现时需要查询数据库获取商品价格
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("PaymentWithOrderRequest{paymentType=%s, amount=%s, subject='%s', tenantId=%d, goodsCount=%d}",
|
||||
paymentType, getFormattedAmount(), subject, tenantId,
|
||||
orderInfo != null && orderInfo.getGoodsItems() != null ? orderInfo.getGoodsItems().size() : 0);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user