From dad58719054556bb73498ef3d787f67747e32c2e Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Mon, 25 Aug 2025 10:08:29 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=94=AF=E4=BB=98=E5=8D=95=E4=BD=8D?= =?UTF-8?q?=E5=85=83=E6=8D=A2=E7=AE=97=E4=B8=BA=E5=88=86=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=A4=84=E7=90=86=EF=BC=9B2=E3=80=81=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=94=AF=E4=BB=98handler=E7=9A=84dto=E5=8C=BA=E5=88=86?= =?UTF-8?q?=E4=BA=8E=E5=8E=9F=E6=A1=86=E6=9E=B6=E7=8B=AC=E7=AB=8B=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/pay/vo/PayOrderUnifiedReqDTO.java | 107 ++++++++++++++++++ .../service/pay/PayOrderServiceImpl.java | 4 +- .../pay/factory/impl/AbstractPayHandler.java | 2 +- .../impl/alipay/AlipayPcPayHandler.java | 2 +- .../impl/wechat/WechatNativePayHandler.java | 5 +- 5 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/pay/vo/PayOrderUnifiedReqDTO.java diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/pay/vo/PayOrderUnifiedReqDTO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/pay/vo/PayOrderUnifiedReqDTO.java new file mode 100644 index 000000000..8b53e7fc5 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/pay/vo/PayOrderUnifiedReqDTO.java @@ -0,0 +1,107 @@ +package com.cf.imes.module.system.controller.admin.pay.vo; + +import com.cf.imes.framework.pay.core.enums.order.PayOrderDisplayModeEnum; +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Digits; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.URL; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Map; + +import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +import static com.cf.imes.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; + +/** + * 统一下单 Request DTO + * + * @author 晨丰科技 + */ +@Data +public class PayOrderUnifiedReqDTO { + + /** + * 用户 IP + */ + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + // ========== 商户相关字段 ========== + + /** + * 外部订单号 + * + * 对应 PayOrderExtensionDO 的 no 字段 + */ + @NotEmpty(message = "外部订单编号不能为空") + private String outTradeNo; + /** + * 商品标题 + */ + @NotEmpty(message = "商品标题不能为空") + @Length(max = 32, message = "商品标题不能超过 32") + private String subject; + /** + * 商品描述信息 + */ + @Length(max = 128, message = "商品描述信息长度不能超过128") + private String body; + /** + * 支付结果的 notify 回调地址 + */ + @NotEmpty(message = "支付结果的回调地址不能为空") + @URL(message = "支付结果的 notify 回调地址必须是 URL 格式") + private String notifyUrl; + /** + * 支付结果的 return 回调地址 + */ + @URL(message = "支付结果的 return 回调地址必须是 URL 格式") + private String returnUrl; + + // ========== 订单相关字段 ========== + + /** + * 支付金额,单位:元 + */ + @NotNull(message = "支付金额不能为空") + @DecimalMin(value = "0.01", message = "支付金额必须大于零") + @DecimalMax(value = "100000", message = "支付金额不能超过十万") + @Digits(integer = 6, fraction = 2, message = "支付金额格式不正确") + private BigDecimal price; + + /** + * 支付过期时间 + */ + @NotNull(message = "支付过期时间不能为空") + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + private LocalDateTime expireTime; + + // ========== 拓展参数 ========== + /** + * 支付渠道的额外参数 + * + * 例如说,微信公众号需要传递 openid 参数 + */ + private Map channelExtras; + + /** + * 发起支付给支付方后,异步回调原封不动回到调用方 + */ + private Map passbackParams; + + /** + * 展示模式 + * + * 如果不传递,则每个支付渠道使用默认的方式 + * + * 枚举 {@link PayOrderDisplayModeEnum} + */ + private String displayMode; + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayOrderServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayOrderServiceImpl.java index a1c40b82e..4b9bd46b9 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayOrderServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayOrderServiceImpl.java @@ -18,7 +18,7 @@ import com.cf.imes.framework.organ.core.context.OrganContextHolder; import com.cf.imes.framework.pay.config.ChenfengAlipayConfig; import com.cf.imes.framework.pay.config.ChenfengPayConfig; import com.cf.imes.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.cf.imes.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; +import com.cf.imes.module.system.controller.admin.pay.vo.PayOrderUnifiedReqDTO; import com.cf.imes.framework.common.exception.PayException; import com.cf.imes.framework.pay.core.enums.order.PayOrderStatusRespEnum; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; @@ -341,7 +341,7 @@ public class PayOrderServiceImpl implements PayOrderService { payOrderUnifiedReqDTO.setSubject(subject); payOrderUnifiedReqDTO.setBody(subject); payOrderUnifiedReqDTO.setOutTradeNo(payOrderDO.getPayNo()); - payOrderUnifiedReqDTO.setPrice(payOrderDO.getPrice().intValue()); + payOrderUnifiedReqDTO.setPrice(payOrderDO.getPrice()); payOrderUnifiedReqDTO.setExpireTime(payOrderDO.getExpireTime()); payOrderUnifiedReqDTO.setNotifyUrl(String.format(alipayConfig.getNotifyUrl(), payOrderDO.getChannelCode().getCode())); payOrderUnifiedReqDTO.setPassbackParams(passbackParams); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/factory/impl/AbstractPayHandler.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/factory/impl/AbstractPayHandler.java index 499ad77a9..89af0276c 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/factory/impl/AbstractPayHandler.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/factory/impl/AbstractPayHandler.java @@ -1,7 +1,7 @@ package com.cf.imes.module.system.service.pay.factory.impl; import com.cf.imes.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.cf.imes.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; +import com.cf.imes.module.system.controller.admin.pay.vo.PayOrderUnifiedReqDTO; import java.util.Map; diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/factory/impl/alipay/AlipayPcPayHandler.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/factory/impl/alipay/AlipayPcPayHandler.java index 6de1fa781..b5151592b 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/factory/impl/alipay/AlipayPcPayHandler.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/factory/impl/alipay/AlipayPcPayHandler.java @@ -18,7 +18,7 @@ import com.alipay.api.response.AlipayTradeQueryResponse; import com.cf.imes.framework.common.util.object.ObjectUtils; import com.cf.imes.framework.pay.config.ChenfengAlipayConfig; import com.cf.imes.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.cf.imes.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; +import com.cf.imes.module.system.controller.admin.pay.vo.PayOrderUnifiedReqDTO; import com.cf.imes.framework.pay.core.enums.order.PayOrderStatusRespEnum; import com.cf.imes.module.system.enums.pay.PayConstants; import com.cf.imes.module.system.service.pay.factory.impl.AbstractPayHandler; diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/factory/impl/wechat/WechatNativePayHandler.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/factory/impl/wechat/WechatNativePayHandler.java index 740af2cf8..9898d257a 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/factory/impl/wechat/WechatNativePayHandler.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/factory/impl/wechat/WechatNativePayHandler.java @@ -7,7 +7,7 @@ import com.alibaba.fastjson.JSON; import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.framework.pay.config.ChenfengWechatPayConfig; import com.cf.imes.framework.pay.core.client.dto.order.PayOrderRespDTO; -import com.cf.imes.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; +import com.cf.imes.module.system.controller.admin.pay.vo.PayOrderUnifiedReqDTO; import com.cf.imes.framework.pay.core.enums.order.PayOrderDisplayModeEnum; import com.cf.imes.module.system.enums.pay.PayOrderStatusEnum; import com.cf.imes.module.system.service.pay.factory.impl.AbstractPayHandler; @@ -22,6 +22,7 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Map; @@ -48,7 +49,7 @@ public class WechatNativePayHandler extends AbstractPayHandler { WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request(); request.setOutTradeNo(reqDTO.getOutTradeNo()); request.setDescription(reqDTO.getSubject()); - request.setAmount(new WxPayUnifiedOrderV3Request.Amount().setTotal(reqDTO.getPrice() * 100)); // 单位分 + request.setAmount(new WxPayUnifiedOrderV3Request.Amount().setTotal(reqDTO.getPrice().multiply(new BigDecimal(100)).intValue())); // 单位分 request.setTimeExpire(formatDateV3(reqDTO.getExpireTime())); request.setSceneInfo(new WxPayUnifiedOrderV3Request.SceneInfo().setPayerClientIp(getClientIP())); request.setNotifyUrl(reqDTO.getNotifyUrl());