From 4bd3d2c1c798408a380735c8f4625e0778cb6e72 Mon Sep 17 00:00:00 2001 From: DaxPay Dev Date: Tue, 16 Jun 2026 16:31:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(strategy):=20=E8=BF=81=E7=A7=BB=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E6=8A=BD=E8=B1=A1=E7=B1=BB=E5=88=B0=20payment/strateg?= =?UTF-8?q?y/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新建 strategy/ 模块 (payment.strategy.{sub}) - 8 个子域: pay/refund/transfer/sync/reconcile/profit/product/auth - 12 个 Abs* 策略文件从 old/pay/strategy 迁移完成 --- .../pay/order/entity/PayAuthOrder.java | 1 + .../strategy/auth/AbsChannelAuthStrategy.java | 24 +++++++++++ .../strategy/pay/AbsPayCloseStrategy.java | 34 ++++++++++++++++ .../strategy/pay/AbsPayPluginStrategy.java | 30 ++++++++++++++ .../payment/strategy/pay/AbsPayStrategy.java | 38 ++++++++++++++++++ .../strategy/product/AbsProductStrategy.java | 40 +++++++++++++++++++ .../profit/AbsTradeProfitStrategy.java | 18 +++++++++ .../reconcile/AbsReconcileStrategy.java | 30 ++++++++++++++ .../strategy/refund/AbsRefundStrategy.java | 25 ++++++++++++ .../sync/AbsSyncPayOrderStrategy.java | 21 ++++++++++ .../sync/AbsSyncRefundOrderStrategy.java | 21 ++++++++++ .../sync/AbsSyncTransferOrderStrategy.java | 21 ++++++++++ .../transfer/AbsTransferStrategy.java | 31 ++++++++++++++ 13 files changed, 334 insertions(+) create mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/auth/AbsChannelAuthStrategy.java create mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/pay/AbsPayCloseStrategy.java create mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/pay/AbsPayPluginStrategy.java create mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/pay/AbsPayStrategy.java create mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/product/AbsProductStrategy.java create mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/profit/AbsTradeProfitStrategy.java create mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/reconcile/AbsReconcileStrategy.java create mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/refund/AbsRefundStrategy.java create mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/sync/AbsSyncPayOrderStrategy.java create mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/sync/AbsSyncRefundOrderStrategy.java create mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/sync/AbsSyncTransferOrderStrategy.java create mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/transfer/AbsTransferStrategy.java diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/pay/order/entity/PayAuthOrder.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/pay/order/entity/PayAuthOrder.java index ddcce7e34..1887119fb 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/pay/order/entity/PayAuthOrder.java +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/pay/order/entity/PayAuthOrder.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import org.dromara.daxpay.payment.common.enums.AuthStatusEnum; import java.time.OffsetDateTime; diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/auth/AbsChannelAuthStrategy.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/auth/AbsChannelAuthStrategy.java new file mode 100644 index 000000000..77357e4ea --- /dev/null +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/auth/AbsChannelAuthStrategy.java @@ -0,0 +1,24 @@ +package org.dromara.daxpay.payment.strategy.auth; + +import org.dromara.daxpay.payment.common.strategy.PaymentStrategy; +import org.dromara.daxpay.payment.unipay.param.assist.AuthCodeParam; +import org.dromara.daxpay.payment.unipay.param.assist.GenerateAuthUrlParam; +import org.dromara.daxpay.payment.unipay.result.assist.AuthResult; +import org.dromara.daxpay.payment.unipay.result.assist.AuthUrlResult; + +/// # 通道抽象认证策略 +/// +public abstract class AbsChannelAuthStrategy implements PaymentStrategy { + + /// 获取授权链接 + public abstract AuthUrlResult generateAuthUrl(GenerateAuthUrlParam param); + + /// 通过AuthCode获取认证结果 + public abstract AuthResult doAuth(AuthCodeParam param); + + /// 获取微信OpenId认证是否使用道通认证方式 + public boolean isWxChannelAuth() { + return false; + } + +} diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/pay/AbsPayCloseStrategy.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/pay/AbsPayCloseStrategy.java new file mode 100644 index 000000000..2d7c1735a --- /dev/null +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/pay/AbsPayCloseStrategy.java @@ -0,0 +1,34 @@ +package org.dromara.daxpay.payment.strategy.pay; + +import org.dromara.daxpay.payment.common.strategy.PaymentStrategy; +import org.dromara.daxpay.platform.core.enums.pay.pay.CloseTypeEnum; +import org.dromara.daxpay.payment.old.pay.entity.order.pay.PayOrder; +import lombok.Getter; +import lombok.Setter; + +/// # 支付关闭策略 +/// +@Getter +@Setter +public abstract class AbsPayCloseStrategy implements PaymentStrategy { + + /// 支付订单 + private PayOrder order = null; + + /// 是否使用撤销方式进行订单关闭 + private boolean useCancel = false; + + public void init(PayOrder order, boolean useCancel){ + this.order = order; + this.useCancel = useCancel; + } + + /// 关闭前的处理方式 + public void doBeforeCloseHandler() {} + + /// 关闭操作 + /// @return 如果执行成功, 返回使用何种方式关闭的支付订单 + public abstract CloseTypeEnum doCloseHandler(); + +} + diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/pay/AbsPayPluginStrategy.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/pay/AbsPayPluginStrategy.java new file mode 100644 index 000000000..4c98cc8bb --- /dev/null +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/pay/AbsPayPluginStrategy.java @@ -0,0 +1,30 @@ +package org.dromara.daxpay.payment.strategy.pay; + +import org.dromara.daxpay.payment.old.pay.entity.notice.callback.MerchantCallbackTask; +import org.dromara.daxpay.payment.old.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.payment.old.pay.entity.order.pay.PayOrderExpand; +import org.dromara.daxpay.payment.old.pay.entity.order.refund.RefundOrder; + +/// # 支付插件 +/// +public interface AbsPayPluginStrategy { + + /// 支付成功 + default void paySuccess(PayOrder payOrder, PayOrderExpand expand){} + + /// 支付失败 + default void payFail(PayOrder payOrder){} + + /// 支付关闭 + default void payClose(PayOrder payOrder){} + + /// 退款成功 + default void refundSuccess(PayOrder payOrder, RefundOrder refundOrder){} + + /// 退款关闭 + default void refundClose(PayOrder payOrder, RefundOrder refundOrder){} + + /// 回调消息发送 + default void noticeSend(MerchantCallbackTask task, boolean autoSend){} + +} diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/pay/AbsPayStrategy.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/pay/AbsPayStrategy.java new file mode 100644 index 000000000..0850345af --- /dev/null +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/pay/AbsPayStrategy.java @@ -0,0 +1,38 @@ +package org.dromara.daxpay.payment.strategy.pay; + +import org.dromara.daxpay.payment.common.strategy.PaymentStrategy; +import org.dromara.daxpay.payment.unipay.param.trade.pay.PayParam; +import org.dromara.daxpay.payment.old.pay.bo.trade.PayResultBo; +import org.dromara.daxpay.payment.old.pay.entity.order.pay.PayOrder; +import lombok.Getter; +import lombok.Setter; + +/// # 抽象支付策略基类 +/// +@Getter +@Setter +public abstract class AbsPayStrategy implements PaymentStrategy { + + /// 支付订单 + private PayOrder order = null; + + /// 支付参数 + private PayParam payParam = null; + + /// 初始化支付的参数支付上下文 + public void initPayParam(PayOrder order, PayParam payParam) { + this.order = order; + this.payParam = payParam; + } + + /// 支付前处理 包含必要的校验以及对当前通道支付配置信息的初始化 + /// 出现错误不会保存相关信息 + public void doBeforePayHandler(){ + } + + /// 支付操作 + /// 出现错误会保存相关信息 + public abstract PayResultBo doPayHandler(); + +} + diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/product/AbsProductStrategy.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/product/AbsProductStrategy.java new file mode 100644 index 000000000..289efd3e9 --- /dev/null +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/product/AbsProductStrategy.java @@ -0,0 +1,40 @@ +package org.dromara.daxpay.payment.strategy.product; + +import org.dromara.daxpay.payment.common.strategy.PaymentStrategy; +import org.dromara.daxpay.platform.core.enums.pay.channel.ChannelApiCallMode; +import org.dromara.daxpay.platform.core.enums.pay.channel.ChannelPayIdType; +import org.dromara.daxpay.platform.core.enums.pay.channel.PayCapabilityEnum; +import org.dromara.daxpay.platform.core.enums.pay.channel.PayMethodEnum; +import org.dromara.daxpay.platform.core.enums.pay.channel.PayProviderEnum; + +import java.util.List; +import java.util.Map; + +/// # 产品策略抽象类 +/// +public abstract class AbsProductStrategy implements PaymentStrategy { + + /// 是否支持服务商模式 + public boolean isIsv() { return false; } + + /// 是否支持分账 + public boolean isAllocatable() { return false; } + + /// 是否支持终端报备 + public boolean isTerminal() { return false; } + + /// 是否支持沙箱环境 + public boolean isSandbox() { return false; } + + /// API调用模式 + public ChannelApiCallMode getApiCallMode() { return ChannelApiCallMode.MCH; } + + /// 支付标识类型 + public ChannelPayIdType getPayIdType() { return ChannelPayIdType.MCH; } + + /// 目录支付方式 → 本产品在该方式下可用的支付能力列表(发版契约,对齐 PayMethodEnum / PayCapabilityEnum) + public abstract Map> methodCapabilityMapping(); + + /// 基础模式通道路由可用的支付渠道列表(各产品策略必须显式声明) + public abstract List supportedPayProviders(); +} diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/profit/AbsTradeProfitStrategy.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/profit/AbsTradeProfitStrategy.java new file mode 100644 index 000000000..c437629c8 --- /dev/null +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/profit/AbsTradeProfitStrategy.java @@ -0,0 +1,18 @@ +package org.dromara.daxpay.payment.strategy.profit; + +import org.dromara.daxpay.payment.common.strategy.PaymentStrategy; +import org.dromara.daxpay.payment.old.pay.entity.order.pay.PayOrder; +import org.dromara.daxpay.payment.old.pay.entity.order.pay.PayOrderExpand; + +/// # 交易订单费率计算策略抽象类 +/// +public abstract class AbsTradeProfitStrategy implements PaymentStrategy { + + /// 获取所适用的费率产品, 默认返回支付渠道, + /// 费率产品必须要为下划线分隔格式, 否则映射会有问题 + public String getRateProduct(PayOrder order, PayOrderExpand payOrderExpand) { + return order.getProvider(); + } + +} + diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/reconcile/AbsReconcileStrategy.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/reconcile/AbsReconcileStrategy.java new file mode 100644 index 000000000..6ba40744c --- /dev/null +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/reconcile/AbsReconcileStrategy.java @@ -0,0 +1,30 @@ +package org.dromara.daxpay.payment.strategy.reconcile; + +import org.dromara.daxpay.payment.common.strategy.PaymentStrategy; +import org.dromara.daxpay.payment.old.pay.bo.reconcile.ReconcileResolveResultBo; +import org.dromara.daxpay.payment.old.pay.entity.reconcile.ReconcileStatement; +import org.dromara.daxpay.platform.core.enums.pay.reconcile.ReconcileFileTypeEnum; +import lombok.Getter; +import lombok.Setter; +import org.springframework.web.multipart.MultipartFile; + +/// # 抽象对账策略 +/// +@Setter +@Getter +public abstract class AbsReconcileStrategy implements PaymentStrategy { + + /// 对账单 + private ReconcileStatement statement; + + /// 对账前处理, 主要是初始化支付SDK配置 + public void doBeforeHandler() { + } + + /// 上传对账单解析并保存 + public abstract ReconcileResolveResultBo uploadAndResolve(MultipartFile file, ReconcileFileTypeEnum fileType); + + /// 下载对账单到本地进行保存 + public abstract ReconcileResolveResultBo downAndResolve(); + +} diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/refund/AbsRefundStrategy.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/refund/AbsRefundStrategy.java new file mode 100644 index 000000000..141eb3bc0 --- /dev/null +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/refund/AbsRefundStrategy.java @@ -0,0 +1,25 @@ +package org.dromara.daxpay.payment.strategy.refund; + +import org.dromara.daxpay.payment.common.strategy.PaymentStrategy; +import org.dromara.daxpay.payment.old.pay.bo.trade.RefundResultBo; +import org.dromara.daxpay.payment.old.pay.entity.order.refund.RefundOrder; +import lombok.Getter; +import lombok.Setter; + +/// # 抽象支付退款策略 +/// +@Getter +@Setter +public abstract class AbsRefundStrategy implements PaymentStrategy { + + /// 退款订单 + private RefundOrder refundOrder = null; + + /// 退款前对处理, 主要进行各种检查 + public void doBeforeRefundHandler() { + } + + /// 退款操作 + public abstract RefundResultBo doRefundHandler(); + +} diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/sync/AbsSyncPayOrderStrategy.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/sync/AbsSyncPayOrderStrategy.java new file mode 100644 index 000000000..afad8d862 --- /dev/null +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/sync/AbsSyncPayOrderStrategy.java @@ -0,0 +1,21 @@ +package org.dromara.daxpay.payment.strategy.sync; + +import org.dromara.daxpay.payment.common.strategy.PaymentStrategy; +import org.dromara.daxpay.payment.old.pay.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.payment.old.pay.entity.order.pay.PayOrder; +import lombok.Getter; +import lombok.Setter; + +/// # 支付同步抽象类 +/// +@Getter +@Setter +public abstract class AbsSyncPayOrderStrategy implements PaymentStrategy { + + /// 支付订单 + private PayOrder order = null; + + /// 查询通道网关方的退款订单状态信息 + public abstract PaySyncResultBo doSync(); + +} diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/sync/AbsSyncRefundOrderStrategy.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/sync/AbsSyncRefundOrderStrategy.java new file mode 100644 index 000000000..757bfe19d --- /dev/null +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/sync/AbsSyncRefundOrderStrategy.java @@ -0,0 +1,21 @@ +package org.dromara.daxpay.payment.strategy.sync; + +import org.dromara.daxpay.payment.common.strategy.PaymentStrategy; +import org.dromara.daxpay.payment.old.pay.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.payment.old.pay.entity.order.refund.RefundOrder; +import lombok.Getter; +import lombok.Setter; + +/// # 支付退款订单同步策略 +/// +@Getter +@Setter +public abstract class AbsSyncRefundOrderStrategy implements PaymentStrategy { + + private RefundOrder refundOrder; + + /// 同步前处理, 主要是预防请求过于迅速, 支付网关没有处理完退款请求, 导致返回的状态不正确 + public void doBeforeHandler(){} + /// 查询通道网关方的退款订单状态信息 + public abstract RefundSyncResultBo doSync(); +} diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/sync/AbsSyncTransferOrderStrategy.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/sync/AbsSyncTransferOrderStrategy.java new file mode 100644 index 000000000..8a7686008 --- /dev/null +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/sync/AbsSyncTransferOrderStrategy.java @@ -0,0 +1,21 @@ +package org.dromara.daxpay.payment.strategy.sync; + +import org.dromara.daxpay.payment.common.strategy.PaymentStrategy; +import org.dromara.daxpay.payment.old.pay.bo.sync.TransferSyncResultBo; +import org.dromara.daxpay.payment.old.pay.entity.order.transfer.TransferOrder; +import lombok.Getter; +import lombok.Setter; + +/// # 转账同步策略 +/// +@Getter +@Setter +public abstract class AbsSyncTransferOrderStrategy implements PaymentStrategy { + + private TransferOrder transferOrder; + + /// 同步前处理, 主要是预防请求过于迅速, 支付网关没有处理完退款请求, 导致返回的状态不正确 + public void doBeforeHandler(){} + /// 查询通道网关方的退款订单状态信息 + public abstract TransferSyncResultBo doSync(); +} diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/transfer/AbsTransferStrategy.java b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/transfer/AbsTransferStrategy.java new file mode 100644 index 000000000..35d0fb7d8 --- /dev/null +++ b/daxpay-payment/daxpay-payment-common/src/main/java/org/dromara/daxpay/payment/strategy/transfer/AbsTransferStrategy.java @@ -0,0 +1,31 @@ +package org.dromara.daxpay.payment.strategy.transfer; + +import org.dromara.daxpay.payment.common.strategy.PaymentStrategy; +import org.dromara.daxpay.payment.old.pay.bo.trade.TransferResultBo; +import org.dromara.daxpay.payment.old.pay.entity.order.transfer.TransferOrder; +import org.dromara.daxpay.payment.unipay.param.trade.transfer.TransferParam; +import lombok.Getter; +import lombok.Setter; + +/// # 转账抽象策略 +/// +@Getter +@Setter +public abstract class AbsTransferStrategy implements PaymentStrategy { + /// 转账订单 + private TransferOrder transferOrder; + /// 转账参数 + private TransferParam transferParam; + + /// 校验参数 + public void doValidateParam() { + + } + + /// 转账前操作 + public void doBeforeHandler(){} + + /// 转账操作 + public abstract TransferResultBo doTransferHandler(); + +}