From 65f186a31f8cc23e660d0254d74e19cdfe31af09 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Sat, 30 Nov 2024 17:21:20 +0800 Subject: [PATCH 01/54] =?UTF-8?q?doc=20=E6=B3=A8=E9=87=8A=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/daxpay/core/enums/CheckoutCallTypeEnum.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java index b9690b932..0fe7b721a 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java @@ -9,12 +9,7 @@ import java.util.Objects; /** * 收银台支付调起方式 - * 1. 扫码支付 - * 2. 条码支付 - * 3. 跳转链接 - * 4. 小程序支付 - * 5. 聚合支付 - * 6. APP支付 + * 字典: checkout_call_type * @author xxm * @since 2024/11/27 */ From 4ea1e39e2fc4c3cb5861b473cbf154d3a1fbc0cd Mon Sep 17 00:00:00 2001 From: DaxPay Date: Mon, 2 Dec 2024 19:11:42 +0800 Subject: [PATCH 02/54] =?UTF-8?q?refactor(payment):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=94=B6=E9=93=B6=E5=8F=B0=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改类名和包名,优化代码结构- 新增 AbsCheckoutStrategy 类,用于收银台支付 - 更新 CashierCodeService 和 CheckoutService,使用新的策略类 -调整 CashierCodeAuthUrlParam 和 CheckoutAggregatePayParam 的命名 --- ...gy.java => AliPayCashierCodeStrategy.java} | 6 +- .../strategy/AliPayCheckoutStrategy.java | 27 +++++ .../WechatPayCallbackController.java | 1 - .../service/assist/WechatAuthService.java | 23 +++- .../service/pay/WechatPayCashierService.java | 100 ------------------ ....java => WechatAllocReceiverStrategy.java} | 2 +- .../strategy/WechatCashierCodeStrategy.java | 64 +++++++++++ .../strategy/WechatCheckoutStrategy.java | 69 ++++++++++++ .../strategy/WechatPayCashierStrategy.java | 59 ----------- ...tegy.java => WechatReconcileStrategy.java} | 2 +- .../cashier/CashierCodeAuthCodeParam.java | 6 +- ...aram.java => CashierCodeAuthUrlParam.java} | 10 +- ...PayParam.java => CashierCodePayParam.java} | 6 +- .../checkout/CheckoutAggregatePayParam.java | 8 +- .../CheckoutAuthCodeParam.java} | 6 +- .../param/checkout/CheckoutAuthUrlParam.java | 27 +++++ ...koutParam.java => CheckoutCreatParam.java} | 2 +- .../unipay/CashierCodeController.java | 10 +- .../controller/unipay/CheckoutController.java | 8 +- .../cashier/CashierCodeAuthUrlParam.java | 22 ---- .../service/cashier/CashierCodeService.java | 32 +++--- .../CheckoutAssistService.java | 14 +-- .../CheckoutQueryService.java | 4 +- .../CheckoutService.java | 69 ++++++++++-- .../strategy/AbsCashierCodeStrategy.java | 35 ++++++ .../strategy/AbsChannelCashierStrategy.java | 36 ------- .../service/strategy/AbsCheckoutStrategy.java | 35 ++++++ 27 files changed, 400 insertions(+), 283 deletions(-) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{AliPayCashierStrategy.java => AliPayCashierCodeStrategy.java} (73%) create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java delete mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayCashierService.java rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{WechatPayAllocReceiverStrategy.java => WechatAllocReceiverStrategy.java} (97%) create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCashierCodeStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java delete mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayCashierStrategy.java rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{WechatPayReconcileStrategy.java => WechatReconcileStrategy.java} (96%) rename daxpay-single/{daxpay-single-service/src/main/java/org/dromara/daxpay/service => daxpay-single-core/src/main/java/org/dromara/daxpay/core}/param/cashier/CashierCodeAuthCodeParam.java (80%) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/{CashierAuthUrlParam.java => CashierCodeAuthUrlParam.java} (58%) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/{CashierPayParam.java => CashierCodePayParam.java} (85%) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/{cashier/CashierAuthCodeParam.java => checkout/CheckoutAuthCodeParam.java} (77%) create mode 100644 daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthUrlParam.java rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/{CheckoutParam.java => CheckoutCreatParam.java} (97%) delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/cashier/CashierCodeAuthUrlParam.java rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/{cashier => checkout}/CheckoutAssistService.java (92%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/{cashier => checkout}/CheckoutQueryService.java (98%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/{cashier => checkout}/CheckoutService.java (67%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCashierCodeStrategy.java delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsChannelCashierStrategy.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCheckoutStrategy.java diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierCodeStrategy.java similarity index 73% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierCodeStrategy.java index 43c87cce8..03442a3f1 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierCodeStrategy.java @@ -1,20 +1,20 @@ package org.dromara.daxpay.channel.alipay.strategy; import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.strategy.AbsChannelCashierStrategy; +import org.dromara.daxpay.service.strategy.AbsCashierCodeStrategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** - * 支付宝收银台支付 + * 支付宝收银码牌支付 * @author xxm * @since 2024/9/29 */ @Slf4j @Component @RequiredArgsConstructor -public class AliPayCashierStrategy extends AbsChannelCashierStrategy { +public class AliPayCashierCodeStrategy extends AbsCashierCodeStrategy { /** * 策略标识, 可以自行进行扩展 diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java new file mode 100644 index 000000000..ed582112f --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java @@ -0,0 +1,27 @@ +package org.dromara.daxpay.channel.alipay.strategy; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.strategy.AbsCheckoutStrategy; +import org.springframework.stereotype.Component; + +/** + * 支付宝 + * @author xxm + * @since 2024/12/2 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class AliPayCheckoutStrategy extends AbsCheckoutStrategy { + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.ALI.getCode(); + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/WechatPayCallbackController.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/WechatPayCallbackController.java index 1ea44b150..729c8a309 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/WechatPayCallbackController.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/WechatPayCallbackController.java @@ -1,7 +1,6 @@ package org.dromara.daxpay.channel.wechat.controller; import cn.bootx.platform.core.annotation.IgnoreAuth; -import org.dromara.daxpay.channel.wechat.service.assist.WechatAuthService; import org.dromara.daxpay.channel.wechat.service.callback.WechatPayCallbackService; import org.dromara.daxpay.channel.wechat.service.callback.WechatRefundCallbackService; import org.dromara.daxpay.channel.wechat.service.callback.WechatTransferCallbackService; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java index 94354f014..e2f03e697 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java @@ -35,6 +35,8 @@ public class WechatAuthService { /** * 构建微信oauth2授权的url连接 + * 1. 手段传输回调地址, 直接进行拼接, 后续跳转到传输的回调地址, 而不会经过系统 + * 2. 不传输回调地址, 则会生成一个h5段的认证路径, 后续通过这个页面和系统配合获取认证信息, 会返回查询码用于查询 */ public AuthUrlResult generateAuthUrl(GenerateAuthUrlParam param) { WechatPayConfig config = wechatPayConfigService.getWechatPayConfig(); @@ -51,13 +53,32 @@ public class WechatAuthService { PlatformConfig platformConfig = platformConfigService.getConfig(); serverUrl = platformConfig.getGatewayMobileUrl(); } + // 生产链接, 授权成功后重定向h5段用于获取授权码的页面, 获取成功后页面自动关闭 String queryCode = RandomUtil.randomString(10); - String redirectUrl = StrUtil.format("{}/wechat/auth/{}/{}/{}", serverUrl, param.getAppId(), param.getChannel(),queryCode); + String redirectUrl = StrUtil.format("{}/wechat/auth/{}/{}/{}", serverUrl, param.getAppId(), param.getChannel(), queryCode); String authUrl = wxMpService.getOAuth2Service().buildAuthorizationUrl(redirectUrl, WxConsts.OAuth2Scope.SNSAPI_BASE, ""); return new AuthUrlResult().setAuthUrl(authUrl).setQueryCode(queryCode); } } + /** + * 生成内部使用的授权链接, 返回授权码给调用者, 由调用者自己再去获取授权信息 + * @param authPath 授权链接, 需要为h5项目中的可访问路由路径 + */ + public String generateInnerAuthUrl(String authPath) { + WechatPayConfig config = wechatPayConfigService.getWechatPayConfig(); + WxMpService wxMpService = this.getWxMpService(config); + + // 如果配置中有地址配置则使用, 没有的话使用平台地址进行拼接 + String serverUrl = config.getAuthUrl(); + if (StrUtil.isBlank(serverUrl)){ + PlatformConfig platformConfig = platformConfigService.getConfig(); + serverUrl = platformConfig.getGatewayMobileUrl(); + } + String redirectUrl = StrUtil.format("{}/{}", serverUrl, authPath); + return wxMpService.getOAuth2Service().buildAuthorizationUrl(redirectUrl, WxConsts.OAuth2Scope.SNSAPI_BASE, ""); + } + /** * 获取微信AccessToken数据 */ diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayCashierService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayCashierService.java deleted file mode 100644 index f3c205673..000000000 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayCashierService.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.dromara.daxpay.channel.wechat.service.pay; - -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; -import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; -import org.dromara.daxpay.core.exception.PayFailureException; -import org.dromara.daxpay.core.param.cashier.CashierAuthCodeParam; -import org.dromara.daxpay.core.param.cashier.CashierAuthUrlParam; -import org.dromara.daxpay.core.param.cashier.CashierPayParam; -import org.dromara.daxpay.core.param.trade.pay.PayParam; -import org.dromara.daxpay.service.entity.config.PlatformConfig; -import org.dromara.daxpay.service.service.config.PlatformConfigService; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; -import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; -import org.springframework.stereotype.Service; - -/** - * 微信收银 - * @author xxm - * @since 2024/9/29 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WechatPayCashierService { - - private final WechatPayConfigService wechatPayConfigService; - - private final PlatformConfigService platformConfigService; - - /** - * 生成授权链接, 主要是微信类通道使用, 用于获取OpenId - */ - public String generateAuthUrl(CashierAuthUrlParam param) { - WechatPayConfig config = wechatPayConfigService.getWechatPayConfig(); - WxMpService wxMpService = this.getWxMpService(config); - - // 如果配置中有地址配置则使用, 没有的话使用平台地址进行拼接 - String serverUrl = config.getAuthUrl(); - if (StrUtil.isBlank(serverUrl)){ - PlatformConfig platformConfig = platformConfigService.getConfig(); - serverUrl = platformConfig.getGatewayMobileUrl(); - } - String redirectUrl = StrUtil.format("{}/cashier/wechat/{}", serverUrl, param.getCashierCode()); - return wxMpService.getOAuth2Service().buildAuthorizationUrl(redirectUrl, WxConsts.OAuth2Scope.SNSAPI_BASE, ""); - } - - /** - * 参数与处理, 获取OpenId - * @param cashierPayParam 收银台支付参数 - * @param payParam 统一支付参数 - */ - public void handlePayParam(CashierPayParam cashierPayParam, PayParam payParam) { - WechatPayParam wechatPayParam = new WechatPayParam(); - wechatPayParam.setOpenId(cashierPayParam.getOpenId()); - payParam.setExtraParam(JSONUtil.toJsonStr(wechatPayParam)); - } - - /** - * 获取OpenId - */ - public String getOpenId(CashierAuthCodeParam param){ - // 获取OpenId - WxMpService wxMpService = this.getWxMpService(); - try { - WxOAuth2AccessToken accessToken = wxMpService.getOAuth2Service().getAccessToken(param.getAuthCode()); - return accessToken.getOpenId(); - } catch (WxErrorException e) { - log.error("收银台支付获取OpenId失败, {}", param, e); - throw new PayFailureException("收银台支付获取OpenId失败"); - } - } - - /** - * 获取微信公众号API的Service - */ - private WxMpService getWxMpService() { - WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(); - return getWxMpService(config); - } - /** - * 获取微信公众号API的Service - */ - private WxMpService getWxMpService(WechatPayConfig config) { - WxMpService wxMpService = new WxMpServiceImpl(); - WxMpDefaultConfigImpl wxMpConfig = new WxMpDefaultConfigImpl(); - wxMpConfig.setAppId(config.getWxAppId()); // 设置微信公众号的appid - wxMpConfig.setSecret(config.getAppSecret()); // 设置微信公众号的app corpSecret - wxMpService.setWxMpConfigStorage(wxMpConfig); - return wxMpService; - } -} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayAllocReceiverStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocReceiverStrategy.java similarity index 97% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayAllocReceiverStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocReceiverStrategy.java index 1663ae807..7ddc0be9f 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayAllocReceiverStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocReceiverStrategy.java @@ -28,7 +28,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Service @Scope(SCOPE_PROTOTYPE) @RequiredArgsConstructor -public class WechatPayAllocReceiverStrategy extends AbsAllocReceiverStrategy { +public class WechatAllocReceiverStrategy extends AbsAllocReceiverStrategy { private final WechatPayAllocReceiverV2Service receiverV2Service; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCashierCodeStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCashierCodeStrategy.java new file mode 100644 index 000000000..7ffea5065 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCashierCodeStrategy.java @@ -0,0 +1,64 @@ +package org.dromara.daxpay.channel.wechat.strategy; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; +import org.dromara.daxpay.channel.wechat.service.assist.WechatAuthService; +import org.dromara.daxpay.core.enums.ChannelAuthStatusEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.param.assist.AuthCodeParam; +import org.dromara.daxpay.core.param.cashier.CashierCodePayParam; +import org.dromara.daxpay.core.param.trade.pay.PayParam; +import org.dromara.daxpay.core.result.assist.AuthResult; +import org.dromara.daxpay.service.strategy.AbsCashierCodeStrategy; +import org.springframework.stereotype.Component; + +/** + * 微信收银码牌支付 + * @author xxm + * @since 2024/9/29 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class WechatCashierCodeStrategy extends AbsCashierCodeStrategy { + private final WechatAuthService wechatAuthService; + + /** + * 生成授权链接, 主要是微信类通道使用, 用于获取OpenId + */ + @Override + public String generateAuthUrl(String cashierCode) { + String redirectUrl = StrUtil.format("/cashier/wechat/{}", cashierCode); + return wechatAuthService.generateInnerAuthUrl(redirectUrl); + } + + /** + * 获取认证结果 + */ + @Override + public AuthResult doAuth(AuthCodeParam param) { + String openId = wechatAuthService.getTokenAndOpenId(param.getAuthCode()).getOpenId(); + return new AuthResult().setStatus(ChannelAuthStatusEnum.SUCCESS.getCode()).setOpenId(openId); + } + + /** + * 支付参数处理 + */ + @Override + public void handlePayParam(CashierCodePayParam cashierPayParam, PayParam payParam) { + WechatPayParam wechatPayParam = new WechatPayParam(); + wechatPayParam.setOpenId(cashierPayParam.getOpenId()); + payParam.setExtraParam(JSONUtil.toJsonStr(wechatPayParam)); + } + + /** + * 策略标识, 可以自行进行扩展 + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT.getCode(); + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java new file mode 100644 index 000000000..ad54125a5 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java @@ -0,0 +1,69 @@ +package org.dromara.daxpay.channel.wechat.strategy; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; +import org.dromara.daxpay.channel.wechat.service.assist.WechatAuthService; +import org.dromara.daxpay.core.enums.ChannelAuthStatusEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.param.assist.AuthCodeParam; +import org.dromara.daxpay.core.param.cashier.CashierCodeAuthUrlParam; +import org.dromara.daxpay.core.param.checkout.CheckoutPayParam; +import org.dromara.daxpay.core.param.trade.pay.PayParam; +import org.dromara.daxpay.core.result.assist.AuthResult; +import org.dromara.daxpay.service.strategy.AbsCheckoutStrategy; +import org.springframework.stereotype.Component; + +/** + * 微信收银台支付策略 + * @author xxm + * @since 2024/12/2 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class WechatCheckoutStrategy extends AbsCheckoutStrategy { + private final WechatAuthService wechatAuthService; + + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT.getCode(); + } + + /** + * 生成授权链接, 主要是微信类通道使用, 用于获取OpenId + */ + @Override + public String generateAuthUrl(CashierCodeAuthUrlParam param) { + String redirectUrl = StrUtil.format("/checkout/wechat/{}", param.getCashierCode()); + return wechatAuthService.generateInnerAuthUrl(redirectUrl); + } + + /** + * 获取认证结果 + */ + @Override + public AuthResult doAuth(AuthCodeParam param) { + String openId = wechatAuthService.getTokenAndOpenId(param.getAuthCode()).getOpenId(); + return new AuthResult().setStatus(ChannelAuthStatusEnum.SUCCESS.getCode()).setOpenId(openId); + } + + /** + * 支付参数处理 + */ + @Override + public void handlePayParam(CheckoutPayParam checkoutPayParam, PayParam payParam) { + WechatPayParam wechatPayParam = new WechatPayParam(); + wechatPayParam.setOpenId(checkoutPayParam.getOpenId()); + wechatPayParam.setAuthCode(checkoutPayParam.getBarCode()); + payParam.setExtraParam(JSONUtil.toJsonStr(wechatPayParam)); + } + +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayCashierStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayCashierStrategy.java deleted file mode 100644 index d763f0e92..000000000 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayCashierStrategy.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.dromara.daxpay.channel.wechat.strategy; - -import org.dromara.daxpay.channel.wechat.service.pay.WechatPayCashierService; -import org.dromara.daxpay.core.enums.ChannelAuthStatusEnum; -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.core.param.cashier.CashierAuthCodeParam; -import org.dromara.daxpay.core.param.cashier.CashierAuthUrlParam; -import org.dromara.daxpay.core.param.cashier.CashierPayParam; -import org.dromara.daxpay.core.param.trade.pay.PayParam; -import org.dromara.daxpay.core.result.assist.AuthResult; -import org.dromara.daxpay.service.strategy.AbsChannelCashierStrategy; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * 微信收银支付 - * @author xxm - * @since 2024/9/29 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class WechatPayCashierStrategy extends AbsChannelCashierStrategy { - private final WechatPayCashierService wechatPayCashierService; - - /** - * 生成授权链接, 主要是微信类通道使用, 用于获取OpenId - */ - @Override - public String generateAuthUrl(CashierAuthUrlParam param) { - return wechatPayCashierService.generateAuthUrl(param); - } - - /** - * 获取认证结果 - */ - @Override - public AuthResult doAuth(CashierAuthCodeParam param) { - String openId = wechatPayCashierService.getOpenId(param); - return new AuthResult().setStatus(ChannelAuthStatusEnum.SUCCESS.getCode()).setOpenId(openId); - } - - /** - * 支付参数处理 - */ - @Override - public void handlePayParam(CashierPayParam cashierPayParam, PayParam payParam) { - wechatPayCashierService.handlePayParam(cashierPayParam,payParam); - } - - /** - * 策略标识, 可以自行进行扩展 - */ - @Override - public String getChannel() { - return ChannelEnum.WECHAT.getCode(); - } -} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayReconcileStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatReconcileStrategy.java similarity index 96% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayReconcileStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatReconcileStrategy.java index cd9c70a44..5bd9e2315 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayReconcileStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatReconcileStrategy.java @@ -25,7 +25,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Scope(SCOPE_PROTOTYPE) @Service @RequiredArgsConstructor -public class WechatPayReconcileStrategy extends AbsReconcileStrategy { +public class WechatReconcileStrategy extends AbsReconcileStrategy { private final WechatPayReconcileService reconcileService; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/cashier/CashierCodeAuthCodeParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierCodeAuthCodeParam.java similarity index 80% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/cashier/CashierCodeAuthCodeParam.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierCodeAuthCodeParam.java index b9685c961..d31b93959 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/cashier/CashierCodeAuthCodeParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierCodeAuthCodeParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.param.cashier; +package org.dromara.daxpay.core.param.cashier; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -15,10 +15,10 @@ import lombok.experimental.Accessors; public class CashierCodeAuthCodeParam { @Schema(description = "码牌Code") - private String code; + private String cashierCode; @Schema(description = "收银台类型") - private String type; + private String cashierType; @Schema(description = "认证Code") private String authCode; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierAuthUrlParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierCodeAuthUrlParam.java similarity index 58% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierAuthUrlParam.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierCodeAuthUrlParam.java index fa7ec0454..045f504aa 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierAuthUrlParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierCodeAuthUrlParam.java @@ -5,18 +5,18 @@ import lombok.Data; import lombok.experimental.Accessors; /** - * 获取通道收银认证url参数 + * 获取收银码牌认证url参数 * @author xxm * @since 2024/9/28 */ @Data @Accessors(chain = true) -@Schema(title = "通道收银认证参数") -public class CashierAuthUrlParam { +@Schema(title = "收银码牌认证参数") +public class CashierCodeAuthUrlParam { - @Schema(description = "应用号") + @Schema(description = "收银台code") private String cashierCode; - @Schema(description = "收银台类型") + @Schema(description = "收银码牌类型") private String cashierType; } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierPayParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierCodePayParam.java similarity index 85% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierPayParam.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierCodePayParam.java index 4afaade1f..28142a597 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierPayParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierCodePayParam.java @@ -7,14 +7,14 @@ import lombok.experimental.Accessors; import java.math.BigDecimal; /** - * 通道收银支付参数 + * 收银码牌支付参数 * @author xxm * @since 2024/9/28 */ @Data @Accessors(chain = true) -@Schema(title = "通道收银支付参数") -public class CashierPayParam { +@Schema(title = "收银码牌支付参数") +public class CashierCodePayParam { @Schema(description = "收银码牌Code") private String cashierCode; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAggregatePayParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAggregatePayParam.java index 9149b7796..ed8883d82 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAggregatePayParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAggregatePayParam.java @@ -3,6 +3,7 @@ package org.dromara.daxpay.core.param.checkout; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; +import org.dromara.daxpay.core.enums.CheckoutAggregateEnum; /** * 收银台聚合支付参数 @@ -11,17 +12,20 @@ import lombok.experimental.Accessors; */ @Data @Accessors(chain = true) -@Schema(title = "收银台支付参数") +@Schema(title = "收银台聚合支付参数") public class CheckoutAggregatePayParam { @Schema(description = "要支付的订单号") private String orderNo; + /** + * 聚合支付类型 + * @see CheckoutAggregateEnum + */ @Schema(description = "聚合支付类型") private String aggregateType; @Schema(description = "唯一标识") private String openId; - } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierAuthCodeParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthCodeParam.java similarity index 77% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierAuthCodeParam.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthCodeParam.java index ac47d7610..7f84dafa6 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/cashier/CashierAuthCodeParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthCodeParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.core.param.cashier; +package org.dromara.daxpay.core.param.checkout; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -11,8 +11,8 @@ import lombok.experimental.Accessors; */ @Data @Accessors(chain = true) -@Schema(title = "通道收银认证参数") -public class CashierAuthCodeParam { +@Schema(title = "收银台认证参数") +public class CheckoutAuthCodeParam { @Schema(description = "应用号") private String appId; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthUrlParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthUrlParam.java new file mode 100644 index 000000000..61f18ffde --- /dev/null +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthUrlParam.java @@ -0,0 +1,27 @@ +package org.dromara.daxpay.core.param.checkout; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.daxpay.core.enums.CheckoutAggregateEnum; + +/** + * 获取通道收银认证url参数 + * @author xxm + * @since 2024/9/28 + */ +@Data +@Accessors(chain = true) +@Schema(title = "通道收银认证参数") +public class CheckoutAuthUrlParam { + + /** + * 聚合支付类型 + * @see CheckoutAggregateEnum + */ + @Schema(description = "聚合支付类型") + private String aggregateType; + + @Schema(description = "收银台类型") + private String cashierType; +} diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutCreatParam.java similarity index 97% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutParam.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutCreatParam.java index 2ba9daff3..2484ef04d 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutCreatParam.java @@ -22,7 +22,7 @@ import java.time.LocalDateTime; @Data @Accessors(chain = true) @Schema(title = "收银台创建参数") -public class CheckoutParam extends PaymentCommonParam { +public class CheckoutCreatParam extends PaymentCommonParam { /** * 收银台类型 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CashierCodeController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CashierCodeController.java index 846944c58..288237b22 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CashierCodeController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CashierCodeController.java @@ -8,12 +8,12 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.core.param.cashier.CashierAuthUrlParam; -import org.dromara.daxpay.core.param.cashier.CashierPayParam; +import org.dromara.daxpay.core.param.cashier.CashierCodeAuthUrlParam; +import org.dromara.daxpay.core.param.cashier.CashierCodePayParam; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.cashier.CashierCodeResult; import org.dromara.daxpay.core.result.trade.pay.PayResult; -import org.dromara.daxpay.service.param.cashier.CashierCodeAuthCodeParam; +import org.dromara.daxpay.core.param.cashier.CashierCodeAuthCodeParam; import org.dromara.daxpay.service.service.cashier.CashierCodeService; import org.dromara.daxpay.service.service.config.cashier.CashierCodeConfigService; import org.springframework.web.bind.annotation.*; @@ -43,7 +43,7 @@ public class CashierCodeController { @Operation(summary = "获取码牌所需授权链接, 用于获取OpenId一类的信息") @PostMapping("/generateAuthUrl") - public Result generateAuthUrl(@RequestBody CashierAuthUrlParam param){ + public Result generateAuthUrl(@RequestBody CashierCodeAuthUrlParam param){ ValidationUtil.validateParam(param); return Res.ok(cashierCodeService.generateAuthUrl(param)); } @@ -57,7 +57,7 @@ public class CashierCodeController { @Operation(summary = "发起支付") @PostMapping("/pay") - public Result cashierPay(@RequestBody CashierPayParam param){ + public Result cashierPay(@RequestBody CashierCodePayParam param){ ValidationUtil.validateParam(param); return Res.ok(cashierCodeService.cashierPay(param)); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java index 1004d5744..6f7e4f66e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java @@ -5,7 +5,7 @@ import cn.bootx.platform.core.rest.result.Result; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.core.param.checkout.CheckoutParam; +import org.dromara.daxpay.core.param.checkout.CheckoutCreatParam; import org.dromara.daxpay.core.param.checkout.CheckoutPayParam; import org.dromara.daxpay.core.result.DaxResult; import org.dromara.daxpay.core.result.checkout.CheckoutAggregateOrderAndConfigResult; @@ -13,8 +13,8 @@ import org.dromara.daxpay.core.result.checkout.CheckoutOrderAndConfigResult; import org.dromara.daxpay.core.result.checkout.CheckoutUrlResult; import org.dromara.daxpay.core.util.DaxRes; import org.dromara.daxpay.service.common.anno.PaymentVerify; -import org.dromara.daxpay.service.service.cashier.CheckoutQueryService; -import org.dromara.daxpay.service.service.cashier.CheckoutService; +import org.dromara.daxpay.service.service.checkout.CheckoutQueryService; +import org.dromara.daxpay.service.service.checkout.CheckoutService; import org.springframework.web.bind.annotation.*; /** @@ -33,7 +33,7 @@ public class CheckoutController { @PaymentVerify @Operation(summary = "创建一个收银台链接") @PostMapping("/creat") - public DaxResult creat(@RequestBody CheckoutParam checkoutParam){ + public DaxResult creat(@RequestBody CheckoutCreatParam checkoutParam){ return DaxRes.ok(checkoutService.creat(checkoutParam)); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/cashier/CashierCodeAuthUrlParam.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/cashier/CashierCodeAuthUrlParam.java deleted file mode 100644 index e66bb2eb9..000000000 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/cashier/CashierCodeAuthUrlParam.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.dromara.daxpay.service.param.cashier; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 获取收银码牌认证url参数 - * @author xxm - * @since 2024/11/25 - */ -@Data -@Accessors(chain = true) -@Schema(title = "获取收银码牌认证url参数") -public class CashierCodeAuthUrlParam { - - @Schema(description = "码牌Code") - private String code; - - @Schema(description = "收银台类型") - private String type; -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CashierCodeService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CashierCodeService.java index 94baa09da..9fee96244 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CashierCodeService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CashierCodeService.java @@ -6,25 +6,25 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.JakartaServletUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.core.param.cashier.CashierAuthCodeParam; -import org.dromara.daxpay.core.param.cashier.CashierAuthUrlParam; -import org.dromara.daxpay.core.param.cashier.CashierPayParam; +import org.dromara.daxpay.core.param.assist.AuthCodeParam; +import org.dromara.daxpay.core.param.cashier.CashierCodeAuthCodeParam; +import org.dromara.daxpay.core.param.cashier.CashierCodeAuthUrlParam; +import org.dromara.daxpay.core.param.cashier.CashierCodePayParam; import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import org.dromara.daxpay.service.param.cashier.CashierCodeAuthCodeParam; import org.dromara.daxpay.service.service.assist.PaymentAssistService; import org.dromara.daxpay.service.service.config.cashier.CashierCodeConfigService; import org.dromara.daxpay.service.service.trade.pay.PayService; -import org.dromara.daxpay.service.strategy.AbsChannelCashierStrategy; +import org.dromara.daxpay.service.strategy.AbsCashierCodeStrategy; import org.dromara.daxpay.service.util.PaymentStrategyFactory; import org.springframework.stereotype.Service; import java.time.LocalDateTime; /** - * 通知支付控制台服务 + * 收银码牌服务 * @author xxm * @since 2024/9/28 */ @@ -42,13 +42,13 @@ public class CashierCodeService { /** * 生成授权链接跳转链接, 主要是微信类通道使用, 用于获取OpenId */ - public String generateAuthUrl(CashierAuthUrlParam param){ + public String generateAuthUrl(CashierCodeAuthUrlParam param){ // 查询配置 var cashierConfig = codeConfigService.findByCashierType(param.getCashierCode(),param.getCashierType()); paymentAssistService.initMchApp(cashierConfig.getAppId()); // 获取策略 - AbsChannelCashierStrategy cashierStrategy = PaymentStrategyFactory.create(cashierConfig.getChannel(), AbsChannelCashierStrategy.class); - return cashierStrategy.generateAuthUrl(param); + AbsCashierCodeStrategy cashierStrategy = PaymentStrategyFactory.create(cashierConfig.getChannel(), AbsCashierCodeStrategy.class); + return cashierStrategy.generateAuthUrl(param.getCashierCode()); } /** @@ -56,21 +56,19 @@ public class CashierCodeService { */ public AuthResult auth(CashierCodeAuthCodeParam param) { // 查询配置 - var cashierConfig = codeConfigService.findByCashierType(param.getCode(),param.getType()); + var cashierConfig = codeConfigService.findByCashierType(param.getCashierCode(),param.getCashierType()); paymentAssistService.initMchApp(cashierConfig.getAppId()); // 获取策略 - AbsChannelCashierStrategy cashierStrategy = PaymentStrategyFactory.create(cashierConfig.getChannel(), AbsChannelCashierStrategy.class); - CashierAuthCodeParam authCodeParam = new CashierAuthCodeParam() - .setCashierType(param.getType()) - .setAuthCode(param.getAuthCode()) - .setAppId(cashierConfig.getAppId()); + AbsCashierCodeStrategy cashierStrategy = PaymentStrategyFactory.create(cashierConfig.getChannel(), AbsCashierCodeStrategy.class); + AuthCodeParam authCodeParam = new AuthCodeParam() + .setAuthCode(param.getAuthCode()); return cashierStrategy.doAuth(authCodeParam); } /** * 支付处理 */ - public PayResult cashierPay(CashierPayParam param){ + public PayResult cashierPay(CashierCodePayParam param){ String clientIP = JakartaServletUtil.getClientIP(WebServletUtil.getRequest()); // 查询配置 var cashierConfig = codeConfigService.findByCashierType(param.getCashierCode(), param.getCashierType()); @@ -90,7 +88,7 @@ public class CashierCodeService { payParam.setSign(sign); // 获取策略 - AbsChannelCashierStrategy cashierStrategy = PaymentStrategyFactory.create(cashierConfig.getChannel(), AbsChannelCashierStrategy.class); + AbsCashierCodeStrategy cashierStrategy = PaymentStrategyFactory.create(cashierConfig.getChannel(), AbsCashierCodeStrategy.class); // 进行参数预处理 cashierStrategy.handlePayParam(param, payParam); // 参数校验 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CheckoutAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java similarity index 92% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CheckoutAssistService.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java index c5399cb7d..ef8dc4018 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CheckoutAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.cashier; +package org.dromara.daxpay.service.service.checkout; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.BigDecimalUtil; @@ -12,7 +12,7 @@ import org.dromara.daxpay.core.enums.PayRefundStatusEnum; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.exception.AmountExceedLimitException; import org.dromara.daxpay.core.exception.TradeStatusErrorException; -import org.dromara.daxpay.core.param.checkout.CheckoutParam; +import org.dromara.daxpay.core.param.checkout.CheckoutCreatParam; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; import org.dromara.daxpay.service.code.DaxPayCode; @@ -52,7 +52,7 @@ public class CheckoutAssistService { /** * 校验支付状态,支付成功则返回,支付失败则抛出对应的异常 */ - public PayOrder getOrderAndCheck(CheckoutParam param) { + public PayOrder getOrderAndCheck(CheckoutCreatParam param) { // 根据订单查询支付记录 PayOrder payOrder = payOrderQueryService.findByBizOrderNo(param.getBizOrderNo(), param.getAppId()).orElse(null); return getOrderAndCheck(payOrder); @@ -87,7 +87,7 @@ public class CheckoutAssistService { /** * 检验订单是否超过限额 */ - public void validationLimitAmount(CheckoutParam checkoutParam) { + public void validationLimitAmount(CheckoutCreatParam checkoutParam) { MchAppLocal mchAppInfo = PaymentContextLocal.get() .getMchAppInfo(); // 总额校验 @@ -100,7 +100,7 @@ public class CheckoutAssistService { /** * 校验订单超时时间是否正常 */ - public void validationExpiredTime(CheckoutParam payParam) { + public void validationExpiredTime(CheckoutCreatParam payParam) { LocalDateTime expiredTime = this.getExpiredTime(payParam); if (Objects.nonNull(expiredTime) && DateTimeUtil.lt(expiredTime,LocalDateTime.now())) { throw new ValidationFailedException("支付超时时间设置有误, 请检查!"); @@ -113,7 +113,7 @@ public class CheckoutAssistService { * 创建支付订单并保存, 返回支付订单 */ @Transactional(rollbackFor = Exception.class) - public PayOrder createPayOrder(CheckoutParam checkoutParam) { + public PayOrder createPayOrder(CheckoutCreatParam checkoutParam) { // 订单超时时间 LocalDateTime expiredTime = this.getExpiredTime(checkoutParam); // 构建支付订单对象 @@ -138,7 +138,7 @@ public class CheckoutAssistService { /** * 获取支付订单超时时间 */ - private LocalDateTime getExpiredTime(CheckoutParam payParam) { + private LocalDateTime getExpiredTime(CheckoutCreatParam payParam) { MchAppLocal mchAppLocal = PaymentContextLocal.get().getMchAppInfo(); // 支付参数传入 if (Objects.nonNull(payParam.getExpiredTime())) { diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CheckoutQueryService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java similarity index 98% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CheckoutQueryService.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java index 4b4a298ed..9d34931ea 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CheckoutQueryService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.cashier; +package org.dromara.daxpay.service.service.checkout; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.bootx.platform.core.exception.DataNotExistException; @@ -24,7 +24,7 @@ import java.util.List; import java.util.stream.Collectors; /** - * + * 收银码牌查询服务 * @author xxm * @since 2024/11/27 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CheckoutService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java similarity index 67% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CheckoutService.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java index 770953764..af5f02e04 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/cashier/CheckoutService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.cashier; +package org.dromara.daxpay.service.service.checkout; import cn.bootx.platform.common.spring.util.WebServletUtil; import cn.hutool.core.util.StrUtil; @@ -10,22 +10,27 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.CheckoutCallTypeEnum; import org.dromara.daxpay.core.enums.CheckoutTypeEnum; import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.exception.ConfigNotExistException; import org.dromara.daxpay.core.exception.TradeProcessingException; import org.dromara.daxpay.core.exception.UnsupportedAbilityException; import org.dromara.daxpay.core.param.checkout.CheckoutAggregatePayParam; -import org.dromara.daxpay.core.param.checkout.CheckoutParam; +import org.dromara.daxpay.core.param.checkout.CheckoutCreatParam; import org.dromara.daxpay.core.param.checkout.CheckoutPayParam; import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.result.checkout.CheckoutPayResult; import org.dromara.daxpay.core.result.checkout.CheckoutUrlResult; import org.dromara.daxpay.core.result.trade.pay.PayResult; +import org.dromara.daxpay.service.dao.config.checkout.CheckoutAggregateConfigManager; import org.dromara.daxpay.service.dao.config.checkout.CheckoutItemConfigManager; import org.dromara.daxpay.service.entity.config.PlatformConfig; +import org.dromara.daxpay.service.entity.config.checkout.CheckoutAggregateConfig; import org.dromara.daxpay.service.entity.config.checkout.CheckoutItemConfig; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.service.assist.PaymentAssistService; import org.dromara.daxpay.service.service.config.PlatformConfigService; import org.dromara.daxpay.service.service.trade.pay.PayService; +import org.dromara.daxpay.service.strategy.AbsCheckoutStrategy; +import org.dromara.daxpay.service.util.PaymentStrategyFactory; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -46,11 +51,12 @@ public class CheckoutService { private final PaymentAssistService paymentAssistService; private final CheckoutItemConfigManager checkoutItemConfigManager; private final PayService payService; + private final CheckoutAggregateConfigManager checkoutAggregateConfigManager; /** * 生成收银台链接 */ - public CheckoutUrlResult creat(CheckoutParam checkoutParam){ + public CheckoutUrlResult creat(CheckoutCreatParam checkoutParam){ // 校验支付限额 checkoutAssistService.validationLimitAmount(checkoutParam); // 校验超时时间, 不可早于当前 @@ -149,15 +155,14 @@ public class CheckoutService { payParam.setReqTime(LocalDateTime.now()); // 获取策略 -// AbsChannelCashierStrategy cashierStrategy = PaymentStrategyFactory.create(itemConfig.getChannel(), AbsChannelCashierStrategy.class); + var cashierStrategy = PaymentStrategyFactory.create(itemConfig.getChannel(), AbsCheckoutStrategy.class); // 进行参数预处理 -// cashierStrategy.handlePayParam(param, payParam); + cashierStrategy.handlePayParam(param, payParam); // 发起支付 PayResult payResult = payService.pay(payParam, payOrder); return new CheckoutPayResult() .setUrl(payResult.getPayBody()) .setPayStatus(payResult.getStatus()); - } /** @@ -167,7 +172,57 @@ public class CheckoutService { // 订单信息 PayOrder payOrder = checkoutAssistService.getOrderAndCheck(param.getOrderNo()); - return new PayResult(); + // 获取聚合类型 + CheckoutAggregateConfig aggregateConfig = checkoutAggregateConfigManager.findByAppIdAndType(payOrder.getAppId(), param.getAggregateType()) + .orElseThrow(() -> new ConfigNotExistException("聚合支付配置项不存在")); + + // 构建支付参数 + String clientIP = JakartaServletUtil.getClientIP(WebServletUtil.getRequest()); + PayParam payParam = new PayParam(); + payParam.setChannel(aggregateConfig.getChannel()); + payParam.setMethod(aggregateConfig.getPayMethod()); + payParam.setAppId(aggregateConfig.getAppId()); + payParam.setClientIp(clientIP); + payParam.setReqTime(LocalDateTime.now()); + + // 获取策略 + var cashierStrategy = PaymentStrategyFactory.create(aggregateConfig.getChannel(), AbsCheckoutStrategy.class); + // 进行参数预处理 + CheckoutPayParam cashierPayParam = new CheckoutPayParam() + .setOpenId(param.getOpenId()); + cashierStrategy.handlePayParam(cashierPayParam, payParam); + // 发起支付 + return payService.pay(payParam, payOrder); } +// /** +// * 生成授权链接跳转链接, 主要是微信类通道使用, 用于获取OpenId +// */ +// public String generateAuthUrl(CheckoutAggregatePayParam param){ +// // 订单信息 +// PayOrder payOrder = checkoutAssistService.getOrderAndCheck(param.getOrderNo()); +// // 获取聚合类型 +// CheckoutAggregateConfig aggregateConfig = checkoutAggregateConfigManager.findByAppIdAndType(payOrder.getAppId(), param.getAggregateType()) +// .orElseThrow(() -> new ConfigNotExistException("聚合支付配置项不存在")); +// paymentAssistService.initMchApp(aggregateConfig.getAppId()); +// // 获取策略 +// var cashierStrategy = PaymentStrategyFactory.create(aggregateConfig.getChannel(), AbsCheckoutStrategy.class); +// return cashierStrategy.generateAuthUrl(param); +// } +// +// /** +// * 授权结果 +// */ +// public AuthResult auth(org.dromara.daxpay.service.param.cashier.AuthCodeParam param) { +// // 查询配置 +// var cashierConfig = codeConfigService.findByCashierType(param.getCode(),param.getType()); +// paymentAssistService.initMchApp(cashierConfig.getAppId()); +// // 获取策略 +// AbsCashierCodeStrategy cashierStrategy = PaymentStrategyFactory.create(cashierConfig.getChannel(), AbsCashierCodeStrategy.class); +// AuthCodeParam authCodeParam = new AuthCodeParam() +// .setCashierType(param.getType()) +// .setAuthCode(param.getAuthCode()) +// .setAppId(cashierConfig.getAppId()); +// return cashierStrategy.doAuth(authCodeParam); +// } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCashierCodeStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCashierCodeStrategy.java new file mode 100644 index 000000000..8a764029a --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCashierCodeStrategy.java @@ -0,0 +1,35 @@ +package org.dromara.daxpay.service.strategy; + +import org.dromara.daxpay.core.param.assist.AuthCodeParam; +import org.dromara.daxpay.core.param.cashier.CashierCodePayParam; +import org.dromara.daxpay.core.param.trade.pay.PayParam; +import org.dromara.daxpay.core.result.assist.AuthResult; + +/** + * 抽象收银码牌策略 + * @author xxm + * @since 2024/9/28 + */ +public abstract class AbsCashierCodeStrategy implements PaymentStrategy{ + + /** + * 生成授权链接, 主要是微信类通道使用, 用于获取OpenId + */ + public String generateAuthUrl(String cashierCode) { + return ""; + } + + /**Z + * 获取认证结果 + */ + public AuthResult doAuth(AuthCodeParam param) { + return new AuthResult(); + } + + /** + * 支付参数处理 + */ + public void handlePayParam(CashierCodePayParam cashierPayParam, PayParam payParam) { + } + +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsChannelCashierStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsChannelCashierStrategy.java deleted file mode 100644 index c0876997f..000000000 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsChannelCashierStrategy.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.dromara.daxpay.service.strategy; - -import org.dromara.daxpay.core.param.cashier.CashierAuthCodeParam; -import org.dromara.daxpay.core.param.cashier.CashierAuthUrlParam; -import org.dromara.daxpay.core.param.cashier.CashierPayParam; -import org.dromara.daxpay.core.param.trade.pay.PayParam; -import org.dromara.daxpay.core.result.assist.AuthResult; - -/** - * 抽象通道收银台策略 - * @author xxm - * @since 2024/9/28 - */ -public abstract class AbsChannelCashierStrategy implements PaymentStrategy{ - - /** - * 生成授权链接, 主要是微信类通道使用, 用于获取OpenId - */ - public String generateAuthUrl(CashierAuthUrlParam param) { - return ""; - } - - /** - * 获取认证结果 - */ - public AuthResult doAuth(CashierAuthCodeParam param) { - return new AuthResult(); - } - - /** - * 支付参数处理 - */ - public void handlePayParam(CashierPayParam cashierPayParam, PayParam payParam) { - } - -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCheckoutStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCheckoutStrategy.java new file mode 100644 index 000000000..73b1ddf05 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCheckoutStrategy.java @@ -0,0 +1,35 @@ +package org.dromara.daxpay.service.strategy; + +import org.dromara.daxpay.core.param.assist.AuthCodeParam; +import org.dromara.daxpay.core.param.cashier.CashierCodeAuthUrlParam; +import org.dromara.daxpay.core.param.checkout.CheckoutPayParam; +import org.dromara.daxpay.core.param.trade.pay.PayParam; +import org.dromara.daxpay.core.result.assist.AuthResult; + +/** + * 抽象收银台策略 + * @author xxm + * @since 2024/12/2 + */ +public abstract class AbsCheckoutStrategy implements PaymentStrategy{ + + /** + * 生成授权链接, 主要是微信类通道使用, 用于获取OpenId + */ + public String generateAuthUrl(CashierCodeAuthUrlParam param) { + return ""; + } + + /** + * 获取认证结果 + */ + public AuthResult doAuth(AuthCodeParam param) { + return new AuthResult(); + } + + /** + * 支付参数处理 + */ + public void handlePayParam(CheckoutPayParam cashierPayParam, PayParam payParam) { + } +} From 0cc8ac400777ba8ac9ff93fbeebe3db717ae7fe3 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Mon, 2 Dec 2024 19:57:37 +0800 Subject: [PATCH 03/54] =?UTF-8?q?feat(checkout):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=94=B6=E9=93=B6=E5=8F=B0=E7=9B=B8=E5=85=B3=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E5=92=8C=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新了 CheckoutAuthCodeParam、CheckoutAuthUrlParam 和 CheckoutPayParam等参数类的结构和字段- 修改了 CheckoutController 中的接口,增加了生成授权链接和获取授权结果的功能 - 重构了 CheckoutService 中的 generateAuthUrl 和 auth 方法,支持聚合支付类型 - 更新了 AbsCheckoutStrategy 和 WechatCheckoutStrategy 中的 generateAuthUrl 方法签名 --- .../strategy/WechatCheckoutStrategy.java | 5 +- .../param/checkout/CheckoutAuthCodeParam.java | 19 ++++-- .../param/checkout/CheckoutAuthUrlParam.java | 10 +-- .../core/param/checkout/CheckoutPayParam.java | 3 - .../CheckoutAggregateConfigResult.java | 4 +- ...CheckoutAggregateOrderAndConfigResult.java | 2 +- .../unipay/CashierCodeController.java | 2 +- .../controller/unipay/CheckoutController.java | 34 ++++++++-- .../checkout/CheckoutQueryService.java | 1 + .../service/checkout/CheckoutService.java | 67 ++++++++++--------- .../service/strategy/AbsCheckoutStrategy.java | 3 +- 11 files changed, 90 insertions(+), 60 deletions(-) diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java index ad54125a5..a9ca3b579 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java @@ -9,7 +9,6 @@ import org.dromara.daxpay.channel.wechat.service.assist.WechatAuthService; import org.dromara.daxpay.core.enums.ChannelAuthStatusEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.param.assist.AuthCodeParam; -import org.dromara.daxpay.core.param.cashier.CashierCodeAuthUrlParam; import org.dromara.daxpay.core.param.checkout.CheckoutPayParam; import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.result.assist.AuthResult; @@ -41,8 +40,8 @@ public class WechatCheckoutStrategy extends AbsCheckoutStrategy { * 生成授权链接, 主要是微信类通道使用, 用于获取OpenId */ @Override - public String generateAuthUrl(CashierCodeAuthUrlParam param) { - String redirectUrl = StrUtil.format("/checkout/wechat/{}", param.getCashierCode()); + public String generateAuthUrl(String orderNo) { + String redirectUrl = StrUtil.format("/checkout/wechat/{}", orderNo); return wechatAuthService.generateInnerAuthUrl(redirectUrl); } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthCodeParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthCodeParam.java index 7f84dafa6..19704c665 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthCodeParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthCodeParam.java @@ -3,23 +3,30 @@ package org.dromara.daxpay.core.param.checkout; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; +import org.dromara.daxpay.core.enums.CheckoutAggregateEnum; /** - * 获取通道收银认证结果参数 + * 获取收银台认证结果参数 * @author xxm * @since 2024/9/28 */ @Data @Accessors(chain = true) -@Schema(title = "收银台认证参数") +@Schema(title = "获取收银台认证结果参数") public class CheckoutAuthCodeParam { - @Schema(description = "应用号") - private String appId; + /** 要支付的订单号 */ + @Schema(description = "要支付的订单号") + private String orderNo; - @Schema(description = "收银台类型") - private String cashierType; + /** + * 聚合支付类型 + * @see CheckoutAggregateEnum + */ + @Schema(description = "聚合支付类型") + private String aggregateType; + /** 认证Code */ @Schema(description = "认证Code") private String authCode; } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthUrlParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthUrlParam.java index 61f18ffde..303a7afb4 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthUrlParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthUrlParam.java @@ -6,22 +6,22 @@ import lombok.experimental.Accessors; import org.dromara.daxpay.core.enums.CheckoutAggregateEnum; /** - * 获取通道收银认证url参数 + * 收银台认证链接生成参数 * @author xxm * @since 2024/9/28 */ @Data @Accessors(chain = true) -@Schema(title = "通道收银认证参数") +@Schema(title = "收银台认证链接生成参数") public class CheckoutAuthUrlParam { + @Schema(description = "要支付的订单号") + private String orderNo; + /** * 聚合支付类型 * @see CheckoutAggregateEnum */ @Schema(description = "聚合支付类型") private String aggregateType; - - @Schema(description = "收银台类型") - private String cashierType; } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutPayParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutPayParam.java index 28054873e..13582e3cb 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutPayParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutPayParam.java @@ -25,7 +25,4 @@ public class CheckoutPayParam { @Schema(description = "付款码") private String barCode; - - @Schema(description = "描述") - private String description; } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutAggregateConfigResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutAggregateConfigResult.java index b7ada9d03..d839ad952 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutAggregateConfigResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutAggregateConfigResult.java @@ -18,10 +18,10 @@ import org.dromara.daxpay.core.enums.PayMethodEnum; public class CheckoutAggregateConfigResult { /** - * 支付类型 + * 聚合支付类型 * @see CheckoutAggregateEnum */ - @Schema(description = "支付类型") + @Schema(description = "聚合支付类型") private String type; /** diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutAggregateOrderAndConfigResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutAggregateOrderAndConfigResult.java index ceba20399..002c57e1a 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutAggregateOrderAndConfigResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutAggregateOrderAndConfigResult.java @@ -19,7 +19,7 @@ public class CheckoutAggregateOrderAndConfigResult { private CheckoutOrderResult order; /** 收银台配置信息 */ - @Schema(description = "配置信息") + @Schema(description = "收银台配置信息") private CheckoutConfigResult config; /** 收银台聚合配置信息 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CashierCodeController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CashierCodeController.java index 288237b22..dce60f2dd 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CashierCodeController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CashierCodeController.java @@ -48,7 +48,7 @@ public class CashierCodeController { return Res.ok(cashierCodeService.generateAuthUrl(param)); } - @Operation(summary = "授权获取结果") + @Operation(summary = "获取授权结果") @PostMapping("/auth") public Result auth(@RequestBody CashierCodeAuthCodeParam param){ ValidationUtil.validateParam(param); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java index 6f7e4f66e..c73967afd 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java @@ -1,15 +1,21 @@ package org.dromara.daxpay.service.controller.unipay; +import cn.bootx.platform.core.annotation.IgnoreAuth; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; +import cn.bootx.platform.core.util.ValidationUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.dromara.daxpay.core.param.checkout.CheckoutAuthCodeParam; +import org.dromara.daxpay.core.param.checkout.CheckoutAuthUrlParam; import org.dromara.daxpay.core.param.checkout.CheckoutCreatParam; import org.dromara.daxpay.core.param.checkout.CheckoutPayParam; import org.dromara.daxpay.core.result.DaxResult; +import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.checkout.CheckoutAggregateOrderAndConfigResult; import org.dromara.daxpay.core.result.checkout.CheckoutOrderAndConfigResult; +import org.dromara.daxpay.core.result.checkout.CheckoutPayResult; import org.dromara.daxpay.core.result.checkout.CheckoutUrlResult; import org.dromara.daxpay.core.util.DaxRes; import org.dromara.daxpay.service.common.anno.PaymentVerify; @@ -37,22 +43,42 @@ public class CheckoutController { return DaxRes.ok(checkoutService.creat(checkoutParam)); } + @IgnoreAuth @Operation(summary = "获取收银台订单和配置信息") @GetMapping("/getOrderAndConfig") public Result getOrderAndConfig(String orderNo, String checkoutType){ return Res.ok(checkoutQueryService.getOrderAndConfig(orderNo, checkoutType)); } + @IgnoreAuth @Operation(summary = "获取聚合支付配置") @GetMapping("/getAggregateConfig") - public Result getAggregateConfig(String orderNo, String checkoutType){ - return Res.ok(checkoutQueryService.getAggregateConfig(orderNo, checkoutType)); + public Result getAggregateConfig(String orderNo, String aggregateType){ + return Res.ok(checkoutQueryService.getAggregateConfig(orderNo, aggregateType)); } + @IgnoreAuth + @Operation(summary = "获取收银台所需授权链接, 用于获取OpenId一类的信息") + @PostMapping("/generateAuthUrl") + public Result generateAuthUrl(@RequestBody CheckoutAuthUrlParam param){ + ValidationUtil.validateParam(param); + return Res.ok(checkoutService.generateAuthUrl(param)); + } + + @IgnoreAuth + @Operation(summary = "获取授权结果") + @PostMapping("/auth") + public Result auth(@RequestBody CheckoutAuthCodeParam param){ + ValidationUtil.validateParam(param); + return Res.ok(checkoutService.auth(param)); + } + + + @IgnoreAuth @Operation(summary = "发起支付") @PostMapping("/pay") - public Result pay(@RequestBody CheckoutPayParam checkoutParam){ - return Res.ok(); + public Result pay(@RequestBody CheckoutPayParam checkoutParam){ + return Res.ok(checkoutService.pay(checkoutParam)); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java index 9d34931ea..50a918ff2 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java @@ -110,6 +110,7 @@ public class CheckoutQueryService { .setAmount(payOrder.getAmount()) .setBizOrderNo(payOrder.getBizOrderNo()) .setOrderNo(payOrder.getOrderNo()); + checkoutInfoResult.setOrder(order); // 获取收银台配置 checkoutInfoResult.setConfig(this.getConfig(payOrder.getAppId())); // 获取聚合支付配置 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java index af5f02e04..24b038688 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java @@ -13,10 +13,10 @@ import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.exception.ConfigNotExistException; import org.dromara.daxpay.core.exception.TradeProcessingException; import org.dromara.daxpay.core.exception.UnsupportedAbilityException; -import org.dromara.daxpay.core.param.checkout.CheckoutAggregatePayParam; -import org.dromara.daxpay.core.param.checkout.CheckoutCreatParam; -import org.dromara.daxpay.core.param.checkout.CheckoutPayParam; +import org.dromara.daxpay.core.param.assist.AuthCodeParam; +import org.dromara.daxpay.core.param.checkout.*; import org.dromara.daxpay.core.param.trade.pay.PayParam; +import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.checkout.CheckoutPayResult; import org.dromara.daxpay.core.result.checkout.CheckoutUrlResult; import org.dromara.daxpay.core.result.trade.pay.PayResult; @@ -195,34 +195,35 @@ public class CheckoutService { return payService.pay(payParam, payOrder); } -// /** -// * 生成授权链接跳转链接, 主要是微信类通道使用, 用于获取OpenId -// */ -// public String generateAuthUrl(CheckoutAggregatePayParam param){ -// // 订单信息 -// PayOrder payOrder = checkoutAssistService.getOrderAndCheck(param.getOrderNo()); -// // 获取聚合类型 -// CheckoutAggregateConfig aggregateConfig = checkoutAggregateConfigManager.findByAppIdAndType(payOrder.getAppId(), param.getAggregateType()) -// .orElseThrow(() -> new ConfigNotExistException("聚合支付配置项不存在")); -// paymentAssistService.initMchApp(aggregateConfig.getAppId()); -// // 获取策略 -// var cashierStrategy = PaymentStrategyFactory.create(aggregateConfig.getChannel(), AbsCheckoutStrategy.class); -// return cashierStrategy.generateAuthUrl(param); -// } -// -// /** -// * 授权结果 -// */ -// public AuthResult auth(org.dromara.daxpay.service.param.cashier.AuthCodeParam param) { -// // 查询配置 -// var cashierConfig = codeConfigService.findByCashierType(param.getCode(),param.getType()); -// paymentAssistService.initMchApp(cashierConfig.getAppId()); -// // 获取策略 -// AbsCashierCodeStrategy cashierStrategy = PaymentStrategyFactory.create(cashierConfig.getChannel(), AbsCashierCodeStrategy.class); -// AuthCodeParam authCodeParam = new AuthCodeParam() -// .setCashierType(param.getType()) -// .setAuthCode(param.getAuthCode()) -// .setAppId(cashierConfig.getAppId()); -// return cashierStrategy.doAuth(authCodeParam); -// } + /** + * 生成授权链接跳转链接, 主要是微信类通道使用, 用于获取OpenId + */ + public String generateAuthUrl(CheckoutAuthUrlParam param){ + // 订单信息 + PayOrder payOrder = checkoutAssistService.getOrderAndCheck(param.getOrderNo()); + // 获取聚合类型 + var aggregateConfig = checkoutAggregateConfigManager.findByAppIdAndType(payOrder.getAppId(), param.getAggregateType()) + .orElseThrow(() -> new ConfigNotExistException("聚合支付配置项不存在")); + paymentAssistService.initMchApp(aggregateConfig.getAppId()); + // 获取策略 + var checkoutStrategy = PaymentStrategyFactory.create(aggregateConfig.getChannel(), AbsCheckoutStrategy.class); + return checkoutStrategy.generateAuthUrl(param.getOrderNo()); + } + + /** + * 授权结果 + */ + public AuthResult auth(CheckoutAuthCodeParam param) { + // 订单信息 + PayOrder payOrder = checkoutAssistService.getOrderAndCheck(param.getOrderNo()); + // 获取聚合类型 + var aggregateConfig = checkoutAggregateConfigManager.findByAppIdAndType(payOrder.getAppId(), param.getAggregateType()) + .orElseThrow(() -> new ConfigNotExistException("聚合支付配置项不存在")); + paymentAssistService.initMchApp(payOrder.getAppId()); + // 获取策略 + var checkoutStrategy = PaymentStrategyFactory.create(aggregateConfig.getChannel(), AbsCheckoutStrategy.class); + AuthCodeParam authCodeParam = new AuthCodeParam() + .setAuthCode(param.getAuthCode()); + return checkoutStrategy.doAuth(authCodeParam); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCheckoutStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCheckoutStrategy.java index 73b1ddf05..089d8a9e4 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCheckoutStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCheckoutStrategy.java @@ -1,7 +1,6 @@ package org.dromara.daxpay.service.strategy; import org.dromara.daxpay.core.param.assist.AuthCodeParam; -import org.dromara.daxpay.core.param.cashier.CashierCodeAuthUrlParam; import org.dromara.daxpay.core.param.checkout.CheckoutPayParam; import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.result.assist.AuthResult; @@ -16,7 +15,7 @@ public abstract class AbsCheckoutStrategy implements PaymentStrategy{ /** * 生成授权链接, 主要是微信类通道使用, 用于获取OpenId */ - public String generateAuthUrl(CashierCodeAuthUrlParam param) { + public String generateAuthUrl(String orderNo) { return ""; } From 77379828f69afa981d23edc52dde734204304d23 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Tue, 3 Dec 2024 17:45:44 +0800 Subject: [PATCH 04/54] =?UTF-8?q?refactor(sdk):=20=E9=87=8D=E6=9E=84=20SDK?= =?UTF-8?q?=20=E5=8F=82=E6=95=B0=E5=92=8C=E5=93=8D=E5=BA=94=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新了多个 SDK 参数和响应模型类的结构 - 优化了字段注解和数据校验 -统一了代码风格,提高了可读性和可维护性 --- .../service/extra/AliPayAuthService.java | 2 +- .../service/assist/WechatAuthService.java | 2 +- .../sdk/code/ChannelAuthStatusEnum.java | 24 +++++ .../single/sdk/code/CheckoutTypeEnum.java | 34 ++++++ .../single/sdk/model/assist/AuthModel.java | 36 +++++++ .../single/sdk/model/assist/AuthUrlModel.java | 22 ++++ .../sdk/model/assist/WxAccessTokenModel.java | 18 ---- .../sdk/model/assist/WxAuthUrlModel.java | 15 --- .../sdk/model/trade/pay/CheckoutUrlModel.java | 16 +++ .../daxpay/single/sdk/net/DaxPayRequest.java | 6 +- .../allocation/AllocReceiverAddParam.java | 14 +-- .../allocation/QueryAllocReceiverParam.java | 12 ++- .../sdk/param/assist/AuthAndSetParam.java | 52 +++++++++ .../sdk/param/assist/AuthCodeParam.java | 54 ++++++++++ .../param/assist/GenerateAuthUrlParam.java | 55 ++++++++++ .../single/sdk/param/channel/AlipayParam.java | 8 +- .../sdk/param/channel/UnionPayParam.java | 8 +- .../sdk/param/channel/WechatPayParam.java | 8 +- .../reconcile/ChannelReconcileDownParam.java | 3 +- .../reconcile/PlatformReconcileDownParam.java | 6 ++ .../param/trade/pay/CheckoutCreatParam.java | 101 ++++++++++++++++++ .../sdk/param/trade/pay/PayCloseParam.java | 12 ++- .../single/sdk/param/trade/pay/PayParam.java | 14 +-- .../sdk/param/trade/pay/PayQueryParam.java | 2 + .../sdk/param/trade/pay/PaySyncParam.java | 14 +-- .../sdk/param/trade/refund/RefundParam.java | 16 +-- .../param/trade/refund/RefundQueryParam.java | 2 + .../param/trade/refund/RefundSyncParam.java | 14 +-- .../param/trade/transfer/TransferParam.java | 16 +-- .../trade/transfer/TransferQueryParam.java | 16 +-- .../trade/transfer/TransferSyncParam.java | 12 ++- .../single/sdk/response/DaxPayResult.java | 8 +- .../sdk/test/assist/AuthAssistTest.java | 75 +++++++++++++ .../sdk/test/trade/CheckoutPayTest.java | 57 ++++++++++ .../core/enums/CheckoutAggregateEnum.java | 2 +- .../checkout/CheckoutAggregatePayParam.java | 12 ++- .../param/checkout/CheckoutAuthCodeParam.java | 6 +- .../param/checkout/CheckoutCreatParam.java | 1 + .../unipay/ChannelUniAuthController.java | 9 +- .../controller/unipay/CheckoutController.java | 29 ++--- 40 files changed, 669 insertions(+), 144 deletions(-) create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/ChannelAuthStatusEnum.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/CheckoutTypeEnum.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/AuthModel.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/AuthUrlModel.java delete mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/WxAccessTokenModel.java delete mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/WxAuthUrlModel.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/pay/CheckoutUrlModel.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/assist/AuthAndSetParam.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/assist/AuthCodeParam.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/assist/GenerateAuthUrlParam.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/CheckoutCreatParam.java create mode 100644 daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/assist/AuthAssistTest.java create mode 100644 daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/trade/CheckoutPayTest.java diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/extra/AliPayAuthService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/extra/AliPayAuthService.java index 7da5b8d00..e35de6bc5 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/extra/AliPayAuthService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/extra/AliPayAuthService.java @@ -48,7 +48,7 @@ public class AliPayAuthService { // 授权地址 String serverUrl = platformConfig.getGatewayMobileUrl(); - String authUrl = StrUtil.format("{}/alipay/auth/{}/{}/{}/{}", + String authUrl = StrUtil.format("{}/auth/alipay/{}/{}/{}/{}", serverUrl, param.getAppId(),param.getChannel(),queryCode,aliPayConfig.getAliAppId()); return new AuthUrlResult().setAuthUrl(authUrl).setQueryCode(queryCode); diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java index e2f03e697..f6631190d 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java @@ -55,7 +55,7 @@ public class WechatAuthService { } // 生产链接, 授权成功后重定向h5段用于获取授权码的页面, 获取成功后页面自动关闭 String queryCode = RandomUtil.randomString(10); - String redirectUrl = StrUtil.format("{}/wechat/auth/{}/{}/{}", serverUrl, param.getAppId(), param.getChannel(), queryCode); + String redirectUrl = StrUtil.format("{}/auth/wechat/{}/{}/{}", serverUrl, param.getAppId(), param.getChannel(), queryCode); String authUrl = wxMpService.getOAuth2Service().buildAuthorizationUrl(redirectUrl, WxConsts.OAuth2Scope.SNSAPI_BASE, ""); return new AuthUrlResult().setAuthUrl(authUrl).setQueryCode(queryCode); } diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/ChannelAuthStatusEnum.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/ChannelAuthStatusEnum.java new file mode 100644 index 000000000..68aa9eb65 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/ChannelAuthStatusEnum.java @@ -0,0 +1,24 @@ +package org.dromara.daxpay.single.sdk.code; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 通道认证状态 + * @author xxm + * @since 2024/9/24 + */ +@Getter +@AllArgsConstructor +public enum ChannelAuthStatusEnum { + + /** 获取中 */ + WAITING("waiting"), + /** 获取成功 */ + SUCCESS("success"), + /** 数据不存在 */ + NOT_EXIST("not_exist"); + + private final String code; + +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/CheckoutTypeEnum.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/CheckoutTypeEnum.java new file mode 100644 index 000000000..13a723e0c --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/CheckoutTypeEnum.java @@ -0,0 +1,34 @@ +package org.dromara.daxpay.single.sdk.code; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.Objects; + +/** + * 收银台类型 + * @author xxm + * @since 2024/11/26 + */ +@Getter +@AllArgsConstructor +public enum CheckoutTypeEnum { + + H5("h5", "H5"), + PC("pc", "PC"), + MINI_APP("mini_app", "小程序"), + AGGREGATE("aggregate", "聚合扫码"), + ; + + private final String code; + private final String name; + + public static CheckoutTypeEnum findBuyCode(String code){ + return Arrays.stream(values()) + .filter(value -> Objects.equals(value.getCode(), code)) + .findFirst() + .orElseThrow(() -> new IllegalStateException("不支持的收银台类型")); + + } +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/AuthModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/AuthModel.java new file mode 100644 index 000000000..134d04cc0 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/AuthModel.java @@ -0,0 +1,36 @@ +package org.dromara.daxpay.single.sdk.model.assist; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.dromara.daxpay.single.sdk.code.ChannelAuthStatusEnum; + +/** + * 认证结果 + * @author xxm + * @since 2024/12/3 + */ +@Data +public class AuthModel { + + @Schema(description = "OpenId") + private String openId; + + /** + * 支付宝存量商户部分返回的是用户ID + */ + @Schema(description = "用户ID") + private String userId; + + /** + * 微信会返回accessToken,用于获取用户信息 + */ + @Schema(description = "AccessToken") + private String accessToken; + + /** + * 状态 + * @see ChannelAuthStatusEnum + */ + @Schema(description = "状态") + private String status; +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/AuthUrlModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/AuthUrlModel.java new file mode 100644 index 000000000..b2b32a1e9 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/AuthUrlModel.java @@ -0,0 +1,22 @@ +package org.dromara.daxpay.single.sdk.model.assist; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 获取OpenId授权链接和查询标识返回类 + * @author xxm + * @since 2024/12/3 + */ +@Data +public class AuthUrlModel { + + + /** 授权访问链接 */ + @Schema(description = "授权访问链接") + private String authUrl; + + /** 查询标识码, 用于查询是否获取到了OpenId */ + @Schema(description = "查询标识码") + private String queryCode; +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/WxAccessTokenModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/WxAccessTokenModel.java deleted file mode 100644 index c6b1e4cd5..000000000 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/WxAccessTokenModel.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.dromara.daxpay.single.sdk.model.assist; - -import lombok.Data; - -/** - * 微信AccessToken - * @author xxm - * @since 2024/2/10 - */ -@Data -public class WxAccessTokenModel{ - - /** 微信AccessToken, 目前无返回 */ - private String accessToken; - - /** 微信用户唯一标识 */ - private String openId; -} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/WxAuthUrlModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/WxAuthUrlModel.java deleted file mode 100644 index 330775c41..000000000 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/assist/WxAuthUrlModel.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.dromara.daxpay.single.sdk.model.assist; - -import lombok.Data; - -/** - * 微信oauth2授权的url连接 - * @author xxm - * @since 2024/2/10 - */ -@Data -public class WxAuthUrlModel{ - - /** 微信oauth2授权的url连接 */ - private String url; -} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/pay/CheckoutUrlModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/pay/CheckoutUrlModel.java new file mode 100644 index 000000000..e1fa82742 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/pay/CheckoutUrlModel.java @@ -0,0 +1,16 @@ +package org.dromara.daxpay.single.sdk.model.trade.pay; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 收银台响应参数 + * @author xxm + * @since 2024/12/3 + */ +@Data +public class CheckoutUrlModel { + @Schema(description = "收银台链接") + private String url; + +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/net/DaxPayRequest.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/net/DaxPayRequest.java index ca9bce224..8f626d087 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/net/DaxPayRequest.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/net/DaxPayRequest.java @@ -1,8 +1,7 @@ package org.dromara.daxpay.single.sdk.net; +import lombok.Data; import org.dromara.daxpay.single.sdk.response.DaxPayResult; -import lombok.Getter; -import lombok.Setter; import java.time.LocalDateTime; @@ -11,8 +10,7 @@ import java.time.LocalDateTime; * @author xxm * @since 2024/2/2 */ -@Getter -@Setter +@Data public abstract class DaxPayRequest { /** 应用号 */ diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocReceiverAddParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocReceiverAddParam.java index 014e71769..b4aeb0488 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocReceiverAddParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocReceiverAddParam.java @@ -1,16 +1,16 @@ package org.dromara.daxpay.single.sdk.param.allocation; -import org.dromara.daxpay.single.sdk.code.AllocReceiverTypeEnum; -import org.dromara.daxpay.single.sdk.code.AllocRelationTypeEnum; -import org.dromara.daxpay.single.sdk.code.ChannelEnum; -import org.dromara.daxpay.single.sdk.net.DaxPayRequest; -import org.dromara.daxpay.single.sdk.response.DaxPayResult; -import org.dromara.daxpay.single.sdk.model.allocation.AllocReceiverAddModel; -import org.dromara.daxpay.single.sdk.util.JsonUtil; import cn.hutool.core.lang.TypeReference; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.code.AllocReceiverTypeEnum; +import org.dromara.daxpay.single.sdk.code.AllocRelationTypeEnum; +import org.dromara.daxpay.single.sdk.code.ChannelEnum; +import org.dromara.daxpay.single.sdk.model.allocation.AllocReceiverAddModel; +import org.dromara.daxpay.single.sdk.net.DaxPayRequest; +import org.dromara.daxpay.single.sdk.response.DaxPayResult; +import org.dromara.daxpay.single.sdk.util.JsonUtil; /** * 分账接收者添加参数 diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/QueryAllocReceiverParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/QueryAllocReceiverParam.java index c6467b62a..03351b921 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/QueryAllocReceiverParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/QueryAllocReceiverParam.java @@ -1,20 +1,22 @@ package org.dromara.daxpay.single.sdk.param.allocation; +import cn.hutool.core.lang.TypeReference; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.model.allocation.AllocReceiverModel; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; import org.dromara.daxpay.single.sdk.util.JsonUtil; -import cn.hutool.core.lang.TypeReference; -import lombok.Getter; -import lombok.Setter; /** * 分账接收方列表参数 * @author xxm * @since 2024/5/21 */ -@Getter -@Setter +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) public class QueryAllocReceiverParam extends DaxPayRequest { /** 分账通道 */ diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/assist/AuthAndSetParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/assist/AuthAndSetParam.java new file mode 100644 index 000000000..2b9205ec8 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/assist/AuthAndSetParam.java @@ -0,0 +1,52 @@ +package org.dromara.daxpay.single.sdk.param.assist; + +import cn.hutool.core.lang.TypeReference; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.net.DaxPayRequest; +import org.dromara.daxpay.single.sdk.response.DaxPayResult; +import org.dromara.daxpay.single.sdk.util.JsonUtil; + +/** + * 设置认证信息请求参数, 次参数不需要进行签名验证, 通过查询码进行认证信息的查询, 主要拥有内部系统使用的场景 + * @author xxm + * @since 2024/12/3 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class AuthAndSetParam extends DaxPayRequest { + + @Schema(description = "支付通道") + private String channel; + + @Schema(description = "认证标识码") + private String authCode; + + /** 用于查询Code值, 不可为空 */ + @Schema(description = "查询码") + private String queryCode; + + /** + * 方法请求路径 + * + * @return 请求路径 + */ + @Override + public String path() { + return "/assist/channel/auth/authAndSet"; + } + + /** + * 将请求返回结果反序列化为实体类 + * + * @param json json字符串 + * @return 反序列后的对象 + */ + @Override + public DaxPayResult toModel(String json) { + return JsonUtil.toBean(json, new TypeReference>() {}); + } +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/assist/AuthCodeParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/assist/AuthCodeParam.java new file mode 100644 index 000000000..fcdcdbafa --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/assist/AuthCodeParam.java @@ -0,0 +1,54 @@ +package org.dromara.daxpay.single.sdk.param.assist; + +import cn.hutool.core.lang.TypeReference; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.model.assist.AuthModel; +import org.dromara.daxpay.single.sdk.net.DaxPayRequest; +import org.dromara.daxpay.single.sdk.response.DaxPayResult; +import org.dromara.daxpay.single.sdk.util.JsonUtil; + +/** + * 获取认证信息请求参数 + * @author xxm + * @since 2024/12/3 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class AuthCodeParam extends DaxPayRequest { + + + @Schema(description = "支付通道") + private String channel; + + @Schema(description = "认证标识码") + private String authCode; + + /** 用于查询Code值, 可以为空 */ + @Schema(description = "查询码") + private String queryCode; + + /** + * 方法请求路径 + * + * @return 请求路径 + */ + @Override + public String path() { + return "/assist/channel/auth/auth"; + } + + /** + * 将请求返回结果反序列化为实体类 + * + * @param json json字符串 + * @return 反序列后的对象 + */ + @Override + public DaxPayResult toModel(String json) { + return JsonUtil.toBean(json, new TypeReference>() {}); + } +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/assist/GenerateAuthUrlParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/assist/GenerateAuthUrlParam.java new file mode 100644 index 000000000..e6cb1fbf7 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/assist/GenerateAuthUrlParam.java @@ -0,0 +1,55 @@ +package org.dromara.daxpay.single.sdk.param.assist; + +import cn.hutool.core.lang.TypeReference; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.model.assist.AuthUrlModel; +import org.dromara.daxpay.single.sdk.net.DaxPayRequest; +import org.dromara.daxpay.single.sdk.response.DaxPayResult; +import org.dromara.daxpay.single.sdk.util.JsonUtil; + +/** + * 生成授权链接参数 + * @author xxm + * @since 2024/12/3 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class GenerateAuthUrlParam extends DaxPayRequest { + + /** + * 支付通道 + */ + @Schema(description = "支付通道") + private String channel; + + /** + * 自定义授权重定向地址, 如果不传, 使用系统提供的默认地址 + */ + @Schema(description = "授权重定向地址") + private String authRedirectUrl; + + /** + * 方法请求路径 + * + * @return 请求路径 + */ + @Override + public String path() { + return "/assist/channel/auth/generateAuthUrl"; + } + + /** + * 将请求返回结果反序列化为实体类 + * + * @param json json字符串 + * @return 反序列后的对象 + */ + @Override + public DaxPayResult toModel(String json) { + return JsonUtil.toBean(json, new TypeReference>() {}); + } +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/channel/AlipayParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/channel/AlipayParam.java index b0ea564d7..a93f76c53 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/channel/AlipayParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/channel/AlipayParam.java @@ -1,16 +1,16 @@ package org.dromara.daxpay.single.sdk.param.channel; +import lombok.Data; +import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.param.ChannelParam; -import lombok.Getter; -import lombok.Setter; /** * 支付宝支付参数 * @author xxm * @since 2021/2/27 */ -@Getter -@Setter +@Data +@Accessors(chain = true) public class AlipayParam implements ChannelParam { /** diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/channel/UnionPayParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/channel/UnionPayParam.java index 1712181e4..063a2d930 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/channel/UnionPayParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/channel/UnionPayParam.java @@ -1,16 +1,16 @@ package org.dromara.daxpay.single.sdk.param.channel; +import lombok.Data; +import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.param.ChannelParam; -import lombok.Getter; -import lombok.Setter; /** * 云闪付参数 * @author xxm * @since 2024/3/13 */ -@Getter -@Setter +@Data +@Accessors(chain = true) public class UnionPayParam implements ChannelParam { /** 授权码(主动扫描用户的付款码) */ diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/channel/WechatPayParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/channel/WechatPayParam.java index f5355face..f69d6b83c 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/channel/WechatPayParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/channel/WechatPayParam.java @@ -1,16 +1,16 @@ package org.dromara.daxpay.single.sdk.param.channel; +import lombok.Data; +import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.param.ChannelParam; -import lombok.Getter; -import lombok.Setter; /** * 微信支付参数 * @author xxm * @since 2021/6/21 */ -@Getter -@Setter +@Data +@Accessors(chain = true) public class WechatPayParam implements ChannelParam { /** 微信openId */ diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/reconcile/ChannelReconcileDownParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/reconcile/ChannelReconcileDownParam.java index 3e3ad8ae0..6d5d5667a 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/reconcile/ChannelReconcileDownParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/reconcile/ChannelReconcileDownParam.java @@ -1,5 +1,6 @@ package org.dromara.daxpay.single.sdk.param.reconcile; +import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; import org.dromara.daxpay.single.sdk.model.reconcile.ReconcileDownModel; @@ -18,7 +19,7 @@ import java.time.LocalDate; */ @EqualsAndHashCode(callSuper = true) @Data -@Schema(title = "对账下载参数") +@Accessors(chain = true) public class ChannelReconcileDownParam extends DaxPayRequest { @Schema(description = "通道") private String channel; diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/reconcile/PlatformReconcileDownParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/reconcile/PlatformReconcileDownParam.java index 0c13c8fb5..197b89ab1 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/reconcile/PlatformReconcileDownParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/reconcile/PlatformReconcileDownParam.java @@ -1,5 +1,8 @@ package org.dromara.daxpay.single.sdk.param.reconcile; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; import org.dromara.daxpay.single.sdk.model.reconcile.ReconcileDownModel; @@ -14,6 +17,9 @@ import java.time.LocalDate; * @author xxm * @since 2024/8/21 */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) public class PlatformReconcileDownParam extends DaxPayRequest { @Schema(description = "通道") private String channel; diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/CheckoutCreatParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/CheckoutCreatParam.java new file mode 100644 index 000000000..307434f90 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/CheckoutCreatParam.java @@ -0,0 +1,101 @@ +package org.dromara.daxpay.single.sdk.param.trade.pay; + +import cn.hutool.core.lang.TypeReference; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.code.CheckoutTypeEnum; +import org.dromara.daxpay.single.sdk.model.trade.pay.CheckoutUrlModel; +import org.dromara.daxpay.single.sdk.net.DaxPayRequest; +import org.dromara.daxpay.single.sdk.response.DaxPayResult; +import org.dromara.daxpay.single.sdk.util.JsonUtil; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 收银台创建参数 + * @author xxm + * @since 2024/12/3 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class CheckoutCreatParam extends DaxPayRequest { + + /** + * 收银台类型 + * @see CheckoutTypeEnum + */ + @Size(max = 100, message = "收银台类型不可超过32位") + private String checkoutType; + + /** 商户订单号 */ + @Schema(description = "商户订单号") + private String bizOrderNo; + + /** 支付标题 */ + @Schema(description = "支付标题") + private String title; + + /** 支付描述 */ + @Schema(description = "支付描述") + private String description; + + /** 是否开启分账 */ + @Schema(description = "是否开启分账") + private Boolean allocation; + + /** 自动分账 */ + @Schema(description = "自动分账") + private Boolean autoAllocation; + + /** 过期时间 */ + @Schema(description = "过期时间") + private LocalDateTime expiredTime; + + /** 支付金额 */ + @Schema(description = "支付金额") + private BigDecimal amount; + + /** + * 支付扩展参数 + */ + @Schema(description = "支付扩展参数") + private String extraParam; + + /** 商户扩展参数,回调时会原样返回 */ + @Schema(description = "商户扩展参数") + private String attach; + + /** 同步跳转地址, 支付完毕后用户浏览器返回到该地址, 不传输跳转到默认地址 */ + @Schema(description = "同步通知URL") + private String returnUrl; + + /** 异步通知地址 */ + @Schema(description = "异步通知地址") + private String notifyUrl; + + /** + * 方法请求路径 + * + * @return 请求路径 + */ + @Override + public String path() { + return "/unipay/checkout/creat"; + } + + /** + * 将请求返回结果反序列化为实体类 + * + * @param json json字符串 + * @return 反序列后的对象 + */ + @Override + public DaxPayResult toModel(String json) { + return JsonUtil.toBean(json, new TypeReference>() {}); + } +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PayCloseParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PayCloseParam.java index b07f61632..581378f09 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PayCloseParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PayCloseParam.java @@ -1,19 +1,21 @@ package org.dromara.daxpay.single.sdk.param.trade.pay; +import cn.hutool.core.lang.TypeReference; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; import org.dromara.daxpay.single.sdk.util.JsonUtil; -import cn.hutool.core.lang.TypeReference; -import lombok.Getter; -import lombok.Setter; /** * 支付关闭参数 * @author xxm * @since 2023/12/17 */ -@Getter -@Setter +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) public class PayCloseParam extends DaxPayRequest { /** diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PayParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PayParam.java index d927cd286..3e57b0744 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PayParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PayParam.java @@ -1,16 +1,17 @@ package org.dromara.daxpay.single.sdk.param.trade.pay; +import cn.hutool.core.lang.TypeReference; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.code.ChannelEnum; import org.dromara.daxpay.single.sdk.code.PayMethodEnum; +import org.dromara.daxpay.single.sdk.model.trade.pay.PayResultModel; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.param.channel.AlipayParam; import org.dromara.daxpay.single.sdk.param.channel.WechatPayParam; import org.dromara.daxpay.single.sdk.response.DaxPayResult; -import org.dromara.daxpay.single.sdk.model.trade.pay.PayResultModel; import org.dromara.daxpay.single.sdk.util.JsonUtil; -import cn.hutool.core.lang.TypeReference; -import lombok.Getter; -import lombok.Setter; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -20,8 +21,9 @@ import java.time.LocalDateTime; * @author xxm * @since 2024/2/2 */ -@Getter -@Setter +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) public class PayParam extends DaxPayRequest { /** 商户订单号 */ diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PayQueryParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PayQueryParam.java index f3d82a476..defa72a59 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PayQueryParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PayQueryParam.java @@ -1,5 +1,6 @@ package org.dromara.daxpay.single.sdk.param.trade.pay; +import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; import org.dromara.daxpay.single.sdk.model.trade.pay.PayOrderModel; @@ -15,6 +16,7 @@ import lombok.EqualsAndHashCode; */ @EqualsAndHashCode(callSuper = true) @Data +@Accessors(chain = true) public class PayQueryParam extends DaxPayRequest { /** 订单号 */ diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PaySyncParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PaySyncParam.java index 6bdd80c77..4b738918f 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PaySyncParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/pay/PaySyncParam.java @@ -1,20 +1,22 @@ package org.dromara.daxpay.single.sdk.param.trade.pay; +import cn.hutool.core.lang.TypeReference; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.model.trade.pay.PaySyncModel; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; -import org.dromara.daxpay.single.sdk.model.trade.pay.PaySyncModel; import org.dromara.daxpay.single.sdk.util.JsonUtil; -import cn.hutool.core.lang.TypeReference; -import lombok.Getter; -import lombok.Setter; /** *支付同步参数 * @author xxm * @since 2024/2/5 */ -@Getter -@Setter +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) public class PaySyncParam extends DaxPayRequest { /** 订单号 */ diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/refund/RefundParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/refund/RefundParam.java index 40da8efd9..5279b5267 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/refund/RefundParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/refund/RefundParam.java @@ -1,17 +1,17 @@ package org.dromara.daxpay.single.sdk.param.trade.refund; +import cn.hutool.core.lang.TypeReference; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.model.trade.refund.RefundModel; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.param.ChannelParam; import org.dromara.daxpay.single.sdk.param.channel.AlipayParam; import org.dromara.daxpay.single.sdk.param.channel.UnionPayParam; import org.dromara.daxpay.single.sdk.param.channel.WechatPayParam; import org.dromara.daxpay.single.sdk.response.DaxPayResult; -import org.dromara.daxpay.single.sdk.model.trade.refund.RefundModel; import org.dromara.daxpay.single.sdk.util.JsonUtil; -import cn.hutool.core.lang.TypeReference; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; import java.math.BigDecimal; @@ -20,9 +20,9 @@ import java.math.BigDecimal; * @author xxm * @since 2023/12/18 */ -@Getter -@Setter -@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) public class RefundParam extends DaxPayRequest { diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/refund/RefundQueryParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/refund/RefundQueryParam.java index 370fd5352..739a55a1d 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/refund/RefundQueryParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/refund/RefundQueryParam.java @@ -1,5 +1,6 @@ package org.dromara.daxpay.single.sdk.param.trade.refund; +import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; import org.dromara.daxpay.single.sdk.model.trade.refund.RefundOrderModel; @@ -15,6 +16,7 @@ import lombok.EqualsAndHashCode; */ @EqualsAndHashCode(callSuper = true) @Data +@Accessors(chain = true) public class RefundQueryParam extends DaxPayRequest { diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/refund/RefundSyncParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/refund/RefundSyncParam.java index 68a8be9b2..89218929a 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/refund/RefundSyncParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/refund/RefundSyncParam.java @@ -1,20 +1,22 @@ package org.dromara.daxpay.single.sdk.param.trade.refund; +import cn.hutool.core.lang.TypeReference; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.model.trade.refund.RefundSyncModel; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; -import org.dromara.daxpay.single.sdk.model.trade.refund.RefundSyncModel; import org.dromara.daxpay.single.sdk.util.JsonUtil; -import cn.hutool.core.lang.TypeReference; -import lombok.Getter; -import lombok.Setter; /** * 退款同步参数 * @author xxm * @since 2024/2/7 */ -@Getter -@Setter +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) public class RefundSyncParam extends DaxPayRequest { /** 退款号 */ diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferParam.java index 92ad56181..4dc870552 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferParam.java @@ -1,15 +1,15 @@ package org.dromara.daxpay.single.sdk.param.trade.transfer; +import cn.hutool.core.lang.TypeReference; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.code.ChannelEnum; import org.dromara.daxpay.single.sdk.code.TransferPayeeTypeEnum; +import org.dromara.daxpay.single.sdk.model.trade.transfer.TransferModel; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; -import org.dromara.daxpay.single.sdk.model.trade.transfer.TransferModel; import org.dromara.daxpay.single.sdk.util.JsonUtil; -import cn.hutool.core.lang.TypeReference; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; import java.math.BigDecimal; @@ -18,9 +18,9 @@ import java.math.BigDecimal; * @author xxm * @since 2024/6/19 */ -@Getter -@Setter -@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) public class TransferParam extends DaxPayRequest { /** 商户转账号 */ diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferQueryParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferQueryParam.java index c415146ab..ff6f83edb 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferQueryParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferQueryParam.java @@ -1,22 +1,22 @@ package org.dromara.daxpay.single.sdk.param.trade.transfer; +import cn.hutool.core.lang.TypeReference; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.model.trade.transfer.TransferOrderModel; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; -import org.dromara.daxpay.single.sdk.model.trade.transfer.TransferOrderModel; import org.dromara.daxpay.single.sdk.util.JsonUtil; -import cn.hutool.core.lang.TypeReference; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; /** * * @author xxm * @since 2024/6/20 */ -@Getter -@Setter -@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) public class TransferQueryParam extends DaxPayRequest { /** 商户转账号 */ diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferSyncParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferSyncParam.java index 2be454ae0..ce5c2d128 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferSyncParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferSyncParam.java @@ -1,20 +1,22 @@ package org.dromara.daxpay.single.sdk.param.trade.transfer; +import cn.hutool.core.lang.TypeReference; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.model.trade.refund.RefundSyncModel; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; import org.dromara.daxpay.single.sdk.util.JsonUtil; -import cn.hutool.core.lang.TypeReference; -import lombok.Getter; -import lombok.Setter; /** * 转账订单同步参数 * @author xxm * @since 2024/2/7 */ -@Getter -@Setter +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) public class TransferSyncParam extends DaxPayRequest { /** 商户转账号 */ diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/response/DaxPayResult.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/response/DaxPayResult.java index 48ebc5421..511ce04b3 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/response/DaxPayResult.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/response/DaxPayResult.java @@ -1,9 +1,7 @@ package org.dromara.daxpay.single.sdk.response; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; +import lombok.Data; import java.time.LocalDateTime; @@ -12,9 +10,7 @@ import java.time.LocalDateTime; * @author xxm * @since 2024/2/2 */ -@Getter -@Setter -@ToString +@Data public class DaxPayResult { /** 状态码 */ diff --git a/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/assist/AuthAssistTest.java b/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/assist/AuthAssistTest.java new file mode 100644 index 000000000..dbde2f2c0 --- /dev/null +++ b/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/assist/AuthAssistTest.java @@ -0,0 +1,75 @@ +package org.dromara.daxpay.single.sdk.test.assist; + +import org.dromara.daxpay.single.sdk.code.ChannelEnum; +import org.dromara.daxpay.single.sdk.code.SignTypeEnum; +import org.dromara.daxpay.single.sdk.model.assist.AuthModel; +import org.dromara.daxpay.single.sdk.model.assist.AuthUrlModel; +import org.dromara.daxpay.single.sdk.net.DaxPayConfig; +import org.dromara.daxpay.single.sdk.net.DaxPayKit; +import org.dromara.daxpay.single.sdk.param.assist.AuthAndSetParam; +import org.dromara.daxpay.single.sdk.param.assist.AuthCodeParam; +import org.dromara.daxpay.single.sdk.param.assist.GenerateAuthUrlParam; +import org.dromara.daxpay.single.sdk.response.DaxPayResult; +import org.dromara.daxpay.single.sdk.util.JsonUtil; +import org.junit.Before; +import org.junit.Test; + +/** + * 认证服务测试类 + * @author xxm + * @since 2024/12/3 + */ +public class AuthAssistTest { + @Before + public void init() { + // 初始化支付配置 + DaxPayConfig config = DaxPayConfig.builder() + .serviceUrl("http://127.0.0.1:9999") + .signSecret("123456") + .appId("M7934041241299655") + .signType(SignTypeEnum.HMAC_SHA256) + .build(); + DaxPayKit.initConfig(config); + } + + /** + * 获取认证链接 + */ + @Test + public void generateAuthUrl(){ + GenerateAuthUrlParam param = new GenerateAuthUrlParam(); + param.setChannel(ChannelEnum.WECHAT.getCode()); + param.setClientIp("127.0.0.1"); + DaxPayResult execute = DaxPayKit.execute(param); + System.out.println(JsonUtil.toJsonStr(execute)); + } + + /** + * 获取认证信息 + */ + @Test + public void auth(){ + AuthCodeParam param = new AuthCodeParam(); + param.setChannel(ChannelEnum.WECHAT.getCode()); + param.setAuthCode("auth"); + param.setClientIp("127.0.0.1"); + DaxPayResult execute = DaxPayKit.execute(param); + System.out.println(JsonUtil.toJsonStr(execute)); + } + + /** + * 设置认证信息. 不需要签名 + */ + @Test + public void authAndSet(){ + AuthAndSetParam param = new AuthAndSetParam(); + param.setChannel(ChannelEnum.WECHAT.getCode()); + param.setAuthCode("auth"); + param.setQueryCode("query13585312378555"); + param.setClientIp("127.0.0.1"); + DaxPayResult execute = DaxPayKit.execute(param,false); + System.out.println(JsonUtil.toJsonStr(execute)); + } + + +} diff --git a/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/trade/CheckoutPayTest.java b/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/trade/CheckoutPayTest.java new file mode 100644 index 000000000..406bbc634 --- /dev/null +++ b/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/trade/CheckoutPayTest.java @@ -0,0 +1,57 @@ +package org.dromara.daxpay.single.sdk.test.trade; + +import org.dromara.daxpay.single.sdk.code.CheckoutTypeEnum; +import org.dromara.daxpay.single.sdk.code.SignTypeEnum; +import org.dromara.daxpay.single.sdk.model.trade.pay.CheckoutUrlModel; +import org.dromara.daxpay.single.sdk.net.DaxPayConfig; +import org.dromara.daxpay.single.sdk.net.DaxPayKit; +import org.dromara.daxpay.single.sdk.param.trade.pay.CheckoutCreatParam; +import org.dromara.daxpay.single.sdk.response.DaxPayResult; +import org.dromara.daxpay.single.sdk.util.JsonUtil; +import org.dromara.daxpay.single.sdk.util.PaySignUtil; +import org.junit.Before; +import org.junit.Test; + +import java.math.BigDecimal; + +/** + * 收银台测试类 + * @author xxm + * @since 2024/12/3 + */ +public class CheckoutPayTest { + + @Before + public void init() { + // 初始化支付配置 + DaxPayConfig config = DaxPayConfig.builder() + .serviceUrl("http://127.0.0.1:9999") + .signSecret("123456") + .appId("M7934041241299655") + .signType(SignTypeEnum.HMAC_SHA256) + .build(); + DaxPayKit.initConfig(config); + } + + /** + * 获取收银台链接 + */ + @Test + public void creatCheck() { + CheckoutCreatParam param = new CheckoutCreatParam(); + param.setClientIp("127.0.0.1"); + param.setBizOrderNo("SDK_"+ System.currentTimeMillis()); + param.setTitle("测试收银台支付"); + param.setDescription("这是支付备注"); + param.setCheckoutType(CheckoutTypeEnum.AGGREGATE.getCode()); + param.setAmount(BigDecimal.valueOf(1.00)); + param.setAttach("{回调参数}"); + param.setAllocation(false); + param.setReturnUrl("https://abc.com/returnurl"); + param.setNotifyUrl("http://127.0.0.1:10880/test/callback/notify"); + + DaxPayResult execute = DaxPayKit.execute(param); + System.out.println(JsonUtil.toJsonStr(execute)); + System.out.println(PaySignUtil.hmacSha256Sign(execute, "123456")); + } +} diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutAggregateEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutAggregateEnum.java index 305ef678c..fbf5a3f56 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutAggregateEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutAggregateEnum.java @@ -17,7 +17,7 @@ import java.util.Objects; @AllArgsConstructor public enum CheckoutAggregateEnum { - WECHAT("wechat", "微信支付"), + WECHAT("wechat_pay", "微信支付"), ALIPAY("alipay", "支付宝"), ; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAggregatePayParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAggregatePayParam.java index ed8883d82..df0f03414 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAggregatePayParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAggregatePayParam.java @@ -1,6 +1,8 @@ package org.dromara.daxpay.core.param.checkout; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; import lombok.Data; import lombok.experimental.Accessors; import org.dromara.daxpay.core.enums.CheckoutAggregateEnum; @@ -15,17 +17,23 @@ import org.dromara.daxpay.core.enums.CheckoutAggregateEnum; @Schema(title = "收银台聚合支付参数") public class CheckoutAggregatePayParam { - @Schema(description = "要支付的订单号") + /** 支付订单号 */ + @NotBlank(message = "支付订单号不可为空") + @Size(max = 32, message = "支付订单号不可超过32位") + @Schema(description = "支付订单号") private String orderNo; /** * 聚合支付类型 * @see CheckoutAggregateEnum */ + @NotBlank(message = "聚合支付类型不可为空") @Schema(description = "聚合支付类型") private String aggregateType; - @Schema(description = "唯一标识") + /** 用户唯一标识 */ + @Size(max = 1024, message = "唯一标识不可超过1024位") + @Schema(description = "用户唯一标识") private String openId; } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthCodeParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthCodeParam.java index 19704c665..234e7cca3 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthCodeParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAuthCodeParam.java @@ -1,6 +1,7 @@ package org.dromara.daxpay.core.param.checkout; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import lombok.Data; import lombok.experimental.Accessors; import org.dromara.daxpay.core.enums.CheckoutAggregateEnum; @@ -15,8 +16,9 @@ import org.dromara.daxpay.core.enums.CheckoutAggregateEnum; @Schema(title = "获取收银台认证结果参数") public class CheckoutAuthCodeParam { - /** 要支付的订单号 */ - @Schema(description = "要支付的订单号") + /** 支付订单号 */ + @NotBlank(message = "支付订单号不可为空") + @Schema(description = "支付订单号") private String orderNo; /** diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutCreatParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutCreatParam.java index 2484ef04d..40590ead1 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutCreatParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutCreatParam.java @@ -28,6 +28,7 @@ public class CheckoutCreatParam extends PaymentCommonParam { * 收银台类型 * @see CheckoutTypeEnum */ + @Size(max = 100, message = "收银台类型不可超过32位") @NotBlank(message = "收银台类型不可为空") private String checkoutType; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/ChannelUniAuthController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/ChannelUniAuthController.java index 3b90cfd4d..c543f1df1 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/ChannelUniAuthController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/ChannelUniAuthController.java @@ -3,7 +3,9 @@ package org.dromara.daxpay.service.controller.unipay; import cn.bootx.platform.core.annotation.IgnoreAuth; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; -import cn.bootx.platform.core.util.ValidationUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; import org.dromara.daxpay.core.param.assist.AuthCodeParam; import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; import org.dromara.daxpay.core.result.DaxResult; @@ -13,9 +15,6 @@ import org.dromara.daxpay.core.util.DaxRes; import org.dromara.daxpay.service.common.anno.PaymentVerify; import org.dromara.daxpay.service.service.assist.ChannelAuthService; import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -37,10 +36,10 @@ public class ChannelUniAuthController { private final PaymentAssistService paymentAssistService; + @PaymentVerify @Operation(summary = "获取授权链接") @PostMapping("/generateAuthUrl") public Result generateAuthUrl(@RequestBody GenerateAuthUrlParam param){ - ValidationUtil.validateParam(param); paymentAssistService.initMchApp(param.getAppId()); return Res.ok(channelAuthService.generateAuthUrl(param)); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java index c73967afd..f993ee1ca 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java @@ -7,16 +7,14 @@ import cn.bootx.platform.core.util.ValidationUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.core.param.checkout.CheckoutAuthCodeParam; -import org.dromara.daxpay.core.param.checkout.CheckoutAuthUrlParam; -import org.dromara.daxpay.core.param.checkout.CheckoutCreatParam; -import org.dromara.daxpay.core.param.checkout.CheckoutPayParam; +import org.dromara.daxpay.core.param.checkout.*; import org.dromara.daxpay.core.result.DaxResult; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.checkout.CheckoutAggregateOrderAndConfigResult; import org.dromara.daxpay.core.result.checkout.CheckoutOrderAndConfigResult; import org.dromara.daxpay.core.result.checkout.CheckoutPayResult; import org.dromara.daxpay.core.result.checkout.CheckoutUrlResult; +import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.core.util.DaxRes; import org.dromara.daxpay.service.common.anno.PaymentVerify; import org.dromara.daxpay.service.service.checkout.CheckoutQueryService; @@ -28,6 +26,7 @@ import org.springframework.web.bind.annotation.*; * @author xxm * @since 2024/11/26 */ +@IgnoreAuth @Tag(name = "收银台服务") @RestController @RequestMapping("/unipay/checkout") @@ -43,21 +42,18 @@ public class CheckoutController { return DaxRes.ok(checkoutService.creat(checkoutParam)); } - @IgnoreAuth @Operation(summary = "获取收银台订单和配置信息") @GetMapping("/getOrderAndConfig") public Result getOrderAndConfig(String orderNo, String checkoutType){ return Res.ok(checkoutQueryService.getOrderAndConfig(orderNo, checkoutType)); } - @IgnoreAuth @Operation(summary = "获取聚合支付配置") @GetMapping("/getAggregateConfig") public Result getAggregateConfig(String orderNo, String aggregateType){ return Res.ok(checkoutQueryService.getAggregateConfig(orderNo, aggregateType)); } - @IgnoreAuth @Operation(summary = "获取收银台所需授权链接, 用于获取OpenId一类的信息") @PostMapping("/generateAuthUrl") public Result generateAuthUrl(@RequestBody CheckoutAuthUrlParam param){ @@ -65,7 +61,6 @@ public class CheckoutController { return Res.ok(checkoutService.generateAuthUrl(param)); } - @IgnoreAuth @Operation(summary = "获取授权结果") @PostMapping("/auth") public Result auth(@RequestBody CheckoutAuthCodeParam param){ @@ -74,11 +69,21 @@ public class CheckoutController { } - @IgnoreAuth - @Operation(summary = "发起支付") + @Operation(summary = "发起支付(普通)") @PostMapping("/pay") - public Result pay(@RequestBody CheckoutPayParam checkoutParam){ - return Res.ok(checkoutService.pay(checkoutParam)); + public Result pay(@RequestBody CheckoutPayParam param){ + ValidationUtil.validateParam(param); + return Res.ok(checkoutService.pay(param)); } + + @Operation(summary = "发起支付(聚合)") + @PostMapping("/aggregatePay") + public Result aggregatePay(@RequestBody CheckoutAggregatePayParam param){ + ValidationUtil.validateParam(param); + return Res.ok(checkoutService.aggregatePay(param)); + } + + + } From 554aa7e123281bf1bf4422f5020ab17455dc2fdd Mon Sep 17 00:00:00 2001 From: bootx Date: Tue, 3 Dec 2024 22:10:58 +0800 Subject: [PATCH 05/54] =?UTF-8?q?perf=20=E4=BC=98=E5=8C=96=E6=94=B6?= =?UTF-8?q?=E9=93=B6=E5=8F=B0=E6=94=AF=E4=BB=98=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/enums/CheckoutCallTypeEnum.java | 2 +- .../checkout/CheckoutGroupConfigResult.java | 3 --- .../CheckoutOrderAndConfigResult.java | 3 +-- .../result/checkout/CheckoutPayResult.java | 27 ------------------- .../controller/unipay/CheckoutController.java | 3 +-- .../checkout/CheckoutAssistService.java | 4 +++ .../service/checkout/CheckoutService.java | 17 ++++++------ 7 files changed, 15 insertions(+), 44 deletions(-) delete mode 100644 daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutPayResult.java diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java index 0fe7b721a..5146b505e 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java @@ -20,7 +20,7 @@ public enum CheckoutCallTypeEnum { QR_CODE("qr_code", "扫码支付"), BAR_CODE("bar_code", "条码支付"), LINK("link", "跳转链接"), - MINI_APP("mini_app", "小程序支付"), + JSAPI("jsapi", "JSAPI"), AGGREGATE("aggregate", "聚合支付"), APP("app", "APP支付"), ; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutGroupConfigResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutGroupConfigResult.java index d1e3eca04..886322983 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutGroupConfigResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutGroupConfigResult.java @@ -17,9 +17,6 @@ import java.util.List; @Schema(title = "收银台分类配置") public class CheckoutGroupConfigResult{ - @Schema(description = "主键") - private Long id; - /** * 类型 web/h5/小程序 * @see CheckoutTypeEnum diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutOrderAndConfigResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutOrderAndConfigResult.java index 240d86eb5..0bc78015d 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutOrderAndConfigResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutOrderAndConfigResult.java @@ -21,11 +21,10 @@ public class CheckoutOrderAndConfigResult { private CheckoutOrderResult order; /** 收银台配置信息 */ - @Schema(description = "配置信息") + @Schema(description = "收银台配置信息") private CheckoutConfigResult config; /** 收银台分类配置信息 */ @Schema(description = "分类配置信息") private List groupConfigs; - } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutPayResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutPayResult.java deleted file mode 100644 index 4a574fbbf..000000000 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutPayResult.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.dromara.daxpay.core.result.checkout; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; -import org.dromara.daxpay.core.enums.PayStatusEnum; - -/** - * 收银台支付结果 - * @author xxm - * @since 2024/11/29 - */ -@Data -@Accessors(chain = true) -@Schema(title = "收银台支付结果") -public class CheckoutPayResult { - - /** 链接 */ - private String url; - - /** - * 支付状态 - * @see PayStatusEnum - */ - @Schema(description = "支付结果") - private String payStatus; -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java index f993ee1ca..0944bfa57 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java @@ -12,7 +12,6 @@ import org.dromara.daxpay.core.result.DaxResult; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.checkout.CheckoutAggregateOrderAndConfigResult; import org.dromara.daxpay.core.result.checkout.CheckoutOrderAndConfigResult; -import org.dromara.daxpay.core.result.checkout.CheckoutPayResult; import org.dromara.daxpay.core.result.checkout.CheckoutUrlResult; import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.core.util.DaxRes; @@ -71,7 +70,7 @@ public class CheckoutController { @Operation(summary = "发起支付(普通)") @PostMapping("/pay") - public Result pay(@RequestBody CheckoutPayParam param){ + public Result pay(@RequestBody CheckoutPayParam param){ ValidationUtil.validateParam(param); return Res.ok(checkoutService.pay(param)); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java index ef8dc4018..c95ebab37 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java @@ -78,6 +78,10 @@ public class CheckoutAssistService { if (Objects.equals(payOrder.getRefundStatus(), PayRefundStatusEnum.REFUNDING.getCode())) { throw new TradeStatusErrorException("该订单处于退款状态"); } + // 待支付和支付中返回订单对象 + if (List.of(PayStatusEnum.WAIT.getCode(), PayStatusEnum.PROGRESS.getCode()).contains(payOrder.getStatus())){ + return payOrder; + } // 其他状态直接抛出兜底异常 throw new TradeStatusErrorException("订单不是待支付状态,请重新确认订单状态"); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java index 24b038688..4d7ade206 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java @@ -17,7 +17,6 @@ import org.dromara.daxpay.core.param.assist.AuthCodeParam; import org.dromara.daxpay.core.param.checkout.*; import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.result.assist.AuthResult; -import org.dromara.daxpay.core.result.checkout.CheckoutPayResult; import org.dromara.daxpay.core.result.checkout.CheckoutUrlResult; import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.service.dao.config.checkout.CheckoutAggregateConfigManager; @@ -114,7 +113,7 @@ public class CheckoutService { /** * 支付调用 */ - public CheckoutPayResult pay(CheckoutPayParam param){ + public PayResult pay(CheckoutPayParam param){ // 订单信息 PayOrder payOrder = checkoutAssistService.getOrderAndCheck(param.getOrderNo()); paymentAssistService.initMchApp(payOrder.getAppId()); @@ -124,14 +123,17 @@ public class CheckoutService { // 判断支付调用类型 CheckoutCallTypeEnum callTypeEnum = CheckoutCallTypeEnum.findBuyCode(itemConfig.getCallType()); switch (callTypeEnum) { - case QR_CODE, LINK, BAR_CODE -> { + case QR_CODE, LINK, BAR_CODE,JSAPI -> { return this.checkoutPay(param, payOrder); } case AGGREGATE -> { PlatformConfig config = platformConfigService.getConfig(); // 直接返回手机端的聚合收银台链接 String url = StrUtil.format("{}/aggregate/{}", config.getGatewayPcUrl(), payOrder.getOrderNo()); - return new CheckoutPayResult().setUrl(url).setPayStatus(PayStatusEnum.WAIT.getCode()); + PayResult payResult = new PayResult(); + payResult.setPayBody(url); + payResult.setStatus(PayStatusEnum.WAIT.getCode()); + return payResult; } default -> throw new UnsupportedAbilityException("不支持的支付调用类型"); } @@ -140,7 +142,7 @@ public class CheckoutService { /** * 处理参数使用通用支付接口调起支付 */ - private CheckoutPayResult checkoutPay(CheckoutPayParam param, PayOrder payOrder){ + private PayResult checkoutPay(CheckoutPayParam param, PayOrder payOrder){ // 查询配置 CheckoutItemConfig itemConfig = checkoutItemConfigManager.findByIdAndAppId(param.getItemId(),payOrder.getAppId()) .orElseThrow(() -> new TradeProcessingException("支付配置项不存在")); @@ -159,10 +161,7 @@ public class CheckoutService { // 进行参数预处理 cashierStrategy.handlePayParam(param, payParam); // 发起支付 - PayResult payResult = payService.pay(payParam, payOrder); - return new CheckoutPayResult() - .setUrl(payResult.getPayBody()) - .setPayStatus(payResult.getStatus()); + return payService.pay(payParam, payOrder); } /** From 947817e12db0f7b6b6478f6b7a96ea17384ecc48 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Wed, 4 Dec 2024 15:12:28 +0800 Subject: [PATCH 06/54] =?UTF-8?q?feat(core):=20=E5=AE=8C=E5=96=84=E6=94=B6?= =?UTF-8?q?=E9=93=B6=E5=8F=B0=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增小程序支付方式 - 更新聚合支付名称 - 添加收银台签名接口 - 实现收银台链接创建功能 -优化收银台配置查询 - 修复聚合支付URL生成逻辑- 优化微信授权URL生成格式 --- .../service/assist/WechatAuthService.java | 2 +- .../strategy/WechatCheckoutStrategy.java | 2 +- .../core/enums/CheckoutCallTypeEnum.java | 3 ++- .../daxpay/core/enums/CheckoutTypeEnum.java | 3 ++- .../develop/DevelopTradeController.java | 23 +++++++++++++++---- .../checkout/CheckoutGroupConfigManager.java | 11 +-------- .../service/checkout/CheckoutService.java | 5 ++-- .../checkout/CheckoutConfigQueryService.java | 2 +- .../service/develop/DevelopTradeService.java | 16 +++++++++++++ 9 files changed, 45 insertions(+), 22 deletions(-) diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java index f6631190d..60205fdb3 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java @@ -75,7 +75,7 @@ public class WechatAuthService { PlatformConfig platformConfig = platformConfigService.getConfig(); serverUrl = platformConfig.getGatewayMobileUrl(); } - String redirectUrl = StrUtil.format("{}/{}", serverUrl, authPath); + String redirectUrl = StrUtil.format("{}{}", serverUrl, authPath); return wxMpService.getOAuth2Service().buildAuthorizationUrl(redirectUrl, WxConsts.OAuth2Scope.SNSAPI_BASE, ""); } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java index a9ca3b579..802c3516b 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java @@ -41,7 +41,7 @@ public class WechatCheckoutStrategy extends AbsCheckoutStrategy { */ @Override public String generateAuthUrl(String orderNo) { - String redirectUrl = StrUtil.format("/checkout/wechat/{}", orderNo); + String redirectUrl = StrUtil.format("/aggregate/wechat/{}", orderNo); return wechatAuthService.generateInnerAuthUrl(redirectUrl); } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java index 5146b505e..43c6f72a1 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java @@ -20,9 +20,10 @@ public enum CheckoutCallTypeEnum { QR_CODE("qr_code", "扫码支付"), BAR_CODE("bar_code", "条码支付"), LINK("link", "跳转链接"), - JSAPI("jsapi", "JSAPI"), + MINI_APP("mini_app", "小程序"), AGGREGATE("aggregate", "聚合支付"), APP("app", "APP支付"), + JSAPI("jsapi", "JSAPI"), ; private final String code; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutTypeEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutTypeEnum.java index 870ef9f22..1cea0f154 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutTypeEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutTypeEnum.java @@ -9,6 +9,7 @@ import java.util.Objects; /** * 收银台类型 + * 字典 checkout_type * @author xxm * @since 2024/11/26 */ @@ -19,7 +20,7 @@ public enum CheckoutTypeEnum { H5("h5", "H5"), PC("pc", "PC"), MINI_APP("mini_app", "小程序"), - AGGREGATE("aggregate", "聚合扫码"), + AGGREGATE("aggregate", "聚合支付"), ; private final String code; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/develop/DevelopTradeController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/develop/DevelopTradeController.java index 70c96d635..16bae7f68 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/develop/DevelopTradeController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/develop/DevelopTradeController.java @@ -4,16 +4,18 @@ import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.annotation.RequestPath; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.result.Result; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.dromara.daxpay.core.param.checkout.CheckoutCreatParam; import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.param.trade.refund.RefundParam; import org.dromara.daxpay.core.param.trade.transfer.TransferParam; +import org.dromara.daxpay.core.result.checkout.CheckoutUrlResult; import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.core.result.trade.refund.RefundResult; import org.dromara.daxpay.core.result.trade.transfer.TransferResult; import org.dromara.daxpay.service.service.develop.DevelopTradeService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -34,7 +36,6 @@ import org.springframework.web.bind.annotation.RestController; public class DevelopTradeController { private final DevelopTradeService developTradeService; - @Operation(summary = "支付参数签名") @RequestPath("支付参数签名") @PostMapping("/sign/pay") @@ -56,6 +57,13 @@ public class DevelopTradeController { return Res.ok(developTradeService.genSign(param)); } + @Operation(summary = "收银台签名") + @RequestPath("收银台签名") + @PostMapping("/sign/checkout") + public Result checkoutSign(@RequestBody CheckoutCreatParam param){ + return Res.ok(developTradeService.genSign(param)); + } + @Operation(summary = "支付接口") @RequestPath("支付接口") @@ -78,4 +86,11 @@ public class DevelopTradeController { return Res.ok(developTradeService.transfer(param)); } + @Operation(summary = "收银台链接创建接口") + @RequestPath("收银台链接创建接口") + @PostMapping("/checkoutUrl") + public Result checkoutUrl(@RequestBody @Validated CheckoutCreatParam param){ + return Res.ok(developTradeService.checkoutUrl(param)); + } + } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/checkout/CheckoutGroupConfigManager.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/checkout/CheckoutGroupConfigManager.java index 0d1f15dce..32552099a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/checkout/CheckoutGroupConfigManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/checkout/CheckoutGroupConfigManager.java @@ -25,16 +25,7 @@ public class CheckoutGroupConfigManager extends BaseManager findAllByAppIdAndType(String appId, String type){ - return lambdaQuery() - .eq(CheckoutGroupConfig::getAppId, appId) - .eq(CheckoutGroupConfig::getType, type) + .orderByAsc(CheckoutGroupConfig::getSortNo) .list(); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java index 4d7ade206..0571779a8 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java @@ -103,7 +103,7 @@ public class CheckoutService { return StrUtil.format("{}/checkout/{}",config.getGatewayPcUrl(), orderNo); } case AGGREGATE -> { - return StrUtil.format("{}/aggregate/{}",config.getGatewayPcUrl(), orderNo); + return StrUtil.format("{}/aggregate/{}",config.getGatewayMobileUrl(), orderNo); } case MINI_APP -> throw new UnsupportedAbilityException("暂不支持小程序收银台"); default -> throw new UnsupportedAbilityException("不支持的收银台类型"); @@ -170,11 +170,10 @@ public class CheckoutService { public PayResult aggregatePay(CheckoutAggregatePayParam param){ // 订单信息 PayOrder payOrder = checkoutAssistService.getOrderAndCheck(param.getOrderNo()); - // 获取聚合类型 CheckoutAggregateConfig aggregateConfig = checkoutAggregateConfigManager.findByAppIdAndType(payOrder.getAppId(), param.getAggregateType()) .orElseThrow(() -> new ConfigNotExistException("聚合支付配置项不存在")); - + paymentAssistService.initMchApp(payOrder.getAppId()); // 构建支付参数 String clientIP = JakartaServletUtil.getClientIP(WebServletUtil.getRequest()); PayParam payParam = new PayParam(); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/config/checkout/CheckoutConfigQueryService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/config/checkout/CheckoutConfigQueryService.java index aecc91d73..502d7dfc6 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/config/checkout/CheckoutConfigQueryService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/config/checkout/CheckoutConfigQueryService.java @@ -46,7 +46,7 @@ public class CheckoutConfigQueryService { * 获取指定类型收银台分组列表 */ public List getGroupConfigs(String appId, String checkoutType){ - return MpUtil.toListResult(checkoutGroupConfigManager.findAllByAppIdAndType(appId, checkoutType)); + return MpUtil.toListResult(checkoutGroupConfigManager.findAllSortByAppIdAndType(appId, checkoutType)); } /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/develop/DevelopTradeService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/develop/DevelopTradeService.java index 24f10ba8b..f35594cd4 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/develop/DevelopTradeService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/develop/DevelopTradeService.java @@ -1,13 +1,16 @@ package org.dromara.daxpay.service.service.develop; import org.dromara.daxpay.core.param.PaymentCommonParam; +import org.dromara.daxpay.core.param.checkout.CheckoutCreatParam; import org.dromara.daxpay.core.param.trade.pay.PayParam; import org.dromara.daxpay.core.param.trade.refund.RefundParam; import org.dromara.daxpay.core.param.trade.transfer.TransferParam; +import org.dromara.daxpay.core.result.checkout.CheckoutUrlResult; import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.core.result.trade.refund.RefundResult; import org.dromara.daxpay.core.result.trade.transfer.TransferResult; import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.service.checkout.CheckoutService; import org.dromara.daxpay.service.service.trade.pay.PayService; import org.dromara.daxpay.service.service.trade.refund.RefundService; import org.dromara.daxpay.service.service.trade.transfer.TransferService; @@ -28,6 +31,8 @@ public class DevelopTradeService { private final PayService payService; private final RefundService refundService; private final TransferService transferService; + private final CheckoutService checkoutService; + /** * 生成签名 */ @@ -68,4 +73,15 @@ public class DevelopTradeService { paymentAssistService.signVerify(param); return transferService.transfer(param); } + + /** + * 收银台链接创建接口 + */ + public CheckoutUrlResult checkoutUrl(CheckoutCreatParam param) { + // 初始化 + paymentAssistService.initMchApp(param.getAppId()); + // 签名校验 + paymentAssistService.signVerify(param); + return checkoutService.creat(param); + } } From 633b7ea17a3fd767e8958477fadcae4217117faa Mon Sep 17 00:00:00 2001 From: DaxPay Date: Wed, 4 Dec 2024 19:23:19 +0800 Subject: [PATCH 07/54] =?UTF-8?q?feat(core):=20=E5=AE=8C=E6=88=90=E6=94=B6?= =?UTF-8?q?=E9=93=B6=E5=8F=B0=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现收银台台功能 - 添加 CheckoutGroupConfigResult 和 CheckoutItemConfigResult 类的主键字段- 更新 CheckoutQueryService 以设置订单信息 - 调整 Task.md 中的任务列表,标记已完成的收银台相关任务 --- _doc/Task.md | 11 ++++++----- .../result/checkout/CheckoutGroupConfigResult.java | 3 +++ .../result/checkout/CheckoutItemConfigResult.java | 3 +++ .../service/checkout/CheckoutQueryService.java | 1 + 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index 06e57dd7a..7ff41c514 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -11,7 +11,7 @@ - [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 - [x] 支付订单新增待支付状态 ## 3.0.0.beta3 -- [ ] 收银台台功能 +- [x] 收银台台功能 - [x] 收银台配置 - [x] 分类配置 - [x] 明细配置 @@ -24,16 +24,17 @@ - [ ] 聚合支付(生成扫码链接) - [ ] H5收银台 - [ ] 跳转支付 + - [x] 升级为聚合支付 - [ ] ~~APP调起支付~~ - [ ] ~~小程序支付~~ - - [ ] 聚合收银台 - - [ ] Jsapi调用 - - [ ] 跳转支付 + - [x] 聚合收银台 + - [x] Jsapi调用 + - [x] 跳转支付 - [x] 支付码牌功能改造 - [x] 一个应用支持多码牌 - [x] 码牌不再使用应用号作为标识, 使用独立的编码 - [x] 码牌H5页面对接 - +- [ ] 分账配置/分账组/分账接收方合并为一个tabs页面 ## bugs - [x] 修复 BigDecimal 类型数据序列化和签名异常问题 - [x] 获取是否订阅消息通知类型查询范围错误问题 diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutGroupConfigResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutGroupConfigResult.java index 886322983..5f342ea60 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutGroupConfigResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutGroupConfigResult.java @@ -16,6 +16,9 @@ import java.util.List; @Accessors(chain = true) @Schema(title = "收银台分类配置") public class CheckoutGroupConfigResult{ + /** 主键 */ + @Schema(description = "主键") + private Long id; /** * 类型 web/h5/小程序 diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutItemConfigResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutItemConfigResult.java index 883be86ae..a8f4256bb 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutItemConfigResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/checkout/CheckoutItemConfigResult.java @@ -17,6 +17,9 @@ import org.dromara.daxpay.core.enums.PayMethodEnum; @Schema(title = "收银台配置项") public class CheckoutItemConfigResult { + /** 主键 */ + @Schema(description = "主键") + private Long id; /** * 发起调用的类型 * @see CheckoutCallTypeEnum diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java index 50a918ff2..8ac2ef219 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java @@ -90,6 +90,7 @@ public class CheckoutQueryService { .setAmount(payOrder.getAmount()) .setBizOrderNo(payOrder.getBizOrderNo()) .setOrderNo(payOrder.getOrderNo()); + checkoutInfoResult.setOrder(order); // 获取收银台配置 checkoutInfoResult.setConfig(this.getConfig(payOrder.getAppId())); // 获取分组和明细配置 From 1270288c2f474f9f871e4d3ca4ccd3c8bdc86758 Mon Sep 17 00:00:00 2001 From: bootx Date: Wed, 4 Dec 2024 22:43:23 +0800 Subject: [PATCH 08/54] =?UTF-8?q?feat(core):=20=E6=B7=BB=E5=8A=A0=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E6=94=AF=E4=BB=98=E6=96=B9=E5=BC=8F=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=94=B6=E9=93=B6=E5=8F=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 CheckoutCallTypeEnum 中新增 FROM表单支付方式 - 在 CheckoutController 中添加 getCheckoutUrl 接口 - 优化 CheckoutQueryService 中的配置查询逻辑 -简化 CheckoutService 中的支付流程 --- .../core/enums/CheckoutCallTypeEnum.java | 2 +- .../controller/unipay/CheckoutController.java | 8 +++++++ .../checkout/CheckoutQueryService.java | 6 ++++- .../service/checkout/CheckoutService.java | 22 +++---------------- 4 files changed, 17 insertions(+), 21 deletions(-) diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java index 43c6f72a1..cca3f292e 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/CheckoutCallTypeEnum.java @@ -21,9 +21,9 @@ public enum CheckoutCallTypeEnum { BAR_CODE("bar_code", "条码支付"), LINK("link", "跳转链接"), MINI_APP("mini_app", "小程序"), - AGGREGATE("aggregate", "聚合支付"), APP("app", "APP支付"), JSAPI("jsapi", "JSAPI"), + FROM("from", "表单方式"), ; private final String code; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java index 0944bfa57..d0baa6e38 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java @@ -41,6 +41,14 @@ public class CheckoutController { return DaxRes.ok(checkoutService.creat(checkoutParam)); } + @Operation(summary = "根据订单号和收银台方式获取收银台链接") + @GetMapping("/getCheckoutUrl") + public Result getCheckoutUrl(String orderNo, String checkoutType){ + return Res.ok(checkoutService.getCheckoutUrl(orderNo, checkoutType)); + + } + + @Operation(summary = "获取收银台订单和配置信息") @GetMapping("/getOrderAndConfig") public Result getOrderAndConfig(String orderNo, String checkoutType){ diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java index 8ac2ef219..0bd58d229 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java @@ -70,7 +70,11 @@ public class CheckoutQueryService { return groups.stream() .map(o->{ var result = CheckoutGroupConfigConvert.CONVERT.toResult(o); - result.setItems(itemGroupMap.get(o.getId()).stream().map(CheckoutItemConfigConvert.CONVERT::toResult).toList()); + List list = itemGroupMap.getOrDefault(o.getId(), new ArrayList<>()) + .stream() + .map(CheckoutItemConfigConvert.CONVERT::toResult) + .toList(); + result.setItems(list); return result; }) .toList(); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java index 0571779a8..3ef8db77b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java @@ -9,7 +9,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.CheckoutCallTypeEnum; import org.dromara.daxpay.core.enums.CheckoutTypeEnum; -import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.exception.ConfigNotExistException; import org.dromara.daxpay.core.exception.TradeProcessingException; import org.dromara.daxpay.core.exception.UnsupportedAbilityException; @@ -75,13 +74,9 @@ public class CheckoutService { if (Objects.isNull(payOrder)){ // 执行支付前的保存动作, 保存支付订单和扩展记录 payOrder = checkoutAssistService.createPayOrder(checkoutParam); - String checkoutUrl = this.getCheckoutUrl(payOrder.getOrderNo(), checkoutParam.getCheckoutType()); - return new CheckoutUrlResult().setUrl(checkoutUrl); - } else { - // 直接返回收银台链接 - String checkoutUrl = this.getCheckoutUrl(payOrder.getOrderNo(), checkoutParam.getCheckoutType()); - return new CheckoutUrlResult().setUrl(checkoutUrl); } + String checkoutUrl = this.getCheckoutUrl(payOrder.getOrderNo(), checkoutParam.getCheckoutType()); + return new CheckoutUrlResult().setUrl(checkoutUrl); } finally { lockTemplate.releaseLock(lock); } @@ -92,9 +87,7 @@ public class CheckoutService { */ public String getCheckoutUrl(String orderNo, String checkoutType){ CheckoutTypeEnum checkoutTypeEnum = CheckoutTypeEnum.findBuyCode(checkoutType); - PlatformConfig config = platformConfigService.getConfig(); - switch (checkoutTypeEnum) { case H5 -> { return StrUtil.format("{}/checkout/{}",config.getGatewayMobileUrl(), orderNo); @@ -123,18 +116,9 @@ public class CheckoutService { // 判断支付调用类型 CheckoutCallTypeEnum callTypeEnum = CheckoutCallTypeEnum.findBuyCode(itemConfig.getCallType()); switch (callTypeEnum) { - case QR_CODE, LINK, BAR_CODE,JSAPI -> { + case QR_CODE, LINK, BAR_CODE,JSAPI,FROM -> { return this.checkoutPay(param, payOrder); } - case AGGREGATE -> { - PlatformConfig config = platformConfigService.getConfig(); - // 直接返回手机端的聚合收银台链接 - String url = StrUtil.format("{}/aggregate/{}", config.getGatewayPcUrl(), payOrder.getOrderNo()); - PayResult payResult = new PayResult(); - payResult.setPayBody(url); - payResult.setStatus(PayStatusEnum.WAIT.getCode()); - return payResult; - } default -> throw new UnsupportedAbilityException("不支持的支付调用类型"); } } From 334af5b5f12016cac8142dfdafcc626dde7b6f52 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Thu, 5 Dec 2024 15:31:16 +0800 Subject: [PATCH 09/54] =?UTF-8?q?feat(checkout):=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=81=9A=E5=90=88=E6=94=AF=E4=BB=98=E6=9D=A1=E7=A0=81=E6=94=AF?= =?UTF-8?q?=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 17 ++++----- .../strategy/AliPayCheckoutStrategy.java | 11 ++++++ .../strategy/WechatCheckoutStrategy.java | 8 +++++ .../CheckoutAggregateBarPayParam.java | 31 ++++++++++++++++ .../controller/unipay/CheckoutController.java | 20 +++++++++-- .../checkout/CheckoutQueryService.java | 14 ++++++++ .../service/checkout/CheckoutService.java | 36 ++++++++++++++++++- .../service/strategy/AbsCheckoutStrategy.java | 7 ++++ .../service/util/PaymentStrategyFactory.java | 16 ++++++++- 9 files changed, 148 insertions(+), 12 deletions(-) create mode 100644 daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAggregateBarPayParam.java diff --git a/_doc/Task.md b/_doc/Task.md index 7ff41c514..ed7615a0a 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -16,14 +16,15 @@ - [x] 分类配置 - [x] 明细配置 - [x] 聚合支付配置 - - [ ] 支持通过订单信息生成多种类型的收银台链接, - - [ ] pc收银台 - - [ ] 扫码支付 - - [ ] 条码支付 - - [ ] 跳转支付 - - [ ] 聚合支付(生成扫码链接) - - [ ] H5收银台 - - [ ] 跳转支付 + - [x] 支持通过订单信息生成多种类型的收银台链接, + - [x] pc收银台 + - [x] 扫码支付 + - [x] 条码支付 + - [x] 跳转支付 + - [x] 聚合支付(生成扫码链接) + - [x] 聚合支付(条码支付) + - [x] H5收银台 + - [x] 跳转支付 - [x] 升级为聚合支付 - [ ] ~~APP调起支付~~ - [ ] ~~小程序支付~~ diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java index ed582112f..66c9ca9e5 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java @@ -1,5 +1,6 @@ package org.dromara.daxpay.channel.alipay.strategy; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.ChannelEnum; @@ -15,6 +16,7 @@ import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor public class AliPayCheckoutStrategy extends AbsCheckoutStrategy { + /** * 策略标识, 可以自行进行扩展 * @@ -24,4 +26,13 @@ public class AliPayCheckoutStrategy extends AbsCheckoutStrategy { public String getChannel() { return ChannelEnum.ALI.getCode(); } + + /** + * 检测付款码 + */ + @Override + public boolean checkBarCode(String barCode){ + String[] ali = { "25", "26", "27", "28", "29", "30" }; + return StrUtil.startWithAny(barCode.substring(0, 2), ali); + } } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java index 802c3516b..302ee4d52 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java @@ -45,6 +45,14 @@ public class WechatCheckoutStrategy extends AbsCheckoutStrategy { return wechatAuthService.generateInnerAuthUrl(redirectUrl); } + /** + * 检测付款码 + */ + @Override + public boolean checkBarCode(String barCode){ + String[] wx = { "10", "11", "12", "13", "14", "15" }; + return StrUtil.startWithAny(barCode.substring(0, 2), wx); + } /** * 获取认证结果 */ diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAggregateBarPayParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAggregateBarPayParam.java new file mode 100644 index 000000000..6243a78af --- /dev/null +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutAggregateBarPayParam.java @@ -0,0 +1,31 @@ +package org.dromara.daxpay.core.param.checkout; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 收银台聚合条码支付参数 + * @author xxm + * @since 2024/11/26 + */ +@Data +@Accessors(chain = true) +@Schema(title = "收银台聚合支付参数") +public class CheckoutAggregateBarPayParam { + /** 支付订单号 */ + @NotBlank(message = "支付订单号不可为空") + @Size(max = 32, message = "支付订单号不可超过32位") + @Schema(description = "支付订单号") + private String orderNo; + + + /** 付款码 */ + @NotBlank(message = "付款码不可为空") + @Size(max = 256, message = "付款码不可超过256位") + @Schema(description = "付款码") + private String barCode; + +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java index d0baa6e38..fe3751581 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java @@ -6,6 +6,7 @@ import cn.bootx.platform.core.rest.result.Result; import cn.bootx.platform.core.util.ValidationUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.dromara.daxpay.core.param.checkout.*; import org.dromara.daxpay.core.result.DaxResult; @@ -18,6 +19,7 @@ import org.dromara.daxpay.core.util.DaxRes; import org.dromara.daxpay.service.common.anno.PaymentVerify; import org.dromara.daxpay.service.service.checkout.CheckoutQueryService; import org.dromara.daxpay.service.service.checkout.CheckoutService; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; /** @@ -25,6 +27,7 @@ import org.springframework.web.bind.annotation.*; * @author xxm * @since 2024/11/26 */ +@Validated @IgnoreAuth @Tag(name = "收银台服务") @RestController @@ -48,7 +51,6 @@ public class CheckoutController { } - @Operation(summary = "获取收银台订单和配置信息") @GetMapping("/getOrderAndConfig") public Result getOrderAndConfig(String orderNo, String checkoutType){ @@ -84,7 +86,7 @@ public class CheckoutController { } - @Operation(summary = "发起支付(聚合)") + @Operation(summary = "发起支付(聚合扫码)") @PostMapping("/aggregatePay") public Result aggregatePay(@RequestBody CheckoutAggregatePayParam param){ ValidationUtil.validateParam(param); @@ -92,5 +94,19 @@ public class CheckoutController { } + @Operation(summary = "发起支付(聚合条码)") + @PostMapping("/aggregateBarPay") + public Result aggregateBarPay(@RequestBody CheckoutAggregateBarPayParam param){ + ValidationUtil.validateParam(param); + return Res.ok(checkoutService.aggregateBarPay(param)); + } + + + @Operation(summary = "查询订单状态") + @GetMapping("/findStatusByOrderNo") + public Result findStatusByOrderNo(@NotBlank(message = "订单号不能为空") String orderNo){ + return Res.ok(checkoutQueryService.findStatusByOrderNo(orderNo)); + } + } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java index 0bd58d229..6eab138d7 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutQueryService.java @@ -4,6 +4,7 @@ import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.bootx.platform.core.exception.DataNotExistException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.result.checkout.*; import org.dromara.daxpay.service.convert.config.CheckoutAggregateConfigConvert; import org.dromara.daxpay.service.convert.config.CheckoutConfigConvert; @@ -13,6 +14,7 @@ import org.dromara.daxpay.service.dao.config.checkout.CheckoutAggregateConfigMan import org.dromara.daxpay.service.dao.config.checkout.CheckoutConfigManager; import org.dromara.daxpay.service.dao.config.checkout.CheckoutGroupConfigManager; import org.dromara.daxpay.service.dao.config.checkout.CheckoutItemConfigManager; +import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; import org.dromara.daxpay.service.entity.config.checkout.CheckoutAggregateConfig; import org.dromara.daxpay.service.entity.config.checkout.CheckoutItemConfig; import org.dromara.daxpay.service.entity.order.pay.PayOrder; @@ -21,6 +23,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -37,6 +40,7 @@ public class CheckoutQueryService { private final CheckoutItemConfigManager checkoutItemConfigManager; private final CheckoutAggregateConfigManager checkoutAggregateConfigManager; private final CheckoutAssistService checkoutAssistService; + private final PayOrderManager payOrderManager; /** * 获取收银台配置 @@ -124,4 +128,14 @@ public class CheckoutQueryService { checkoutInfoResult.setAggregateConfig(CheckoutAggregateConfigConvert.CONVERT.toResult(aggregateConfig)); return checkoutInfoResult; } + + /** + * 查询订单状态 + */ + public Boolean findStatusByOrderNo(String orderNo) { + String status = payOrderManager.findByOrderNo(orderNo) + .map(PayOrder::getStatus) + .orElse(null); + return Objects.equals(status, PayStatusEnum.SUCCESS.getCode()); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java index 3ef8db77b..f74c77068 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java @@ -9,6 +9,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.CheckoutCallTypeEnum; import org.dromara.daxpay.core.enums.CheckoutTypeEnum; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.core.exception.ChannelNotExistException; import org.dromara.daxpay.core.exception.ConfigNotExistException; import org.dromara.daxpay.core.exception.TradeProcessingException; import org.dromara.daxpay.core.exception.UnsupportedAbilityException; @@ -149,7 +151,7 @@ public class CheckoutService { } /** - * 聚合支付 + * 聚合支付(扫码) */ public PayResult aggregatePay(CheckoutAggregatePayParam param){ // 订单信息 @@ -177,6 +179,38 @@ public class CheckoutService { return payService.pay(payParam, payOrder); } + /** + * 聚合支付(条码支付) + */ + public PayResult aggregateBarPay(CheckoutAggregateBarPayParam param){ + // 订单信息 + PayOrder payOrder = checkoutAssistService.getOrderAndCheck(param.getOrderNo()); + var cashierStrategies = PaymentStrategyFactory.createGroup(AbsCheckoutStrategy.class); + // 获取策略 + var cashierStrategy = cashierStrategies.stream() + .filter(strategy -> strategy.checkBarCode(param.getBarCode())) + .findFirst() + .orElseThrow(() -> new ChannelNotExistException("未找到支持该付款码的支付通道")); + + // 获取聚合类型 + paymentAssistService.initMchApp(payOrder.getAppId()); + // 构建支付参数 + String clientIP = JakartaServletUtil.getClientIP(WebServletUtil.getRequest()); + PayParam payParam = new PayParam(); + payParam.setChannel(cashierStrategy.getChannel()); + payParam.setMethod(PayMethodEnum.BARCODE.getCode()); + payParam.setAppId(payOrder.getAppId()); + payParam.setClientIp(clientIP); + payParam.setReqTime(LocalDateTime.now()); + + // 进行参数预处理 + CheckoutPayParam cashierPayParam = new CheckoutPayParam() + .setBarCode(param.getBarCode()); + cashierStrategy.handlePayParam(cashierPayParam, payParam); + // 发起支付 + return payService.pay(payParam, payOrder); + } + /** * 生成授权链接跳转链接, 主要是微信类通道使用, 用于获取OpenId */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCheckoutStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCheckoutStrategy.java index 089d8a9e4..d0e72c650 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCheckoutStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsCheckoutStrategy.java @@ -19,6 +19,13 @@ public abstract class AbsCheckoutStrategy implements PaymentStrategy{ return ""; } + /** + * 检测付款码 + */ + public boolean checkBarCode(String barCode){ + return false; + } + /** * 获取认证结果 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/util/PaymentStrategyFactory.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/util/PaymentStrategyFactory.java index 79be51590..fdb73cd45 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/util/PaymentStrategyFactory.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/util/PaymentStrategyFactory.java @@ -5,6 +5,9 @@ import org.dromara.daxpay.service.strategy.PaymentStrategy; import cn.hutool.extra.spring.SpringUtil; import lombok.experimental.UtilityClass; +import java.util.ArrayList; +import java.util.List; + /** * 策略工厂工具类 * @author xxm @@ -18,7 +21,7 @@ public class PaymentStrategyFactory { * @param channel 通道编码 * @param clazz 策略类型 * @return 策略类 - * @param 需要为 PayStrategy 的子类 + * @param 需要为 PaymentStrategy 的子类 */ public T create(String channel, Class clazz) { var beansOfType = SpringUtil.getBeansOfType(clazz); @@ -28,5 +31,16 @@ public class PaymentStrategyFactory { .orElseThrow(() -> new UnsupportedAbilityException("不支持的能力")); } + /** + * 根据指定类型获取策略组 + * @param clazz 策略类型 + * @return 策略类列表 + * @param 需要为 PaymentStrategy 的子类 + */ + public List createGroup(Class clazz) { + var beansOfType = SpringUtil.getBeansOfType(clazz); + return new ArrayList<>(beansOfType.values()); + } + } From 65891ffc2f9a85faa93e668f3530fa4e071552a2 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Thu, 5 Dec 2024 19:39:04 +0800 Subject: [PATCH 10/54] =?UTF-8?q?build=20=E6=9B=B4=E6=96=B0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config/mysql/dax-pay-single.sql | 578 ++++---- _config/postgresql/dax-pay-single.sql | 1245 ++++++++--------- _doc/ChangeLog.md | 17 + _doc/Task.md | 55 +- .../sdk/test/trade/CheckoutPayTest.java | 4 +- 5 files changed, 919 insertions(+), 980 deletions(-) diff --git a/_config/mysql/dax-pay-single.sql b/_config/mysql/dax-pay-single.sql index ff0906e24..e33fe8fb8 100644 --- a/_config/mysql/dax-pay-single.sql +++ b/_config/mysql/dax-pay-single.sql @@ -5,13 +5,11 @@ Source Server Type : MySQL Source Server Version : 80025 (8.0.25) Source Host : localhost:3306 - Source Schema : dax-pay-single Target Server Type : MySQL Target Server Version : 80025 (8.0.25) File Encoding : 65001 - Date: 23/10/2024 15:30:42 */ SET NAMES utf8mb4; @@ -63,10 +61,12 @@ INSERT INTO `base_dict` VALUES (1825408039604842496, '消息发送类型', '支 INSERT INTO `base_dict` VALUES (1826059944274382848, '对账差异类型', '支付', 'reconcile_discrepancy_type', '', 1811365615815487488, '2024-08-21 08:53:12', 1811365615815487488, '2024-08-21 08:53:12', 0, 1, 0); INSERT INTO `base_dict` VALUES (1826061072412135424, '对账结果', '支付', 'reconcile_result', '', 1811365615815487488, '2024-08-21 08:57:41', 1811365615815487488, '2024-08-21 08:57:41', 0, 1, 0); INSERT INTO `base_dict` VALUES (1826143914542350336, '交易状态', '支付', 'trade_status', '', 1811365615815487488, '2024-08-21 14:26:52', 1811365615815487488, '2024-08-21 14:26:52', 0, 1, 0); -INSERT INTO `base_dict` VALUES (1840650057641713664, '收银台类型', '支付', 'cashier_type', '', 1811365615815487488, '2024-09-30 15:09:06', 1811365615815487488, '2024-10-08 16:23:30', 1, 1, 0); +INSERT INTO `base_dict` VALUES (1840650057641713664, '码牌类型', '支付', 'cashier_code_type', '', 1811365615815487488, '2024-09-30 15:09:06', 1811365615815487488, '2024-11-21 09:09:19', 2, 1, 0); INSERT INTO `base_dict` VALUES (1843536439208931328, '分账接收方类型', '支付', 'alloc_receiver_type', '', 1811365615815487488, '2024-10-08 14:18:33', 1811365615815487488, '2024-10-08 14:18:33', 0, 1, 0); INSERT INTO `base_dict` VALUES (1843536733108006912, '分账关系类型', '支付', 'alloc_relation_type', '', 1811365615815487488, '2024-10-08 14:19:43', 1811365615815487488, '2024-10-08 14:29:33', 1, 1, 0); -INSERT INTO `base_dict` VALUES (1843935232479731712, '123', '', '123', '', 1811365615815487488, '2024-10-09 16:43:13', 1811365615815487488, '2024-10-09 17:02:12', 0, 1, 1); +INSERT INTO `base_dict` VALUES (1862094405423972352, '收银台聚合支付类型', '支付', 'checkout_aggregate', '', 1811365615815487488, '2024-11-28 19:21:17', 1811365615815487488, '2024-11-28 19:22:05', 1, 1, 0); +INSERT INTO `base_dict` VALUES (1862784043394342912, '收银台支付调起方式', '支付', 'checkout_call_type', '', 1811365615815487488, '2024-11-30 17:01:39', 1811365615815487488, '2024-11-30 17:01:39', 0, 1, 0); +INSERT INTO `base_dict` VALUES (1864134865629839360, '收银台类型', '支付', 'checkout_type', '', 1811365615815487488, '2024-12-04 10:29:21', 1811365615815487488, '2024-12-04 10:29:21', 0, 1, 0); -- ---------------------------- -- Table structure for base_dict_item @@ -94,9 +94,7 @@ CREATE TABLE `base_dict_item` ( -- Records of base_dict_item -- ---------------------------- INSERT INTO `base_dict_item` VALUES (1823688520268062720, 1823688398549360640, 'channel', 'ali_pay', '支付宝(直连)', 1, 1, '支付宝 - 直连商户', 1811365615815487488, '2024-08-14 19:50:00', 0, '2024-08-15 19:45:52', 1, 0); -INSERT INTO `base_dict_item` VALUES (1823688577201545216, 1823688398549360640, 'channel', 'ali_service', '支付宝(服务商)', 2, 1, '支付宝 - 服务商商户', 1811365615815487488, '2024-08-14 19:50:14', 0, '2024-08-15 19:46:14', 1, 0); INSERT INTO `base_dict_item` VALUES (1823688680352063488, 1823688398549360640, 'channel', 'wechat_pay', '微信支付(直连)', 3, 1, '', 1811365615815487488, '2024-08-14 19:50:39', 0, '2024-08-15 19:46:22', 1, 0); -INSERT INTO `base_dict_item` VALUES (1823688722165080064, 1823688398549360640, 'channel', 'wechat_service', '微信支付(服务商)', 4, 1, '', 1811365615815487488, '2024-08-14 19:50:49', 0, '2024-08-15 19:46:31', 1, 0); INSERT INTO `base_dict_item` VALUES (1823688758965903360, 1823688398549360640, 'channel', 'union_pay', '云闪付', 5, 1, '', 1811365615815487488, '2024-08-14 19:50:57', 1811365615815487488, '2024-08-14 19:50:57', 0, 0); INSERT INTO `base_dict_item` VALUES (1823696988228100096, 1823696159936946176, 'id_type', 'IDCard', '身份证', 1, 1, '', 1811365615815487488, '2024-08-14 20:23:39', 1811365615815487488, '2024-08-14 20:23:39', 0, 0); INSERT INTO `base_dict_item` VALUES (1823697045249662976, 1823696159936946176, 'id_type', 'passport', '护照', 2, 1, '', 1811365615815487488, '2024-08-14 20:23:53', 1811365615815487488, '2024-08-14 20:23:53', 0, 0); @@ -125,7 +123,6 @@ INSERT INTO `base_dict_item` VALUES (1823992851131273216, 1823991280205041664, ' INSERT INTO `base_dict_item` VALUES (1823992894504570880, 1823991280205041664, 'log_business_type', 'force', '强退', 7, 1, '', 0, '2024-08-15 15:59:29', 0, '2024-08-15 15:59:29', 0, 0); INSERT INTO `base_dict_item` VALUES (1823992935814270976, 1823991280205041664, 'log_business_type', 'clean', '清空数据', 8, 1, '', 0, '2024-08-15 15:59:39', 0, '2024-08-15 15:59:39', 0, 0); INSERT INTO `base_dict_item` VALUES (1823992995331444736, 1823991280205041664, 'log_business_type', 'other', '其它', 9, 1, '', 0, '2024-08-15 15:59:53', 0, '2024-08-15 15:59:53', 0, 0); -INSERT INTO `base_dict_item` VALUES (1824050515865571328, 1823688398549360640, 'channel', 'pay_status', '支付状态', 0, 1, '', 0, '2024-08-15 19:48:27', 0, '2024-08-15 19:48:33', 0, 1); INSERT INTO `base_dict_item` VALUES (1824050709768245248, 1824050661785407488, 'pay_status', 'progress', '支付中', 1, 1, '', 0, '2024-08-15 19:49:13', 0, '2024-08-15 19:49:13', 0, 0); INSERT INTO `base_dict_item` VALUES (1824050750083895296, 1824050661785407488, 'pay_status', 'success', '支付成功', 2, 1, '', 0, '2024-08-15 19:49:23', 1811365615815487488, '2024-08-16 11:24:18', 1, 0); INSERT INTO `base_dict_item` VALUES (1824050788306587648, 1824050661785407488, 'pay_status', 'close', '支付关闭', 3, 1, '', 0, '2024-08-15 19:49:32', 0, '2024-08-15 19:49:32', 0, 0); @@ -142,8 +139,8 @@ INSERT INTO `base_dict_item` VALUES (1824285613860851712, 1824285303885008896, ' INSERT INTO `base_dict_item` VALUES (1824285656248487936, 1824285303885008896, 'pay_method', 'app', '应用支付', 2, 1, '', 1811365615815487488, '2024-08-16 11:22:49', 1811365615815487488, '2024-08-16 11:22:49', 0, 0); INSERT INTO `base_dict_item` VALUES (1824285688691429376, 1824285303885008896, 'pay_method', 'web', 'web支付', 3, 1, '', 1811365615815487488, '2024-08-16 11:22:56', 1811365615815487488, '2024-08-16 11:22:56', 0, 0); INSERT INTO `base_dict_item` VALUES (1824285724460453888, 1824285303885008896, 'pay_method', 'qrcode', '扫码支付', 4, 1, '', 1811365615815487488, '2024-08-16 11:23:05', 1811365615815487488, '2024-08-16 11:23:05', 0, 0); -INSERT INTO `base_dict_item` VALUES (1824285781570097152, 1824285303885008896, 'pay_method', 'barcode', '付款码', 5, 1, '', 1811365615815487488, '2024-08-16 11:23:19', 1811365615815487488, '2024-08-16 11:23:19', 0, 0); -INSERT INTO `base_dict_item` VALUES (1824285824247140352, 1824285303885008896, 'pay_method', 'jsapi', '小程序支付', 6, 1, '', 1811365615815487488, '2024-08-16 11:23:29', 1811365615815487488, '2024-08-16 11:23:29', 0, 0); +INSERT INTO `base_dict_item` VALUES (1824285781570097152, 1824285303885008896, 'pay_method', 'barcode', '条码支付', 5, 1, '', 1811365615815487488, '2024-08-16 11:23:19', 1811365615815487488, '2024-11-28 19:42:23', 1, 0); +INSERT INTO `base_dict_item` VALUES (1824285824247140352, 1824285303885008896, 'pay_method', 'jsapi', 'JSAPI支付', 6, 1, '', 1811365615815487488, '2024-08-16 11:23:29', 1811365615815487488, '2024-11-28 19:42:39', 1, 0); INSERT INTO `base_dict_item` VALUES (1824287473090957312, 1824287281285435392, 'refund_status', 'progress', '退款中', 1, 1, '', 1811365615815487488, '2024-08-16 11:30:02', 1811365615815487488, '2024-08-16 14:41:26', 3, 0); INSERT INTO `base_dict_item` VALUES (1824287508851593216, 1824287281285435392, 'refund_status', 'success', '退款成功', 2, 1, '', 1811365615815487488, '2024-08-16 11:30:10', 1811365615815487488, '2024-08-16 14:42:12', 2, 0); INSERT INTO `base_dict_item` VALUES (1824287549255323648, 1824287281285435392, 'refund_status', 'close', '退款关闭', 3, 1, '', 1811365615815487488, '2024-08-16 11:30:20', 1811365615815487488, '2024-08-16 11:30:20', 0, 0); @@ -158,7 +155,6 @@ INSERT INTO `base_dict_item` VALUES (1825135534352588800, 1825134996013670400, ' INSERT INTO `base_dict_item` VALUES (1825135567118491648, 1825134996013670400, 'transfer_status', 'success', '转账成功', 2, 1, '', 1811365615815487488, '2024-08-18 19:40:03', 1811365615815487488, '2024-08-18 19:40:03', 0, 0); INSERT INTO `base_dict_item` VALUES (1825135606624641024, 1825134996013670400, 'transfer_status', 'close', '转账关闭', 3, 1, '', 1811365615815487488, '2024-08-18 19:40:13', 1811365615815487488, '2024-08-18 19:40:13', 0, 0); INSERT INTO `base_dict_item` VALUES (1825135653311438848, 1825134996013670400, 'transfer_status', 'fail', '转账失败', 4, 1, '', 1811365615815487488, '2024-08-18 19:40:24', 1811365615815487488, '2024-08-18 19:40:24', 0, 0); -INSERT INTO `base_dict_item` VALUES (1825171620147658752, 1825135068277334016, 'transfer_payee_type', 'wx_personal', 'OpenId(微信)', 1, 1, '', 1811365615815487488, '2024-08-18 22:03:19', 1811365615815487488, '2024-10-08 17:50:13', 1, 1); INSERT INTO `base_dict_item` VALUES (1825171656562606080, 1825135068277334016, 'transfer_payee_type', 'user_id', '用户ID', 2, 1, '', 1811365615815487488, '2024-08-18 22:03:28', 1811365615815487488, '2024-10-08 17:50:20', 2, 0); INSERT INTO `base_dict_item` VALUES (1825171693782859776, 1825135068277334016, 'transfer_payee_type', 'open_id', 'OpenId', 1, 1, '', 1811365615815487488, '2024-08-18 22:03:37', 1811365615815487488, '2024-10-08 17:51:28', 3, 0); INSERT INTO `base_dict_item` VALUES (1825171779002728448, 1825135068277334016, 'transfer_payee_type', 'login_name', '登录账号', 4, 1, '', 1811365615815487488, '2024-08-18 22:03:57', 1811365615815487488, '2024-10-08 17:52:08', 3, 0); @@ -183,8 +179,8 @@ INSERT INTO `base_dict_item` VALUES (1826144059224866816, 1826143914542350336, ' INSERT INTO `base_dict_item` VALUES (1826144095107137536, 1826143914542350336, 'trade_status', 'revoked', '撤销', 4, 1, '', 1811365615815487488, '2024-08-21 14:27:35', 1811365615815487488, '2024-08-21 14:27:35', 0, 0); INSERT INTO `base_dict_item` VALUES (1826521714671509504, 1826143914542350336, 'trade_status', 'progress', '执行中', 0, 1, '', 1811365615815487488, '2024-08-22 15:28:07', 1811365615815487488, '2024-08-22 15:28:07', 0, 0); INSERT INTO `base_dict_item` VALUES (1826523501021388800, 1826143914542350336, 'trade_status', 'exception', '异常', 5, 1, '', 1811365615815487488, '2024-08-22 15:35:12', 1811365615815487488, '2024-08-22 15:35:12', 0, 0); -INSERT INTO `base_dict_item` VALUES (1840650104185905152, 1840650057641713664, 'cashier_type', 'wechat_pay', '微信收银台', 1, 1, '', 1811365615815487488, '2024-09-30 15:09:17', 1811365615815487488, '2024-09-30 15:09:17', 0, 0); -INSERT INTO `base_dict_item` VALUES (1840650136427520000, 1840650057641713664, 'cashier_type', 'alipay', '支付宝收银台', 2, 1, '', 1811365615815487488, '2024-09-30 15:09:25', 1811365615815487488, '2024-09-30 15:09:25', 0, 0); +INSERT INTO `base_dict_item` VALUES (1840650104185905152, 1840650057641713664, 'cashier_code_type', 'wechat_pay', '微信码牌', 1, 1, '', 1811365615815487488, '2024-09-30 15:09:17', 1811365615815487488, '2024-11-21 09:13:32', 1, 0); +INSERT INTO `base_dict_item` VALUES (1840650136427520000, 1840650057641713664, 'cashier_code_type', 'alipay', '支付宝码牌', 2, 1, '', 1811365615815487488, '2024-09-30 15:09:25', 1811365615815487488, '2024-11-21 09:13:35', 1, 0); INSERT INTO `base_dict_item` VALUES (1843536477700059136, 1843536439208931328, 'alloc_receiver_type', 'merchant_no', '商户号', 1, 1, '', 1811365615815487488, '2024-10-08 14:18:42', 1811365615815487488, '2024-10-08 14:18:42', 0, 0); INSERT INTO `base_dict_item` VALUES (1843536514106617856, 1843536439208931328, 'alloc_receiver_type', 'user_id', '用户ID', 2, 1, '', 1811365615815487488, '2024-10-08 14:18:51', 1811365615815487488, '2024-10-08 14:18:51', 0, 0); INSERT INTO `base_dict_item` VALUES (1843536564304048128, 1843536439208931328, 'alloc_receiver_type', 'open_id', 'OpenId', 0, 1, '', 1811365615815487488, '2024-10-08 14:19:03', 1811365615815487488, '2024-10-08 17:51:46', 3, 0); @@ -200,6 +196,20 @@ INSERT INTO `base_dict_item` VALUES (1843538156054999040, 1843536733108006912, ' INSERT INTO `base_dict_item` VALUES (1843538204528570368, 1843536733108006912, 'alloc_relation_type', 'user', '用户', 9, 1, '', 1811365615815487488, '2024-10-08 14:25:34', 1811365615815487488, '2024-10-08 14:25:34', 0, 0); INSERT INTO `base_dict_item` VALUES (1843538242730291200, 1843536733108006912, 'alloc_relation_type', 'supplier', '供应商', 10, 1, '', 1811365615815487488, '2024-10-08 14:25:43', 1811365615815487488, '2024-10-08 14:25:43', 0, 0); INSERT INTO `base_dict_item` VALUES (1843538293854662656, 1843536733108006912, 'alloc_relation_type', 'custom', '自定义', 11, 1, '', 1811365615815487488, '2024-10-08 14:25:55', 1811365615815487488, '2024-10-08 14:25:55', 0, 0); +INSERT INTO `base_dict_item` VALUES (1862094703940976640, 1862094405423972352, 'checkout_aggregate', 'wechat_pay', '微信支付', 1, 1, '', 1811365615815487488, '2024-11-28 19:22:28', 1811365615815487488, '2024-12-04 11:36:17', 1, 0); +INSERT INTO `base_dict_item` VALUES (1862094738430738432, 1862094405423972352, 'checkout_aggregate', 'alipay', '支付宝', 2, 1, '', 1811365615815487488, '2024-11-28 19:22:36', 1811365615815487488, '2024-11-28 19:22:36', 0, 0); +INSERT INTO `base_dict_item` VALUES (1862784096733306880, 1862784043394342912, 'checkout_call_type', 'qr_code', '扫码支付', 1, 1, '', 1811365615815487488, '2024-11-30 17:01:52', 1811365615815487488, '2024-11-30 17:02:56', 1, 0); +INSERT INTO `base_dict_item` VALUES (1862784137904594944, 1862784043394342912, 'checkout_call_type', 'bar_code', '条码支付', 2, 1, '', 1811365615815487488, '2024-11-30 17:02:02', 1811365615815487488, '2024-11-30 17:02:53', 1, 0); +INSERT INTO `base_dict_item` VALUES (1862784218108076032, 1862784043394342912, 'checkout_call_type', 'link', '跳转链接', 3, 1, '', 1811365615815487488, '2024-11-30 17:02:21', 1811365615815487488, '2024-11-30 17:02:21', 0, 0); +INSERT INTO `base_dict_item` VALUES (1862784251175968768, 1862784043394342912, 'checkout_call_type', 'mini_app', '小程序支付', 4, 1, '', 1811365615815487488, '2024-11-30 17:02:29', 1811365615815487488, '2024-11-30 17:02:29', 0, 0); +INSERT INTO `base_dict_item` VALUES (1862784292565360640, 1862784043394342912, 'checkout_call_type', 'aggregate', '聚合支付', 5, 1, '', 1811365615815487488, '2024-11-30 17:02:39', 1811365615815487488, '2024-11-30 17:02:39', 0, 0); +INSERT INTO `base_dict_item` VALUES (1862784325809414144, 1862784043394342912, 'checkout_call_type', 'app', 'APP支付', 6, 1, '', 1811365615815487488, '2024-11-30 17:02:47', 1811365615815487488, '2024-11-30 17:02:47', 0, 0); +INSERT INTO `base_dict_item` VALUES (1864134907958755328, 1864134865629839360, 'checkout_type', 'h5', 'H5', 0, 1, '', 1811365615815487488, '2024-12-04 10:29:31', 1811365615815487488, '2024-12-04 10:29:31', 0, 0); +INSERT INTO `base_dict_item` VALUES (1864134948614144000, 1864134865629839360, 'checkout_type', 'pc', 'PC', 1, 1, '', 1811365615815487488, '2024-12-04 10:29:40', 1811365615815487488, '2024-12-04 10:29:40', 0, 0); +INSERT INTO `base_dict_item` VALUES (1864134981908529152, 1864134865629839360, 'checkout_type', 'mini_app', '小程序', 3, 1, '', 1811365615815487488, '2024-12-04 10:29:48', 1811365615815487488, '2024-12-04 10:29:48', 0, 0); +INSERT INTO `base_dict_item` VALUES (1864135083783979008, 1864134865629839360, 'checkout_type', 'aggregate', '聚合支付', 4, 1, '', 1811365615815487488, '2024-12-04 10:30:13', 1811365615815487488, '2024-12-04 10:30:13', 0, 0); +INSERT INTO `base_dict_item` VALUES (1864140869360779264, 1862784043394342912, 'checkout_call_type', 'jsapi', 'JSAPI', 7, 1, '', 1811365615815487488, '2024-12-04 10:53:12', 1811365615815487488, '2024-12-04 10:53:12', 0, 0); +INSERT INTO `base_dict_item` VALUES (1864182908966182912, 1824050661785407488, 'pay_status', 'wait', '待支付', 0, 1, '', 1811365615815487488, '2024-12-04 13:40:15', 1811365615815487488, '2024-12-04 13:40:15', 0, 0); -- ---------------------------- -- Table structure for base_param @@ -272,6 +282,9 @@ CREATE TABLE `iam_perm_code` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '权限码' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of iam_perm_code +-- ---------------------------- -- ---------------------------- -- Table structure for iam_perm_menu @@ -309,7 +322,6 @@ CREATE TABLE `iam_perm_menu` ( -- ---------------------------- INSERT INTO `iam_perm_menu` VALUES (1810864706127790080, 0, '2024-07-10 10:32:45', 1811365615815487488, '2024-07-13 21:17:10', 5, 0, NULL, 'dax-pay', '系统管理', 'System', 'ant-design:setting-outlined', 0, 0, 'Layout', '/system', '', 0, 1, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1810871795650891776, 0, '2024-07-10 11:00:55', 0, '2024-07-10 11:13:08', 7, 0, 1810864706127790080, 'dax-pay', '菜单管理', 'MenuList', '', 0, 0, '/iam/perm/menu/MenuList', '/system/menu', '', 0, 0, 1, 0, 0, NULL); -INSERT INTO `iam_perm_menu` VALUES (1810878374534152192, 0, '2024-07-10 11:27:04', 1811365615815487488, '2024-07-13 21:16:24', 5, 1, NULL, 'dax-pay', '测试Iframe', 'Iframe', '', 1, 0, 'Iframe', '/Iframe', 'https://www.antdv.com/components/overview-cn', 0, 1, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1810909511121862656, 0, '2024-07-10 13:30:47', 0, '2024-07-10 13:48:12', 6, 0, 1810864706127790080, 'dax-pay', '权限管理', 'Permission', '', 0, 0, 'Layout', '/system/permission', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1810909853691641856, 0, '2024-07-10 13:32:09', 0, '2024-07-10 13:35:46', 1, 0, 1810864706127790080, 'dax-pay', '用户信息', 'UserAuth', '', 0, 0, 'Layout', '/system/user', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1810910433264762880, 0, '2024-07-10 13:34:27', 0, '2024-07-10 13:35:57', 1, 0, 1810864706127790080, 'dax-pay', '系统配置', 'SystemConfig', '', 0, 0, 'Layout', '/system/config', '', 0, 0, 1, 0, 0, NULL); @@ -324,7 +336,6 @@ INSERT INTO `iam_perm_menu` VALUES (1811667984159715328, 1811365615815487488, '2 INSERT INTO `iam_perm_menu` VALUES (1811671741266243584, 1811365615815487488, '2024-07-12 15:59:37', 1811365615815487488, '2024-07-12 15:59:37', 0, 0, 1811667984159715328, 'dax-pay', '登录日志', 'LoginLogList', '', 0, 0, '/baseapi/log/login/LoginLogList', '/system/log/login', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1811672495767007232, 1811365615815487488, '2024-07-12 16:02:37', 1811365615815487488, '2024-07-12 16:35:42', 1, 0, 1811667984159715328, 'dax-pay', '操作日志', 'OperateLogList', '', 0, 0, '/baseapi/log/operate/OperateLogList', '/system/log/operate', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812113823376666624, 1811365615815487488, '2024-07-13 21:16:18', 1811365615815487488, '2024-07-13 21:27:14', 2, 0, NULL, 'dax-pay', '支付配置', 'PayConfig', 'ant-design:property-safety-twotone', 0, 0, 'Layout', '/pay/config', '', 0, 1, 1, 0, 0, NULL); -INSERT INTO `iam_perm_menu` VALUES (1812113986291822592, 1811365615815487488, '2024-07-13 21:16:56', 1811365615815487488, '2024-07-13 21:17:06', 0, 1, NULL, 'dax-pay', '系统管理', 'System', 'ant-design:setting-outlined', 0, 0, 'Layout', '/system', '', 0, 1, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812114224679284736, 1811365615815487488, '2024-07-13 21:17:53', 1811365615815487488, '2024-07-13 21:18:01', 1, 0, NULL, 'dax-pay', '订单管理', 'PayOrder', 'ant-design:wallet-outlined', 0, 0, 'Layout', '/pay/order', '', 0, 1, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812114347454951424, 1811365615815487488, '2024-07-13 21:18:23', 1811365615815487488, '2024-07-24 18:53:39', 2, 0, NULL, 'dax-pay', '交易记录', 'PayRecord', 'ant-design:container-outlined', 0, 0, 'Layout', '/pay/record', '', 0, 1, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812114603047448576, 1811365615815487488, '2024-07-13 21:19:23', 1811365615815487488, '2024-07-24 19:28:09', 1, 0, NULL, 'dax-pay', '商户通知', 'PayNotic', 'ant-design:notification-twotone', 0, 0, 'Layout', '/pay/notice', '', 0, 1, 1, 0, 0, NULL); @@ -334,7 +345,6 @@ INSERT INTO `iam_perm_menu` VALUES (1812115119471128576, 1811365615815487488, '2 INSERT INTO `iam_perm_menu` VALUES (1812115247342874624, 1811365615815487488, '2024-07-13 21:21:57', 1811365615815487488, '2024-07-13 21:25:06', 4, 0, NULL, 'dax-pay', '关于', '', 'ant-design:info-circle-outlined', 0, 0, 'Layout', '/about', '/about/index', 0, 1, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812116779807338496, 1811365615815487488, '2024-07-13 21:28:02', 1811365615815487488, '2024-07-17 14:13:02', 1, 0, 1812113823376666624, 'dax-pay', '基础数据', '', '', 0, 0, 'Layout', '/pay/config/base', '', -2, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812116972585938944, 1811365615815487488, '2024-07-13 21:28:48', 1811365615815487488, '2024-07-13 21:28:48', 0, 0, 1812113823376666624, 'dax-pay', '商户管理', '', '', 0, 0, 'Layout', '/pay/config/merchant', '', 0, 0, 1, 0, 0, NULL); -INSERT INTO `iam_perm_menu` VALUES (1812117366246535168, 1811365615815487488, '2024-07-13 21:30:22', 1811365615815487488, '2024-10-05 21:59:32', 0, 1, 1812116972585938944, 'dax-pay', '商户信息', 'MerchantList', '', 0, 0, '/daxpay/admin/merchant/info/MerchantList', '/pay/config/merchant/info', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812117498400665600, 1811365615815487488, '2024-07-13 21:30:54', 1811365615815487488, '2024-08-27 19:10:42', 1, 0, 1812116972585938944, 'dax-pay', '应用信息', 'MchAppList', '', 0, 0, '/daxpay/common/merchant/app/MchAppList', '/pay/config/merchant/app', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812118306328473600, 1811365615815487488, '2024-07-13 21:34:06', 1811365615815487488, '2024-08-27 16:13:35', 4, 0, 1812116779807338496, 'dax-pay', '支付通道', 'ChannelConstList', '', 0, 0, '/daxpay/common/constant/channel/ChannelConstList', '/pay/config/base/channel', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812118417951485952, 1811365615815487488, '2024-07-13 21:34:33', 1811365615815487488, '2024-08-27 16:13:39', 2, 0, 1812116779807338496, 'dax-pay', '支付方式', 'MethodConstList', '', 0, 0, '/daxpay/common/constant/method/MethodConstList', '/pay/config/base/method', '', 0, 0, 1, 0, 0, NULL); @@ -357,7 +367,7 @@ INSERT INTO `iam_perm_menu` VALUES (1822975777026252800, 1811365615815487488, '2 INSERT INTO `iam_perm_menu` VALUES (1822975970266226688, 1811365615815487488, '2024-08-12 20:38:35', 1811365615815487488, '2024-08-12 20:38:35', 0, 0, 1822975425229004800, 'dax-pay', '文件管理', 'FileUploadList', '', 0, 0, '/baseapi/file/upload/FileUploadList', '/system/file/info', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1824779660136001536, 1811365615815487488, '2024-08-17 20:05:48', 1811365615815487488, '2024-10-08 19:21:44', 5, 0, 1812114725651148800, 'dax-pay', '接收方', 'AllocationReceiverList', '', 1, 0, '/daxpay/common/allocation/receiver/AllocationReceiverList', '/pay/allocation/receiver', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1824779695900831744, 1811365615815487488, '2024-08-17 20:05:57', 1811365615815487488, '2024-10-08 19:21:38', 2, 0, 1812114725651148800, 'dax-pay', '分账组管理', 'AllocationGroupList', '', 1, 0, '/daxpay/common/allocation/group/AllocationGroupList', '/pay/allocation/group', '', 0, 0, 1, 0, 0, NULL); -INSERT INTO `iam_perm_menu` VALUES (1824779750208679936, 1811365615815487488, '2024-08-17 20:06:10', 1811365615815487488, '2024-10-08 19:25:43', 2, 0, 1812114725651148800, 'dax-pay', '分账单', '', '', 0, 0, '', '/pay/reconcile/order', '', 0, 0, 1, 0, 0, NULL); +INSERT INTO `iam_perm_menu` VALUES (1824779750208679936, 1811365615815487488, '2024-08-17 20:06:10', 1811365615815487488, '2024-11-18 14:39:23', 3, 0, 1812114725651148800, 'dax-pay', '分账单', 'AllocTransactionList', '', 0, 0, '/daxpay/common/allocation/transaction/AllocTransactionList', '/pay/reconcile/order', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1824779945365450752, 1811365615815487488, '2024-08-17 20:06:56', 1811365615815487488, '2024-08-27 19:11:51', 2, 0, 1812114347454951424, 'dax-pay', '同步记录', 'TradeSyncRecordList', '', 0, 0, '/daxpay/common/record/sync/TradeSyncRecordList', '/pay/record/sync', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1836248839544733696, 1811365615815487488, '2024-09-18 11:40:14', 1811365615815487488, '2024-09-25 14:46:38', 1, 0, 1812115119471128576, 'dax-pay', '交易调试', 'DevelopTrade', '', 0, 0, '/daxpay/common/develop/trade/DevelopTrade', '/pay/demo/develop', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1837381440350912512, 1811365615815487488, '2024-09-21 14:40:47', 1811365615815487488, '2024-09-21 14:40:47', 0, 0, 1810910433264762880, 'dax-pay', '延时队列', 'DelayQuery', '', 0, 0, '/baseapi/delay/DelayQuery', '/system/config/delay', '', 0, 0, 1, 0, 0, NULL); @@ -384,209 +394,6 @@ CREATE TABLE `iam_perm_path` ( -- ---------------------------- -- Records of iam_perm_path -- ---------------------------- -INSERT INTO `iam_perm_path` VALUES (1842909631622815744, 1811365615815487488, '2024-10-06 20:47:50', 'operateLog', 'dax-pay', '', '清除指定天数的操作日志', 1, '/log/operate/deleteByDay', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631639592960, 1811365615815487488, '2024-10-06 20:47:50', 'ChannelAuth', 'dax-pay', '', '通过查询码获取认证结果', 1, '/assist/channel/auth/queryAuthResult', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631647981568, 1811365615815487488, '2024-10-06 20:47:50', 'merchant', 'dax-pay', '', '新增商户应用', 1, '/mch/app/add', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631647981569, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '添加字典', 1, '/dict/add', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631652175872, 1811365615815487488, '2024-10-06 20:47:50', 'PayConst', 'dax-pay', '', '商户订阅通知类型分页', 1, '/const/merchant/notify/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631652175873, 1811365615815487488, '2024-10-06 20:47:50', 'MerchantCallback', 'dax-pay', '', '发送回调消息', 1, '/merchant/notice/callback/send', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631652175874, 1811365615815487488, '2024-10-06 20:47:50', 'RefundOrder', 'dax-pay', '', '退款关闭', 1, '/order/refund/close', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631656370176, 1811365615815487488, '2024-10-06 20:47:50', 'merchant', 'dax-pay', '', '商户应用分页', 1, '/mch/app/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631656370177, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '字典分页', 1, '/dict/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631656370178, 1811365615815487488, '2024-10-06 20:47:50', 'MerchantNotifyConfig', 'dax-pay', '', '查询列表', 1, '/merchant/notify/config/findAllByAppId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631660564480, 1811365615815487488, '2024-10-06 20:47:50', 'client', 'dax-pay', '', '编码是否被使用', 1, '/client/existsByCode', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631660564481, 1811365615815487488, '2024-10-06 20:47:50', 'params', 'dax-pay', '', '判断编码是否存在', 1, '/system/param/existsByKey', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631660564482, 1811365615815487488, '2024-10-06 20:47:50', 'MerchantNotify', 'dax-pay', '', '任务分页', 1, '/merchant/notice/notify/task/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631664758784, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '指定角色下的请求权限树(分配时用)', 1, '/role/path/treeByRole', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631664758785, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '根据用户ID获取到角色id集合', 1, '/user/role/findRoleIdsByUser', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631664758786, 1811365615815487488, '2024-10-06 20:47:50', 'TradeSync', 'dax-pay', '', '分页查询', 1, '/record/sync/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631668953088, 1811365615815487488, '2024-10-06 20:47:50', 'role', 'dax-pay', '', '角色下拉框', 1, '/role/dropdown', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631668953089, 1811365615815487488, '2024-10-06 20:47:50', 'loginLog', 'dax-pay', '', '登录日志分页', 1, '/log/login/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631668953090, 1811365615815487488, '2024-10-06 20:47:50', 'RefundOrder', 'dax-pay', '', '根据ID查询', 1, '/order/refund/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631673147392, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '根据用户ID获取到角色集合', 1, '/user/role/findRolesByUser', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631673147393, 1811365615815487488, '2024-10-06 20:47:50', 'AlipayConfig', 'dax-pay', '', '获取配置', 1, '/alipay/config/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631677341696, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '字典编码是否被使用', 1, '/dict/existsByCode', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631677341697, 1811365615815487488, '2024-10-06 20:47:50', 'operateLog', 'dax-pay', '', '获取日志分页', 1, '/log/operate/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631681536000, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '添加字典项', 1, '/dict/item/add', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631681536001, 1811365615815487488, '2024-10-06 20:47:50', 'MerchantNotify', 'dax-pay', '', '发送订阅消息', 1, '/merchant/notice/notify/send', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631681536002, 1811365615815487488, '2024-10-06 20:47:50', 'DevelopTrade', 'dax-pay', '', '支付接口', 1, '/develop/trade/pay', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631685730304, 1811365615815487488, '2024-10-06 20:47:50', 'RefundOrder', 'dax-pay', '', '查询金额汇总', 1, '/order/refund/getTotalAmount', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631685730305, 1811365615815487488, '2024-10-06 20:47:50', 'perm', 'dax-pay', '', '权限码目录树', 1, '/perm/code/catalogTree', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631689924608, 1811365615815487488, '2024-10-06 20:47:50', 'RefundOrder', 'dax-pay', '', '退款订单分页查询', 1, '/order/refund/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631689924609, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '编码是否被使用(不包含自己)', 1, '/dict/existsByCodeNotId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631689924610, 1811365615815487488, '2024-10-06 20:47:50', 'role', 'dax-pay', '', '名称是否被使用(不包含自己)', 1, '/role/existsByNameNotId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631689924611, 1811365615815487488, '2024-10-06 20:47:50', 'PayOrder', 'dax-pay', '', '关闭支付订单', 1, '/order/pay/close', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631694118912, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '获取全部字典项', 1, '/dict/item/findAll', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631694118913, 1811365615815487488, '2024-10-06 20:47:50', 'perm', 'dax-pay', '', '编码是否被使用', 1, '/perm/code/existsByCode', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631694118914, 1811365615815487488, '2024-10-06 20:47:50', 'ReconcileStatement', 'dax-pay', '', '手动触发交易对账单比对', 1, '/reconcile/statement/compare', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631694118915, 1811365615815487488, '2024-10-06 20:47:50', 'TradeCallback', 'dax-pay', '', '分页查询', 1, '/record/callback/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631698313216, 1811365615815487488, '2024-10-06 20:47:50', 'ReconcileDiscrepancy', 'dax-pay', '', '对账差异记录分页', 1, '/reconcile/discrepancy/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631698313217, 1811365615815487488, '2024-10-06 20:47:50', 'DevelopTrade', 'dax-pay', '', '退款接口', 1, '/develop/trade/refund', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631698313218, 1811365615815487488, '2024-10-06 20:47:50', 'TransferOrder', 'dax-pay', '', '根据转账号查询', 1, '/order/transfer/findByTransferNo', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631702507520, 1811365615815487488, '2024-10-06 20:47:50', 'loginLog', 'dax-pay', '', '清除指定天数之前的登录日志', 1, '/log/login/deleteByDay', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631702507521, 1811365615815487488, '2024-10-06 20:47:50', 'MerchantCallback', 'dax-pay', '', '任务详情', 1, '/merchant/notice/callback/task/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631702507522, 1811365615815487488, '2024-10-06 20:47:50', 'TradeFlow', 'dax-pay', '', '查询各类金额汇总', 1, '/record/flow/summary', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631706701824, 1811365615815487488, '2024-10-06 20:47:50', 'MerchantNotify', 'dax-pay', '', '任务详情', 1, '/merchant/notice/notify/task/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631706701825, 1811365615815487488, '2024-10-06 20:47:50', 'params', 'dax-pay', '', '获取单条', 1, '/system/param/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631710896128, 1811365615815487488, '2024-10-06 20:47:50', 'client', 'dax-pay', '', '编码是否被使用(不包含自己)', 1, '/client/existsByCodeNotId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631710896129, 1811365615815487488, '2024-10-06 20:47:50', 'AlipayConfig', 'dax-pay', '', '新增或更新', 1, '/alipay/config/saveOrUpdate', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631710896130, 1811365615815487488, '2024-10-06 20:47:50', 'user', 'dax-pay', '', '修改用户', 1, '/user/admin/update', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631710896131, 1811365615815487488, '2024-10-06 20:47:50', 'file', 'dax-pay', '', '更新文件存储平台地址', 1, '/file/platform/updateUrl', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631715090432, 1811365615815487488, '2024-10-06 20:47:50', 'RefundOrder', 'dax-pay', '', '发起退款', 1, '/order/refund/create', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631715090433, 1811365615815487488, '2024-10-06 20:47:50', 'ChannelCashierConfig', 'dax-pay', '', '配置详情', 1, '/channel/cashier/config/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631715090434, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '保存请求权限关系', 1, '/role/menu/save', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631719284736, 1811365615815487488, '2024-10-06 20:47:50', 'ChannelCashierConfig', 'dax-pay', '', '配置列表', 1, '/channel/cashier/config/findByAppId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631719284737, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '指定角色下的菜单权限树(分配时用)', 1, '/role/menu/treeByRole', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631719284738, 1811365615815487488, '2024-10-06 20:47:50', 'params', 'dax-pay', '', '分页', 1, '/system/param/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631719284739, 1811365615815487488, '2024-10-06 20:47:50', 'ChannelCashierConfig', 'dax-pay', '', '配置是否存在(不包括自身)', 1, '/channel/cashier/config/existsByTypeNotId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631723479040, 1811365615815487488, '2024-10-06 20:47:50', 'user', 'dax-pay', '', '根据用户id查询用户 ', 1, '/user/admin/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631723479041, 1811365615815487488, '2024-10-06 20:47:50', 'CloseRecord', 'dax-pay', '', '查询单条', 1, '/record/close/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631723479042, 1811365615815487488, '2024-10-06 20:47:50', 'ReconcileStatement', 'dax-pay', '', '手动创建对账订单', 1, '/reconcile/statement/create', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631723479043, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '指定角色下的请求权限树(分配时用)', 1, '/role/code/treeByRole', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631723479044, 1811365615815487488, '2024-10-06 20:47:50', 'DevelopTrade', 'dax-pay', '', '退款参数签名', 1, '/develop/trade/sign/refund', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631723479045, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '查询全部字典', 1, '/dict/findAll', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631723479046, 1811365615815487488, '2024-10-06 20:47:50', 'role', 'dax-pay', '', '查询所有的角色', 1, '/role/findAll', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631731867648, 1811365615815487488, '2024-10-06 20:47:50', 'ChannelAuth', 'dax-pay', '', '获取授权链接', 1, '/assist/channel/auth/generateAuthUrl', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631731867649, 1811365615815487488, '2024-10-06 20:47:50', 'user', 'dax-pay', '', '批量解锁用户', 1, '/user/admin/unlockBatch', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631736061952, 1811365615815487488, '2024-10-06 20:47:50', 'MerchantCallback', 'dax-pay', '', '发送记录分页', 1, '/merchant/notice/callback/record/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631736061953, 1811365615815487488, '2024-10-06 20:47:50', 'PayOrder', 'dax-pay', '', '撤销支付订单', 1, '/order/pay/cancel', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631736061954, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '删除字典项', 1, '/dict/item/delete', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631740256256, 1811365615815487488, '2024-10-06 20:47:50', 'PayOrder', 'dax-pay', '', '查询订单详情', 1, '/order/pay/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631740256257, 1811365615815487488, '2024-10-06 20:47:50', 'TradeCallback', 'dax-pay', '', '查询单条', 1, '/record/callback/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631740256258, 1811365615815487488, '2024-10-06 20:47:50', 'params', 'dax-pay', '', '更新', 1, '/system/param/update', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631740256259, 1811365615815487488, '2024-10-06 20:47:50', 'UnionPayConfig', 'dax-pay', '', '获取配置', 1, '/union/pay/config/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631740256260, 1811365615815487488, '2024-10-06 20:47:50', 'ReconcileStatement', 'dax-pay', '', '手动上传交易对账单文件', 1, '/reconcile/statement/upload', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631744450560, 1811365615815487488, '2024-10-06 20:47:50', 'perm', 'dax-pay', '', '编码是否被使用(不包含自己)', 1, '/perm/code/existsByCodeNotId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631744450561, 1811365615815487488, '2024-10-06 20:47:50', 'PayOrder', 'dax-pay', '', '根据订单号查询详情', 1, '/order/pay/findByOrderNo', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631744450562, 1811365615815487488, '2024-10-06 20:47:50', 'perm', 'dax-pay', '', '根据id查询菜单', 1, '/perm/menu/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631744450563, 1811365615815487488, '2024-10-06 20:47:50', 'client', 'dax-pay', '', '查询所有终端', 1, '/client/findAll', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631744450564, 1811365615815487488, '2024-10-06 20:47:50', 'ReconcileStatement', 'dax-pay', '', '手动触发对账文件下载', 1, '/reconcile/statement/downAndSave', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631748644864, 1811365615815487488, '2024-10-06 20:47:50', 'params', 'dax-pay', '', '添加', 1, '/system/param/add', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631748644865, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '给用户分配角色', 1, '/user/role/saveAssign', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631748644866, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '给用户分配角色(批量)', 1, '/user/role/saveAssignBatch', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631748644867, 1811365615815487488, '2024-10-06 20:47:50', 'user', 'dax-pay', '', '重置密码', 1, '/user/admin/restartPassword', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631752839168, 1811365615815487488, '2024-10-06 20:47:50', 'loginLog', 'dax-pay', '', '获取登录日志', 1, '/log/login/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631752839169, 1811365615815487488, '2024-10-06 20:47:50', 'user', 'dax-pay', '', '封禁用户', 1, '/user/admin/ban', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631752839170, 1811365615815487488, '2024-10-06 20:47:50', 'PayOrder', 'dax-pay', '', '分页查询', 1, '/order/pay/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631752839171, 1811365615815487488, '2024-10-06 20:47:50', 'role', 'dax-pay', '', '编码是否被使用', 1, '/role/existsByCode', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631757033472, 1811365615815487488, '2024-10-06 20:47:50', 'RefundOrder', 'dax-pay', '', '根据商户退款号查询', 1, '/order/refund/findByRefundNo', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631757033473, 1811365615815487488, '2024-10-06 20:47:50', 'TransferOrder', 'dax-pay', '', '转账关闭', 1, '/order/transfer/close', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631757033474, 1811365615815487488, '2024-10-06 20:47:50', 'ChannelCashierConfig', 'dax-pay', '', '配置删除', 1, '/channel/cashier/config/delete', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631757033475, 1811365615815487488, '2024-10-06 20:47:50', 'ReconcileStatement', 'dax-pay', '', '对账单分页', 1, '/reconcile/statement/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631761227776, 1811365615815487488, '2024-10-06 20:47:50', 'params', 'dax-pay', '', '删除', 1, '/system/param/delete', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631761227777, 1811365615815487488, '2024-10-06 20:47:50', 'UnionPayConfig', 'dax-pay', '', '新增或更新', 1, '/union/pay/config/saveOrUpdate', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631761227778, 1811365615815487488, '2024-10-06 20:47:50', 'ChannelCashierConfig', 'dax-pay', '', '配置是否存在', 1, '/channel/cashier/config/existsByType', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631761227779, 1811365615815487488, '2024-10-06 20:47:50', 'merchant', 'dax-pay', '', '删除商户应用', 1, '/mch/app/delete', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631761227780, 1811365615815487488, '2024-10-06 20:47:50', 'PayOrder', 'dax-pay', '', '同步支付订单状态', 1, '/order/pay/sync', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631765422080, 1811365615815487488, '2024-10-06 20:47:50', 'user', 'dax-pay', '', '用户分页', 1, '/user/admin/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631765422081, 1811365615815487488, '2024-10-06 20:47:50', 'WechatPayConfig', 'dax-pay', '', '获取配置', 1, '/wechat/pay/config/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631765422082, 1811365615815487488, '2024-10-06 20:47:50', 'TradeSync', 'dax-pay', '', '查询单条', 1, '/record/sync/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631765422083, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '根据主键删除字典', 1, '/dict/delete', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631765422084, 1811365615815487488, '2024-10-06 20:47:50', 'ChannelCashierConfig', 'dax-pay', '', '配置更新', 1, '/channel/cashier/config/update', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631769616384, 1811365615815487488, '2024-10-06 20:47:50', 'TransferOrder', 'dax-pay', '', '分页查询', 1, '/order/transfer/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631769616385, 1811365615815487488, '2024-10-06 20:47:50', 'TradeFlow', 'dax-pay', '', '查询单条', 1, '/record/flow/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631769616386, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '根据主键获取字典', 1, '/dict/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631769616387, 1811365615815487488, '2024-10-06 20:47:50', 'user', 'dax-pay', '', '解锁用户', 1, '/user/admin/unlock', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631769616388, 1811365615815487488, '2024-10-06 20:47:50', 'role', 'dax-pay', '', '编码是否被使用(不包含自己)', 1, '/role/existsByCodeNotId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631773810688, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '添加字典项', 1, '/dict/item/update', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631773810689, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '更新字典', 1, '/dict/update', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631773810690, 1811365615815487488, '2024-10-06 20:47:50', 'MerchantCallback', 'dax-pay', '', '发送记录详情', 1, '/merchant/notice/callback/record/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631778004992, 1811365615815487488, '2024-10-06 20:47:50', 'perm', 'dax-pay', '', '权限码详情', 1, '/perm/code/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631778004993, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '查询当前角色已经选择的菜单id', 1, '/role/menu/findIdsByRole', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631778004994, 1811365615815487488, '2024-10-06 20:47:50', 'CloseRecord', 'dax-pay', '', '分页查询', 1, '/record/close/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631778004995, 1811365615815487488, '2024-10-06 20:47:50', 'role', 'dax-pay', '', '通过ID查询角色', 1, '/role/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631778004996, 1811365615815487488, '2024-10-06 20:47:50', 'user', 'dax-pay', '', '添加用户', 1, '/user/admin/add', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631778004997, 1811365615815487488, '2024-10-06 20:47:50', 'merchant', 'dax-pay', '', '根据商户号查询商户应用下拉列表', 1, '/mch/app/dropdown', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631782199296, 1811365615815487488, '2024-10-06 20:47:50', 'TransferOrder', 'dax-pay', '', '查询单条', 1, '/order/transfer/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631782199297, 1811365615815487488, '2024-10-06 20:47:50', 'MerchantNotify', 'dax-pay', '', '发送记录分页', 1, '/merchant/notice/notify/record/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631782199298, 1811365615815487488, '2024-10-06 20:47:50', 'MerchantNotifyConfig', 'dax-pay', '', '商户消息订阅配置', 1, '/merchant/notify/config/subscribe', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631782199299, 1811365615815487488, '2024-10-06 20:47:50', 'merchant', 'dax-pay', '', '根据id查询商户应用', 1, '/mch/app/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631782199300, 1811365615815487488, '2024-10-06 20:47:50', 'ChannelCashierConfig', 'dax-pay', '', '获取码牌地址', 1, '/channel/cashier/config/qrCodeUrl', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631782199301, 1811365615815487488, '2024-10-06 20:47:50', 'client', 'dax-pay', '', '通过ID查询终端', 1, '/client/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631786393600, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '查询当前角色已经选择的请求路径', 1, '/role/path/findIdsByRole', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631786393601, 1811365615815487488, '2024-10-06 20:47:50', 'RefundOrder', 'dax-pay', '', '退款同步', 1, '/order/refund/sync', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631786393602, 1811365615815487488, '2024-10-06 20:47:50', 'TransferOrder', 'dax-pay', '', '查询金额汇总', 1, '/order/transfer/getTotalAmount', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631786393603, 1811365615815487488, '2024-10-06 20:47:50', 'TransferOrder', 'dax-pay', '', '转账重试', 1, '/order/transfer/retry', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631786393604, 1811365615815487488, '2024-10-06 20:47:50', 'PayOrder', 'dax-pay', '', '查询金额汇总', 1, '/order/pay/getTotalAmount', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631790587904, 1811365615815487488, '2024-10-06 20:47:50', 'operateLog', 'dax-pay', '', '操作日志分页', 1, '/log/operate/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631790587905, 1811365615815487488, '2024-10-06 20:47:50', 'ReconcileStatement', 'dax-pay', '', '查询对账单', 1, '/reconcile/statement/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631790587906, 1811365615815487488, '2024-10-06 20:47:50', 'RefundOrder', 'dax-pay', '', '退款重试', 1, '/order/refund/retry', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631794782208, 1811365615815487488, '2024-10-06 20:47:50', 'PayConst', 'dax-pay', '', '支付方式分页', 1, '/const/method/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631798976512, 1811365615815487488, '2024-10-06 20:47:50', 'role', 'dax-pay', '', '名称是否被使用', 1, '/role/existsByName', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631803170816, 1811365615815487488, '2024-10-06 20:47:50', 'client', 'dax-pay', '', '分页查询终端', 1, '/client/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631803170817, 1811365615815487488, '2024-10-06 20:47:50', 'perm', 'dax-pay', '', '获取请求权限详情', 1, '/perm/path/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631803170818, 1811365615815487488, '2024-10-06 20:47:50', 'MerchantCallback', 'dax-pay', '', '任务分页', 1, '/merchant/notice/callback/task/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631803170819, 1811365615815487488, '2024-10-06 20:47:50', 'PayConst', 'dax-pay', '', '支付开放接口分页', 1, '/const/api/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631803170820, 1811365615815487488, '2024-10-06 20:47:50', 'PayConst', 'dax-pay', '', '支付通道分页', 1, '/const/channel/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631803170821, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '查询字典项', 1, '/dict/item/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631807365120, 1811365615815487488, '2024-10-06 20:47:50', 'perm', 'dax-pay', '', '请求权限树', 1, '/perm/path/tree', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631807365121, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '保存请求权限关系', 1, '/role/code/save', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631807365122, 1811365615815487488, '2024-10-06 20:47:50', 'WechatPayConfig', 'dax-pay', '', '新增或更新', 1, '/wechat/pay/config/saveOrUpdate', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631807365123, 1811365615815487488, '2024-10-06 20:47:50', 'ChannelCashierConfig', 'dax-pay', '', '配置保存', 1, '/channel/cashier/config/save', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631807365124, 1811365615815487488, '2024-10-06 20:47:50', 'user', 'dax-pay', '', '批量封禁用户', 1, '/user/admin/banBatch', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631807365125, 1811365615815487488, '2024-10-06 20:47:50', 'channelConfig', 'dax-pay', '', '根据应用AppId查询配置列表', 1, '/channel/config/findAllByAppId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631807365126, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '查询字典项列表', 1, '/dict/item/findByDictionaryId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631807365127, 1811365615815487488, '2024-10-06 20:47:50', 'DevelopTrade', 'dax-pay', '', '转账参数签名', 1, '/develop/trade/sign/transfer', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631807365128, 1811365615815487488, '2024-10-06 20:47:50', 'TransferOrder', 'dax-pay', '', '根据商户转账号查询', 1, '/order/transfer/findByBizTransferNo', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631815753728, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '字典项编码是否被使用', 1, '/dict/item/existsByCode', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631815753729, 1811365615815487488, '2024-10-06 20:47:50', 'params', 'dax-pay', '', '判断编码是否存在(不包含自己)', 1, '/system/param/existsByKeyNotId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631815753730, 1811365615815487488, '2024-10-06 20:47:50', 'DevelopTrade', 'dax-pay', '', '支付参数签名', 1, '/develop/trade/sign/pay', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631815753731, 1811365615815487488, '2024-10-06 20:47:50', 'file', 'dax-pay', '', '设置默认存储平台地址', 1, '/file/platform/setDefault', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631815753732, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '字典项编码是否被使用(不包含自己)', 1, '/dict/item/existsByCodeNotId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631819948032, 1811365615815487488, '2024-10-06 20:47:50', 'dict', 'dax-pay', '', '字典项分页', 1, '/dict/item/pageByDictionaryId', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631819948033, 1811365615815487488, '2024-10-06 20:47:50', 'TransferOrder', 'dax-pay', '', '转账同步', 1, '/order/transfer/sync', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631819948034, 1811365615815487488, '2024-10-06 20:47:50', 'DevelopTrade', 'dax-pay', '', '转账接口', 1, '/develop/trade/transfer', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631819948035, 1811365615815487488, '2024-10-06 20:47:50', 'TradeFlow', 'dax-pay', '', '分页查询', 1, '/record/flow/page', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631819948036, 1811365615815487488, '2024-10-06 20:47:50', 'MerchantNotify', 'dax-pay', '', '发送记录详情', 1, '/merchant/notice/notify/record/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631819948037, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '保存角色请求权限关联关系', 1, '/role/path/save', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631819948038, 1811365615815487488, '2024-10-06 20:47:50', 'upms', 'dax-pay', '', '查询当前角色已经选择的菜单id', 1, '/role/code/findIdsByRole', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909631824142336, 1811365615815487488, '2024-10-06 20:47:50', 'user', 'dax-pay', '', '批量重置密码', 1, '/user/admin/restartPasswordBatch', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631824142337, 1811365615815487488, '2024-10-06 20:47:50', 'merchant', 'dax-pay', '', '修改商户应用', 1, '/mch/app/update', 'POST'); -INSERT INTO `iam_perm_path` VALUES (1842909631824142338, 1811365615815487488, '2024-10-06 20:47:50', 'ReconcileDiscrepancy', 'dax-pay', '', '查询对账差异记录', 1, '/reconcile/discrepancy/findById', 'GET'); -INSERT INTO `iam_perm_path` VALUES (1842909632381984768, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'PayConfig', '支付配置', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632386179072, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'alipay', '支付宝通道', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632386179073, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'starter', 'starter模块', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632386179074, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'baseapi', '基础API', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632386179075, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'develop', '开发调试功能', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632386179076, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'reconcile', '对账服务', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632390373376, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'TradeOrder', '交易订单', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632390373377, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'iam', '身份识别与访问管理', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632390373378, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'UnionPay', '云闪付', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632390373379, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'wechatPay', '微信支付', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632390373380, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'TradeRecord', '交易记录', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632390373381, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'MerchantNotice', '商户通知', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632390373382, 1811365615815487488, '2024-10-06 20:47:51', NULL, 'dax-pay', 'assist', '辅助功能', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632394567680, 1811365615815487488, '2024-10-06 20:47:51', 'PayConfig', 'dax-pay', 'PayConst', '支付常量', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632394567681, 1811365615815487488, '2024-10-06 20:47:51', 'iam', 'dax-pay', 'role', '角色管理', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632394567682, 1811365615815487488, '2024-10-06 20:47:51', 'iam', 'dax-pay', 'perm', '权限管理', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632394567683, 1811365615815487488, '2024-10-06 20:47:51', 'TradeOrder', 'dax-pay', 'PayOrder', '支付订单', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632394567684, 1811365615815487488, '2024-10-06 20:47:51', 'starter', 'dax-pay', 'loginLog', '登录日志', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632398761984, 1811365615815487488, '2024-10-06 20:47:51', 'starter', 'dax-pay', 'file', '文件存储管理', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632398761985, 1811365615815487488, '2024-10-06 20:47:51', 'assist', 'dax-pay', 'ChannelAuth', '通道认证', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632398761986, 1811365615815487488, '2024-10-06 20:47:51', 'MerchantNotice', 'dax-pay', 'MerchantCallback', '商户回调通知', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632398761987, 1811365615815487488, '2024-10-06 20:47:51', 'iam', 'dax-pay', 'client', '终端管理', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632398761988, 1811365615815487488, '2024-10-06 20:47:51', 'baseapi', 'dax-pay', 'dict', '字典管理', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632398761989, 1811365615815487488, '2024-10-06 20:47:51', 'reconcile', 'dax-pay', 'ReconcileDiscrepancy', '对账差异记录', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632402956288, 1811365615815487488, '2024-10-06 20:47:51', 'PayConfig', 'dax-pay', 'MerchantNotifyConfig', '商户通知配置', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632402956289, 1811365615815487488, '2024-10-06 20:47:51', 'starter', 'dax-pay', 'operateLog', '操作日志', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632402956290, 1811365615815487488, '2024-10-06 20:47:51', 'TradeRecord', 'dax-pay', 'TradeFlow', '交易流水记录', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632402956291, 1811365615815487488, '2024-10-06 20:47:51', 'TradeOrder', 'dax-pay', 'RefundOrder', '退款订单', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632402956292, 1811365615815487488, '2024-10-06 20:47:51', 'reconcile', 'dax-pay', 'ReconcileStatement', '对账单', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632402956293, 1811365615815487488, '2024-10-06 20:47:51', 'TradeRecord', 'dax-pay', 'TradeCallback', '交易回调记录', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632402956294, 1811365615815487488, '2024-10-06 20:47:51', 'alipay', 'dax-pay', 'AlipayConfig', '支付宝配置', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632407150592, 1811365615815487488, '2024-10-06 20:47:51', 'TradeRecord', 'dax-pay', 'CloseRecord', '支付关闭记录', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632407150593, 1811365615815487488, '2024-10-06 20:47:51', 'wechatPay', 'dax-pay', 'WechatPayConfig', '微信支付配置', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632407150594, 1811365615815487488, '2024-10-06 20:47:51', 'PayConfig', 'dax-pay', 'ChannelCashierConfig', '通道支付收银台配置', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632407150595, 1811365615815487488, '2024-10-06 20:47:51', 'MerchantNotice', 'dax-pay', 'MerchantNotify', '商户订阅通知', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632411344896, 1811365615815487488, '2024-10-06 20:47:51', 'PayConfig', 'dax-pay', 'merchant', '商户配置', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632411344897, 1811365615815487488, '2024-10-06 20:47:51', 'UnionPay', 'dax-pay', 'UnionPayConfig', '云闪付配置', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632415539200, 1811365615815487488, '2024-10-06 20:47:51', 'baseapi', 'dax-pay', 'params', '系统参数', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632415539201, 1811365615815487488, '2024-10-06 20:47:51', 'develop', 'dax-pay', 'DevelopTrade', '交易开发调试服务', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632415539202, 1811365615815487488, '2024-10-06 20:47:51', 'TradeRecord', 'dax-pay', 'TradeSync', '交易同步记录', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632415539203, 1811365615815487488, '2024-10-06 20:47:51', 'TradeOrder', 'dax-pay', 'TransferOrder', '转账订单', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632415539204, 1811365615815487488, '2024-10-06 20:47:51', 'PayConfig', 'dax-pay', 'channelConfig', '通道配置', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632415539205, 1811365615815487488, '2024-10-06 20:47:51', 'iam', 'dax-pay', 'upms', '权限分配管理', 0, NULL, NULL); -INSERT INTO `iam_perm_path` VALUES (1842909632415539206, 1811365615815487488, '2024-10-06 20:47:51', 'iam', 'dax-pay', 'user', '用户管理', 0, NULL, NULL); -- ---------------------------- -- Table structure for iam_role @@ -610,13 +417,7 @@ CREATE TABLE `iam_role` ( -- ---------------------------- -- Records of iam_role -- ---------------------------- -INSERT INTO `iam_role` VALUES (1810203792869191680, 0, '2024-07-08 14:46:31', 0, '2024-07-08 14:46:31', 0, 0, NULL, 'admin', '管理员', 0, ''); -INSERT INTO `iam_role` VALUES (1810205411434328064, 0, '2024-07-08 14:52:57', 0, '2024-07-08 14:52:57', 0, 0, 1810203792869191680, 'test', '测试角色', 0, ''); -INSERT INTO `iam_role` VALUES (1810208169436672000, 0, '2024-07-08 15:03:54', 0, '2024-07-08 15:03:54', 0, 0, 1810205411434328064, 'test2', '测试三级角色', 0, ''); -INSERT INTO `iam_role` VALUES (1810593423368630272, 0, '2024-07-09 16:34:46', 0, '2024-07-09 16:34:46', 0, 0, NULL, 'cancel', '忽略分账', 0, '12333'); -INSERT INTO `iam_role` VALUES (1810593451453689856, 0, '2024-07-09 16:34:53', 0, '2024-07-09 16:34:53', 0, 0, 1810593423368630272, '1123', '3322', 0, '2223'); -INSERT INTO `iam_role` VALUES (1826818640033910784, 1811365615815487488, '2024-08-23 11:07:59', 1811365615815487488, '2024-08-23 11:07:59', 0, 0, NULL, 'merchant_admin', '商户系统管理员', 1, '商户系统的管理员'); -INSERT INTO `iam_role` VALUES (1828680591068422144, 1827910922934001664, '2024-08-28 14:26:43', 1827910922934001664, '2024-08-28 14:26:43', 0, 0, 1826818640033910784, 'cs1', '商户子管理员', 0, ''); +INSERT INTO `iam_role` VALUES (1810203792869191680, 0, '2024-07-08 14:46:31', 0, '2024-07-08 14:46:31', 0, 0, NULL, 'admin', '管理员', 1, ''); -- ---------------------------- -- Table structure for iam_role_code @@ -632,9 +433,6 @@ CREATE TABLE `iam_role_code` ( -- ---------------------------- -- Records of iam_role_code -- ---------------------------- -INSERT INTO `iam_role_code` VALUES (1812476422410076160, 1810203792869191680, 1810975149316100096); -INSERT INTO `iam_role_code` VALUES (1812476422632374272, 1810208169436672000, 1812476422410076160); -INSERT INTO `iam_role_code` VALUES (1812476422649151488, 1810205411434328064, 1812476422410076160); -- ---------------------------- -- Table structure for iam_role_menu @@ -696,10 +494,6 @@ CREATE TABLE `iam_user_expand_info` ( -- Records of iam_user_expand_info -- ---------------------------- INSERT INTO `iam_user_expand_info` VALUES (1811365615815487488, 0, '2024-07-11 19:43:11', 0, '2024-07-11 19:43:11', 0, 0, NULL, NULL, NULL, NULL, '2024-07-11 19:43:11', NULL, 0, 0, NULL); -INSERT INTO `iam_user_expand_info` VALUES (1811689994080333824, 1811365615815487488, '2024-07-12 17:12:09', 1811365615815487488, '2024-07-12 17:12:09', 0, 0, NULL, NULL, NULL, NULL, '2024-07-12 17:12:09', NULL, 0, 0, NULL); -INSERT INTO `iam_user_expand_info` VALUES (1811690440006152192, 1811365615815487488, '2024-07-12 17:13:55', 1811365615815487488, '2024-07-12 17:13:55', 0, 0, NULL, NULL, NULL, NULL, '2024-07-12 17:13:55', NULL, 0, 0, NULL); -INSERT INTO `iam_user_expand_info` VALUES (1827910922934001664, 1811365615815487488, '2024-08-26 11:28:20', 1811365615815487488, '2024-08-26 11:28:20', 0, 0, NULL, NULL, NULL, NULL, '2024-08-26 11:28:20', NULL, 0, 0, NULL); -INSERT INTO `iam_user_expand_info` VALUES (1828624347955830784, 1827910922934001664, '2024-08-28 10:43:13', 1827910922934001664, '2024-08-28 10:43:13', 0, 0, NULL, NULL, NULL, NULL, '2024-08-28 10:43:13', NULL, 0, 0, NULL); -- ---------------------------- -- Table structure for iam_user_info @@ -727,10 +521,6 @@ CREATE TABLE `iam_user_info` ( -- Records of iam_user_info -- ---------------------------- INSERT INTO `iam_user_info` VALUES (1811365615815487488, 0, '2024-07-11 19:43:11', 0, '2024-07-11 19:43:33', 1, 0, '超级管理员', 'bootx', '$2a$10$knt/I7FYX9YpWYfjv4ChhuOhiYGf3/fCvrHxm51pis.OnNPBDvSeC', '13333333333', 'bootx@bootx.cn', 1, 'normal'); -INSERT INTO `iam_user_info` VALUES (1811689994080333824, 1811365615815487488, '2024-07-12 17:12:09', 1811365615815487488, '2024-07-12 17:12:09', 0, 0, 'daxpay管理员', 'daxpayadmin', '$2a$10$g0z/HDjLW5H78ngJwNh76uBxkoLwiDpJZKSXT4uq7.H.w84nhnRUq', '', '', 0, 'normal'); -INSERT INTO `iam_user_info` VALUES (1811690440006152192, 1811365615815487488, '2024-07-12 17:13:55', 1811365615815487488, '2024-07-13 21:04:08', 1, 0, 'daxpay', 'daxpay', '$2a$10$gnZOm7R1kPXAfE/Blis1jOFd7yf8.ts9o5aHvqk4Pe9Kv01KEO3/K', '', '', 0, 'normal'); -INSERT INTO `iam_user_info` VALUES (1827910922934001664, 1811365615815487488, '2024-08-26 11:28:20', 1811365615815487488, '2024-08-26 11:28:20', 0, 0, '一杯广播', 'ybgn', '$2a$10$7wOKvdcW2k3WsMzg/fUAqu/Y..9Jb7fxXIeBKlQOuoK0peqP111Lq', '', '', 0, 'normal'); -INSERT INTO `iam_user_info` VALUES (1828624347955830784, 1827910922934001664, '2024-08-28 10:43:13', 1827910922934001664, '2024-08-28 10:43:13', 0, 0, 'ybgn001', 'ybgn001', '$2a$10$1D9GkCe7YhFqjZMzBluQ6.YOk09Re1pykFT0shRNFjnrVLhgn3GG.', '', '', 0, 'normal'); -- ---------------------------- -- Table structure for iam_user_role @@ -746,10 +536,39 @@ CREATE TABLE `iam_user_role` ( -- ---------------------------- -- Records of iam_user_role -- ---------------------------- -INSERT INTO `iam_user_role` VALUES (1812414360145350656, 1811690440006152192, 1810205411434328064); -INSERT INTO `iam_user_role` VALUES (1818534592677240832, 1811689994080333824, 1810203792869191680); -INSERT INTO `iam_user_role` VALUES (1827910923944828928, 1827910922934001664, 1826818640033910784); -INSERT INTO `iam_user_role` VALUES (1828966173665492992, 1828624347955830784, 1828680591068422144); + +-- ---------------------------- +-- Table structure for pay_alloc_detail +-- ---------------------------- +DROP TABLE IF EXISTS `pay_alloc_detail`; +CREATE TABLE `pay_alloc_detail` ( + `id` bigint NOT NULL COMMENT '主键', + `allocation_id` bigint NOT NULL COMMENT '分账订单ID', + `receiver_id` bigint NOT NULL COMMENT '接收者ID', + `receiver_no` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分账接收方编号', + `rate` int NOT NULL COMMENT '分账比例(万分之多少)', + `amount` int NOT NULL COMMENT '分账金额', + `receiver_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分账接收方类型', + `receiver_account` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '接收方账号', + `receiver_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '接收方姓名', + `result` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分账结果', + `error_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '错误代码', + `error_msg` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '错误原因', + `finish_time` datetime NULL DEFAULT NULL COMMENT '分账完成时间', + `creator` bigint NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int NOT NULL COMMENT '乐观锁', + `deleted` tinyint(1) NOT NULL COMMENT '删除标志', + `app_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '应用号', + PRIMARY KEY (`id`) USING BTREE, + INDEX `allocation_id`(`allocation_id` ASC) USING BTREE COMMENT '分账订单ID索引' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '分账订单明细' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of pay_alloc_detail +-- ---------------------------- -- ---------------------------- -- Table structure for pay_alloc_group @@ -773,6 +592,9 @@ CREATE TABLE `pay_alloc_group` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '分账组' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of pay_alloc_group +-- ---------------------------- -- ---------------------------- -- Table structure for pay_alloc_group_receiver @@ -793,6 +615,9 @@ CREATE TABLE `pay_alloc_group_receiver` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '分账接收组关系' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of pay_alloc_group_receiver +-- ---------------------------- -- ---------------------------- -- Table structure for pay_alloc_receiver @@ -817,12 +642,80 @@ CREATE TABLE `pay_alloc_receiver` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '分账接收方' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of pay_alloc_receiver +-- ---------------------------- -- ---------------------------- --- Table structure for pay_channel_cashier_config +-- Table structure for pay_alloc_transaction -- ---------------------------- -DROP TABLE IF EXISTS `pay_channel_cashier_config`; -CREATE TABLE `pay_channel_cashier_config` ( +DROP TABLE IF EXISTS `pay_alloc_transaction`; +CREATE TABLE `pay_alloc_transaction` ( + `id` bigint NOT NULL COMMENT '主键', + `alloc_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分账单号', + `biz_alloc_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '商户分账单号', + `out_alloc_no` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '通道分账号', + `order_id` bigint NOT NULL COMMENT '支付订单ID', + `order_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '支付订单号', + `biz_order_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '商户支付订单号', + `out_order_no` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '通道支付订单号', + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '支付标题', + `channel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '所属通道', + `amount` int NOT NULL COMMENT '总分账金额', + `description` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分账描述', + `status` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态', + `result` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '处理结果', + `finish_time` datetime NULL DEFAULT NULL COMMENT '分账完成时间', + `notify_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '异步通知地址', + `attach` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商户扩展参数', + `req_time` datetime NULL DEFAULT NULL COMMENT '请求时间,传输时间戳', + `client_ip` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '支付终端ip', + `error_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '错误码', + `error_msg` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '错误信息', + `creator` bigint NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int NOT NULL COMMENT '乐观锁', + `deleted` tinyint(1) NOT NULL COMMENT '删除标志', + `app_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '应用号', + PRIMARY KEY (`id`) USING BTREE, + INDEX `alloc_no`(`alloc_no` ASC) USING BTREE COMMENT '分账单号索引', + INDEX `biz_alloc_no`(`biz_alloc_no` ASC) USING BTREE COMMENT '商户分账单号索引', + INDEX `out_alloc_no`(`out_alloc_no` ASC) USING BTREE COMMENT '通道分账号索引', + INDEX `order_id`(`order_id` ASC) USING BTREE COMMENT '支付订单ID索引', + INDEX `order_no`(`order_no` ASC) USING BTREE COMMENT '支付订单号索引', + INDEX `biz_order_no`(`biz_order_no` ASC) USING BTREE COMMENT '商户支付订单号索引', + INDEX `out_order_no`(`out_order_no` ASC) USING BTREE COMMENT '通道支付订单号索引' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '分账订单' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of pay_alloc_transaction +-- ---------------------------- + +-- ---------------------------- +-- Table structure for pay_api_const +-- ---------------------------- +DROP TABLE IF EXISTS `pay_api_const`; +CREATE TABLE `pay_api_const` ( + `id` bigint NOT NULL COMMENT '主键', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '编码', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '接口名称', + `api` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '接口地址', + `enable` tinyint(1) NULL DEFAULT NULL COMMENT '是否启用', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支付接口常量' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of pay_api_const +-- ---------------------------- + +-- ---------------------------- +-- Table structure for pay_cashier_code_config +-- ---------------------------- +DROP TABLE IF EXISTS `pay_cashier_code_config`; +CREATE TABLE `pay_cashier_code_config` ( `id` bigint NOT NULL COMMENT '主键', `creator` bigint NULL DEFAULT NULL COMMENT '创建者ID', `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', @@ -831,16 +724,43 @@ CREATE TABLE `pay_channel_cashier_config` ( `version` int NOT NULL COMMENT '版本号', `deleted` tinyint(1) NOT NULL COMMENT '删除标志', `app_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '应用号', - `cashier_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '收银台类型', - `cashier_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '收银台名称', - `channel` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '支付通道', - `pay_method` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '支付方式', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '码牌名称', + `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '码牌code', + `template_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模板编号', + `enable` tinyint(1) NOT NULL COMMENT '是否启用', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银码牌配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of pay_cashier_code_config +-- ---------------------------- + +-- ---------------------------- +-- Table structure for pay_cashier_code_type_config +-- ---------------------------- +DROP TABLE IF EXISTS `pay_cashier_code_type_config`; +CREATE TABLE `pay_cashier_code_type_config` ( + `id` bigint NOT NULL COMMENT '主键', + `creator` bigint NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint NULL DEFAULT NULL COMMENT '最后修改ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int NOT NULL COMMENT '版本号', + `deleted` tinyint(1) NOT NULL COMMENT '删除标志', + `app_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '应用号', + `cashier_code_id` bigint NOT NULL COMMENT '码牌ID', + `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '收银台类型', + `channel` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付通道', + `pay_method` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付方式', `allocation` tinyint(1) NOT NULL COMMENT '是否开启分账', `auto_allocation` tinyint(1) NOT NULL COMMENT '自动分账', - `remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '备注', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '通道收银台配置' ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '各类型码牌配置' ROW_FORMAT = Dynamic; +-- ---------------------------- +-- Records of pay_cashier_code_type_config +-- ---------------------------- -- ---------------------------- -- Table structure for pay_channel_config @@ -863,6 +783,9 @@ CREATE TABLE `pay_channel_config` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '通道支付配置' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of pay_channel_config +-- ---------------------------- -- ---------------------------- -- Table structure for pay_channel_const @@ -874,29 +797,16 @@ CREATE TABLE `pay_channel_const` ( `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '通道名称', `enable` tinyint(1) NULL DEFAULT NULL COMMENT '是否启用', `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `allocatable` tinyint(1) NULL DEFAULT NULL COMMENT '支持分账', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支付通道常量' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of pay_channel_const -- ---------------------------- -INSERT INTO `pay_channel_const` VALUES (10000, 'ali_pay', '支付宝(直连商户)', 1, NULL); -INSERT INTO `pay_channel_const` VALUES (20000, 'wechat_pay', '微信支付(直连商户)', 1, NULL); -INSERT INTO `pay_channel_const` VALUES (30000, 'union_pay', '云闪付', 1, NULL); - --- ---------------------------- --- Table structure for pay_api_const --- ---------------------------- -DROP TABLE IF EXISTS `pay_api_const`; -CREATE TABLE `pay_api_const` ( - `id` bigint NOT NULL COMMENT '主键', - `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '编码', - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '接口名称', - `api` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '接口地址', - `enable` tinyint(1) NULL DEFAULT NULL COMMENT '是否启用', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支付接口常量' ROW_FORMAT = Dynamic; +INSERT INTO `pay_channel_const` VALUES (10000, 'ali_pay', '支付宝(直连商户)', 1, NULL, NULL); +INSERT INTO `pay_channel_const` VALUES (20000, 'wechat_pay', '微信支付(直连商户)', 1, NULL, NULL); +INSERT INTO `pay_channel_const` VALUES (30000, 'union_pay', '云闪付', 1, NULL, NULL); -- ---------------------------- -- Table structure for pay_channel_reconcile_trade @@ -920,8 +830,104 @@ CREATE TABLE `pay_channel_reconcile_trade` ( -- ---------------------------- -- Records of pay_channel_reconcile_trade -- ---------------------------- -INSERT INTO `pay_channel_reconcile_trade` VALUES (1845026949899558912, 1811365615815487488, '2024-10-12 17:01:18', 'M8207639754663343', 1843961004720398336, 'pay', '2024100810000200000001', '712410081000023951528', 10.00, 'success', '2024-10-08 10:00:02'); -INSERT INTO `pay_channel_reconcile_trade` VALUES (1845026949903753216, 1811365615815487488, '2024-10-12 17:01:18', 'M8207639754663343', 1843961004720398336, 'pay', '2024100810000100000000', '712410081000013950278', 10.00, 'success', '2024-10-08 10:00:01'); + +-- ---------------------------- +-- Table structure for pay_checkout_aggregate_config +-- ---------------------------- +DROP TABLE IF EXISTS `pay_checkout_aggregate_config`; +CREATE TABLE `pay_checkout_aggregate_config` ( + `id` bigint NOT NULL COMMENT '主键', + `creator` bigint NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int NOT NULL COMMENT '乐观锁', + `deleted` tinyint(1) NOT NULL COMMENT '删除标志', + `app_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '应用号', + `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '聚合支付类型', + `channel` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '通道', + `pay_method` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付方式', + `auto_launch` tinyint(1) NULL DEFAULT NULL COMMENT '自动拉起支付', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银台聚合支付配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of pay_checkout_aggregate_config +-- ---------------------------- + +-- ---------------------------- +-- Table structure for pay_checkout_config +-- ---------------------------- +DROP TABLE IF EXISTS `pay_checkout_config`; +CREATE TABLE `pay_checkout_config` ( + `id` bigint NOT NULL COMMENT '主键', + `creator` bigint NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int NOT NULL COMMENT '乐观锁', + `deleted` tinyint(1) NOT NULL COMMENT '删除标志', + `app_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '应用号', + `name` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '收银台名称', + `aggregate_show` tinyint(1) NULL DEFAULT NULL COMMENT 'PC收银台是否同时显示聚合收银码', + `h5_auto_upgrade` tinyint(1) NULL DEFAULT NULL COMMENT 'h5收银台自动升级聚合支付', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银台配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of pay_checkout_config +-- ---------------------------- + +-- ---------------------------- +-- Table structure for pay_checkout_group_config +-- ---------------------------- +DROP TABLE IF EXISTS `pay_checkout_group_config`; +CREATE TABLE `pay_checkout_group_config` ( + `id` bigint NOT NULL COMMENT '主键', + `creator` bigint NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int NOT NULL COMMENT '乐观锁', + `deleted` tinyint(1) NOT NULL COMMENT '删除标志', + `app_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '应用号', + `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '类型', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称', + `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标', + `sort_no` double(8, 2) NULL DEFAULT NULL COMMENT '排序', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银台类目配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of pay_checkout_group_config +-- ---------------------------- + +-- ---------------------------- +-- Table structure for pay_checkout_item_config +-- ---------------------------- +DROP TABLE IF EXISTS `pay_checkout_item_config`; +CREATE TABLE `pay_checkout_item_config` ( + `id` bigint NOT NULL COMMENT '主键', + `creator` bigint NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint NULL DEFAULT NULL COMMENT '最后修者ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int NOT NULL COMMENT '乐观锁', + `deleted` tinyint(1) NOT NULL COMMENT '删除标志', + `app_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '应用号', + `group_id` bigint NULL DEFAULT NULL COMMENT '分组配置ID', + `channel` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '通道', + `pay_method` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付方式', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称', + `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标', + `sort_no` double(8, 2) NULL DEFAULT NULL COMMENT '排序', + `call_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '调用方式', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银台配置项' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of pay_checkout_item_config +-- ---------------------------- -- ---------------------------- -- Table structure for pay_close_record @@ -974,6 +980,9 @@ CREATE TABLE `pay_mch_app` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商户应用' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of pay_mch_app +-- ---------------------------- -- ---------------------------- -- Table structure for pay_merchant_callback_record @@ -1045,6 +1054,9 @@ CREATE TABLE `pay_merchant_notify_config` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商户应用消息通知配置' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of pay_merchant_notify_config +-- ---------------------------- -- ---------------------------- -- Table structure for pay_merchant_notify_const @@ -1062,9 +1074,6 @@ CREATE TABLE `pay_merchant_notify_const` ( -- ---------------------------- -- Records of pay_merchant_notify_const -- ---------------------------- -INSERT INTO `pay_merchant_notify_const` VALUES (10000, 'pay', '支付订单变动通知', '支付订单变动通知', 1); -INSERT INTO `pay_merchant_notify_const` VALUES (20000, 'refund', '退款订单变动通知', '退款订单变动通知', 1); -INSERT INTO `pay_merchant_notify_const` VALUES (30000, 'transfer', '转账订单变动通知', '转账订单变动通知', 1); -- ---------------------------- -- Table structure for pay_merchant_notify_record @@ -1133,13 +1142,13 @@ CREATE TABLE `pay_method_const` ( -- ---------------------------- -- Records of pay_method_const -- ---------------------------- -INSERT INTO `pay_method_const` VALUES (10000, 'normal', '常规支付', 1, NULL); +INSERT INTO `pay_method_const` VALUES (10000, 'normal', '常规支付', 0, NULL); INSERT INTO `pay_method_const` VALUES (20000, 'wap', 'wap支付', 1, NULL); INSERT INTO `pay_method_const` VALUES (30000, 'app', '应用支付', 1, NULL); INSERT INTO `pay_method_const` VALUES (40000, 'web', 'web支付', 1, NULL); INSERT INTO `pay_method_const` VALUES (50000, 'qrcode', '扫码支付', 1, NULL); INSERT INTO `pay_method_const` VALUES (60000, 'barcode', '付款码', 1, NULL); -INSERT INTO `pay_method_const` VALUES (70000, 'jsapi', '小程序支付', 1, NULL); +INSERT INTO `pay_method_const` VALUES (70000, 'jsapi', 'JSAPI', 1, NULL); -- ---------------------------- -- Table structure for pay_order @@ -1185,6 +1194,9 @@ CREATE TABLE `pay_order` ( INDEX `order_pay_order_out_order_no_idx`(`out_order_no` ASC) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支付订单' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of pay_order +-- ---------------------------- -- ---------------------------- -- Table structure for pay_platform_config @@ -1207,7 +1219,7 @@ CREATE TABLE `pay_platform_config` ( -- ---------------------------- -- Records of pay_platform_config -- ---------------------------- -INSERT INTO `pay_platform_config` VALUES (1, 1, '2024-09-20 10:54:44', 1811365615815487488, '2024-10-08 17:24:13', 13, 0, 'https://pay1.bootx.cn', 'https://pay1.bootx.cn/h5', 'http://pay1.bootx.cn'); +INSERT INTO `pay_platform_config` VALUES (1, 1, '2024-09-20 10:54:44', 1811365615815487488, '2024-12-04 09:27:23', 14, 0, 'https://pay.daxpay.com/server', 'https://pay.daxpay.com/h5', 'http://pay.daxpay.com/web'); -- ---------------------------- -- Table structure for pay_reconcile_discrepancy @@ -1239,6 +1251,9 @@ CREATE TABLE `pay_reconcile_discrepancy` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '对账差异记录' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of pay_reconcile_discrepancy +-- ---------------------------- -- ---------------------------- -- Table structure for pay_reconcile_statement @@ -1275,6 +1290,9 @@ CREATE TABLE `pay_reconcile_statement` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '对账报告' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of pay_reconcile_statement +-- ---------------------------- -- ---------------------------- -- Table structure for pay_refund_order @@ -1438,6 +1456,9 @@ CREATE TABLE `pay_transfer_order` ( INDEX `transfer_transfer_no`(`transfer_no` ASC) USING BTREE COMMENT '转账号索引' ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '转账订单' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of pay_transfer_order +-- ---------------------------- -- ---------------------------- -- Table structure for starter_audit_login_log @@ -1459,6 +1480,9 @@ CREATE TABLE `starter_audit_login_log` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '登录日志' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of starter_audit_login_log +-- ---------------------------- -- ---------------------------- -- Table structure for starter_audit_operate_log @@ -1486,7 +1510,6 @@ CREATE TABLE `starter_audit_operate_log` ( -- ---------------------------- -- Records of starter_audit_operate_log -- ---------------------------- -INSERT INTO `starter_audit_operate_log` VALUES (1812110800621465600, '批量重置密码', 1811365615815487488, 'bootx', 'update', 'cn.bootx.platform.iam.controller.user.UserAdminController#restartPasswordBatch', 'POST', '/user/admin/restartPasswordBatch', '0:0:0:0:0:0:0:1', '未知', '[{\"userIds\":[\"1811690440006152192\"],\"newPassword\":\"123456\"}]', NULL, 1, NULL, '2024-07-13 21:04:08'); -- ---------------------------- -- Table structure for starter_file_platform @@ -1544,5 +1567,8 @@ CREATE TABLE `starter_file_upload_info` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '文件记录表' ROW_FORMAT = DYNAMIC; +-- ---------------------------- +-- Records of starter_file_upload_info +-- ---------------------------- SET FOREIGN_KEY_CHECKS = 1; diff --git a/_config/postgresql/dax-pay-single.sql b/_config/postgresql/dax-pay-single.sql index 973482846..0fd2e47ac 100644 --- a/_config/postgresql/dax-pay-single.sql +++ b/_config/postgresql/dax-pay-single.sql @@ -4,13 +4,14 @@ Source Server : 本地PG Source Server Type : PostgreSQL Source Server Version : 140005 (140005) + Source Host : localhost:5432 + Source Catalog : daxpay Source Schema : public Target Server Type : PostgreSQL Target Server Version : 140005 (140005) File Encoding : 65001 - Date: 10/10/2024 18:41:07 */ @@ -75,8 +76,10 @@ INSERT INTO "public"."base_dict" VALUES (1826061072412135424, '对账结果', ' INSERT INTO "public"."base_dict" VALUES (1826143914542350336, '交易状态', '支付', 'trade_status', '', 1811365615815487488, '2024-08-21 14:26:52.000272', 1811365615815487488, '2024-08-21 14:26:52.005675', 0, 't', 'f'); INSERT INTO "public"."base_dict" VALUES (1843536439208931328, '分账接收方类型', '支付', 'alloc_receiver_type', '', 1811365615815487488, '2024-10-08 14:18:33.016439', 1811365615815487488, '2024-10-08 14:18:33.017572', 0, 't', 'f'); INSERT INTO "public"."base_dict" VALUES (1843536733108006912, '分账关系类型', '支付', 'alloc_relation_type', '', 1811365615815487488, '2024-10-08 14:19:43.086847', 1811365615815487488, '2024-10-08 14:29:32.826875', 1, 't', 'f'); -INSERT INTO "public"."base_dict" VALUES (1840650057641713664, '收银台类型', '支付', 'cashier_type', '', 1811365615815487488, '2024-09-30 15:09:06.025286', 1811365615815487488, '2024-10-08 16:23:30.298502', 1, 't', 'f'); -INSERT INTO "public"."base_dict" VALUES (1843935232479731712, '123', '', '123', '', 1811365615815487488, '2024-10-09 16:43:12.743272', 1811365615815487488, '2024-10-09 17:02:12.206911', 0, 't', 't'); +INSERT INTO "public"."base_dict" VALUES (1840650057641713664, '码牌类型', '支付', 'cashier_code_type', '', 1811365615815487488, '2024-09-30 15:09:06', 1811365615815487488, '2024-11-21 09:09:19', 2, 't', 'f'); +INSERT INTO "public"."base_dict" VALUES (1862094405423972352, '收银台聚合支付类型', '支付', 'checkout_aggregate', '', 1811365615815487488, '2024-11-28 19:21:17', 1811365615815487488, '2024-11-28 19:22:05', 1, 't', 'f'); +INSERT INTO "public"."base_dict" VALUES (1862784043394342912, '收银台支付调起方式', '支付', 'checkout_call_type', '', 1811365615815487488, '2024-11-30 17:01:39', 1811365615815487488, '2024-11-30 17:01:39', 0, 't', 'f'); +INSERT INTO "public"."base_dict" VALUES (1864134865629839360, '收银台类型', '支付', 'checkout_type', '', 1811365615815487488, '2024-12-04 10:29:21', 1811365615815487488, '2024-12-04 10:29:21', 0, 't', 'f'); -- ---------------------------- -- Table structure for base_dict_item @@ -118,7 +121,6 @@ COMMENT ON TABLE "public"."base_dict_item" IS '字典项'; -- ---------------------------- -- Records of base_dict_item -- ---------------------------- -INSERT INTO "public"."base_dict_item" VALUES (1824050515865571328, 1823688398549360640, 'channel', 'pay_status', '支付状态', 0, 't', '', 0, '2024-08-15 19:48:26.861144', 0, '2024-08-15 19:48:32.569552', 0, 't'); INSERT INTO "public"."base_dict_item" VALUES (1823688758965903360, 1823688398549360640, 'channel', 'union_pay', '云闪付', 5, 't', '', 1811365615815487488, '2024-08-14 19:50:57.293338', 1811365615815487488, '2024-08-14 19:50:57.294914', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1823696988228100096, 1823696159936946176, 'id_type', 'IDCard', '身份证', 1, 't', '', 1811365615815487488, '2024-08-14 20:23:39.302492', 1811365615815487488, '2024-08-14 20:23:39.304061', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1823697045249662976, 1823696159936946176, 'id_type', 'passport', '护照', 2, 't', '', 1811365615815487488, '2024-08-14 20:23:52.897578', 1811365615815487488, '2024-08-14 20:23:52.89914', 0, 'f'); @@ -148,9 +150,7 @@ INSERT INTO "public"."base_dict_item" VALUES (1823992894504570880, 1823991280205 INSERT INTO "public"."base_dict_item" VALUES (1823992935814270976, 1823991280205041664, 'log_business_type', 'clean', '清空数据', 8, 't', '', 0, '2024-08-15 15:59:38.705444', 0, '2024-08-15 15:59:38.706503', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1823992995331444736, 1823991280205041664, 'log_business_type', 'other', '其它', 9, 't', '', 0, '2024-08-15 15:59:52.895664', 0, '2024-08-15 15:59:52.896179', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1823688520268062720, 1823688398549360640, 'channel', 'ali_pay', '支付宝(直连)', 1, 't', '支付宝 - 直连商户', 1811365615815487488, '2024-08-14 19:50:00.383209', 0, '2024-08-15 19:45:52.133311', 1, 'f'); -INSERT INTO "public"."base_dict_item" VALUES (1823688577201545216, 1823688398549360640, 'channel', 'ali_service', '支付宝(服务商)', 2, 't', '支付宝 - 服务商商户', 1811365615815487488, '2024-08-14 19:50:13.957732', 0, '2024-08-15 19:46:14.070089', 1, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1823688680352063488, 1823688398549360640, 'channel', 'wechat_pay', '微信支付(直连)', 3, 't', '', 1811365615815487488, '2024-08-14 19:50:38.551335', 0, '2024-08-15 19:46:22.364663', 1, 'f'); -INSERT INTO "public"."base_dict_item" VALUES (1823688722165080064, 1823688398549360640, 'channel', 'wechat_service', '微信支付(服务商)', 4, 't', '', 1811365615815487488, '2024-08-14 19:50:48.519498', 0, '2024-08-15 19:46:30.624402', 1, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1824277977388027904, 1824277928167870464, 'pay_refund_status', 'no_refund', '未退款', 1, 't', '', 1811365615815487488, '2024-08-16 10:52:17.912141', 1811365615815487488, '2024-08-16 10:52:17.913687', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1824278014436315136, 1824277928167870464, 'pay_refund_status', 'refunding', '退款中', 2, 't', '', 1811365615815487488, '2024-08-16 10:52:26.745134', 1811365615815487488, '2024-08-16 10:52:26.746691', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1824278055448219648, 1824277928167870464, 'pay_refund_status', 'partial_refund', '部分退款', 3, 't', '', 1811365615815487488, '2024-08-16 10:52:36.523227', 1811365615815487488, '2024-08-16 10:52:36.525303', 0, 'f'); @@ -221,10 +221,23 @@ INSERT INTO "public"."base_dict_item" VALUES (1843538293854662656, 1843536733108 INSERT INTO "public"."base_dict_item" VALUES (1825171779002728448, 1825135068277334016, 'transfer_payee_type', 'login_name', '登录账号', 4, 't', '', 1811365615815487488, '2024-08-18 22:03:56.823151', 1811365615815487488, '2024-10-08 17:52:07.717985', 3, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1840650104185905152, 1840650057641713664, 'cashier_type', 'wechat_pay', '微信收银台', 1, 't', '', 1811365615815487488, '2024-09-30 15:09:17.120403', 1811365615815487488, '2024-09-30 15:09:17.120403', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1840650136427520000, 1840650057641713664, 'cashier_type', 'alipay', '支付宝收银台', 2, 't', '', 1811365615815487488, '2024-09-30 15:09:24.807694', 1811365615815487488, '2024-09-30 15:09:24.807694', 0, 'f'); -INSERT INTO "public"."base_dict_item" VALUES (1825171620147658752, 1825135068277334016, 'transfer_payee_type', 'wx_personal', 'OpenId(微信)', 1, 't', '', 1811365615815487488, '2024-08-18 22:03:18.9509', 1811365615815487488, '2024-10-08 17:50:13.061585', 1, 't'); INSERT INTO "public"."base_dict_item" VALUES (1825171656562606080, 1825135068277334016, 'transfer_payee_type', 'user_id', '用户ID', 2, 't', '', 1811365615815487488, '2024-08-18 22:03:27.631478', 1811365615815487488, '2024-10-08 17:50:20.130589', 2, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1825171693782859776, 1825135068277334016, 'transfer_payee_type', 'open_id', 'OpenId', 1, 't', '', 1811365615815487488, '2024-08-18 22:03:36.505827', 1811365615815487488, '2024-10-08 17:51:28.00028', 3, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1843536564304048128, 1843536439208931328, 'alloc_receiver_type', 'open_id', 'OpenId', 0, 't', '', 1811365615815487488, '2024-10-08 14:19:02.84085', 1811365615815487488, '2024-10-08 17:51:46.206937', 3, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1862094703940976640, 1862094405423972352, 'checkout_aggregate', 'wechat_pay', '微信支付', 1, 't', '', 1811365615815487488, '2024-11-28 19:22:28', 1811365615815487488, '2024-12-04 11:36:17', 1, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1862094738430738432, 1862094405423972352, 'checkout_aggregate', 'alipay', '支付宝', 2, 't', '', 1811365615815487488, '2024-11-28 19:22:36', 1811365615815487488, '2024-11-28 19:22:36', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1862784096733306880, 1862784043394342912, 'checkout_call_type', 'qr_code', '扫码支付', 1, 't', '', 1811365615815487488, '2024-11-30 17:01:52', 1811365615815487488, '2024-11-30 17:02:56', 1, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1862784137904594944, 1862784043394342912, 'checkout_call_type', 'bar_code', '条码支付', 2, 't', '', 1811365615815487488, '2024-11-30 17:02:02', 1811365615815487488, '2024-11-30 17:02:53', 1, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1862784218108076032, 1862784043394342912, 'checkout_call_type', 'link', '跳转链接', 3, 't', '', 1811365615815487488, '2024-11-30 17:02:21', 1811365615815487488, '2024-11-30 17:02:21', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1862784251175968768, 1862784043394342912, 'checkout_call_type', 'mini_app', '小程序支付', 4, 't', '', 1811365615815487488, '2024-11-30 17:02:29', 1811365615815487488, '2024-11-30 17:02:29', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1862784292565360640, 1862784043394342912, 'checkout_call_type', 'aggregate', '聚合支付', 5, 't', '', 1811365615815487488, '2024-11-30 17:02:39', 1811365615815487488, '2024-11-30 17:02:39', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1862784325809414144, 1862784043394342912, 'checkout_call_type', 'app', 'APP支付', 6, 't', '', 1811365615815487488, '2024-11-30 17:02:47', 1811365615815487488, '2024-11-30 17:02:47', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1864134907958755328, 1864134865629839360, 'checkout_type', 'h5', 'H5', 0, 't', '', 1811365615815487488, '2024-12-04 10:29:31', 1811365615815487488, '2024-12-04 10:29:31', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1864134948614144000, 1864134865629839360, 'checkout_type', 'pc', 'PC', 1, 't', '', 1811365615815487488, '2024-12-04 10:29:40', 1811365615815487488, '2024-12-04 10:29:40', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1864134981908529152, 1864134865629839360, 'checkout_type', 'mini_app', '小程序', 3, 't', '', 1811365615815487488, '2024-12-04 10:29:48', 1811365615815487488, '2024-12-04 10:29:48', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1864135083783979008, 1864134865629839360, 'checkout_type', 'aggregate', '聚合支付', 4, 't', '', 1811365615815487488, '2024-12-04 10:30:13', 1811365615815487488, '2024-12-04 10:30:13', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1864140869360779264, 1862784043394342912, 'checkout_call_type', 'jsapi', 'JSAPI', 7, 't', '', 1811365615815487488, '2024-12-04 10:53:12', 1811365615815487488, '2024-12-04 10:53:12', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1864182908966182912, 1824050661785407488, 'pay_status', 'wait', '待支付', 0, 't', '', 1811365615815487488, '2024-12-04 13:40:15', 1811365615815487488, '2024-12-04 13:40:15', 0, 'f'); -- ---------------------------- -- Table structure for base_param @@ -239,7 +252,7 @@ CREATE TABLE "public"."base_param" ( "version" int4 NOT NULL, "deleted" bool NOT NULL, "name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, - "param_key" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "key" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, "value" varchar(500) COLLATE "pg_catalog"."default" NOT NULL, "type" varchar(20) COLLATE "pg_catalog"."default", "enable" bool NOT NULL, @@ -255,7 +268,7 @@ COMMENT ON COLUMN "public"."base_param"."last_modified_time" IS '最后修改时 COMMENT ON COLUMN "public"."base_param"."version" IS '版本号'; COMMENT ON COLUMN "public"."base_param"."deleted" IS '删除标志'; COMMENT ON COLUMN "public"."base_param"."name" IS '参数名称'; -COMMENT ON COLUMN "public"."base_param"."param_key" IS '参数键名'; +COMMENT ON COLUMN "public"."base_param"."key" IS '参数键名'; COMMENT ON COLUMN "public"."base_param"."value" IS '参数值'; COMMENT ON COLUMN "public"."base_param"."type" IS '参数类型'; COMMENT ON COLUMN "public"."base_param"."enable" IS '启用状态'; @@ -412,8 +425,6 @@ INSERT INTO "public"."iam_perm_menu" VALUES (1810871795650891776, 0, '2024-07-10 INSERT INTO "public"."iam_perm_menu" VALUES (1810909853691641856, 0, '2024-07-10 13:32:08.855417', 0, '2024-07-10 13:35:45.759284', 1, 'f', 1810864706127790080, 'dax-pay', '用户信息', 'UserAuth', '', 'f', 'f', 'Layout', '/system/user', '', 0, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1810910433264762880, 0, '2024-07-10 13:34:27.036666', 0, '2024-07-10 13:35:56.758501', 1, 'f', 1810864706127790080, 'dax-pay', '系统配置', 'SystemConfig', '', 'f', 'f', 'Layout', '/system/config', '', 0, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1810911232921423872, 0, '2024-07-10 13:37:37.692104', 0, '2024-07-10 13:37:37.693108', 0, 'f', 1810909511121862656, 'dax-pay', '角色管理', 'RoleList', '', 'f', 'f', 'iam/role/RoleList.vue', '/system/permission/role', '', 0, 'f', 't', 'f', 'f', NULL); -INSERT INTO "public"."iam_perm_menu" VALUES (1810878374534152192, 0, '2024-07-10 11:27:03.641433', 1811365615815487488, '2024-07-13 21:16:24.212477', 5, 't', NULL, 'dax-pay', '测试Iframe', 'Iframe', '', 't', 'f', 'Iframe', '/Iframe', 'https://www.antdv.com/components/overview-cn', 0, 't', 't', 'f', 'f', NULL); -INSERT INTO "public"."iam_perm_menu" VALUES (1812113986291822592, 1811365615815487488, '2024-07-13 21:16:56.438162', 1811365615815487488, '2024-07-13 21:17:06.34038', 0, 't', NULL, 'dax-pay', '系统管理', 'System', 'ant-design:setting-outlined', 'f', 'f', 'Layout', '/system', '', 0, 't', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1810864706127790080, 0, '2024-07-10 10:32:44.838967', 1811365615815487488, '2024-07-13 21:17:09.975339', 5, 'f', NULL, 'dax-pay', '系统管理', 'System', 'ant-design:setting-outlined', 'f', 'f', 'Layout', '/system', '', 0, 't', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1812114224679284736, 1811365615815487488, '2024-07-13 21:17:53.274452', 1811365615815487488, '2024-07-13 21:18:00.886679', 1, 'f', NULL, 'dax-pay', '订单管理', 'PayOrder', 'ant-design:wallet-outlined', 'f', 'f', 'Layout', '/pay/order', '', 0, 't', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1812114959231938560, 1811365615815487488, '2024-07-13 21:20:48.405236', 1811365615815487488, '2024-07-13 21:20:48.407298', 0, 'f', NULL, 'dax-pay', '对账管理', 'Reconcile', 'ant-design:arrows-alt-outlined', 'f', 'f', 'Layout', '/pay/reconcile', '', 0, 't', 't', 'f', 'f', NULL); @@ -439,7 +450,6 @@ INSERT INTO "public"."iam_perm_menu" VALUES (1820467523628474368, 18113656158154 INSERT INTO "public"."iam_perm_menu" VALUES (1822975425229004800, 1811365615815487488, '2024-08-12 20:36:25.279489', 1811365615815487488, '2024-08-12 20:36:25.282711', 0, 'f', 1810864706127790080, 'dax-pay', '文件存储', '', '', 'f', 'f', 'Layout', '/system/file', '', 0, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1813456708833087488, 1811365615815487488, '2024-07-17 14:12:26.440633', 1811365615815487488, '2024-09-20 11:05:46.469139', 4, 'f', 1812113823376666624, 'dax-pay', '基础配置', '', '', 'f', 'f', 'Layout', '/pay/config/basic', '', -1, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1822975777026252800, 1811365615815487488, '2024-08-12 20:37:49.152472', 1811365615815487488, '2024-08-12 20:37:49.154031', 0, 'f', 1822975425229004800, 'dax-pay', '存储平台', 'FilePlatformList', '', 'f', 'f', '/baseapi/file/platform/FilePlatformList', '/system/file/platform', '', 0, 'f', 't', 'f', 'f', NULL); -INSERT INTO "public"."iam_perm_menu" VALUES (1812117366246535168, 1811365615815487488, '2024-07-13 21:30:22.282442', 1811365615815487488, '2024-10-05 21:59:31.640637', 0, 't', 1812116972585938944, 'dax-pay', '商户信息', 'MerchantList', '', 'f', 'f', '/daxpay/admin/merchant/info/MerchantList', '/pay/config/merchant/info', '', 0, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1822975970266226688, 1811365615815487488, '2024-08-12 20:38:35.224183', 1811365615815487488, '2024-08-12 20:38:35.226288', 0, 'f', 1822975425229004800, 'dax-pay', '文件管理', 'FileUploadList', '', 'f', 'f', '/baseapi/file/upload/FileUploadList', '/system/file/info', '', 0, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1824779750208679936, 1811365615815487488, '2024-08-17 20:06:09.875297', 1811365615815487488, '2024-10-08 19:25:43.362002', 2, 'f', 1812114725651148800, 'dax-pay', '分账单', '', '', 'f', 'f', '', '/pay/reconcile/order', '', 0, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1812118306328473600, 1811365615815487488, '2024-07-13 21:34:06.415311', 1811365615815487488, '2024-08-27 16:13:34.678515', 4, 'f', 1812116779807338496, 'dax-pay', '支付通道', 'ChannelConstList', '', 'f', 'f', '/daxpay/common/constant/channel/ChannelConstList', '/pay/config/base/channel', '', 0, 'f', 't', 'f', 'f', NULL); @@ -487,234 +497,6 @@ COMMENT ON TABLE "public"."iam_perm_path" IS '请求权限(url)'; -- ---------------------------- -- Records of iam_perm_path -- ---------------------------- -INSERT INTO "public"."iam_perm_path" VALUES (1844304458889641984, 1811365615815487488, '2024-10-10 17:10:23.178819', 'AllocGroup', 'dax-pay', '', '修改分账比例', 't', '/allocation/group/updateRate', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458919002112, 1811365615815487488, '2024-10-10 17:10:23.183818', 'operateLog', 'dax-pay', '', '清除指定天数的操作日志', 't', '/log/operate/deleteByDay', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458923196416, 1811365615815487488, '2024-10-10 17:10:23.184819', 'AllocGroup', 'dax-pay', '', '批量取消绑定接收者', 't', '/allocation/group/unbindReceivers', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458923196417, 1811365615815487488, '2024-10-10 17:10:23.184819', 'ChannelAuth', 'dax-pay', '', '通过查询码获取认证结果', 't', '/assist/channel/auth/queryAuthResult', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458923196418, 1811365615815487488, '2024-10-10 17:10:23.184819', 'merchant', 'dax-pay', '', '新增商户应用', 't', '/mch/app/add', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458923196419, 1811365615815487488, '2024-10-10 17:10:23.184819', 'dict', 'dax-pay', '', '添加字典', 't', '/dict/add', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458927390720, 1811365615815487488, '2024-10-10 17:10:23.185818', 'PayConst', 'dax-pay', '', '商户订阅通知类型分页', 't', '/const/merchant/notify/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458927390721, 1811365615815487488, '2024-10-10 17:10:23.185818', 'MerchantCallback', 'dax-pay', '', '发送回调消息', 't', '/merchant/notice/callback/send', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458927390722, 1811365615815487488, '2024-10-10 17:10:23.185818', 'PlatformConfig', 'dax-pay', '', '获取配置', 't', '/platform/config/get', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458931585024, 1811365615815487488, '2024-10-10 17:10:23.186324', 'RefundOrder', 'dax-pay', '', '退款关闭', 't', '/order/refund/close', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458931585025, 1811365615815487488, '2024-10-10 17:10:23.186324', 'merchant', 'dax-pay', '', '商户应用分页', 't', '/mch/app/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458931585026, 1811365615815487488, '2024-10-10 17:10:23.186827', 'dict', 'dax-pay', '', '字典分页', 't', '/dict/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458931585027, 1811365615815487488, '2024-10-10 17:10:23.186827', 'client', 'dax-pay', '', '编码是否被使用', 't', '/client/existsByCode', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458935779328, 1811365615815487488, '2024-10-10 17:10:23.187297', 'MerchantNotifyConfig', 'dax-pay', '', '查询列表', 't', '/merchant/notify/config/findAllByAppId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458935779329, 1811365615815487488, '2024-10-10 17:10:23.187297', 'params', 'dax-pay', '', '判断编码是否存在', 't', '/system/param/existsByKey', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458935779330, 1811365615815487488, '2024-10-10 17:10:23.187841', 'MerchantNotify', 'dax-pay', '', '任务分页', 't', '/merchant/notice/notify/task/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458935779331, 1811365615815487488, '2024-10-10 17:10:23.187841', 'AllocGroup', 'dax-pay', '', '编码是否存在', 't', '/allocation/group/existsByGroupNo', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458935779332, 1811365615815487488, '2024-10-10 17:10:23.187841', 'AllocReceiver', 'dax-pay', '', '删除', 't', '/allocation/receiver/delete', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458935779333, 1811365615815487488, '2024-10-10 17:10:23.187841', 'upms', 'dax-pay', '', '指定角色下的请求权限树(分配时用)', 't', '/role/path/treeByRole', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458939973632, 1811365615815487488, '2024-10-10 17:10:23.188834', 'upms', 'dax-pay', '', '根据用户ID获取到角色id集合', 't', '/user/role/findRoleIdsByUser', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458939973633, 1811365615815487488, '2024-10-10 17:10:23.188834', 'TradeSync', 'dax-pay', '', '分页查询', 't', '/record/sync/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458939973634, 1811365615815487488, '2024-10-10 17:10:23.188834', 'loginLog', 'dax-pay', '', '登录日志分页', 't', '/log/login/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458939973635, 1811365615815487488, '2024-10-10 17:10:23.188834', 'role', 'dax-pay', '', '角色下拉框', 't', '/role/dropdown', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458944167936, 1811365615815487488, '2024-10-10 17:10:23.189835', 'upms', 'dax-pay', '', '根据用户ID获取到角色集合', 't', '/user/role/findRolesByUser', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458944167937, 1811365615815487488, '2024-10-10 17:10:23.189835', 'RefundOrder', 'dax-pay', '', '根据ID查询', 't', '/order/refund/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458944167938, 1811365615815487488, '2024-10-10 17:10:23.189835', 'AlipayConfig', 'dax-pay', '', '获取配置', 't', '/alipay/config/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458944167939, 1811365615815487488, '2024-10-10 17:10:23.189835', 'dict', 'dax-pay', '', '字典编码是否被使用', 't', '/dict/existsByCode', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458948362240, 1811365615815487488, '2024-10-10 17:10:23.190833', 'dict', 'dax-pay', '', '添加字典项', 't', '/dict/item/add', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458948362241, 1811365615815487488, '2024-10-10 17:10:23.190833', 'operateLog', 'dax-pay', '', '获取日志分页', 't', '/log/operate/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458948362242, 1811365615815487488, '2024-10-10 17:10:23.190833', 'AllocReceiver', 'dax-pay', '', '编码是否存在', 't', '/allocation/receiver/existsByReceiverNo', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458948362243, 1811365615815487488, '2024-10-10 17:10:23.190833', 'AllocGroup', 'dax-pay', '', '查询分账接收方信息', 't', '/allocation/group/findReceiversByGroups', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458952556544, 1811365615815487488, '2024-10-10 17:10:23.191833', 'PlatformConfig', 'dax-pay', '', '更新配置', 't', '/platform/config/update', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458952556545, 1811365615815487488, '2024-10-10 17:10:23.191833', 'MerchantNotify', 'dax-pay', '', '发送订阅消息', 't', '/merchant/notice/notify/send', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458952556546, 1811365615815487488, '2024-10-10 17:10:23.191833', 'DevelopTrade', 'dax-pay', '', '支付接口', 't', '/develop/trade/pay', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458952556547, 1811365615815487488, '2024-10-10 17:10:23.192832', 'RefundOrder', 'dax-pay', '', '查询金额汇总', 't', '/order/refund/getTotalAmount', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458956750848, 1811365615815487488, '2024-10-10 17:10:23.192832', 'dict', 'dax-pay', '', '编码是否被使用(不包含自己)', 't', '/dict/existsByCodeNotId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458956750849, 1811365615815487488, '2024-10-10 17:10:23.192832', 'RefundOrder', 'dax-pay', '', '退款订单分页查询', 't', '/order/refund/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458956750850, 1811365615815487488, '2024-10-10 17:10:23.192832', 'perm', 'dax-pay', '', '权限码目录树', 't', '/perm/code/catalogTree', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458956750851, 1811365615815487488, '2024-10-10 17:10:23.192832', 'role', 'dax-pay', '', '名称是否被使用(不包含自己)', 't', '/role/existsByNameNotId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458960945152, 1811365615815487488, '2024-10-10 17:10:23.193835', 'PayOrder', 'dax-pay', '', '关闭支付订单', 't', '/order/pay/close', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458960945153, 1811365615815487488, '2024-10-10 17:10:23.193835', 'dict', 'dax-pay', '', '获取全部字典项', 't', '/dict/item/findAll', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458960945154, 1811365615815487488, '2024-10-10 17:10:23.193835', 'perm', 'dax-pay', '', '编码是否被使用', 't', '/perm/code/existsByCode', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458965139456, 1811365615815487488, '2024-10-10 17:10:23.194833', 'ReconcileStatement', 'dax-pay', '', '手动触发交易对账单比对', 't', '/reconcile/statement/compare', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458969333760, 1811365615815487488, '2024-10-10 17:10:23.195832', 'TradeCallback', 'dax-pay', '', '分页查询', 't', '/record/callback/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458969333761, 1811365615815487488, '2024-10-10 17:10:23.195832', 'ReconcileDiscrepancy', 'dax-pay', '', '对账差异记录分页', 't', '/reconcile/discrepancy/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458973528064, 1811365615815487488, '2024-10-10 17:10:23.196778', 'DevelopTrade', 'dax-pay', '', '退款接口', 't', '/develop/trade/refund', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458973528065, 1811365615815487488, '2024-10-10 17:10:23.196778', 'AllocReceiver', 'dax-pay', '', '添加', 't', '/allocation/receiver/add', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458973528066, 1811365615815487488, '2024-10-10 17:10:23.196778', 'loginLog', 'dax-pay', '', '清除指定天数之前的登录日志', 't', '/log/login/deleteByDay', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458973528067, 1811365615815487488, '2024-10-10 17:10:23.196778', 'TransferOrder', 'dax-pay', '', '根据转账号查询', 't', '/order/transfer/findByTransferNo', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458973528068, 1811365615815487488, '2024-10-10 17:10:23.196778', 'MerchantCallback', 'dax-pay', '', '任务详情', 't', '/merchant/notice/callback/task/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458977722368, 1811365615815487488, '2024-10-10 17:10:23.197787', 'TradeFlow', 'dax-pay', '', '查询各类金额汇总', 't', '/record/flow/summary', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458977722369, 1811365615815487488, '2024-10-10 17:10:23.197787', 'MerchantNotify', 'dax-pay', '', '任务详情', 't', '/merchant/notice/notify/task/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458977722370, 1811365615815487488, '2024-10-10 17:10:23.197787', 'params', 'dax-pay', '', '获取单条', 't', '/system/param/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458977722371, 1811365615815487488, '2024-10-10 17:10:23.197787', 'client', 'dax-pay', '', '编码是否被使用(不包含自己)', 't', '/client/existsByCodeNotId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458977722372, 1811365615815487488, '2024-10-10 17:10:23.197787', 'AlipayConfig', 'dax-pay', '', '新增或更新', 't', '/alipay/config/saveOrUpdate', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458977722373, 1811365615815487488, '2024-10-10 17:10:23.197787', 'AllocReceiver', 'dax-pay', '', '查询详情', 't', '/allocation/receiver/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458981916672, 1811365615815487488, '2024-10-10 17:10:23.198788', 'user', 'dax-pay', '', '修改用户', 't', '/user/admin/update', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458981916673, 1811365615815487488, '2024-10-10 17:10:23.198788', 'file', 'dax-pay', '', '更新文件存储平台地址', 't', '/file/platform/updateUrl', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458981916674, 1811365615815487488, '2024-10-10 17:10:23.198788', 'RefundOrder', 'dax-pay', '', '发起退款', 't', '/order/refund/create', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458981916675, 1811365615815487488, '2024-10-10 17:10:23.198788', 'AllocGroup', 'dax-pay', '', '批量绑定接收者', 't', '/allocation/group/bindReceivers', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458981916676, 1811365615815487488, '2024-10-10 17:10:23.198788', 'ChannelCashierConfig', 'dax-pay', '', '配置详情', 't', '/channel/cashier/config/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458981916677, 1811365615815487488, '2024-10-10 17:10:23.198788', 'upms', 'dax-pay', '', '保存请求权限关系', 't', '/role/menu/save', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458981916678, 1811365615815487488, '2024-10-10 17:10:23.198788', 'ChannelCashierConfig', 'dax-pay', '', '配置列表', 't', '/channel/cashier/config/findByAppId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458986110976, 1811365615815487488, '2024-10-10 17:10:23.199783', 'AllocReceiver', 'dax-pay', '', '分页', 't', '/allocation/receiver/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458990305280, 1811365615815487488, '2024-10-10 17:10:23.200784', 'upms', 'dax-pay', '', '指定角色下的菜单权限树(分配时用)', 't', '/role/menu/treeByRole', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458990305281, 1811365615815487488, '2024-10-10 17:10:23.200784', 'params', 'dax-pay', '', '分页', 't', '/system/param/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458990305282, 1811365615815487488, '2024-10-10 17:10:23.200784', 'ChannelCashierConfig', 'dax-pay', '', '配置是否存在(不包括自身)', 't', '/channel/cashier/config/existsByTypeNotId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458990305283, 1811365615815487488, '2024-10-10 17:10:23.200784', 'CloseRecord', 'dax-pay', '', '查询单条', 't', '/record/close/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458990305284, 1811365615815487488, '2024-10-10 17:10:23.200784', 'user', 'dax-pay', '', '根据用户id查询用户 ', 't', '/user/admin/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458990305285, 1811365615815487488, '2024-10-10 17:10:23.200784', 'ReconcileStatement', 'dax-pay', '', '手动创建对账订单', 't', '/reconcile/statement/create', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458994499584, 1811365615815487488, '2024-10-10 17:10:23.201782', 'upms', 'dax-pay', '', '指定角色下的请求权限树(分配时用)', 't', '/role/code/treeByRole', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458994499585, 1811365615815487488, '2024-10-10 17:10:23.201782', 'DevelopTrade', 'dax-pay', '', '退款参数签名', 't', '/develop/trade/sign/refund', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458994499586, 1811365615815487488, '2024-10-10 17:10:23.201782', 'AllocGroup', 'dax-pay', '', '取消绑定接收者', 't', '/allocation/group/unbindReceiver', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458994499587, 1811365615815487488, '2024-10-10 17:10:23.201782', 'dict', 'dax-pay', '', '查询全部字典', 't', '/dict/findAll', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458994499588, 1811365615815487488, '2024-10-10 17:10:23.201782', 'role', 'dax-pay', '', '查询所有的角色', 't', '/role/findAll', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458994499589, 1811365615815487488, '2024-10-10 17:10:23.201782', 'ChannelAuth', 'dax-pay', '', '获取授权链接', 't', '/assist/channel/auth/generateAuthUrl', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458994499590, 1811365615815487488, '2024-10-10 17:10:23.201782', 'AllocGroup', 'dax-pay', '', '修改', 't', '/allocation/group/update', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458994499591, 1811365615815487488, '2024-10-10 17:10:23.201782', 'MerchantCallback', 'dax-pay', '', '发送记录分页', 't', '/merchant/notice/callback/record/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458994499592, 1811365615815487488, '2024-10-10 17:10:23.201782', 'user', 'dax-pay', '', '批量解锁用户', 't', '/user/admin/unlockBatch', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458998693888, 1811365615815487488, '2024-10-10 17:10:23.202783', 'PayOrder', 'dax-pay', '', '撤销支付订单', 't', '/order/pay/cancel', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458998693889, 1811365615815487488, '2024-10-10 17:10:23.202783', 'dict', 'dax-pay', '', '删除字典项', 't', '/dict/item/delete', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458998693890, 1811365615815487488, '2024-10-10 17:10:23.202783', 'PayOrder', 'dax-pay', '', '查询订单详情', 't', '/order/pay/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458998693891, 1811365615815487488, '2024-10-10 17:10:23.202783', 'TradeCallback', 'dax-pay', '', '查询单条', 't', '/record/callback/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304458998693892, 1811365615815487488, '2024-10-10 17:10:23.202783', 'AllocGroup', 'dax-pay', '', '清除默认分账组', 't', '/allocation/group/clearDefault', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459002888192, 1811365615815487488, '2024-10-10 17:10:23.203785', 'params', 'dax-pay', '', '更新', 't', '/system/param/update', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459002888193, 1811365615815487488, '2024-10-10 17:10:23.203785', 'UnionPayConfig', 'dax-pay', '', '获取配置', 't', '/union/pay/config/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459002888194, 1811365615815487488, '2024-10-10 17:10:23.203785', 'ReconcileStatement', 'dax-pay', '', '手动上传交易对账单文件', 't', '/reconcile/statement/upload', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459002888195, 1811365615815487488, '2024-10-10 17:10:23.203785', 'perm', 'dax-pay', '', '编码是否被使用(不包含自己)', 't', '/perm/code/existsByCodeNotId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459002888196, 1811365615815487488, '2024-10-10 17:10:23.203785', 'client', 'dax-pay', '', '查询所有终端', 't', '/client/findAll', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459007082496, 1811365615815487488, '2024-10-10 17:10:23.204784', 'PayOrder', 'dax-pay', '', '根据订单号查询详情', 't', '/order/pay/findByOrderNo', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459007082497, 1811365615815487488, '2024-10-10 17:10:23.204784', 'perm', 'dax-pay', '', '根据id查询菜单', 't', '/perm/menu/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459007082498, 1811365615815487488, '2024-10-10 17:10:23.204784', 'ReconcileStatement', 'dax-pay', '', '手动触发对账文件下载', 't', '/reconcile/statement/downAndSave', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459007082499, 1811365615815487488, '2024-10-10 17:10:23.204784', 'params', 'dax-pay', '', '添加', 't', '/system/param/add', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459007082500, 1811365615815487488, '2024-10-10 17:10:23.204784', 'upms', 'dax-pay', '', '给用户分配角色', 't', '/user/role/saveAssign', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459011276800, 1811365615815487488, '2024-10-10 17:10:23.205786', 'user', 'dax-pay', '', '重置密码', 't', '/user/admin/restartPassword', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459011276801, 1811365615815487488, '2024-10-10 17:10:23.205786', 'upms', 'dax-pay', '', '给用户分配角色(批量)', 't', '/user/role/saveAssignBatch', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459011276802, 1811365615815487488, '2024-10-10 17:10:23.206567', 'loginLog', 'dax-pay', '', '获取登录日志', 't', '/log/login/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459015471104, 1811365615815487488, '2024-10-10 17:10:23.206567', 'PayOrder', 'dax-pay', '', '分页查询', 't', '/order/pay/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459019665408, 1811365615815487488, '2024-10-10 17:10:23.207031', 'user', 'dax-pay', '', '封禁用户', 't', '/user/admin/ban', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459019665409, 1811365615815487488, '2024-10-10 17:10:23.207031', 'role', 'dax-pay', '', '编码是否被使用', 't', '/role/existsByCode', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459019665410, 1811365615815487488, '2024-10-10 17:10:23.207031', 'RefundOrder', 'dax-pay', '', '根据商户退款号查询', 't', '/order/refund/findByRefundNo', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459019665411, 1811365615815487488, '2024-10-10 17:10:23.207575', 'TransferOrder', 'dax-pay', '', '转账关闭', 't', '/order/transfer/close', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459019665412, 1811365615815487488, '2024-10-10 17:10:23.207575', 'AllocGroup', 'dax-pay', '', '查询详情', 't', '/allocation/group/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459019665413, 1811365615815487488, '2024-10-10 17:10:23.207575', 'ChannelCashierConfig', 'dax-pay', '', '配置删除', 't', '/channel/cashier/config/delete', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459019665414, 1811365615815487488, '2024-10-10 17:10:23.207575', 'ReconcileStatement', 'dax-pay', '', '对账单分页', 't', '/reconcile/statement/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459023859712, 1811365615815487488, '2024-10-10 17:10:23.208575', 'params', 'dax-pay', '', '删除', 't', '/system/param/delete', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459023859713, 1811365615815487488, '2024-10-10 17:10:23.208575', 'UnionPayConfig', 'dax-pay', '', '新增或更新', 't', '/union/pay/config/saveOrUpdate', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459023859714, 1811365615815487488, '2024-10-10 17:10:23.208575', 'ChannelCashierConfig', 'dax-pay', '', '配置是否存在', 't', '/channel/cashier/config/existsByType', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459023859715, 1811365615815487488, '2024-10-10 17:10:23.209575', 'merchant', 'dax-pay', '', '删除商户应用', 't', '/mch/app/delete', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459028054016, 1811365615815487488, '2024-10-10 17:10:23.209575', 'PayOrder', 'dax-pay', '', '同步支付订单状态', 't', '/order/pay/sync', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459028054017, 1811365615815487488, '2024-10-10 17:10:23.209575', 'WechatPayConfig', 'dax-pay', '', '获取配置', 't', '/wechat/pay/config/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459028054018, 1811365615815487488, '2024-10-10 17:10:23.209575', 'user', 'dax-pay', '', '用户分页', 't', '/user/admin/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459032248320, 1811365615815487488, '2024-10-10 17:10:23.210575', 'dict', 'dax-pay', '', '根据主键删除字典', 't', '/dict/delete', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459032248321, 1811365615815487488, '2024-10-10 17:10:23.210575', 'ChannelCashierConfig', 'dax-pay', '', '配置更新', 't', '/channel/cashier/config/update', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459032248322, 1811365615815487488, '2024-10-10 17:10:23.210575', 'TradeSync', 'dax-pay', '', '查询单条', 't', '/record/sync/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459036442624, 1811365615815487488, '2024-10-10 17:10:23.211576', 'TransferOrder', 'dax-pay', '', '分页查询', 't', '/order/transfer/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459036442625, 1811365615815487488, '2024-10-10 17:10:23.211576', 'TradeFlow', 'dax-pay', '', '查询单条', 't', '/record/flow/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459036442626, 1811365615815487488, '2024-10-10 17:10:23.211576', 'dict', 'dax-pay', '', '根据主键获取字典', 't', '/dict/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459040636928, 1811365615815487488, '2024-10-10 17:10:23.212577', 'user', 'dax-pay', '', '解锁用户', 't', '/user/admin/unlock', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459040636929, 1811365615815487488, '2024-10-10 17:10:23.212577', 'dict', 'dax-pay', '', '添加字典项', 't', '/dict/item/update', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459040636930, 1811365615815487488, '2024-10-10 17:10:23.212577', 'role', 'dax-pay', '', '编码是否被使用(不包含自己)', 't', '/role/existsByCodeNotId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459040636931, 1811365615815487488, '2024-10-10 17:10:23.212577', 'perm', 'dax-pay', '', '权限码详情', 't', '/perm/code/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459040636932, 1811365615815487488, '2024-10-10 17:10:23.212577', 'MerchantCallback', 'dax-pay', '', '发送记录详情', 't', '/merchant/notice/callback/record/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459040636933, 1811365615815487488, '2024-10-10 17:10:23.213578', 'dict', 'dax-pay', '', '更新字典', 't', '/dict/update', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459044831232, 1811365615815487488, '2024-10-10 17:10:23.213578', 'CloseRecord', 'dax-pay', '', '分页查询', 't', '/record/close/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459044831233, 1811365615815487488, '2024-10-10 17:10:23.213578', 'upms', 'dax-pay', '', '查询当前角色已经选择的菜单id', 't', '/role/menu/findIdsByRole', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459049025536, 1811365615815487488, '2024-10-10 17:10:23.214574', 'role', 'dax-pay', '', '通过ID查询角色', 't', '/role/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459053219840, 1811365615815487488, '2024-10-10 17:10:23.215573', 'user', 'dax-pay', '', '添加用户', 't', '/user/admin/add', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459057414144, 1811365615815487488, '2024-10-10 17:10:23.216623', 'merchant', 'dax-pay', '', '根据商户号查询商户应用下拉列表', 't', '/mch/app/dropdown', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459061608448, 1811365615815487488, '2024-10-10 17:10:23.217631', 'TransferOrder', 'dax-pay', '', '查询单条', 't', '/order/transfer/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459061608449, 1811365615815487488, '2024-10-10 17:10:23.217631', 'MerchantNotify', 'dax-pay', '', '发送记录分页', 't', '/merchant/notice/notify/record/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459061608450, 1811365615815487488, '2024-10-10 17:10:23.217631', 'MerchantNotifyConfig', 'dax-pay', '', '商户消息订阅配置', 't', '/merchant/notify/config/subscribe', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459061608451, 1811365615815487488, '2024-10-10 17:10:23.217631', 'merchant', 'dax-pay', '', '根据id查询商户应用', 't', '/mch/app/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459061608452, 1811365615815487488, '2024-10-10 17:10:23.217631', 'ChannelCashierConfig', 'dax-pay', '', '获取码牌地址', 't', '/channel/cashier/config/qrCodeUrl', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459061608453, 1811365615815487488, '2024-10-10 17:10:23.217631', 'client', 'dax-pay', '', '通过ID查询终端', 't', '/client/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459065802752, 1811365615815487488, '2024-10-10 17:10:23.21863', 'upms', 'dax-pay', '', '查询当前角色已经选择的请求路径', 't', '/role/path/findIdsByRole', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459065802753, 1811365615815487488, '2024-10-10 17:10:23.21863', 'RefundOrder', 'dax-pay', '', '退款同步', 't', '/order/refund/sync', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459065802754, 1811365615815487488, '2024-10-10 17:10:23.21863', 'AllocGroup', 'dax-pay', '', '添加', 't', '/allocation/group/create', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459065802755, 1811365615815487488, '2024-10-10 17:10:23.21863', 'TransferOrder', 'dax-pay', '', '查询金额汇总', 't', '/order/transfer/getTotalAmount', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459065802756, 1811365615815487488, '2024-10-10 17:10:23.21863', 'TransferOrder', 'dax-pay', '', '转账重试', 't', '/order/transfer/retry', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459065802757, 1811365615815487488, '2024-10-10 17:10:23.21863', 'PayOrder', 'dax-pay', '', '查询金额汇总', 't', '/order/pay/getTotalAmount', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459065802758, 1811365615815487488, '2024-10-10 17:10:23.21863', 'operateLog', 'dax-pay', '', '操作日志分页', 't', '/log/operate/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459065802759, 1811365615815487488, '2024-10-10 17:10:23.21863', 'ReconcileStatement', 'dax-pay', '', '查询对账单', 't', '/reconcile/statement/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459065802760, 1811365615815487488, '2024-10-10 17:10:23.21863', 'RefundOrder', 'dax-pay', '', '退款重试', 't', '/order/refund/retry', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459069997056, 1811365615815487488, '2024-10-10 17:10:23.219631', 'PayConst', 'dax-pay', '', '支付方式分页', 't', '/const/method/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459069997057, 1811365615815487488, '2024-10-10 17:10:23.219631', 'client', 'dax-pay', '', '分页查询终端', 't', '/client/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459069997058, 1811365615815487488, '2024-10-10 17:10:23.219631', 'role', 'dax-pay', '', '名称是否被使用', 't', '/role/existsByName', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459069997059, 1811365615815487488, '2024-10-10 17:10:23.219631', 'AllocReceiver', 'dax-pay', '', '根据通道获取分账接收方类型', 't', '/allocation/receiver/findReceiverTypeByChannel', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459069997060, 1811365615815487488, '2024-10-10 17:10:23.219631', 'perm', 'dax-pay', '', '获取请求权限详情', 't', '/perm/path/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459074191360, 1811365615815487488, '2024-10-10 17:10:23.220629', 'MerchantCallback', 'dax-pay', '', '任务分页', 't', '/merchant/notice/callback/task/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459074191361, 1811365615815487488, '2024-10-10 17:10:23.220629', 'PayConst', 'dax-pay', '', '支付开放接口分页', 't', '/const/api/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459074191362, 1811365615815487488, '2024-10-10 17:10:23.220629', 'PayConst', 'dax-pay', '', '支付通道分页', 't', '/const/channel/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459074191363, 1811365615815487488, '2024-10-10 17:10:23.220629', 'dict', 'dax-pay', '', '查询字典项', 't', '/dict/item/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459074191364, 1811365615815487488, '2024-10-10 17:10:23.220629', 'upms', 'dax-pay', '', '保存请求权限关系', 't', '/role/code/save', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459078385664, 1811365615815487488, '2024-10-10 17:10:23.221633', 'perm', 'dax-pay', '', '请求权限树', 't', '/perm/path/tree', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459078385665, 1811365615815487488, '2024-10-10 17:10:23.221633', 'AllocGroup', 'dax-pay', '', '删除', 't', '/allocation/group/delete', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459078385666, 1811365615815487488, '2024-10-10 17:10:23.221633', 'WechatPayConfig', 'dax-pay', '', '新增或更新', 't', '/wechat/pay/config/saveOrUpdate', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459082579968, 1811365615815487488, '2024-10-10 17:10:23.222633', 'ChannelCashierConfig', 'dax-pay', '', '配置保存', 't', '/channel/cashier/config/save', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459082579969, 1811365615815487488, '2024-10-10 17:10:23.222633', 'user', 'dax-pay', '', '批量封禁用户', 't', '/user/admin/banBatch', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459082579970, 1811365615815487488, '2024-10-10 17:10:23.222633', 'channelConfig', 'dax-pay', '', '根据应用AppId查询配置列表', 't', '/channel/config/findAllByAppId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459082579971, 1811365615815487488, '2024-10-10 17:10:23.222633', 'dict', 'dax-pay', '', '查询字典项列表', 't', '/dict/item/findByDictionaryId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459082579972, 1811365615815487488, '2024-10-10 17:10:23.222633', 'DevelopTrade', 'dax-pay', '', '转账参数签名', 't', '/develop/trade/sign/transfer', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459086774272, 1811365615815487488, '2024-10-10 17:10:23.22363', 'AllocReceiver', 'dax-pay', '', '可分账的通道列表', 't', '/allocation/receiver/findChannels', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459086774273, 1811365615815487488, '2024-10-10 17:10:23.22363', 'params', 'dax-pay', '', '判断编码是否存在(不包含自己)', 't', '/system/param/existsByKeyNotId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459086774274, 1811365615815487488, '2024-10-10 17:10:23.22363', 'dict', 'dax-pay', '', '字典项编码是否被使用', 't', '/dict/item/existsByCode', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459086774275, 1811365615815487488, '2024-10-10 17:10:23.22363', 'DevelopTrade', 'dax-pay', '', '支付参数签名', 't', '/develop/trade/sign/pay', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459090968576, 1811365615815487488, '2024-10-10 17:10:23.224632', 'file', 'dax-pay', '', '设置默认存储平台地址', 't', '/file/platform/setDefault', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459090968577, 1811365615815487488, '2024-10-10 17:10:23.224632', 'dict', 'dax-pay', '', '字典项编码是否被使用(不包含自己)', 't', '/dict/item/existsByCodeNotId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459090968578, 1811365615815487488, '2024-10-10 17:10:23.224632', 'dict', 'dax-pay', '', '字典项分页', 't', '/dict/item/pageByDictionaryId', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459090968579, 1811365615815487488, '2024-10-10 17:10:23.224632', 'TransferOrder', 'dax-pay', '', '转账同步', 't', '/order/transfer/sync', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459090968580, 1811365615815487488, '2024-10-10 17:10:23.224632', 'DevelopTrade', 'dax-pay', '', '转账接口', 't', '/develop/trade/transfer', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459090968581, 1811365615815487488, '2024-10-10 17:10:23.224632', 'TradeFlow', 'dax-pay', '', '分页查询', 't', '/record/flow/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459095162880, 1811365615815487488, '2024-10-10 17:10:23.225631', 'MerchantNotify', 'dax-pay', '', '发送记录详情', 't', '/merchant/notice/notify/record/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459095162881, 1811365615815487488, '2024-10-10 17:10:23.225631', 'upms', 'dax-pay', '', '保存角色请求权限关联关系', 't', '/role/path/save', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459095162882, 1811365615815487488, '2024-10-10 17:10:23.225631', 'upms', 'dax-pay', '', '查询当前角色已经选择的菜单id', 't', '/role/code/findIdsByRole', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459095162883, 1811365615815487488, '2024-10-10 17:10:23.225631', 'user', 'dax-pay', '', '批量重置密码', 't', '/user/admin/restartPasswordBatch', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459099357184, 1811365615815487488, '2024-10-10 17:10:23.226852', 'AllocGroup', 'dax-pay', '', '设置默认分账组', 't', '/allocation/group/setDefault', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459103551488, 1811365615815487488, '2024-10-10 17:10:23.227357', 'AllocGroup', 'dax-pay', '', '分页', 't', '/allocation/group/page', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459103551489, 1811365615815487488, '2024-10-10 17:10:23.227357', 'merchant', 'dax-pay', '', '修改商户应用', 't', '/mch/app/update', 'POST'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459103551490, 1811365615815487488, '2024-10-10 17:10:23.227357', 'ReconcileDiscrepancy', 'dax-pay', '', '查询对账差异记录', 't', '/reconcile/discrepancy/findById', 'GET'); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459996938240, 1811365615815487488, '2024-10-10 17:10:23.440208', NULL, 'dax-pay', 'PayConfig', '支付配置', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459996938241, 1811365615815487488, '2024-10-10 17:10:23.440716', NULL, 'dax-pay', 'alipay', '支付宝通道', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459996938242, 1811365615815487488, '2024-10-10 17:10:23.440716', NULL, 'dax-pay', 'starter', 'starter模块', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459996938243, 1811365615815487488, '2024-10-10 17:10:23.440716', NULL, 'dax-pay', 'baseapi', '基础API', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304459996938244, 1811365615815487488, '2024-10-10 17:10:23.440716', NULL, 'dax-pay', 'develop', '开发调试功能', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460001132544, 1811365615815487488, '2024-10-10 17:10:23.441723', NULL, 'dax-pay', 'TradeOrder', '交易订单', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460001132545, 1811365615815487488, '2024-10-10 17:10:23.441723', NULL, 'dax-pay', 'reconcile', '对账服务', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460001132546, 1811365615815487488, '2024-10-10 17:10:23.441723', NULL, 'dax-pay', 'Alloc', '分账管理', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460001132547, 1811365615815487488, '2024-10-10 17:10:23.441723', NULL, 'dax-pay', 'iam', '身份识别与访问管理', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460001132548, 1811365615815487488, '2024-10-10 17:10:23.441723', NULL, 'dax-pay', 'UnionPay', '云闪付', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460001132549, 1811365615815487488, '2024-10-10 17:10:23.441723', NULL, 'dax-pay', 'TradeRecord', '交易记录', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460001132550, 1811365615815487488, '2024-10-10 17:10:23.441723', NULL, 'dax-pay', 'wechatPay', '微信支付', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460005326848, 1811365615815487488, '2024-10-10 17:10:23.442721', NULL, 'dax-pay', 'MerchantNotice', '商户通知', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460005326849, 1811365615815487488, '2024-10-10 17:10:23.442721', NULL, 'dax-pay', 'assist', '辅助功能', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460005326850, 1811365615815487488, '2024-10-10 17:10:23.442721', 'PayConfig', 'dax-pay', 'PayConst', '支付常量', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460005326851, 1811365615815487488, '2024-10-10 17:10:23.442721', 'iam', 'dax-pay', 'role', '角色管理', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460005326852, 1811365615815487488, '2024-10-10 17:10:23.442721', 'Alloc', 'dax-pay', 'AllocReceiver', '分账接收方', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460009521152, 1811365615815487488, '2024-10-10 17:10:23.443723', 'iam', 'dax-pay', 'perm', '权限管理', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460009521153, 1811365615815487488, '2024-10-10 17:10:23.443723', 'TradeOrder', 'dax-pay', 'PayOrder', '支付订单', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460009521154, 1811365615815487488, '2024-10-10 17:10:23.443723', 'starter', 'dax-pay', 'loginLog', '登录日志', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460009521155, 1811365615815487488, '2024-10-10 17:10:23.443723', 'Alloc', 'dax-pay', 'AllocGroup', '分账组', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460009521156, 1811365615815487488, '2024-10-10 17:10:23.443723', 'PayConfig', 'dax-pay', 'PlatformConfig', '平台配置', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460009521157, 1811365615815487488, '2024-10-10 17:10:23.443723', 'starter', 'dax-pay', 'file', '文件存储管理', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460013715456, 1811365615815487488, '2024-10-10 17:10:23.444722', 'assist', 'dax-pay', 'ChannelAuth', '通道认证', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460013715457, 1811365615815487488, '2024-10-10 17:10:23.444722', 'MerchantNotice', 'dax-pay', 'MerchantCallback', '商户回调通知', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460013715458, 1811365615815487488, '2024-10-10 17:10:23.444722', 'baseapi', 'dax-pay', 'dict', '字典管理', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460013715459, 1811365615815487488, '2024-10-10 17:10:23.444722', 'iam', 'dax-pay', 'client', '终端管理', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460013715460, 1811365615815487488, '2024-10-10 17:10:23.444722', 'reconcile', 'dax-pay', 'ReconcileDiscrepancy', '对账差异记录', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460013715461, 1811365615815487488, '2024-10-10 17:10:23.444722', 'PayConfig', 'dax-pay', 'MerchantNotifyConfig', '商户通知配置', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460013715462, 1811365615815487488, '2024-10-10 17:10:23.444722', 'starter', 'dax-pay', 'operateLog', '操作日志', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460013715463, 1811365615815487488, '2024-10-10 17:10:23.444722', 'TradeRecord', 'dax-pay', 'TradeFlow', '交易流水记录', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460013715464, 1811365615815487488, '2024-10-10 17:10:23.444722', 'reconcile', 'dax-pay', 'ReconcileStatement', '对账单', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460013715465, 1811365615815487488, '2024-10-10 17:10:23.444722', 'TradeOrder', 'dax-pay', 'RefundOrder', '退款订单', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460017909760, 1811365615815487488, '2024-10-10 17:10:23.445722', 'TradeRecord', 'dax-pay', 'TradeCallback', '交易回调记录', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460017909761, 1811365615815487488, '2024-10-10 17:10:23.445722', 'alipay', 'dax-pay', 'AlipayConfig', '支付宝配置', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460017909762, 1811365615815487488, '2024-10-10 17:10:23.445722', 'TradeRecord', 'dax-pay', 'CloseRecord', '支付关闭记录', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460017909763, 1811365615815487488, '2024-10-10 17:10:23.445722', 'wechatPay', 'dax-pay', 'WechatPayConfig', '微信支付配置', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460017909764, 1811365615815487488, '2024-10-10 17:10:23.445722', 'PayConfig', 'dax-pay', 'ChannelCashierConfig', '通道支付收银台配置', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460017909765, 1811365615815487488, '2024-10-10 17:10:23.445722', 'MerchantNotice', 'dax-pay', 'MerchantNotify', '商户订阅通知', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460017909766, 1811365615815487488, '2024-10-10 17:10:23.445722', 'PayConfig', 'dax-pay', 'merchant', '商户配置', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460017909767, 1811365615815487488, '2024-10-10 17:10:23.445722', 'UnionPay', 'dax-pay', 'UnionPayConfig', '云闪付配置', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460017909768, 1811365615815487488, '2024-10-10 17:10:23.445722', 'baseapi', 'dax-pay', 'params', '系统参数', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460022104064, 1811365615815487488, '2024-10-10 17:10:23.446753', 'TradeRecord', 'dax-pay', 'TradeSync', '交易同步记录', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460022104065, 1811365615815487488, '2024-10-10 17:10:23.446753', 'develop', 'dax-pay', 'DevelopTrade', '交易开发调试服务', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460022104066, 1811365615815487488, '2024-10-10 17:10:23.446753', 'TradeOrder', 'dax-pay', 'TransferOrder', '转账订单', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460022104067, 1811365615815487488, '2024-10-10 17:10:23.446753', 'PayConfig', 'dax-pay', 'channelConfig', '通道配置', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460022104068, 1811365615815487488, '2024-10-10 17:10:23.446753', 'iam', 'dax-pay', 'upms', '权限分配管理', 'f', NULL, NULL); -INSERT INTO "public"."iam_perm_path" VALUES (1844304460022104069, 1811365615815487488, '2024-10-10 17:10:23.446753', 'iam', 'dax-pay', 'user', '用户管理', 'f', NULL, NULL); -- ---------------------------- -- Table structure for iam_role @@ -752,8 +534,7 @@ COMMENT ON TABLE "public"."iam_role" IS '角色'; -- ---------------------------- -- Records of iam_role -- ---------------------------- -INSERT INTO "public"."iam_role" VALUES (1810203792869191680, 0, '2024-07-08 14:46:30.838451', 0, '2024-07-08 14:46:30.838451', 0, 'f', NULL, 'admin', '管理员', 't', ''); -INSERT INTO "public"."iam_role" VALUES (1844320575938973696, 1811689994080333824, '2024-10-10 18:14:25.780682', 1811689994080333824, '2024-10-10 18:14:25.780682', 0, 'f', 1810203792869191680, 'demo', '演示角色', 'f', ''); +INSERT INTO "public"."iam_role" VALUES (1810203792869191680, 0, '2024-07-08 14:46:30.838451', 0, '2024-07-08 14:46:30.838451', 0, 'f', NULL, 'admin', '管理员', 'f', ''); -- ---------------------------- -- Table structure for iam_role_code @@ -794,89 +575,6 @@ COMMENT ON TABLE "public"."iam_role_menu" IS '角色菜单关联关系'; -- ---------------------------- -- Records of iam_role_menu -- ---------------------------- -INSERT INTO "public"."iam_role_menu" VALUES (1844311765623058432, 1810203792869191680, 'dax-pay', 1810864706127790080); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765623058433, 1810203792869191680, 'dax-pay', 1810871795650891776); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765623058434, 1810203792869191680, 'dax-pay', 1810909511121862656); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765623058435, 1810203792869191680, 'dax-pay', 1810911232921423872); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765623058436, 1810203792869191680, 'dax-pay', 1810914501286580224); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765623058437, 1810203792869191680, 'dax-pay', 1810915172140339200); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252736, 1810203792869191680, 'dax-pay', 1810909853691641856); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252737, 1810203792869191680, 'dax-pay', 1811360392644521984); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252738, 1810203792869191680, 'dax-pay', 1810910433264762880); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252739, 1810203792869191680, 'dax-pay', 1811283512855629824); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252740, 1810203792869191680, 'dax-pay', 1811283778967441408); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252741, 1810203792869191680, 'dax-pay', 1811336128809766912); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252742, 1810203792869191680, 'dax-pay', 1837381440350912512); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252743, 1810203792869191680, 'dax-pay', 1811667984159715328); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252744, 1810203792869191680, 'dax-pay', 1811671741266243584); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252745, 1810203792869191680, 'dax-pay', 1811672495767007232); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252746, 1810203792869191680, 'dax-pay', 1822975425229004800); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252747, 1810203792869191680, 'dax-pay', 1822975777026252800); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252748, 1810203792869191680, 'dax-pay', 1822975970266226688); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252749, 1810203792869191680, 'dax-pay', 1812113823376666624); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252750, 1810203792869191680, 'dax-pay', 1812116779807338496); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252751, 1810203792869191680, 'dax-pay', 1812118306328473600); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252752, 1810203792869191680, 'dax-pay', 1812118417951485952); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252753, 1810203792869191680, 'dax-pay', 1812118635229016064); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252754, 1810203792869191680, 'dax-pay', 1820432075829538816); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252755, 1810203792869191680, 'dax-pay', 1813456708833087488); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765627252756, 1810203792869191680, 'dax-pay', 1813782811271446528); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765631447040, 1810203792869191680, 'dax-pay', 1812116972585938944); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765631447041, 1810203792869191680, 'dax-pay', 1812117498400665600); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765631447042, 1810203792869191680, 'dax-pay', 1812114224679284736); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765631447043, 1810203792869191680, 'dax-pay', 1814602527895957504); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765631447044, 1810203792869191680, 'dax-pay', 1814602684720984064); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765631447045, 1810203792869191680, 'dax-pay', 1814602840971390976); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765631447046, 1810203792869191680, 'dax-pay', 1812114347454951424); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765631447047, 1810203792869191680, 'dax-pay', 1816064154722365440); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765631447048, 1810203792869191680, 'dax-pay', 1816064344661422080); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765631447049, 1810203792869191680, 'dax-pay', 1816064593371066368); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641344, 1810203792869191680, 'dax-pay', 1824779945365450752); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641345, 1810203792869191680, 'dax-pay', 1812114603047448576); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641346, 1810203792869191680, 'dax-pay', 1820467440233127936); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641347, 1810203792869191680, 'dax-pay', 1820467523628474368); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641348, 1810203792869191680, 'dax-pay', 1812114725651148800); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641349, 1810203792869191680, 'dax-pay', 1824779660136001536); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641350, 1810203792869191680, 'dax-pay', 1824779695900831744); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641351, 1810203792869191680, 'dax-pay', 1824779750208679936); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641352, 1810203792869191680, 'dax-pay', 1812114959231938560); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641353, 1810203792869191680, 'dax-pay', 1820467934552825856); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641354, 1810203792869191680, 'dax-pay', 1820468413097746432); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641355, 1810203792869191680, 'dax-pay', 1812115119471128576); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641356, 1810203792869191680, 'dax-pay', 1836248839544733696); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641357, 1810203792869191680, 'dax-pay', 1838832057238274048); -INSERT INTO "public"."iam_role_menu" VALUES (1844311765635641358, 1810203792869191680, 'dax-pay', 1812115247342874624); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799986110464, 1844320575938973696, 'dax-pay', 1812113823376666624); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799990304768, 1844320575938973696, 'dax-pay', 1812116779807338496); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799990304769, 1844320575938973696, 'dax-pay', 1812118306328473600); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799990304770, 1844320575938973696, 'dax-pay', 1812118417951485952); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799990304771, 1844320575938973696, 'dax-pay', 1812118635229016064); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799990304772, 1844320575938973696, 'dax-pay', 1820432075829538816); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799994499072, 1844320575938973696, 'dax-pay', 1812116972585938944); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799994499073, 1844320575938973696, 'dax-pay', 1812117498400665600); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799994499074, 1844320575938973696, 'dax-pay', 1812114224679284736); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799994499075, 1844320575938973696, 'dax-pay', 1814602527895957504); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799994499076, 1844320575938973696, 'dax-pay', 1814602684720984064); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799994499077, 1844320575938973696, 'dax-pay', 1814602840971390976); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799994499078, 1844320575938973696, 'dax-pay', 1812114347454951424); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799994499079, 1844320575938973696, 'dax-pay', 1816064154722365440); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799994499080, 1844320575938973696, 'dax-pay', 1816064344661422080); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799994499081, 1844320575938973696, 'dax-pay', 1816064593371066368); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799998693376, 1844320575938973696, 'dax-pay', 1824779945365450752); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799998693377, 1844320575938973696, 'dax-pay', 1812114603047448576); -INSERT INTO "public"."iam_role_menu" VALUES (1844320799998693378, 1844320575938973696, 'dax-pay', 1820467440233127936); -INSERT INTO "public"."iam_role_menu" VALUES (1844320800002887680, 1844320575938973696, 'dax-pay', 1820467523628474368); -INSERT INTO "public"."iam_role_menu" VALUES (1844320800002887681, 1844320575938973696, 'dax-pay', 1812114725651148800); -INSERT INTO "public"."iam_role_menu" VALUES (1844320800002887682, 1844320575938973696, 'dax-pay', 1824779660136001536); -INSERT INTO "public"."iam_role_menu" VALUES (1844320800002887683, 1844320575938973696, 'dax-pay', 1824779695900831744); -INSERT INTO "public"."iam_role_menu" VALUES (1844320800002887684, 1844320575938973696, 'dax-pay', 1824779750208679936); -INSERT INTO "public"."iam_role_menu" VALUES (1844320800002887685, 1844320575938973696, 'dax-pay', 1812114959231938560); -INSERT INTO "public"."iam_role_menu" VALUES (1844320800002887686, 1844320575938973696, 'dax-pay', 1820467934552825856); -INSERT INTO "public"."iam_role_menu" VALUES (1844320800007081984, 1844320575938973696, 'dax-pay', 1820468413097746432); -INSERT INTO "public"."iam_role_menu" VALUES (1844320800007081985, 1844320575938973696, 'dax-pay', 1812115119471128576); -INSERT INTO "public"."iam_role_menu" VALUES (1844320800007081986, 1844320575938973696, 'dax-pay', 1836248839544733696); -INSERT INTO "public"."iam_role_menu" VALUES (1844320800007081987, 1844320575938973696, 'dax-pay', 1838832057238274048); -INSERT INTO "public"."iam_role_menu" VALUES (1844320800007081988, 1844320575938973696, 'dax-pay', 1812115247342874624); -- ---------------------------- -- Table structure for iam_role_path @@ -898,300 +596,6 @@ COMMENT ON TABLE "public"."iam_role_path" IS '角色路径关联关系'; -- ---------------------------- -- Records of iam_role_path -- ---------------------------- -INSERT INTO "public"."iam_role_path" VALUES (1844316892790599680, 1810203792869191680, 'dax-pay', 1844304459103551490); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793984, 1810203792869191680, 'dax-pay', 1844304458969333761); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793985, 1810203792869191680, 'dax-pay', 1844304459065802759); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793986, 1810203792869191680, 'dax-pay', 1844304459019665414); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793987, 1810203792869191680, 'dax-pay', 1844304459007082498); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793988, 1810203792869191680, 'dax-pay', 1844304459002888194); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793989, 1810203792869191680, 'dax-pay', 1844304458990305285); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793990, 1810203792869191680, 'dax-pay', 1844304458965139456); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793991, 1810203792869191680, 'dax-pay', 1844304459103551489); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793992, 1810203792869191680, 'dax-pay', 1844304459061608451); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793993, 1810203792869191680, 'dax-pay', 1844304459057414144); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793994, 1810203792869191680, 'dax-pay', 1844304459023859715); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793995, 1810203792869191680, 'dax-pay', 1844304458931585025); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793996, 1810203792869191680, 'dax-pay', 1844304458923196418); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793997, 1810203792869191680, 'dax-pay', 1844304459082579970); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793998, 1810203792869191680, 'dax-pay', 1844304459082579968); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794793999, 1810203792869191680, 'dax-pay', 1844304459061608452); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794000, 1810203792869191680, 'dax-pay', 1844304459032248321); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794001, 1810203792869191680, 'dax-pay', 1844304459023859714); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794002, 1810203792869191680, 'dax-pay', 1844304459019665413); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794003, 1810203792869191680, 'dax-pay', 1844304458990305282); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794004, 1810203792869191680, 'dax-pay', 1844304458981916678); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794005, 1810203792869191680, 'dax-pay', 1844304458981916676); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794006, 1810203792869191680, 'dax-pay', 1844304459074191362); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794007, 1810203792869191680, 'dax-pay', 1844304459074191361); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794008, 1810203792869191680, 'dax-pay', 1844304459069997056); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794009, 1810203792869191680, 'dax-pay', 1844304458927390720); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794010, 1810203792869191680, 'dax-pay', 1844304459061608450); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794011, 1810203792869191680, 'dax-pay', 1844304458935779328); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794012, 1810203792869191680, 'dax-pay', 1844304458952556544); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794013, 1810203792869191680, 'dax-pay', 1844304458927390722); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794014, 1810203792869191680, 'dax-pay', 1844304459103551488); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794015, 1810203792869191680, 'dax-pay', 1844304459099357184); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794016, 1810203792869191680, 'dax-pay', 1844304459078385665); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794017, 1810203792869191680, 'dax-pay', 1844304459065802754); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794018, 1810203792869191680, 'dax-pay', 1844304459019665412); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794019, 1810203792869191680, 'dax-pay', 1844304458998693892); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794020, 1810203792869191680, 'dax-pay', 1844304458994499590); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794021, 1810203792869191680, 'dax-pay', 1844304458994499586); -INSERT INTO "public"."iam_role_path" VALUES (1844316892794794022, 1810203792869191680, 'dax-pay', 1844304458981916675); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988288, 1810203792869191680, 'dax-pay', 1844304458948362243); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988289, 1810203792869191680, 'dax-pay', 1844304458935779331); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988290, 1810203792869191680, 'dax-pay', 1844304458923196416); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988291, 1810203792869191680, 'dax-pay', 1844304458889641984); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988292, 1810203792869191680, 'dax-pay', 1844304459086774272); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988293, 1810203792869191680, 'dax-pay', 1844304459069997059); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988294, 1810203792869191680, 'dax-pay', 1844304458986110976); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988295, 1810203792869191680, 'dax-pay', 1844304458977722373); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988296, 1810203792869191680, 'dax-pay', 1844304458973528065); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988297, 1810203792869191680, 'dax-pay', 1844304458948362242); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988298, 1810203792869191680, 'dax-pay', 1844304458935779332); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988299, 1810203792869191680, 'dax-pay', 1844304459095162883); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988300, 1810203792869191680, 'dax-pay', 1844304459082579969); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988301, 1810203792869191680, 'dax-pay', 1844304459053219840); -INSERT INTO "public"."iam_role_path" VALUES (1844316892798988302, 1810203792869191680, 'dax-pay', 1844304459040636928); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182592, 1810203792869191680, 'dax-pay', 1844304459028054018); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182593, 1810203792869191680, 'dax-pay', 1844304459019665408); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182594, 1810203792869191680, 'dax-pay', 1844304459011276800); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182595, 1810203792869191680, 'dax-pay', 1844304458994499592); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182596, 1810203792869191680, 'dax-pay', 1844304458990305284); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182597, 1810203792869191680, 'dax-pay', 1844304458981916672); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182598, 1810203792869191680, 'dax-pay', 1844304459095162882); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182599, 1810203792869191680, 'dax-pay', 1844304459095162881); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182600, 1810203792869191680, 'dax-pay', 1844304459074191364); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182601, 1810203792869191680, 'dax-pay', 1844304459065802752); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182602, 1810203792869191680, 'dax-pay', 1844304459044831233); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182603, 1810203792869191680, 'dax-pay', 1844304459011276801); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182604, 1810203792869191680, 'dax-pay', 1844304459007082500); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182605, 1810203792869191680, 'dax-pay', 1844304458994499584); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182606, 1810203792869191680, 'dax-pay', 1844304458990305280); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182607, 1810203792869191680, 'dax-pay', 1844304458981916677); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182608, 1810203792869191680, 'dax-pay', 1844304458944167936); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182609, 1810203792869191680, 'dax-pay', 1844304458939973632); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182610, 1810203792869191680, 'dax-pay', 1844304458935779333); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182611, 1810203792869191680, 'dax-pay', 1844304459078385664); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182612, 1810203792869191680, 'dax-pay', 1844304459069997060); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182613, 1810203792869191680, 'dax-pay', 1844304459040636931); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182614, 1810203792869191680, 'dax-pay', 1844304459007082497); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182615, 1810203792869191680, 'dax-pay', 1844304459002888195); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182616, 1810203792869191680, 'dax-pay', 1844304458960945154); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182617, 1810203792869191680, 'dax-pay', 1844304458956750850); -INSERT INTO "public"."iam_role_path" VALUES (1844316892803182618, 1810203792869191680, 'dax-pay', 1844304459069997058); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376896, 1810203792869191680, 'dax-pay', 1844304459049025536); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376897, 1810203792869191680, 'dax-pay', 1844304459040636930); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376898, 1810203792869191680, 'dax-pay', 1844304459019665409); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376899, 1810203792869191680, 'dax-pay', 1844304458994499588); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376900, 1810203792869191680, 'dax-pay', 1844304458956750851); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376901, 1810203792869191680, 'dax-pay', 1844304458939973635); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376902, 1810203792869191680, 'dax-pay', 1844304459069997057); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376903, 1810203792869191680, 'dax-pay', 1844304459061608453); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376904, 1810203792869191680, 'dax-pay', 1844304459002888196); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376905, 1810203792869191680, 'dax-pay', 1844304458977722371); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376906, 1810203792869191680, 'dax-pay', 1844304458931585027); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376907, 1810203792869191680, 'dax-pay', 1844304459095162880); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376908, 1810203792869191680, 'dax-pay', 1844304459061608449); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376909, 1810203792869191680, 'dax-pay', 1844304458977722369); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376910, 1810203792869191680, 'dax-pay', 1844304458952556545); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376911, 1810203792869191680, 'dax-pay', 1844304458935779330); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376912, 1810203792869191680, 'dax-pay', 1844304459074191360); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376913, 1810203792869191680, 'dax-pay', 1844304459040636932); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376914, 1810203792869191680, 'dax-pay', 1844304458994499591); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376915, 1810203792869191680, 'dax-pay', 1844304458973528068); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376916, 1810203792869191680, 'dax-pay', 1844304458927390721); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376917, 1810203792869191680, 'dax-pay', 1844304459090968581); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376918, 1810203792869191680, 'dax-pay', 1844304459036442625); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376919, 1810203792869191680, 'dax-pay', 1844304458977722368); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376920, 1810203792869191680, 'dax-pay', 1844304459044831232); -INSERT INTO "public"."iam_role_path" VALUES (1844316892807376921, 1810203792869191680, 'dax-pay', 1844304458990305283); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571200, 1810203792869191680, 'dax-pay', 1844304459032248322); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571201, 1810203792869191680, 'dax-pay', 1844304458939973633); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571202, 1810203792869191680, 'dax-pay', 1844304458998693891); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571203, 1810203792869191680, 'dax-pay', 1844304458969333760); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571204, 1810203792869191680, 'dax-pay', 1844304459090968580); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571205, 1810203792869191680, 'dax-pay', 1844304459086774275); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571206, 1810203792869191680, 'dax-pay', 1844304459082579972); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571207, 1810203792869191680, 'dax-pay', 1844304458994499585); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571208, 1810203792869191680, 'dax-pay', 1844304458973528064); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571209, 1810203792869191680, 'dax-pay', 1844304458952556546); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571210, 1810203792869191680, 'dax-pay', 1844304459090968579); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571211, 1810203792869191680, 'dax-pay', 1844304459065802756); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571212, 1810203792869191680, 'dax-pay', 1844304459065802755); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571213, 1810203792869191680, 'dax-pay', 1844304459061608448); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571214, 1810203792869191680, 'dax-pay', 1844304459036442624); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571215, 1810203792869191680, 'dax-pay', 1844304459019665411); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571216, 1810203792869191680, 'dax-pay', 1844304458973528067); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571217, 1810203792869191680, 'dax-pay', 1844304459065802760); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571218, 1810203792869191680, 'dax-pay', 1844304459065802753); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571219, 1810203792869191680, 'dax-pay', 1844304459019665410); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571220, 1810203792869191680, 'dax-pay', 1844304458981916674); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571221, 1810203792869191680, 'dax-pay', 1844304458956750849); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571222, 1810203792869191680, 'dax-pay', 1844304458952556547); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571223, 1810203792869191680, 'dax-pay', 1844304458944167937); -INSERT INTO "public"."iam_role_path" VALUES (1844316892811571224, 1810203792869191680, 'dax-pay', 1844304458931585024); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765504, 1810203792869191680, 'dax-pay', 1844304459065802757); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765505, 1810203792869191680, 'dax-pay', 1844304459028054016); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765506, 1810203792869191680, 'dax-pay', 1844304459015471104); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765507, 1810203792869191680, 'dax-pay', 1844304459007082496); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765508, 1810203792869191680, 'dax-pay', 1844304458998693890); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765509, 1810203792869191680, 'dax-pay', 1844304458998693888); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765510, 1810203792869191680, 'dax-pay', 1844304458960945152); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765511, 1810203792869191680, 'dax-pay', 1844304459090968578); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765512, 1810203792869191680, 'dax-pay', 1844304459090968577); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765513, 1810203792869191680, 'dax-pay', 1844304459086774274); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765514, 1810203792869191680, 'dax-pay', 1844304459082579971); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765515, 1810203792869191680, 'dax-pay', 1844304459074191363); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765516, 1810203792869191680, 'dax-pay', 1844304459040636933); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765517, 1810203792869191680, 'dax-pay', 1844304459040636929); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765518, 1810203792869191680, 'dax-pay', 1844304459036442626); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765519, 1810203792869191680, 'dax-pay', 1844304459032248320); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765520, 1810203792869191680, 'dax-pay', 1844304458998693889); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765521, 1810203792869191680, 'dax-pay', 1844304458994499587); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765522, 1810203792869191680, 'dax-pay', 1844304458960945153); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765523, 1810203792869191680, 'dax-pay', 1844304458956750848); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765524, 1810203792869191680, 'dax-pay', 1844304458948362240); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765525, 1810203792869191680, 'dax-pay', 1844304458944167939); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765526, 1810203792869191680, 'dax-pay', 1844304458931585026); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765527, 1810203792869191680, 'dax-pay', 1844304458923196419); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765528, 1810203792869191680, 'dax-pay', 1844304459086774273); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765529, 1810203792869191680, 'dax-pay', 1844304459023859712); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765530, 1810203792869191680, 'dax-pay', 1844304459007082499); -INSERT INTO "public"."iam_role_path" VALUES (1844316892815765531, 1810203792869191680, 'dax-pay', 1844304459002888192); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959808, 1810203792869191680, 'dax-pay', 1844304458990305281); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959809, 1810203792869191680, 'dax-pay', 1844304458977722370); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959810, 1810203792869191680, 'dax-pay', 1844304458935779329); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959811, 1810203792869191680, 'dax-pay', 1844304459090968576); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959812, 1810203792869191680, 'dax-pay', 1844304458981916673); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959813, 1810203792869191680, 'dax-pay', 1844304459065802758); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959814, 1810203792869191680, 'dax-pay', 1844304458948362241); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959815, 1810203792869191680, 'dax-pay', 1844304458919002112); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959816, 1810203792869191680, 'dax-pay', 1844304459011276802); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959817, 1810203792869191680, 'dax-pay', 1844304458973528066); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959818, 1810203792869191680, 'dax-pay', 1844304458939973634); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959819, 1810203792869191680, 'dax-pay', 1844304459078385666); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959820, 1810203792869191680, 'dax-pay', 1844304459028054017); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959821, 1810203792869191680, 'dax-pay', 1844304459023859713); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959822, 1810203792869191680, 'dax-pay', 1844304459002888193); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959823, 1810203792869191680, 'dax-pay', 1844304458994499589); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959824, 1810203792869191680, 'dax-pay', 1844304458923196417); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959825, 1810203792869191680, 'dax-pay', 1844304458977722372); -INSERT INTO "public"."iam_role_path" VALUES (1844316892819959826, 1810203792869191680, 'dax-pay', 1844304458944167938); -INSERT INTO "public"."iam_role_path" VALUES (1844320923361562624, 1844320575938973696, 'dax-pay', 1844304459103551490); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756928, 1844320575938973696, 'dax-pay', 1844304458969333761); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756929, 1844320575938973696, 'dax-pay', 1844304459065802759); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756930, 1844320575938973696, 'dax-pay', 1844304459019665414); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756931, 1844320575938973696, 'dax-pay', 1844304459007082498); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756932, 1844320575938973696, 'dax-pay', 1844304459002888194); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756933, 1844320575938973696, 'dax-pay', 1844304458990305285); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756934, 1844320575938973696, 'dax-pay', 1844304458965139456); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756935, 1844320575938973696, 'dax-pay', 1844304459103551489); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756936, 1844320575938973696, 'dax-pay', 1844304459061608451); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756937, 1844320575938973696, 'dax-pay', 1844304459057414144); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756938, 1844320575938973696, 'dax-pay', 1844304459023859715); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756939, 1844320575938973696, 'dax-pay', 1844304458931585025); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756940, 1844320575938973696, 'dax-pay', 1844304458923196418); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756941, 1844320575938973696, 'dax-pay', 1844304459082579970); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756942, 1844320575938973696, 'dax-pay', 1844304459082579968); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756943, 1844320575938973696, 'dax-pay', 1844304459061608452); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756944, 1844320575938973696, 'dax-pay', 1844304459032248321); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756945, 1844320575938973696, 'dax-pay', 1844304459023859714); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756946, 1844320575938973696, 'dax-pay', 1844304459019665413); -INSERT INTO "public"."iam_role_path" VALUES (1844320923365756947, 1844320575938973696, 'dax-pay', 1844304458990305282); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951232, 1844320575938973696, 'dax-pay', 1844304458981916678); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951233, 1844320575938973696, 'dax-pay', 1844304458981916676); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951234, 1844320575938973696, 'dax-pay', 1844304459074191362); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951235, 1844320575938973696, 'dax-pay', 1844304459074191361); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951236, 1844320575938973696, 'dax-pay', 1844304459069997056); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951237, 1844320575938973696, 'dax-pay', 1844304458927390720); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951238, 1844320575938973696, 'dax-pay', 1844304459061608450); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951239, 1844320575938973696, 'dax-pay', 1844304458935779328); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951240, 1844320575938973696, 'dax-pay', 1844304458952556544); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951241, 1844320575938973696, 'dax-pay', 1844304458927390722); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951242, 1844320575938973696, 'dax-pay', 1844304459103551488); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951243, 1844320575938973696, 'dax-pay', 1844304459099357184); -INSERT INTO "public"."iam_role_path" VALUES (1844320923369951244, 1844320575938973696, 'dax-pay', 1844304459078385665); -INSERT INTO "public"."iam_role_path" VALUES (1844320923374145536, 1844320575938973696, 'dax-pay', 1844304459065802754); -INSERT INTO "public"."iam_role_path" VALUES (1844320923374145537, 1844320575938973696, 'dax-pay', 1844304459019665412); -INSERT INTO "public"."iam_role_path" VALUES (1844320923374145538, 1844320575938973696, 'dax-pay', 1844304458998693892); -INSERT INTO "public"."iam_role_path" VALUES (1844320923374145539, 1844320575938973696, 'dax-pay', 1844304458994499590); -INSERT INTO "public"."iam_role_path" VALUES (1844320923374145540, 1844320575938973696, 'dax-pay', 1844304458994499586); -INSERT INTO "public"."iam_role_path" VALUES (1844320923374145541, 1844320575938973696, 'dax-pay', 1844304458981916675); -INSERT INTO "public"."iam_role_path" VALUES (1844320923374145542, 1844320575938973696, 'dax-pay', 1844304458948362243); -INSERT INTO "public"."iam_role_path" VALUES (1844320923374145543, 1844320575938973696, 'dax-pay', 1844304458935779331); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339840, 1844320575938973696, 'dax-pay', 1844304458923196416); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339841, 1844320575938973696, 'dax-pay', 1844304458889641984); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339842, 1844320575938973696, 'dax-pay', 1844304459086774272); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339843, 1844320575938973696, 'dax-pay', 1844304459069997059); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339844, 1844320575938973696, 'dax-pay', 1844304458986110976); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339845, 1844320575938973696, 'dax-pay', 1844304458977722373); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339846, 1844320575938973696, 'dax-pay', 1844304458973528065); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339847, 1844320575938973696, 'dax-pay', 1844304458948362242); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339848, 1844320575938973696, 'dax-pay', 1844304458935779332); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339849, 1844320575938973696, 'dax-pay', 1844304459095162880); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339850, 1844320575938973696, 'dax-pay', 1844304459061608449); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339851, 1844320575938973696, 'dax-pay', 1844304458977722369); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339852, 1844320575938973696, 'dax-pay', 1844304458952556545); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339853, 1844320575938973696, 'dax-pay', 1844304458935779330); -INSERT INTO "public"."iam_role_path" VALUES (1844320923378339854, 1844320575938973696, 'dax-pay', 1844304459074191360); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534144, 1844320575938973696, 'dax-pay', 1844304459040636932); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534145, 1844320575938973696, 'dax-pay', 1844304458994499591); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534146, 1844320575938973696, 'dax-pay', 1844304458973528068); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534147, 1844320575938973696, 'dax-pay', 1844304458927390721); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534148, 1844320575938973696, 'dax-pay', 1844304459090968581); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534149, 1844320575938973696, 'dax-pay', 1844304459036442625); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534150, 1844320575938973696, 'dax-pay', 1844304458977722368); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534151, 1844320575938973696, 'dax-pay', 1844304459044831232); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534152, 1844320575938973696, 'dax-pay', 1844304458990305283); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534153, 1844320575938973696, 'dax-pay', 1844304459032248322); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534154, 1844320575938973696, 'dax-pay', 1844304458939973633); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534155, 1844320575938973696, 'dax-pay', 1844304458998693891); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534156, 1844320575938973696, 'dax-pay', 1844304458969333760); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534157, 1844320575938973696, 'dax-pay', 1844304459090968580); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534158, 1844320575938973696, 'dax-pay', 1844304459086774275); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534159, 1844320575938973696, 'dax-pay', 1844304459082579972); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534160, 1844320575938973696, 'dax-pay', 1844304458994499585); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534161, 1844320575938973696, 'dax-pay', 1844304458973528064); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534162, 1844320575938973696, 'dax-pay', 1844304458952556546); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534163, 1844320575938973696, 'dax-pay', 1844304459090968579); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534164, 1844320575938973696, 'dax-pay', 1844304459065802756); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534165, 1844320575938973696, 'dax-pay', 1844304459065802755); -INSERT INTO "public"."iam_role_path" VALUES (1844320923382534166, 1844320575938973696, 'dax-pay', 1844304459061608448); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728448, 1844320575938973696, 'dax-pay', 1844304459036442624); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728449, 1844320575938973696, 'dax-pay', 1844304459019665411); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728450, 1844320575938973696, 'dax-pay', 1844304458973528067); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728451, 1844320575938973696, 'dax-pay', 1844304459065802760); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728452, 1844320575938973696, 'dax-pay', 1844304459065802753); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728453, 1844320575938973696, 'dax-pay', 1844304459019665410); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728454, 1844320575938973696, 'dax-pay', 1844304458981916674); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728455, 1844320575938973696, 'dax-pay', 1844304458956750849); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728456, 1844320575938973696, 'dax-pay', 1844304458952556547); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728457, 1844320575938973696, 'dax-pay', 1844304458944167937); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728458, 1844320575938973696, 'dax-pay', 1844304458931585024); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728459, 1844320575938973696, 'dax-pay', 1844304459065802757); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728460, 1844320575938973696, 'dax-pay', 1844304459028054016); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728461, 1844320575938973696, 'dax-pay', 1844304459015471104); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728462, 1844320575938973696, 'dax-pay', 1844304459007082496); -INSERT INTO "public"."iam_role_path" VALUES (1844320923386728463, 1844320575938973696, 'dax-pay', 1844304458998693890); -INSERT INTO "public"."iam_role_path" VALUES (1844320923390922752, 1844320575938973696, 'dax-pay', 1844304458998693888); -INSERT INTO "public"."iam_role_path" VALUES (1844320923390922753, 1844320575938973696, 'dax-pay', 1844304458960945152); -INSERT INTO "public"."iam_role_path" VALUES (1844320923390922754, 1844320575938973696, 'dax-pay', 1844304459090968576); -INSERT INTO "public"."iam_role_path" VALUES (1844320923390922755, 1844320575938973696, 'dax-pay', 1844304458981916673); -INSERT INTO "public"."iam_role_path" VALUES (1844320923390922756, 1844320575938973696, 'dax-pay', 1844304459065802758); -INSERT INTO "public"."iam_role_path" VALUES (1844320923390922757, 1844320575938973696, 'dax-pay', 1844304458948362241); -INSERT INTO "public"."iam_role_path" VALUES (1844320923390922758, 1844320575938973696, 'dax-pay', 1844304458919002112); -INSERT INTO "public"."iam_role_path" VALUES (1844320923390922759, 1844320575938973696, 'dax-pay', 1844304459011276802); -INSERT INTO "public"."iam_role_path" VALUES (1844320923390922760, 1844320575938973696, 'dax-pay', 1844304458973528066); -INSERT INTO "public"."iam_role_path" VALUES (1844320923395117056, 1844320575938973696, 'dax-pay', 1844304458939973634); -INSERT INTO "public"."iam_role_path" VALUES (1844320923395117057, 1844320575938973696, 'dax-pay', 1844304459078385666); -INSERT INTO "public"."iam_role_path" VALUES (1844320923395117058, 1844320575938973696, 'dax-pay', 1844304459028054017); -INSERT INTO "public"."iam_role_path" VALUES (1844320923395117059, 1844320575938973696, 'dax-pay', 1844304459023859713); -INSERT INTO "public"."iam_role_path" VALUES (1844320923395117060, 1844320575938973696, 'dax-pay', 1844304459002888193); -INSERT INTO "public"."iam_role_path" VALUES (1844320923395117061, 1844320575938973696, 'dax-pay', 1844304458994499589); -INSERT INTO "public"."iam_role_path" VALUES (1844320923395117062, 1844320575938973696, 'dax-pay', 1844304458923196417); -INSERT INTO "public"."iam_role_path" VALUES (1844320923395117063, 1844320575938973696, 'dax-pay', 1844304458977722372); -INSERT INTO "public"."iam_role_path" VALUES (1844320923395117064, 1844320575938973696, 'dax-pay', 1844304458944167938); -- ---------------------------- -- Table structure for iam_user_expand_info @@ -1238,8 +642,6 @@ COMMENT ON TABLE "public"."iam_user_expand_info" IS '用户扩展信息'; -- Records of iam_user_expand_info -- ---------------------------- INSERT INTO "public"."iam_user_expand_info" VALUES (1811365615815487488, 0, '2024-07-11 19:43:11.023201', 0, '2024-07-11 19:43:11.023201', 0, 'f', NULL, NULL, NULL, NULL, '2024-07-11 19:43:11.021597', NULL, 'f', 'f', NULL); -INSERT INTO "public"."iam_user_expand_info" VALUES (1811689994080333824, 1811365615815487488, '2024-07-12 17:12:08.833139', 1811365615815487488, '2024-07-12 17:12:08.833139', 0, 'f', NULL, NULL, NULL, NULL, '2024-07-12 17:12:08.829981', NULL, 'f', 'f', NULL); -INSERT INTO "public"."iam_user_expand_info" VALUES (1811690440006152192, 1811365615815487488, '2024-07-12 17:13:55.143576', 1811365615815487488, '2024-07-12 17:13:55.143576', 0, 'f', NULL, NULL, NULL, NULL, '2024-07-12 17:13:55.143064', NULL, 'f', 'f', NULL); -- ---------------------------- -- Table structure for iam_user_info @@ -1281,9 +683,7 @@ COMMENT ON TABLE "public"."iam_user_info" IS '用户核心信息'; -- ---------------------------- -- Records of iam_user_info -- ---------------------------- -INSERT INTO "public"."iam_user_info" VALUES (1811365615815487488, 0, '2024-07-11 19:43:11.013754', 1811365615815487488, '2024-10-10 17:13:37.987245', 3, 'f', '超级管理员', 'bootx', '$2a$10$q.GlM9TmQ.tBEUnIJC7ubOlLUpK8nUsrnQCTf0AC6j9GDeXdQuOBC', '13333333333', 'bootx@bootx.cn', 't', 'normal'); -INSERT INTO "public"."iam_user_info" VALUES (1811690440006152192, 1811365615815487488, '2024-07-12 17:13:55.135004', 1811689994080333824, '2024-10-10 18:29:54.67657', 2, 'f', 'daxpay', 'daxpay', '$2a$10$QQg1dWcgK5XwojjmBsNYP.OLmoiVhKZfnZ275f/E52UWc83HuRsxi', '', '', 'f', 'normal'); -INSERT INTO "public"."iam_user_info" VALUES (1811689994080333824, 1811365615815487488, '2024-07-12 17:12:08.819164', 1811689994080333824, '2024-10-10 18:31:30.597042', 2, 'f', 'daxpay管理员', 'daxpayadmin', '$2a$10$oeO0ipXqgFlW6NqTEvCNlOMW16uWB8mbYTwtlNSphSOjTC29QTTtK', '', '', 'f', 'normal'); +INSERT INTO "public"."iam_user_info" VALUES (1811365615815487488, 0, '2024-07-11 19:43:11.013754', 0, '2024-07-11 19:43:32.925167', 1, 'f', '超级管理员', 'bootx', '$2a$10$knt/I7FYX9YpWYfjv4ChhuOhiYGf3/fCvrHxm51pis.OnNPBDvSeC', '13333333333', 'bootx@bootx.cn', 't', 'normal'); -- ---------------------------- -- Table structure for iam_user_role @@ -1303,8 +703,59 @@ COMMENT ON TABLE "public"."iam_user_role" IS '用户角色关联关系'; -- ---------------------------- -- Records of iam_user_role -- ---------------------------- -INSERT INTO "public"."iam_user_role" VALUES (1844305323314724864, 1811689994080333824, 1810203792869191680); -INSERT INTO "public"."iam_user_role" VALUES (1844324394932461568, 1811690440006152192, 1844320575938973696); + +-- ---------------------------- +-- Table structure for pay_alloc_detail +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_alloc_detail"; +CREATE TABLE "public"."pay_alloc_detail" ( + "id" int8 NOT NULL, + "allocation_id" int8 NOT NULL, + "receiver_id" int8 NOT NULL, + "receiver_no" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, + "rate" int4 NOT NULL, + "amount" int4 NOT NULL, + "receiver_type" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, + "receiver_account" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "receiver_name" varchar(100) COLLATE "pg_catalog"."default", + "result" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, + "error_code" varchar(10) COLLATE "pg_catalog"."default", + "error_msg" varchar(150) COLLATE "pg_catalog"."default", + "finish_time" timestamp(6), + "creator" int8, + "create_time" timestamp(6), + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL, + "deleted" bool NOT NULL, + "app_id" varchar(32) COLLATE "pg_catalog"."default" +) +; +COMMENT ON COLUMN "public"."pay_alloc_detail"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."allocation_id" IS '分账订单ID'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."receiver_id" IS '接收者ID'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."receiver_no" IS '分账接收方编号'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."rate" IS '分账比例(万分之多少)'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."amount" IS '分账金额'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."receiver_type" IS '分账接收方类型'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."receiver_account" IS '接收方账号'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."receiver_name" IS '接收方姓名'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."result" IS '分账结果'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."error_code" IS '错误代码'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."error_msg" IS '错误原因'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."finish_time" IS '分账完成时间'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."last_modifier" IS '最后修者ID'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."version" IS '乐观锁'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."deleted" IS '删除标志'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."app_id" IS '应用号'; +COMMENT ON TABLE "public"."pay_alloc_detail" IS '分账订单明细'; + +-- ---------------------------- +-- Records of pay_alloc_detail +-- ---------------------------- -- ---------------------------- -- Table structure for pay_alloc_group @@ -1346,7 +797,6 @@ COMMENT ON TABLE "public"."pay_alloc_group" IS '分账组'; -- ---------------------------- -- Records of pay_alloc_group -- ---------------------------- -INSERT INTO "public"."pay_alloc_group" VALUES (1843552721174097920, '123', '123', 'ali_pay', 't', 18.30, NULL, 1811365615815487488, '2024-10-08 15:23:14.938198', 1811365615815487488, '2024-10-08 16:13:52.239032', 11, 'f', 'M8207639754663343'); -- ---------------------------- -- Table structure for pay_alloc_group_receiver @@ -1401,8 +851,8 @@ CREATE TABLE "public"."pay_alloc_receiver" ( "last_modifier" int8, "last_modified_time" timestamp(6), "version" int4 NOT NULL, - "deleted" bool NOT NULL, - "app_id" varchar(32) COLLATE "pg_catalog"."default" + "app_id" varchar(32) COLLATE "pg_catalog"."default", + "deleted" bool NOT NULL ) ; COMMENT ON COLUMN "public"."pay_alloc_receiver"."id" IS '主键'; @@ -1418,14 +868,83 @@ COMMENT ON COLUMN "public"."pay_alloc_receiver"."create_time" IS '创建时间'; COMMENT ON COLUMN "public"."pay_alloc_receiver"."last_modifier" IS '最后修改ID'; COMMENT ON COLUMN "public"."pay_alloc_receiver"."last_modified_time" IS '最后修改时间'; COMMENT ON COLUMN "public"."pay_alloc_receiver"."version" IS '版本号'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."deleted" IS '删除标志'; COMMENT ON COLUMN "public"."pay_alloc_receiver"."app_id" IS '应用号'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."deleted" IS '删除标志'; COMMENT ON TABLE "public"."pay_alloc_receiver" IS '分账接收方'; -- ---------------------------- -- Records of pay_alloc_receiver -- ---------------------------- +-- ---------------------------- +-- Table structure for pay_alloc_transaction +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_alloc_transaction"; +CREATE TABLE "public"."pay_alloc_transaction" ( + "id" int8 NOT NULL, + "alloc_no" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "biz_alloc_no" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "out_alloc_no" varchar(150) COLLATE "pg_catalog"."default", + "order_id" int8 NOT NULL, + "order_no" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "biz_order_no" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "out_order_no" varchar(150) COLLATE "pg_catalog"."default" NOT NULL, + "title" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "channel" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, + "amount" int4 NOT NULL, + "description" varchar(150) COLLATE "pg_catalog"."default", + "status" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, + "result" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, + "finish_time" timestamp(6), + "notify_url" varchar(200) COLLATE "pg_catalog"."default", + "attach" varchar(500) COLLATE "pg_catalog"."default", + "req_time" timestamp(6), + "client_ip" varchar(64) COLLATE "pg_catalog"."default", + "error_code" varchar(10) COLLATE "pg_catalog"."default", + "error_msg" varchar(2048) COLLATE "pg_catalog"."default", + "creator" int8, + "create_time" timestamp(6), + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL, + "deleted" bool NOT NULL, + "app_id" varchar(32) COLLATE "pg_catalog"."default" +) +; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."alloc_no" IS '分账单号'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."biz_alloc_no" IS '商户分账单号'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."out_alloc_no" IS '通道分账号'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."order_id" IS '支付订单ID'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."order_no" IS '支付订单号'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."biz_order_no" IS '商户支付订单号'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."out_order_no" IS '通道支付订单号'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."title" IS '支付标题'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."channel" IS '所属通道'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."amount" IS '总分账金额'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."description" IS '分账描述'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."status" IS '状态'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."result" IS '处理结果'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."finish_time" IS '分账完成时间'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."notify_url" IS '异步通知地址'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."attach" IS '商户扩展参数'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."req_time" IS '请求时间,传输时间戳'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."client_ip" IS '支付终端ip'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."error_code" IS '错误码'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."error_msg" IS '错误信息'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."last_modifier" IS '最后修者ID'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."version" IS '乐观锁'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."deleted" IS '删除标志'; +COMMENT ON COLUMN "public"."pay_alloc_transaction"."app_id" IS '应用号'; +COMMENT ON TABLE "public"."pay_alloc_transaction" IS '分账订单'; + +-- ---------------------------- +-- Records of pay_alloc_transaction +-- ---------------------------- + -- ---------------------------- -- Table structure for pay_api_const -- ---------------------------- @@ -1452,46 +971,83 @@ COMMENT ON TABLE "public"."pay_api_const" IS '支付接口常量'; -- ---------------------------- -- ---------------------------- --- Table structure for pay_channel_cashier_config +-- Table structure for pay_cashier_code_config -- ---------------------------- -DROP TABLE IF EXISTS "public"."pay_channel_cashier_config"; -CREATE TABLE "public"."pay_channel_cashier_config" ( +DROP TABLE IF EXISTS "public"."pay_cashier_code_config"; +CREATE TABLE "public"."pay_cashier_code_config" ( "id" int8 NOT NULL, "creator" int8, "create_time" timestamp(6), "last_modifier" int8, "last_modified_time" timestamp(6), "version" int4 NOT NULL, - "deleted" bool NOT NULL, "app_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, - "cashier_type" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, - "cashier_name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, - "channel" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, - "pay_method" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, - "allocation" bool NOT NULL, - "auto_allocation" bool NOT NULL, - "remark" varchar(300) COLLATE "pg_catalog"."default" + "name" varchar(50) COLLATE "pg_catalog"."default", + "code" varchar(32) COLLATE "pg_catalog"."default", + "template_code" varchar(32) COLLATE "pg_catalog"."default", + "remark" varchar(200) COLLATE "pg_catalog"."default", + "enable" bool NOT NULL, + "deleted" bool NOT NULL ) ; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."id" IS '主键'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."creator" IS '创建者ID'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."create_time" IS '创建时间'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."last_modifier" IS '最后修改ID'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."last_modified_time" IS '最后修改时间'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."version" IS '版本号'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."deleted" IS '删除标志'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."app_id" IS '应用号'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."cashier_type" IS '收银台类型'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."cashier_name" IS '收银台名称'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."channel" IS '支付通道'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."pay_method" IS '支付方式'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."allocation" IS '是否开启分账'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."auto_allocation" IS '自动分账'; -COMMENT ON COLUMN "public"."pay_channel_cashier_config"."remark" IS '备注'; -COMMENT ON TABLE "public"."pay_channel_cashier_config" IS '通道收银台配置'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."last_modifier" IS '最后修改ID'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."version" IS '版本号'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."app_id" IS '应用号'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."name" IS '码牌名称'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."code" IS '码牌code'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."template_code" IS '模板编号'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."remark" IS '备注'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."enable" IS '是否启用'; +COMMENT ON COLUMN "public"."pay_cashier_code_config"."deleted" IS '删除标志'; +COMMENT ON TABLE "public"."pay_cashier_code_config" IS '收银码牌配置'; -- ---------------------------- --- Records of pay_channel_cashier_config +-- Records of pay_cashier_code_config +-- ---------------------------- + +-- ---------------------------- +-- Table structure for pay_cashier_code_type_config +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_cashier_code_type_config"; +CREATE TABLE "public"."pay_cashier_code_type_config" ( + "id" int8 NOT NULL, + "creator" int8, + "create_time" timestamp(6), + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL, + "app_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "cashier_code_id" int8 NOT NULL, + "type" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "channel" varchar(32) COLLATE "pg_catalog"."default", + "pay_method" varchar(32) COLLATE "pg_catalog"."default", + "allocation" bool NOT NULL, + "auto_allocation" bool NOT NULL, + "deleted" bool NOT NULL +) +; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."last_modifier" IS '最后修改ID'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."version" IS '版本号'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."app_id" IS '应用号'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."cashier_code_id" IS '码牌ID'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."type" IS '收银台类型'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."channel" IS '支付通道'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."pay_method" IS '支付方式'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."allocation" IS '是否开启分账'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."auto_allocation" IS '自动分账'; +COMMENT ON COLUMN "public"."pay_cashier_code_type_config"."deleted" IS '删除标志'; +COMMENT ON TABLE "public"."pay_cashier_code_type_config" IS '各类型码牌配置'; + +-- ---------------------------- +-- Records of pay_cashier_code_type_config -- ---------------------------- -- ---------------------------- @@ -1542,7 +1098,8 @@ CREATE TABLE "public"."pay_channel_const" ( "code" varchar(255) COLLATE "pg_catalog"."default", "name" varchar(255) COLLATE "pg_catalog"."default", "enable" bool, - "remark" varchar(255) COLLATE "pg_catalog"."default" + "remark" varchar(255) COLLATE "pg_catalog"."default", + "allocatable" bool ) ; COMMENT ON COLUMN "public"."pay_channel_const"."id" IS '主键'; @@ -1550,14 +1107,15 @@ COMMENT ON COLUMN "public"."pay_channel_const"."code" IS '通道编码'; COMMENT ON COLUMN "public"."pay_channel_const"."name" IS '通道名称'; COMMENT ON COLUMN "public"."pay_channel_const"."enable" IS '是否启用'; COMMENT ON COLUMN "public"."pay_channel_const"."remark" IS '备注'; +COMMENT ON COLUMN "public"."pay_channel_const"."allocatable" IS '是否支持分账'; COMMENT ON TABLE "public"."pay_channel_const" IS '支付通道常量'; -- ---------------------------- -- Records of pay_channel_const -- ---------------------------- -INSERT INTO "public"."pay_channel_const" VALUES (30000, 'union_pay', '云闪付', 't', NULL); -INSERT INTO "public"."pay_channel_const" VALUES (10000, 'ali_pay', '支付宝(直连商户)', 't', NULL); -INSERT INTO "public"."pay_channel_const" VALUES (20000, 'wechat_pay', '微信支付(直连商户)', 't', NULL); +INSERT INTO "public"."pay_channel_const" VALUES (30000, 'union_pay', '云闪付', 't', NULL, 't'); +INSERT INTO "public"."pay_channel_const" VALUES (10000, 'ali_pay', '支付宝(直连商户)', 't', NULL, 't'); +INSERT INTO "public"."pay_channel_const" VALUES (20000, 'wechat_pay', '微信支付(直连商户)', 't', NULL, 't'); -- ---------------------------- -- Table structure for pay_channel_reconcile_trade @@ -1594,6 +1152,158 @@ COMMENT ON TABLE "public"."pay_channel_reconcile_trade" IS '通道对账交易 -- Records of pay_channel_reconcile_trade -- ---------------------------- +-- ---------------------------- +-- Table structure for pay_checkout_aggregate_config +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_checkout_aggregate_config"; +CREATE TABLE "public"."pay_checkout_aggregate_config" ( + "id" int8 NOT NULL, + "creator" int8, + "create_time" timestamp(6), + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL, + "deleted" bool NOT NULL, + "app_id" varchar(32) COLLATE "pg_catalog"."default", + "type" varchar(32) COLLATE "pg_catalog"."default", + "channel" varchar(32) COLLATE "pg_catalog"."default", + "pay_method" varchar(32) COLLATE "pg_catalog"."default", + "auto_launch" bool +) +; +COMMENT ON COLUMN "public"."pay_checkout_aggregate_config"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_checkout_aggregate_config"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_checkout_aggregate_config"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_checkout_aggregate_config"."last_modifier" IS '最后修者ID'; +COMMENT ON COLUMN "public"."pay_checkout_aggregate_config"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_checkout_aggregate_config"."version" IS '乐观锁'; +COMMENT ON COLUMN "public"."pay_checkout_aggregate_config"."deleted" IS '删除标志'; +COMMENT ON COLUMN "public"."pay_checkout_aggregate_config"."app_id" IS '应用号'; +COMMENT ON COLUMN "public"."pay_checkout_aggregate_config"."type" IS '聚合支付类型'; +COMMENT ON COLUMN "public"."pay_checkout_aggregate_config"."channel" IS '通道'; +COMMENT ON COLUMN "public"."pay_checkout_aggregate_config"."pay_method" IS '支付方式'; +COMMENT ON COLUMN "public"."pay_checkout_aggregate_config"."auto_launch" IS '自动拉起支付'; +COMMENT ON TABLE "public"."pay_checkout_aggregate_config" IS '收银台聚合支付配置'; + +-- ---------------------------- +-- Records of pay_checkout_aggregate_config +-- ---------------------------- + +-- ---------------------------- +-- Table structure for pay_checkout_config +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_checkout_config"; +CREATE TABLE "public"."pay_checkout_config" ( + "id" int8 NOT NULL, + "creator" int8, + "create_time" timestamp(6), + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL, + "deleted" bool NOT NULL, + "app_id" varchar(32) COLLATE "pg_catalog"."default", + "name" varchar(55) COLLATE "pg_catalog"."default", + "aggregate_show" bool, + "h5_auto_upgrade" bool +) +; +COMMENT ON COLUMN "public"."pay_checkout_config"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_checkout_config"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_checkout_config"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_checkout_config"."last_modifier" IS '最后修者ID'; +COMMENT ON COLUMN "public"."pay_checkout_config"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_checkout_config"."version" IS '乐观锁'; +COMMENT ON COLUMN "public"."pay_checkout_config"."deleted" IS '删除标志'; +COMMENT ON COLUMN "public"."pay_checkout_config"."app_id" IS '应用号'; +COMMENT ON COLUMN "public"."pay_checkout_config"."name" IS '收银台名称'; +COMMENT ON COLUMN "public"."pay_checkout_config"."aggregate_show" IS 'PC收银台是否同时显示聚合收银码'; +COMMENT ON COLUMN "public"."pay_checkout_config"."h5_auto_upgrade" IS 'h5收银台自动升级聚合支付'; +COMMENT ON TABLE "public"."pay_checkout_config" IS '收银台配置'; + +-- ---------------------------- +-- Records of pay_checkout_config +-- ---------------------------- + +-- ---------------------------- +-- Table structure for pay_checkout_group_config +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_checkout_group_config"; +CREATE TABLE "public"."pay_checkout_group_config" ( + "id" int8 NOT NULL, + "creator" int8, + "create_time" timestamp(6), + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL, + "deleted" varchar(1) COLLATE "pg_catalog"."default" NOT NULL, + "app_id" varchar(32) COLLATE "pg_catalog"."default", + "type" varchar(32) COLLATE "pg_catalog"."default", + "name" varchar(50) COLLATE "pg_catalog"."default", + "icon" varchar(100) COLLATE "pg_catalog"."default", + "sort_no" numeric(10,2) +) +; +COMMENT ON COLUMN "public"."pay_checkout_group_config"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_checkout_group_config"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_checkout_group_config"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_checkout_group_config"."last_modifier" IS '最后修者ID'; +COMMENT ON COLUMN "public"."pay_checkout_group_config"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_checkout_group_config"."version" IS '乐观锁'; +COMMENT ON COLUMN "public"."pay_checkout_group_config"."deleted" IS '删除标志'; +COMMENT ON COLUMN "public"."pay_checkout_group_config"."app_id" IS '应用号'; +COMMENT ON COLUMN "public"."pay_checkout_group_config"."type" IS '类型'; +COMMENT ON COLUMN "public"."pay_checkout_group_config"."name" IS '名称'; +COMMENT ON COLUMN "public"."pay_checkout_group_config"."icon" IS '图标'; +COMMENT ON COLUMN "public"."pay_checkout_group_config"."sort_no" IS '排序'; +COMMENT ON TABLE "public"."pay_checkout_group_config" IS '收银台类目配置'; + +-- ---------------------------- +-- Records of pay_checkout_group_config +-- ---------------------------- + +-- ---------------------------- +-- Table structure for pay_checkout_item_config +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_checkout_item_config"; +CREATE TABLE "public"."pay_checkout_item_config" ( + "id" int8 NOT NULL, + "creator" int8, + "create_time" timestamp(6), + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL, + "deleted" bool NOT NULL, + "app_id" varchar(32) COLLATE "pg_catalog"."default", + "group_id" int8, + "channel" varchar(32) COLLATE "pg_catalog"."default", + "pay_method" varchar(32) COLLATE "pg_catalog"."default", + "name" varchar(50) COLLATE "pg_catalog"."default", + "icon" varchar(100) COLLATE "pg_catalog"."default", + "sort_no" numeric(10,2), + "call_type" varchar(32) COLLATE "pg_catalog"."default" +) +; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."last_modifier" IS '最后修者ID'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."version" IS '乐观锁'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."deleted" IS '删除标志'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."app_id" IS '应用号'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."group_id" IS '分组配置ID'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."channel" IS '通道'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."pay_method" IS '支付方式'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."name" IS '名称'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."icon" IS '图标'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."sort_no" IS '排序'; +COMMENT ON COLUMN "public"."pay_checkout_item_config"."call_type" IS '调用方式'; +COMMENT ON TABLE "public"."pay_checkout_item_config" IS '收银台配置项'; + +-- ---------------------------- +-- Records of pay_checkout_item_config +-- ---------------------------- + -- ---------------------------- -- Table structure for pay_close_record -- ---------------------------- @@ -1921,13 +1631,13 @@ COMMENT ON TABLE "public"."pay_method_const" IS '支付方式常量'; -- ---------------------------- -- Records of pay_method_const -- ---------------------------- -INSERT INTO "public"."pay_method_const" VALUES (10000, 'normal', '常规支付', 't', NULL); INSERT INTO "public"."pay_method_const" VALUES (20000, 'wap', 'wap支付', 't', NULL); INSERT INTO "public"."pay_method_const" VALUES (30000, 'app', '应用支付', 't', NULL); INSERT INTO "public"."pay_method_const" VALUES (40000, 'web', 'web支付', 't', NULL); INSERT INTO "public"."pay_method_const" VALUES (50000, 'qrcode', '扫码支付', 't', NULL); INSERT INTO "public"."pay_method_const" VALUES (60000, 'barcode', '付款码', 't', NULL); -INSERT INTO "public"."pay_method_const" VALUES (70000, 'jsapi', '小程序支付', 't', NULL); +INSERT INTO "public"."pay_method_const" VALUES (70000, 'jsapi', 'JSAPI', 't', NULL); +INSERT INTO "public"."pay_method_const" VALUES (10000, 'normal', '常规支付', 'f', NULL); -- ---------------------------- -- Table structure for pay_order @@ -2040,7 +1750,7 @@ COMMENT ON TABLE "public"."pay_platform_config" IS '管理平台配置'; -- ---------------------------- -- Records of pay_platform_config -- ---------------------------- -INSERT INTO "public"."pay_platform_config" VALUES (1, 1, '2024-09-20 10:54:44', 1811365615815487488, '2024-10-08 17:24:12.679758', 13, 'f', 'https://127.0.0.1', 'https://127.0.0.1', 'https://127.0.0.1'); +INSERT INTO "public"."pay_platform_config" VALUES (1, 1, '2024-09-20 10:54:44', 1811365615815487488, '2024-10-08 17:24:12.679758', 13, 'f', 'https://pay.daxpay.com', 'https://pay.daxpay.com/h5', 'http://pay.daxpay.com'); -- ---------------------------- -- Table structure for pay_reconcile_discrepancy @@ -2455,13 +2165,6 @@ COMMENT ON TABLE "public"."starter_audit_login_log" IS '登录日志'; -- ---------------------------- -- Records of starter_audit_login_log -- ---------------------------- -INSERT INTO "public"."starter_audit_login_log" VALUES (1844305540139270144, 1811689994080333824, 'daxpayadmin', 't', 'dax-pay', 'password', '0:0:0:0:0:0:0:1', '未知', 'MSEdge 129.0.0.0', 'Windows 10 or Windows Server 2016', NULL, '2024-10-10 17:14:40.96512'); -INSERT INTO "public"."starter_audit_login_log" VALUES (1844319677221253120, 1811365615815487488, 'bootx', 't', 'dax-pay', 'password', '0:0:0:0:0:0:0:1', '未知', 'MSEdge 129.0.0.0', 'Windows 10 or Windows Server 2016', NULL, '2024-10-10 18:10:51.506417'); -INSERT INTO "public"."starter_audit_login_log" VALUES (1844319978389065728, NULL, '未知', 'f', 'dax-pay', 'password', '0:0:0:0:0:0:0:1', '未知', 'MSEdge 129.0.0.0', 'Windows 10 or Windows Server 2016', '未开启超级管理员权限', '2024-10-10 18:12:03.302468'); -INSERT INTO "public"."starter_audit_login_log" VALUES (1844319995774455808, NULL, '未知', 'f', 'dax-pay', 'password', '0:0:0:0:0:0:0:1', '未知', 'MSEdge 129.0.0.0', 'Windows 10 or Windows Server 2016', '未开启超级管理员权限', '2024-10-10 18:12:07.457692'); -INSERT INTO "public"."starter_audit_login_log" VALUES (1844320113818947584, 1811689994080333824, 'daxpayadmin', 't', 'dax-pay', 'password', '0:0:0:0:0:0:0:1', '未知', 'MSEdge 129.0.0.0', 'Windows 10 or Windows Server 2016', NULL, '2024-10-10 18:12:35.60174'); -INSERT INTO "public"."starter_audit_login_log" VALUES (1844324531951984640, 1811690440006152192, 'daxpay', 't', 'dax-pay', 'password', '0:0:0:0:0:0:0:1', '未知', 'MSEdge 129.0.0.0', 'Windows 10 or Windows Server 2016', NULL, '2024-10-10 18:30:08.965914'); -INSERT INTO "public"."starter_audit_login_log" VALUES (1844325067979841536, 1811689994080333824, 'daxpayadmin', 't', 'dax-pay', 'password', '0:0:0:0:0:0:0:1', '未知', 'MSEdge 129.0.0.0', 'Windows 10 or Windows Server 2016', NULL, '2024-10-10 18:32:16.765654'); -- ---------------------------- -- Table structure for starter_audit_operate_log @@ -2538,8 +2241,8 @@ COMMENT ON TABLE "public"."starter_file_platform" IS '文件存储平台'; -- ---------------------------- -- Records of starter_file_platform -- ---------------------------- +INSERT INTO "public"."starter_file_platform" VALUES (1000, 'local', '本地存储', 'http://127.0.0.1:9999', 'f', 1811365615815487488, '2024-08-13 12:32:37', 1811365615815487488, '2024-10-06 17:17:39.422003', 0); INSERT INTO "public"."starter_file_platform" VALUES (2000, 'minio', 'minio存储', 'http://127.0.0.1:9002/daxpay', 't', 1811365615815487488, '2024-08-13 12:32:40', 1811365615815487488, '2024-10-06 17:17:39.428101', 3); -INSERT INTO "public"."starter_file_platform" VALUES (1000, 'local', '本地存储', 'http://127.0.0.1:8899', 'f', 1811365615815487488, '2024-08-13 12:32:37', 1811365615815487488, '2024-10-10 15:08:55.098487', 1); -- ---------------------------- -- Table structure for starter_file_upload_info @@ -2601,6 +2304,138 @@ COMMENT ON TABLE "public"."starter_file_upload_info" IS '文件记录表'; -- ---------------------------- -- Records of starter_file_upload_info -- ---------------------------- +INSERT INTO "public"."starter_file_upload_info" VALUES (1821097013954715648, '/file/66b32c610d41ab408c70e774.png', 216374, '66b32c610d41ab408c70e774.png', '微信截图_20240514205633.png', '/file/', '', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-07 08:12:17.079'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822969544408014848, 'file/66b9fc4fa1fa0bba28d38189.png', 321611, '66b9fc4fa1fa0bba28d38189.png', '微信截图_20240514202144.png', 'file/', '', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:13:03.035'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822969908121280512, 'file/aaa/66b9fca5a1fa0bba28d3818a.png', 321611, '66b9fca5a1fa0bba28d3818a.png', '微信截图_20240514202144.png', 'file/', 'aaa/', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:14:29.892'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822971444570333184, 'file/2024/08/1266b9fe14a1fa0bba28d3818b.png', 321611, '66b9fe14a1fa0bba28d3818b.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:36.211'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822971456683483136, 'file/2024/08/1266b9fe17a1fa0bba28d3818c.png', 321611, '66b9fe17a1fa0bba28d3818c.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:39.098'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822971459174899712, 'file/2024/08/1266b9fe17a1fa0bba28d3818d.png', 321611, '66b9fe17a1fa0bba28d3818d.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:39.693'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822971462438068224, 'file/2024/08/1266b9fe18a1fa0bba28d3818e.png', 321611, '66b9fe18a1fa0bba28d3818e.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:40.471'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822971464799461376, 'file/2024/08/1266b9fe19a1fa0bba28d3818f.png', 321611, '66b9fe19a1fa0bba28d3818f.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:41.034'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822971465835454464, 'file/2024/08/1266b9fe19a1fa0bba28d38190.png', 321611, '66b9fe19a1fa0bba28d38190.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:41.28'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822971466686898176, 'file/2024/08/1266b9fe19a1fa0bba28d38191.png', 321611, '66b9fe19a1fa0bba28d38191.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:41.484'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822971467467038720, 'file/2024/08/1266b9fe19a1fa0bba28d38192.png', 321611, '66b9fe19a1fa0bba28d38192.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:41.671'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822971667761831936, 'file/2024/08/1266b9fe49a1fa0bba28d38193.png', 321611, '66b9fe49a1fa0bba28d38193.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:21:29.424'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822971796644405248, 'file/2024/08/1266b9fe68a1fa0bba28d38194.png', 321611, '66b9fe68a1fa0bba28d38194.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:22:00.149'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1822976328996659200, '/file/2024/08/1266ba02a0a1faf26c0c033991.png', 216374, '66ba02a0a1faf26c0c033991.png', '微信截图_20240514205633.png', '/file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:40:00.707'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1823203227169546240, '/file//2024/08/13/66bad5f061236ef74fc35d2f.png', 822076, '66bad5f061236ef74fc35d2f.png', '微信截图_20240514202014.png', '/file/', '/2024/08/13/', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-13 03:41:36.828'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1823204644156456960, '/file/2024/08/13/66bad7426123c55acd645891.png', 209410, '66bad7426123c55acd645891.png', 'QQ图片20240531181517.png', '/file/', '2024/08/13/', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-13 03:47:14.767'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1823210440613294080, '/file/2024/08/13/66badca8612381f3dab8b659.sql', 484222, '66badca8612381f3dab8b659.sql', 'dax-pay.sql', '/file/', '2024/08/13/', 'sql', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-13 04:10:16.775'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1824779093602971648, '/file/2024/08/17/66c09194fb5fa7f335dbd1e7.jpg', 107464, '66c09194fb5fa7f335dbd1e7.jpg', '微信图片_20220522132928.jpg', '/file/', '2024/08/17/', 'jpg', 'image/jpeg', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-17 12:03:32.838'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825718211879563264, '/file/66c3fc341f35f424dba37510.csv', 775, '66c3fc341f35f424dba37510.csv', '交易对账单-支付宝-20240818.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 02:15:16.078'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825718295480430592, '/file/66c3fc481f35f424dba37511.csv', 775, '66c3fc481f35f424dba37511.csv', '交易对账单-支付宝-20240818.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 02:15:36.48'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825720111223992320, '/file/66c3fdf91f35f424dba37512.csv', 775, '66c3fdf91f35f424dba37512.csv', '交易对账单-支付宝-20240818.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 02:22:49.392'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825753217356218368, '/file/2024/08/20/66c41cce1f352f391eadba3e.xlsx', 9614, '66c41cce1f352f391eadba3e.xlsx', '消息订阅.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 04:34:22.055'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825753283894657024, '/file/2024/08/20/66c41cde1f352f391eadba3f.xlsx', 9614, '66c41cde1f352f391eadba3f.xlsx', '消息订阅.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 04:34:38.355'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825793692494667776, '/file/2024/08/20/66c442801f35438ca96741b3.xlsx', 9627, '66c442801f35438ca96741b3.xlsx', '消息订阅.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 07:15:12.039'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825795353548103680, '/file/2024/08/20/66c4440c1f35438ca96741b4.png', 56704, '66c4440c1f35438ca96741b4.png', 'DD94AFCB-E1EA-403a-A5BB-606CF977034C.png', '/file/', '2024/08/20/', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 07:21:48.536'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825795565142351872, '/file/2024/08/20/66c4443e1f35438ca96741b5.png', 56704, '66c4443e1f35438ca96741b5.png', 'DD94AFCB-E1EA-403a-A5BB-606CF977034C.png', '/file/', '2024/08/20/', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 07:22:38.992'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825795861373460480, '/file/2024/08/20/66c444851f35438ca96741b6.png', 56704, '66c444851f35438ca96741b6.png', 'DD94AFCB-E1EA-403a-A5BB-606CF977034C.png', '/file/', '2024/08/20/', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 07:23:49.53'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825796076641959936, '/file/2024/08/20/66c444b21f35453b8057d0fb.png', 56704, '66c444b21f35453b8057d0fb.png', 'DD94AFCB-E1EA-403a-A5BB-606CF977034C.png', '/file/', '2024/08/20/', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 07:24:18.784'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825799359162990592, '/file/2024/08/20/66c447c71f35453b8057d0fc.xlsx', 9614, '66c447c71f35453b8057d0fc.xlsx', '消息订阅.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 15:37:43.593469'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825799570165841920, '/file/66c447f91f35453b8057d0fd.csv', 775, '66c447f91f35453b8057d0fd.csv', '交易对账单-支付宝-20240816.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 15:38:33.899827'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825799577078054912, '/file/2024/08/20/66c447fb1f35453b8057d0fe.xlsx', 9614, '66c447fb1f35453b8057d0fe.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 15:38:35.546999'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825799590139117568, '/file/66c447fe1f35453b8057d0ff.csv', 1189, '66c447fe1f35453b8057d0ff.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 15:38:38.662392'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825799613258121216, '/file/2024/08/20/66c448041f35453b8057d100.xlsx', 9614, '66c448041f35453b8057d100.xlsx', '消息订阅.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 15:38:44.173717'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825808183974379520, '/file/2024/08/20/66c44ffc1f35fa1c978ea54c.xlsx', 9613, '66c44ffc1f35fa1c978ea54c.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 16:12:47.587103'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825808183991156736, '/file/2024/08/20/66c44ffc1f35fa1c978ea54d.xlsx', 9612, '66c44ffc1f35fa1c978ea54d.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 16:12:47.588101'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825808257634746368, '/file/2024/08/20/66c450111f35fa1c978ea54e.xlsx', 9613, '66c450111f35fa1c978ea54e.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 16:13:05.154672'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826528037253439488, '/file/66c6ee69c76387d97684a0d3.csv', 4873, '66c6ee69c76387d97684a0d3.csv', '交易对账单-微信-20240821.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 15:53:13.985807'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825808277838708736, '/file/2024/08/20/66c450151f35fa1c978ea54f.xlsx', 9613, '66c450151f35fa1c978ea54f.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 16:13:09.971531'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825813275939119104, '/file/66c454bd1f35808c73fcb4f9.csv', 775, '66c454bd1f35808c73fcb4f9.csv', '交易对账单-支付宝-20240816.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 16:33:01.603346'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825816007903223808, '/file/66c457481f35808c73fcb4fa.csv', 1189, '66c457481f35808c73fcb4fa.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 16:43:52.960613'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825820562539880448, '/file/66c45b861f35808c73fcb4fb.csv', 1189, '66c45b861f35808c73fcb4fb.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:01:58.872311'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825820967122440192, '/file/66c45be61f3570ed83b5deda.csv', 1189, '66c45be61f3570ed83b5deda.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:03:35.323328'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825821293732888576, '/file/66c45c341f35156de355269c.csv', 1189, '66c45c341f35156de355269c.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:04:53.19356'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825821723045068800, '/file/66c45c9b1f35156de355269d.csv', 1189, '66c45c9b1f35156de355269d.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:06:35.557476'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825821752279367680, '/file/2024/08/20/66c45ca21f35156de355269e.xlsx', 9786, '66c45ca21f35156de355269e.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:06:42.527505'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825830633537777664, '/file/2024/08/20/66c464e71f35b610eeff97b1.xlsx', 9795, '66c464e71f35b610eeff97b1.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:41:59.981496'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825831496863911936, '/file/66c465b51f3576080962d6c3.csv', 1189, '66c465b51f3576080962d6c3.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:45:25.809379'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825834316396695552, '/file/2024/08/20/66c468551f3576080962d6c4.xlsx', 9796, '66c468551f3576080962d6c4.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:56:38.046761'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825834800268382208, '/file/2024/08/20/66c468c91f3576080962d6c5.xlsx', 9796, '66c468c91f3576080962d6c5.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:58:33.411027'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825835210064465920, '/file/2024/08/20/66c4692a1f3576080962d6c6.xlsx', 9795, '66c4692a1f3576080962d6c6.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:00:11.113848'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825843546990252032, '/file/66c470ee1f3576080962d6c7.csv', 1189, '66c470ee1f3576080962d6c7.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:33:18.791522'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825844129692323840, '/file/2024/08/20/66c471791f3576080962d6c8.xlsx', 9811, '66c471791f3576080962d6c8.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:35:37.719031'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825844629024182272, '/file/66c471f01f35aed981cc6a59.csv', 1189, '66c471f01f35aed981cc6a59.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:37:36.758077'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825844842937880576, '/file/2024/08/20/66c472231f35aed981cc6a5a.xlsx', 9819, '66c472231f35aed981cc6a5a.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:38:27.770051'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825847210479955968, '/file/66c474571f357b60c1a2b78a.csv', 1189, '66c474571f357b60c1a2b78a.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:47:52.223284'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1825847359704903680, '/file/2024/08/20/66c4747b1f357b60c1a2b78b.xlsx', 9840, '66c4747b1f357b60c1a2b78b.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:48:27.813444'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826097618230136832, '/file/66c55d8d0d41b292dd16e301.csv', 1189, '66c55d8d0d41b292dd16e301.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 11:22:54.093713'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826097630125182976, '/file/2024/08/21/66c55d900d41b292dd16e302.xlsx', 9823, '66c55d900d41b292dd16e302.xlsx', '测试对账.xlsx', '/file/', '2024/08/21/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 11:22:56.932144'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826104071162494976, '/file/66c563900d413c77079c09f3.csv', 1189, '66c563900d413c77079c09f3.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 11:48:32.583252'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826104244588576768, '/file/2024/08/21/66c563b90d413c77079c09f4.xlsx', 9823, '66c563b90d413c77079c09f4.xlsx', '外部交易明细.xlsx', '/file/', '2024/08/21/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 11:49:13.942925'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826108050550398976, '/file/66c567440d41d39e503adbf7.csv', 1189, '66c567440d41d39e503adbf7.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 12:04:21.352012'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826108060998410240, '/file/2024/08/21/66c567470d41d39e503adbf8.xlsx', 9823, '66c567470d41d39e503adbf8.xlsx', '外部交易明细.xlsx', '/file/', '2024/08/21/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 12:04:23.846222'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826144377513820160, '/file/66c589190d41534805a9a0c5.csv', 1189, '66c589190d41534805a9a0c5.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 14:28:42.375373'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826144389043961856, '/file/2024/08/21/66c5891d0d41534805a9a0c6.xlsx', 9819, '66c5891d0d41534805a9a0c6.xlsx', '测试对账.xlsx', '/file/', '2024/08/21/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 14:28:45.126552'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826454887404781568, '/file/66c6aa49c763a99769caae79.xlsx', 2564, '66c6aa49c763a99769caae79.xlsx', '交易对账单-微信-20240820.xlsx', '/file/', '', 'xlsx', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:02:33.686962'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826454907948482560, '/file/2024/08/22/66c6aa4ec763a99769caae7a.xlsx', 9620, '66c6aa4ec763a99769caae7a.xlsx', '测试对账.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:02:38.603264'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826455432215511040, '/file/66c6aacbc763a99769caae7b.xlsx', 2564, '66c6aacbc763a99769caae7b.xlsx', '交易对账单-微信-20240820.xlsx', '/file/', '', 'xlsx', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:04:43.594394'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826455601317265408, '/file/66c6aaf3c763a99769caae7c.xlsx', 4873, '66c6aaf3c763a99769caae7c.xlsx', '交易对账单-微信-20240821.xlsx', '/file/', '', 'xlsx', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:05:23.911901'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826455623035371520, '/file/2024/08/22/66c6aaf8c763a99769caae7d.xlsx', 9619, '66c6aaf8c763a99769caae7d.xlsx', '测试对账.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:05:29.093238'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826455963705131008, '/file/66c6ab4ac763a99769caae7e.xlsx', 2564, '66c6ab4ac763a99769caae7e.xlsx', '交易对账单-微信-20240820.xlsx', '/file/', '', 'xlsx', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:06:50.312192'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826456479956758528, '/file/66c6abc4c7633375f8725b9b.xlsx', 4873, '66c6abc4c7633375f8725b9b.xlsx', '交易对账单-微信-20240821.xlsx', '/file/', '', 'xlsx', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:08:53.391935'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826456537934622720, '/file/2024/08/22/66c6abd3c7633375f8725b9c.xlsx', 10486, '66c6abd3c7633375f8725b9c.xlsx', '测试对账.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:09:07.222795'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826528050088009728, '/file/2024/08/22/66c6ee6dc76387d97684a0d4.xlsx', 10587, '66c6ee6dc76387d97684a0d4.xlsx', '订阅消息.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 15:53:17.048532'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826532233684037632, '/file/66c6f252c76353f70eacf1de.csv', 4873, '66c6f252c76353f70eacf1de.csv', '交易对账单-微信-20240821.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 16:09:54.492768'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826532244555673600, '/file/2024/08/22/66c6f254c76353f70eacf1df.xlsx', 10587, '66c6f254c76353f70eacf1df.xlsx', '外部交易明细.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 16:09:57.086142'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826534025192910848, '/file/66c6f3fdc76353f70eacf1e0.csv', 4873, '66c6f3fdc76353f70eacf1e0.csv', '交易对账单-微信-20240821.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 16:17:01.624309'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826534549581574144, '/file/66c6f47ac76353f70eacf1e1.csv', 4873, '66c6f47ac76353f70eacf1e1.csv', '交易对账单-微信-20240821.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 16:19:06.648517'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826535790386720768, '/file/66c6f5a2c76353f70eacf1e2.csv', 4873, '66c6f5a2c76353f70eacf1e2.csv', '交易对账单-微信-20240821.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 16:24:02.478931'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826535798624333824, '/file/2024/08/22/66c6f5a4c76353f70eacf1e3.xlsx', 10599, '66c6f5a4c76353f70eacf1e3.xlsx', '测试对账.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 16:24:04.442922'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826547489412079616, '/file/66c70087c763e807cbf7de4c.csv', 641, '66c70087c763e807cbf7de4c.csv', '交易对账单-支付宝-20240821.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 17:10:31.742535'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826547501512646656, '/file/2024/08/22/66c7008ac763e807cbf7de4d.xlsx', 9769, '66c7008ac763e807cbf7de4d.xlsx', '外部交易明细.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 17:10:34.629401'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826548693462540288, '/file/66c701a6c763e807cbf7de4e.csv', 4873, '66c701a6c763e807cbf7de4e.csv', '交易对账单-微信-20240821.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 17:15:18.81236'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826548700915818496, '/file/2024/08/22/66c701a8c763e807cbf7de4f.xlsx', 10859, '66c701a8c763e807cbf7de4f.xlsx', '测试对账.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 17:15:20.589063'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826550241479413760, '/file/66c70317c763d39942d0f55c.csv', 1189, '66c70317c763d39942d0f55c.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 17:21:27.886652'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1826550253630312448, '/file/2024/08/22/66c7031ac763d39942d0f55d.xlsx', 9951, '66c7031ac763d39942d0f55d.xlsx', '测试对账.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 17:21:30.785225'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1829092824449552384, '/file/66d0430e2725ea0e6dd63e99.csv', 975, '66d0430e2725ea0e6dd63e99.csv', '交易对账单-支付宝-20240825.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-29 17:44:46.899974'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1829092838819237888, '/file/2024/08/29/66d043122725ea0e6dd63e9a.xlsx', 9879, '66d043122725ea0e6dd63e9a.xlsx', '分账单.xlsx', '/file/', '2024/08/29/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-29 17:44:50.332586'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1829376511166722048, '/file/66d14b42e537e3f57615df0e.csv', 773, '66d14b42e537e3f57615df0e.csv', '交易对账单-支付宝-20240829.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-30 12:32:03.082505'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830432967571877888, '/file/66d523299b65f788a54f4345.csv', 588, '66d523299b65f788a54f4345.csv', '交易对账单-支付宝-20240901.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:01.924318'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830432971883622400, '/file/2024/09/02/66d5232a9b65f788a54f4346.xlsx', 9725, '66d5232a9b65f788a54f4346.xlsx', '【2024-09-01】 - 测试应用2 - 支付宝(直连商户).xlsx', '/file/', '2024/09/02/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:02.953727'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830432978368016384, '/file/66d5232c9b65f788a54f4347.csv', 1152, '66d5232c9b65f788a54f4347.csv', '交易对账单-微信-20240901.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:04.500493'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830432979357872128, '/file/2024/09/02/66d5232c9b65f788a54f4348.xlsx', 9964, '66d5232c9b65f788a54f4348.xlsx', '【2024-09-01】 - 正式测试环境 - 微信支付(直连商户).xlsx', '/file/', '2024/09/02/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:04.736091'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830432980876210176, '/file/66d5232d9b65f788a54f4349.csv', 588, '66d5232d9b65f788a54f4349.csv', '交易对账单-支付宝-20240901.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:05.097887'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830432981224337408, '/file/2024/09/02/66d5232d9b65f788a54f434a.xlsx', 9725, '66d5232d9b65f788a54f434a.xlsx', '【2024-09-01】 - 正式测试环境 - 支付宝(直连商户).xlsx', '/file/', '2024/09/02/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:05.180424'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830432989017354240, '/file/66d5232f9b65f788a54f434b.csv', 773, '66d5232f9b65f788a54f434b.csv', '交易对账单-支付宝-20240901.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:07.0389'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830432989638111232, '/file/2024/09/02/66d5232f9b65f788a54f434c.xlsx', 9726, '66d5232f9b65f788a54f434c.xlsx', '【2024-09-01】 - 秘钥测试账户(支付宝沙箱) - 支付宝(直连商户).xlsx', '/file/', '2024/09/02/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:07.187076'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830795357480173568, '/file/66d674a91f358abb94988653.csv', 775, '66d674a91f358abb94988653.csv', '交易对账单-支付宝-20240902.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:02.410984'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830795361926135808, '/file/2024/09/03/66d674ab1f358abb94988654.xlsx', 10927, '66d674ab1f358abb94988654.xlsx', '【2024-09-02】 - 测试应用2 - 支付宝(直连商户).xlsx', '/file/', '2024/09/03/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:03.47317'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830795369018703872, '/file/66d674ad1f358abb94988655.csv', 1148, '66d674ad1f358abb94988655.csv', '交易对账单-微信-20240902.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:05.163827'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830795369673015296, '/file/2024/09/03/66d674ad1f358abb94988656.xlsx', 9965, '66d674ad1f358abb94988656.xlsx', '【2024-09-02】 - 正式测试环境 - 微信支付(直连商户).xlsx', '/file/', '2024/09/03/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:05.320186'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830795372088934400, '/file/66d674ad1f358abb94988657.csv', 775, '66d674ad1f358abb94988657.csv', '交易对账单-支付宝-20240902.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:05.896053'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830795373271728128, '/file/2024/09/03/66d674ae1f358abb94988658.xlsx', 10926, '66d674ae1f358abb94988658.xlsx', '【2024-09-02】 - 正式测试环境 - 支付宝(直连商户).xlsx', '/file/', '2024/09/03/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:06.178188'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830795379219251200, '/file/66d674af1f358abb94988659.csv', 773, '66d674af1f358abb94988659.csv', '交易对账单-支付宝-20240902.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:07.596269'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1830795379978420224, '/file/2024/09/03/66d674af1f358abb9498865a.xlsx', 10927, '66d674af1f358abb9498865a.xlsx', '【2024-09-02】 - 秘钥测试账户(支付宝沙箱) - 支付宝(直连商户).xlsx', '/file/', '2024/09/03/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:07.777158'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1831233989211004928, '/file/66d80d2b0d4141300044fc44.csv', 775, '66d80d2b0d4141300044fc44.csv', '交易对账单-支付宝-20240903.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 15:33:00.365017'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1831233993724076032, '/file/2024/09/04/66d80d2d0d4141300044fc45.xlsx', 9726, '66d80d2d0d4141300044fc45.xlsx', '【2024-09-03】-M1723635576766-M7934041241299655-支付宝(直连商户).xlsx', '/file/', '2024/09/04/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 15:33:01.443352'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1831234003706519552, '/file/66d80d2f0d4141300044fc46.csv', 775, '66d80d2f0d4141300044fc46.csv', '交易对账单-支付宝-20240903.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 15:33:03.822384'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1831234004142727168, '/file/2024/09/04/66d80d2f0d4141300044fc47.xlsx', 9726, '66d80d2f0d4141300044fc47.xlsx', '【2024-09-03】-M1723635576766-M8207639754663343-支付宝(直连商户).xlsx', '/file/', '2024/09/04/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 15:33:03.926613'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1831234013055623168, '/file/66d80d320d4141300044fc48.csv', 773, '66d80d320d4141300044fc48.csv', '交易对账单-支付宝-20240903.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 15:33:06.051702'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1831234013588299776, '/file/2024/09/04/66d80d320d4141300044fc49.xlsx', 9726, '66d80d320d4141300044fc49.xlsx', '【2024-09-03】-M1723635576766-M8088873888246277-支付宝(直连商户).xlsx', '/file/', '2024/09/04/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 15:33:06.179445'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1831245328214020096, '/file/66d817bb0d4118c2cf4a8e72.csv', 773, '66d817bb0d4118c2cf4a8e72.csv', '交易对账单-支付宝-20240903.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 16:18:03.788286'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1831245352838778880, '/file/2024/09/04/66d817c10d4118c2cf4a8e73.xlsx', 9726, '66d817c10d4118c2cf4a8e73.xlsx', '【2024-09-03】-M1723635576766-M7189826551600486-支付宝(直连商户).xlsx', '/file/', '2024/09/04/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 16:18:09.666814'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1838767893975228416, '/file/66f375aac76333160bc4e4ca.csv', 773, '66f375aac76333160bc4e4ca.csv', '交易对账单-支付宝-20240924.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:03.234173'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1838767897783656448, '/file/2024/09/25/66f375acc76333160bc4e4cb.xlsx', 9725, '66f375acc76333160bc4e4cb.xlsx', '【2024-09-24】M1723635576766-M7189826551600486-支付宝(直连商户).xlsx', '/file/', '2024/09/25/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:04.143105'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1838767901315260416, '/file/66f375acc76333160bc4e4cc.csv', 588, '66f375acc76333160bc4e4cc.csv', '交易对账单-支付宝-20240924.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:04.986'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1838767901684359168, '/file/2024/09/25/66f375adc76333160bc4e4cd.xlsx', 9725, '66f375adc76333160bc4e4cd.xlsx', '【2024-09-24】M1723635576766-M7934041241299655-支付宝(直连商户).xlsx', '/file/', '2024/09/25/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:05.074329'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1838767906600083456, '/file/66f375aec76333160bc4e4ce.csv', 588, '66f375aec76333160bc4e4ce.csv', '交易对账单-支付宝-20240924.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:06.246034'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1838767907405389824, '/file/2024/09/25/66f375aec76333160bc4e4cf.xlsx', 9726, '66f375aec76333160bc4e4cf.xlsx', '【2024-09-24】M1723635576766-M8207639754663343-支付宝(直连商户).xlsx', '/file/', '2024/09/25/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:06.438419'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1838767913310969856, '/file/66f375afc76333160bc4e4d0.csv', 773, '66f375afc76333160bc4e4d0.csv', '交易对账单-支付宝-20240924.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:07.845724'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1838767913768148992, '/file/2024/09/25/66f375afc76333160bc4e4d1.xlsx', 9726, '66f375afc76333160bc4e4d1.xlsx', '【2024-09-24】M1723635576766-M8088873888246277-支付宝(直连商户).xlsx', '/file/', '2024/09/25/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:07.955428'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1839130282750988288, '/file/66f4c72ba2e5db5ec8f6d8c4.csv', 773, '66f4c72ba2e5db5ec8f6d8c4.csv', '交易对账单-支付宝-20240925.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:03.451004'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1839130286337118208, '/file/2024/09/26/66f4c72ca2e5db5ec8f6d8c5.xlsx', 9726, '66f4c72ca2e5db5ec8f6d8c5.xlsx', '【2024-09-25】M1723635576766-M7189826551600486-支付宝(直连商户).xlsx', '/file/', '2024/09/26/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:04.308822'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1839130289847750656, '/file/66f4c72da2e5db5ec8f6d8c6.csv', 588, '66f4c72da2e5db5ec8f6d8c6.csv', '交易对账单-支付宝-20240925.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:05.144483'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1839130290191683584, '/file/2024/09/26/66f4c72da2e5db5ec8f6d8c7.xlsx', 9725, '66f4c72da2e5db5ec8f6d8c7.xlsx', '【2024-09-25】M1723635576766-M7934041241299655-支付宝(直连商户).xlsx', '/file/', '2024/09/26/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:05.22687'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1839130295765913600, '/file/66f4c72ea2e5db5ec8f6d8c8.csv', 588, '66f4c72ea2e5db5ec8f6d8c8.csv', '交易对账单-支付宝-20240925.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:06.55616'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1839130296114040832, '/file/2024/09/26/66f4c72ea2e5db5ec8f6d8c9.xlsx', 9725, '66f4c72ea2e5db5ec8f6d8c9.xlsx', '【2024-09-25】M1723635576766-M8207639754663343-支付宝(直连商户).xlsx', '/file/', '2024/09/26/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:06.639039'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1839130304922079232, '/file/66f4c730a2e5db5ec8f6d8ca.csv', 773, '66f4c730a2e5db5ec8f6d8ca.csv', '交易对账单-支付宝-20240925.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:08.739167'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1839130305433784320, '/file/2024/09/26/66f4c730a2e5db5ec8f6d8cb.xlsx', 9725, '66f4c730a2e5db5ec8f6d8cb.xlsx', '【2024-09-25】M1723635576766-M8088873888246277-支付宝(直连商户).xlsx', '/file/', '2024/09/26/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:08.861025'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1845026949664677888, '/file/670a3ade27257f956fb37432.csv', 1218, '670a3ade27257f956fb37432.csv', '交易对账单-云闪付-20241008.csv', '/file/', '', 'csv', 'text/plain', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-10-12 17:01:18.398618'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1845026982594158592, '/file/2024/10/12/670a3ae627257f956fb37433.xlsx', 9929, '670a3ae627257f956fb37433.xlsx', '订阅通知.xlsx', '/file/', '2024/10/12/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-10-12 17:01:26.251311'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1845027095811006464, '/file/670a3b0127257f956fb37434.csv', 588, '670a3b0127257f956fb37434.csv', '交易对账单-支付宝-20241007.csv', '/file/', '', 'csv', 'application/octet-stream', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-10-12 17:01:53.243283'); +INSERT INTO "public"."starter_file_upload_info" VALUES (1845027103906013184, '/file/2024/10/12/670a3b0327257f956fb37435.xlsx', 9725, '670a3b0327257f956fb37435.xlsx', '订阅通知.xlsx', '/file/', '2024/10/12/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-10-12 17:01:55.174477'); -- ---------------------------- -- Primary Key structure for table base_dict @@ -2667,6 +2502,19 @@ ALTER TABLE "public"."iam_user_info" ADD CONSTRAINT "iam_user_info_pkey" PRIMARY -- ---------------------------- ALTER TABLE "public"."iam_user_role" ADD CONSTRAINT "iam_user_role_pkey" PRIMARY KEY ("id"); +-- ---------------------------- +-- Indexes structure for table pay_alloc_detail +-- ---------------------------- +CREATE INDEX "allocation_id" ON "public"."pay_alloc_detail" USING btree ( + "allocation_id" "pg_catalog"."int8_ops" ASC NULLS LAST +); +COMMENT ON INDEX "public"."allocation_id" IS '分账订单ID索引'; + +-- ---------------------------- +-- Primary Key structure for table pay_alloc_detail +-- ---------------------------- +ALTER TABLE "public"."pay_alloc_detail" ADD CONSTRAINT "pay_alloc_detail_pkey" PRIMARY KEY ("id"); + -- ---------------------------- -- Primary Key structure for table pay_alloc_group -- ---------------------------- @@ -2680,7 +2528,27 @@ ALTER TABLE "public"."pay_alloc_group_receiver" ADD CONSTRAINT "pay_allocation_g -- ---------------------------- -- Primary Key structure for table pay_alloc_receiver -- ---------------------------- -ALTER TABLE "public"."pay_alloc_receiver" ADD CONSTRAINT "pay_allocation_receiver_pkey" PRIMARY KEY ("id"); +ALTER TABLE "public"."pay_alloc_receiver" ADD CONSTRAINT "pay_alloc_receiver_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table pay_alloc_transaction +-- ---------------------------- +CREATE INDEX "alloc_no" ON "public"."pay_alloc_transaction" USING btree ( + "alloc_no" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +COMMENT ON INDEX "public"."alloc_no" IS '分账单号索引'; +CREATE INDEX "biz_alloc_no" ON "public"."pay_alloc_transaction" USING btree ( + "biz_alloc_no" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +COMMENT ON INDEX "public"."biz_alloc_no" IS '商户分账单号索引'; +CREATE INDEX "order_id" ON "public"."pay_alloc_transaction" USING btree ( + "order_id" "pg_catalog"."int8_ops" ASC NULLS LAST +); +COMMENT ON INDEX "public"."order_id" IS '支付订单ID索引'; +CREATE INDEX "out_alloc_no" ON "public"."pay_alloc_transaction" USING btree ( + "out_alloc_no" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +); +COMMENT ON INDEX "public"."out_alloc_no" IS '通道分账号索引'; -- ---------------------------- -- Primary Key structure for table pay_api_const @@ -2688,9 +2556,14 @@ ALTER TABLE "public"."pay_alloc_receiver" ADD CONSTRAINT "pay_allocation_receive ALTER TABLE "public"."pay_api_const" ADD CONSTRAINT "pay_channel_const_copy1_pkey1" PRIMARY KEY ("id"); -- ---------------------------- --- Primary Key structure for table pay_channel_cashier_config +-- Primary Key structure for table pay_cashier_code_config -- ---------------------------- -ALTER TABLE "public"."pay_channel_cashier_config" ADD CONSTRAINT "pay_channel_cashier_config_pkey" PRIMARY KEY ("id"); +ALTER TABLE "public"."pay_cashier_code_config" ADD CONSTRAINT "pay_cashier_code_config_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_cashier_code_type_config +-- ---------------------------- +ALTER TABLE "public"."pay_cashier_code_type_config" ADD CONSTRAINT "pay_cashier_code_type_config_pkey" PRIMARY KEY ("id"); -- ---------------------------- -- Primary Key structure for table pay_channel_config @@ -2707,6 +2580,26 @@ ALTER TABLE "public"."pay_channel_const" ADD CONSTRAINT "pay_channel_const_pkey" -- ---------------------------- ALTER TABLE "public"."pay_channel_reconcile_trade" ADD CONSTRAINT "pay_channel_reconcile_trade_pkey" PRIMARY KEY ("id"); +-- ---------------------------- +-- Primary Key structure for table pay_checkout_aggregate_config +-- ---------------------------- +ALTER TABLE "public"."pay_checkout_aggregate_config" ADD CONSTRAINT "pay_checkout_aggregate_config_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_checkout_config +-- ---------------------------- +ALTER TABLE "public"."pay_checkout_config" ADD CONSTRAINT "pay_checkout_config_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_checkout_group_config +-- ---------------------------- +ALTER TABLE "public"."pay_checkout_group_config" ADD CONSTRAINT "pay_checkout_group_config_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_checkout_item_config +-- ---------------------------- +ALTER TABLE "public"."pay_checkout_item_config" ADD CONSTRAINT "pay_checkout_item_config_pkey" PRIMARY KEY ("id"); + -- ---------------------------- -- Indexes structure for table pay_close_record -- ---------------------------- diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index 78acffc63..bb75239f7 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,8 +1,25 @@ # CHANGELOG ## [v3.0.0.beta2] 2024-11-08 +- 新增: 增加PC收银台功能 +- 新增: 增加H5收银台功能 +- 新增: 增加聚合收银台功能 +- 新增: 增加收银台配置功能 +- 新增: 交易调试页增加收银台调试选项 +- 新增: SDK增加收银台相关接口/认证相关接口 +- 新增: 系统首页驾驶舱数据展示页 +- 重构: 原支付收银台改为支付码牌, 一个应用支持多个码牌 +- 重构: SDK命名空间更改为org.dromara.daxpay +- 优化: 微信通道添加单独的认证跳转地址 +- 优化: 添加定时任务和事件监听服务 +- 优化: 微信支付方式的判断逻辑,提高了系统稳定性 - fix: 系统参数使用到MySQL8保留字 - fix: Mysql 脚本缺少 缺失 表pay_api_const - fix: H5构建版本限制错误, 限制为最低为node20+ +- fix: 修复商户回调和通知的延迟逻辑 +- fix: 商户应用类型命名错误 +- fix: 修复对账差异逻辑 +- fix: 修复微信支付同步金额为空的问题 +- fix: 修复 BigDecimal 类型数据序列化和签名异常问题 ## [v3.0.0.beta1] 2024-10-24 - 重构: JDK版本升级为21+, Spring Boot 版本升级为3.3.x, 前端组件升级为Antd Vue 4.x + Vite5 - 重构: 数据库更新为PostgreSQL + MySQL8.x 双版本支持 diff --git a/_doc/Task.md b/_doc/Task.md index ed7615a0a..e52890e02 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,4 +1,33 @@ # 单商户 +## 3.0.1 功能优化 +- [ ] 收银台功能优化 + - [ ] 支持配置背景色和图标 +## 3.0.0.beta3 +- [x] 收银台功能 + - [x] 收银台配置 + - [x] 分类配置 + - [x] 明细配置 + - [x] 聚合支付配置 + - [x] 支持通过订单信息生成多种类型的收银台链接, + - [x] pc收银台 + - [x] 扫码支付 + - [x] 条码支付 + - [x] 跳转支付 + - [x] 聚合支付(生成扫码链接) + - [x] 聚合支付(条码支付) + - [x] H5收银台 + - [x] 跳转支付 + - [x] 升级为聚合支付 + - [ ] ~~APP调起支付~~ + - [ ] ~~小程序支付~~ + - [x] 聚合收银台 + - [x] Jsapi调用 + - [x] 跳转支付 +- [x] 支付码牌功能改造 + - [x] 一个应用支持多码牌 + - [x] 码牌不再使用应用号作为标识, 使用独立的编码 + - [x] 码牌H5页面对接 +- [ ] 分账配置/分账组/分账接收方合并为一个tabs页面 ## 3.0.0.bate2: 功能完善第二阶段 - 优化: - [ ] 增加首页驾驶舱功能 @@ -10,32 +39,6 @@ - [ ] 同步回调页 - [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 - [x] 支付订单新增待支付状态 -## 3.0.0.beta3 -- [x] 收银台台功能 - - [x] 收银台配置 - - [x] 分类配置 - - [x] 明细配置 - - [x] 聚合支付配置 - - [x] 支持通过订单信息生成多种类型的收银台链接, - - [x] pc收银台 - - [x] 扫码支付 - - [x] 条码支付 - - [x] 跳转支付 - - [x] 聚合支付(生成扫码链接) - - [x] 聚合支付(条码支付) - - [x] H5收银台 - - [x] 跳转支付 - - [x] 升级为聚合支付 - - [ ] ~~APP调起支付~~ - - [ ] ~~小程序支付~~ - - [x] 聚合收银台 - - [x] Jsapi调用 - - [x] 跳转支付 -- [x] 支付码牌功能改造 - - [x] 一个应用支持多码牌 - - [x] 码牌不再使用应用号作为标识, 使用独立的编码 - - [x] 码牌H5页面对接 -- [ ] 分账配置/分账组/分账接收方合并为一个tabs页面 ## bugs - [x] 修复 BigDecimal 类型数据序列化和签名异常问题 - [x] 获取是否订阅消息通知类型查询范围错误问题 diff --git a/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/trade/CheckoutPayTest.java b/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/trade/CheckoutPayTest.java index 406bbc634..5f22da79c 100644 --- a/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/trade/CheckoutPayTest.java +++ b/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/trade/CheckoutPayTest.java @@ -27,7 +27,7 @@ public class CheckoutPayTest { DaxPayConfig config = DaxPayConfig.builder() .serviceUrl("http://127.0.0.1:9999") .signSecret("123456") - .appId("M7934041241299655") + .appId("M8207639754663343") .signType(SignTypeEnum.HMAC_SHA256) .build(); DaxPayKit.initConfig(config); @@ -43,7 +43,7 @@ public class CheckoutPayTest { param.setBizOrderNo("SDK_"+ System.currentTimeMillis()); param.setTitle("测试收银台支付"); param.setDescription("这是支付备注"); - param.setCheckoutType(CheckoutTypeEnum.AGGREGATE.getCode()); + param.setCheckoutType(CheckoutTypeEnum.PC.getCode()); param.setAmount(BigDecimal.valueOf(1.00)); param.setAttach("{回调参数}"); param.setAllocation(false); From 31b50869b272518bcc6bfa5415fd54da7ef301fd Mon Sep 17 00:00:00 2001 From: DaxPay Date: Thu, 5 Dec 2024 20:45:18 +0800 Subject: [PATCH 11/54] =?UTF-8?q?build=203.0.0.beta1,=20fix=20pg=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config/postgresql/dax-pay-single.sql | 2 +- _doc/Task.md | 53 ++++++++++++++----- .../common-cache/pom.xml | 2 +- .../common-config/pom.xml | 2 +- .../common-exception-handler/pom.xml | 2 +- .../common-header-holder/pom.xml | 2 +- .../common-jackson/pom.xml | 2 +- .../bootx-platform-common/common-log/pom.xml | 2 +- .../common-mybatis-plus/pom.xml | 2 +- .../common-redis/pom.xml | 2 +- .../common-spring/pom.xml | 2 +- .../common-swagger/pom.xml | 2 +- bootx-platform/bootx-platform-common/pom.xml | 2 +- bootx-platform/bootx-platform-core/pom.xml | 2 +- bootx-platform/bootx-platform-service/pom.xml | 2 +- .../service-baseapi/pom.xml | 2 +- .../service-iam/pom.xml | 2 +- bootx-platform/bootx-platform-starter/pom.xml | 4 +- .../starter-audit-log/pom.xml | 2 +- .../starter-auth/pom.xml | 2 +- .../starter-delay-queue/pom.xml | 2 +- .../starter-file/pom.xml | 2 +- .../starter-quartz/pom.xml | 2 +- bootx-platform/pom.xml | 4 +- .../daxpay-single-alipay/pom.xml | 2 +- .../daxpay-single-union/pom.xml | 2 +- .../daxpay-single-wechat/pom.xml | 2 +- daxpay-single-channel/pom.xml | 8 +-- daxpay-single/daxpay-single-core/pom.xml | 2 +- daxpay-single/daxpay-single-service/pom.xml | 2 +- daxpay-single/daxpay-single-unisdk/pom.xml | 2 +- daxpay-single/pom.xml | 6 +-- pom.xml | 2 +- 33 files changed, 79 insertions(+), 52 deletions(-) diff --git a/_config/postgresql/dax-pay-single.sql b/_config/postgresql/dax-pay-single.sql index 0fd2e47ac..d0092cd60 100644 --- a/_config/postgresql/dax-pay-single.sql +++ b/_config/postgresql/dax-pay-single.sql @@ -1235,7 +1235,7 @@ CREATE TABLE "public"."pay_checkout_group_config" ( "last_modifier" int8, "last_modified_time" timestamp(6), "version" int4 NOT NULL, - "deleted" varchar(1) COLLATE "pg_catalog"."default" NOT NULL, + "deleted" bool NOT NULL, "app_id" varchar(32) COLLATE "pg_catalog"."default", "type" varchar(32) COLLATE "pg_catalog"."default", "name" varchar(50) COLLATE "pg_catalog"."default", diff --git a/_doc/Task.md b/_doc/Task.md index e52890e02..0f70f7ac6 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -2,7 +2,19 @@ ## 3.0.1 功能优化 - [ ] 收银台功能优化 - [ ] 支持配置背景色和图标 -## 3.0.0.beta3 +- [ ] 定时同步任务频次不要太高, 预防产生过多的数据 +## 3.0.0.bate3: 功能完善 +- 优化: +- [ ] 增加首页驾驶舱功能 +- [ ] 分账功能 + - [x] 分账接收方配置 + - [ ] 分账单管理 + - [ ] 分账接口开发 +- [ ] 网关配套移动端开发 + - [ ] 同步回调页 +- [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 +- [x] 支付订单新增待支付状态 +## 3.0.0.beta2 收银台 - [x] 收银台功能 - [x] 收银台配置 - [x] 分类配置 @@ -28,23 +40,38 @@ - [x] 码牌不再使用应用号作为标识, 使用独立的编码 - [x] 码牌H5页面对接 - [ ] 分账配置/分账组/分账接收方合并为一个tabs页面 -## 3.0.0.bate2: 功能完善第二阶段 -- 优化: -- [ ] 增加首页驾驶舱功能 -- [ ] 分账功能 - - [x] 分账接收方配置 - - [ ] 分账单管理 - - [ ] 分账接口开发 -- [ ] 网关配套移动端开发 - - [ ] 同步回调页 -- [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 -- [x] 支付订单新增待支付状态 +## 3.0.0.beta2 收银台 +- [x] 收银台功能 + - [x] 收银台配置 + - [x] 分类配置 + - [x] 明细配置 + - [x] 聚合支付配置 + - [x] 支持通过订单信息生成多种类型的收银台链接, + - [x] pc收银台 + - [x] 扫码支付 + - [x] 条码支付 + - [x] 跳转支付 + - [x] 聚合支付(生成扫码链接) + - [x] 聚合支付(条码支付) + - [x] H5收银台 + - [x] 跳转支付 + - [x] 升级为聚合支付 + - [ ] ~~APP调起支付~~ + - [ ] ~~小程序支付~~ + - [x] 聚合收银台 + - [x] Jsapi调用 + - [x] 跳转支付 +- [x] 支付码牌功能改造 + - [x] 一个应用支持多码牌 + - [x] 码牌不再使用应用号作为标识, 使用独立的编码 + - [x] 码牌H5页面对接 +- [ ] 分账配置/分账组/分账接收方合并为一个tabs页面 + ## bugs - [x] 修复 BigDecimal 类型数据序列化和签名异常问题 - [x] 获取是否订阅消息通知类型查询范围错误问题 ## 任务池 -- [ ] 定时同步任务频次不要太高, 预防产生过多的数据 - [ ] 退款支持以撤销的方式进行退款 - [ ] 商户应用增加启停用状态 - [ ] 商户应用应该要有一个类似删除的功能, 实现停用冻结, 但不影响数据的关联 diff --git a/bootx-platform/bootx-platform-common/common-cache/pom.xml b/bootx-platform/bootx-platform-common/common-cache/pom.xml index 9b6b91055..5e18c29cd 100644 --- a/bootx-platform/bootx-platform-common/common-cache/pom.xml +++ b/bootx-platform/bootx-platform-common/common-cache/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta1 + 3.0.0.beta2 common-cache diff --git a/bootx-platform/bootx-platform-common/common-config/pom.xml b/bootx-platform/bootx-platform-common/common-config/pom.xml index 772bc4ed8..687ff96fb 100644 --- a/bootx-platform/bootx-platform-common/common-config/pom.xml +++ b/bootx-platform/bootx-platform-common/common-config/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta1 + 3.0.0.beta2 common-config diff --git a/bootx-platform/bootx-platform-common/common-exception-handler/pom.xml b/bootx-platform/bootx-platform-common/common-exception-handler/pom.xml index f234042f6..176633a8e 100644 --- a/bootx-platform/bootx-platform-common/common-exception-handler/pom.xml +++ b/bootx-platform/bootx-platform-common/common-exception-handler/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta1 + 3.0.0.beta2 common-exception-handler diff --git a/bootx-platform/bootx-platform-common/common-header-holder/pom.xml b/bootx-platform/bootx-platform-common/common-header-holder/pom.xml index 41fcf29ec..fc1327e4c 100644 --- a/bootx-platform/bootx-platform-common/common-header-holder/pom.xml +++ b/bootx-platform/bootx-platform-common/common-header-holder/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta1 + 3.0.0.beta2 common-header-holder diff --git a/bootx-platform/bootx-platform-common/common-jackson/pom.xml b/bootx-platform/bootx-platform-common/common-jackson/pom.xml index bac001df2..1558dcc9c 100644 --- a/bootx-platform/bootx-platform-common/common-jackson/pom.xml +++ b/bootx-platform/bootx-platform-common/common-jackson/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta1 + 3.0.0.beta2 common-jackson diff --git a/bootx-platform/bootx-platform-common/common-log/pom.xml b/bootx-platform/bootx-platform-common/common-log/pom.xml index 8e3270f37..aeedc3bdf 100644 --- a/bootx-platform/bootx-platform-common/common-log/pom.xml +++ b/bootx-platform/bootx-platform-common/common-log/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta1 + 3.0.0.beta2 common-log diff --git a/bootx-platform/bootx-platform-common/common-mybatis-plus/pom.xml b/bootx-platform/bootx-platform-common/common-mybatis-plus/pom.xml index 2c5837e9b..b35359b11 100644 --- a/bootx-platform/bootx-platform-common/common-mybatis-plus/pom.xml +++ b/bootx-platform/bootx-platform-common/common-mybatis-plus/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta1 + 3.0.0.beta2 common-mybatis-plus diff --git a/bootx-platform/bootx-platform-common/common-redis/pom.xml b/bootx-platform/bootx-platform-common/common-redis/pom.xml index d5b52b7d7..ac495790a 100644 --- a/bootx-platform/bootx-platform-common/common-redis/pom.xml +++ b/bootx-platform/bootx-platform-common/common-redis/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta1 + 3.0.0.beta2 common-redis diff --git a/bootx-platform/bootx-platform-common/common-spring/pom.xml b/bootx-platform/bootx-platform-common/common-spring/pom.xml index 2ee2a772a..08eacbc6b 100644 --- a/bootx-platform/bootx-platform-common/common-spring/pom.xml +++ b/bootx-platform/bootx-platform-common/common-spring/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta1 + 3.0.0.beta2 common-spring diff --git a/bootx-platform/bootx-platform-common/common-swagger/pom.xml b/bootx-platform/bootx-platform-common/common-swagger/pom.xml index 958bee3da..d6d59a6bc 100644 --- a/bootx-platform/bootx-platform-common/common-swagger/pom.xml +++ b/bootx-platform/bootx-platform-common/common-swagger/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta1 + 3.0.0.beta2 common-swagger diff --git a/bootx-platform/bootx-platform-common/pom.xml b/bootx-platform/bootx-platform-common/pom.xml index 6b20ba44b..69c3ad5df 100644 --- a/bootx-platform/bootx-platform-common/pom.xml +++ b/bootx-platform/bootx-platform-common/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta1 + 3.0.0.beta2 4.0.0 diff --git a/bootx-platform/bootx-platform-core/pom.xml b/bootx-platform/bootx-platform-core/pom.xml index f92aaa717..adf36d887 100644 --- a/bootx-platform/bootx-platform-core/pom.xml +++ b/bootx-platform/bootx-platform-core/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta1 + 3.0.0.beta2 4.0.0 diff --git a/bootx-platform/bootx-platform-service/pom.xml b/bootx-platform/bootx-platform-service/pom.xml index dba99229a..ab7d1af6f 100644 --- a/bootx-platform/bootx-platform-service/pom.xml +++ b/bootx-platform/bootx-platform-service/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta1 + 3.0.0.beta2 service-baseapi diff --git a/bootx-platform/bootx-platform-service/service-baseapi/pom.xml b/bootx-platform/bootx-platform-service/service-baseapi/pom.xml index 990be5253..0db50969d 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/pom.xml +++ b/bootx-platform/bootx-platform-service/service-baseapi/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-service - 3.0.0.beta1 + 3.0.0.beta2 service-baseapi diff --git a/bootx-platform/bootx-platform-service/service-iam/pom.xml b/bootx-platform/bootx-platform-service/service-iam/pom.xml index 092105842..84a6af32f 100644 --- a/bootx-platform/bootx-platform-service/service-iam/pom.xml +++ b/bootx-platform/bootx-platform-service/service-iam/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-service - 3.0.0.beta1 + 3.0.0.beta2 service-iam diff --git a/bootx-platform/bootx-platform-starter/pom.xml b/bootx-platform/bootx-platform-starter/pom.xml index 920124de8..9d4530b3f 100644 --- a/bootx-platform/bootx-platform-starter/pom.xml +++ b/bootx-platform/bootx-platform-starter/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta1 + 3.0.0.beta2 starter-auth @@ -25,7 +25,7 @@ cn.bootx.platform bootx-platform-core - 3.0.0.beta1 + 3.0.0.beta2 diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/pom.xml b/bootx-platform/bootx-platform-starter/starter-audit-log/pom.xml index 695aef184..bf0df5e7a 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta1 + 3.0.0.beta2 starter-audit-log diff --git a/bootx-platform/bootx-platform-starter/starter-auth/pom.xml b/bootx-platform/bootx-platform-starter/starter-auth/pom.xml index 69fabe7cf..c34ce6c8a 100644 --- a/bootx-platform/bootx-platform-starter/starter-auth/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-auth/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta1 + 3.0.0.beta2 starter-auth diff --git a/bootx-platform/bootx-platform-starter/starter-delay-queue/pom.xml b/bootx-platform/bootx-platform-starter/starter-delay-queue/pom.xml index 39a29ca2c..95eebe203 100644 --- a/bootx-platform/bootx-platform-starter/starter-delay-queue/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-delay-queue/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta1 + 3.0.0.beta2 starter-delay-queue diff --git a/bootx-platform/bootx-platform-starter/starter-file/pom.xml b/bootx-platform/bootx-platform-starter/starter-file/pom.xml index ad6363257..3fbb2c034 100644 --- a/bootx-platform/bootx-platform-starter/starter-file/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-file/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta1 + 3.0.0.beta2 starter-file diff --git a/bootx-platform/bootx-platform-starter/starter-quartz/pom.xml b/bootx-platform/bootx-platform-starter/starter-quartz/pom.xml index b21cc0879..84aa2944c 100644 --- a/bootx-platform/bootx-platform-starter/starter-quartz/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-quartz/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta1 + 3.0.0.beta2 starter-quartz diff --git a/bootx-platform/pom.xml b/bootx-platform/pom.xml index 24be88833..290c33ab7 100644 --- a/bootx-platform/pom.xml +++ b/bootx-platform/pom.xml @@ -13,7 +13,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta1 + 3.0.0.beta2 pom 基础脚手架服务 @@ -25,7 +25,7 @@ - 3.0.0.beta1 + 3.0.0.beta2 2.5.0 5.8.31 diff --git a/daxpay-single-channel/daxpay-single-alipay/pom.xml b/daxpay-single-channel/daxpay-single-alipay/pom.xml index 2e8c27337..112d96e84 100644 --- a/daxpay-single-channel/daxpay-single-alipay/pom.xml +++ b/daxpay-single-channel/daxpay-single-alipay/pom.xml @@ -7,7 +7,7 @@ org.dromara.daxpay daxpay-single-channel - 3.0.0.beta1 + 3.0.0.beta2 daxpay-single-alipay diff --git a/daxpay-single-channel/daxpay-single-union/pom.xml b/daxpay-single-channel/daxpay-single-union/pom.xml index c4241d6f5..7cd349ab7 100644 --- a/daxpay-single-channel/daxpay-single-union/pom.xml +++ b/daxpay-single-channel/daxpay-single-union/pom.xml @@ -7,7 +7,7 @@ org.dromara.daxpay daxpay-single-channel - 3.0.0.beta1 + 3.0.0.beta2 daxpay-single-union diff --git a/daxpay-single-channel/daxpay-single-wechat/pom.xml b/daxpay-single-channel/daxpay-single-wechat/pom.xml index d5bd1be5b..00b935c0d 100644 --- a/daxpay-single-channel/daxpay-single-wechat/pom.xml +++ b/daxpay-single-channel/daxpay-single-wechat/pom.xml @@ -7,7 +7,7 @@ org.dromara.daxpay daxpay-single-channel - 3.0.0.beta1 + 3.0.0.beta2 daxpay-single-wechat diff --git a/daxpay-single-channel/pom.xml b/daxpay-single-channel/pom.xml index d1515f92e..118257669 100644 --- a/daxpay-single-channel/pom.xml +++ b/daxpay-single-channel/pom.xml @@ -13,7 +13,7 @@ org.dromara.daxpay daxpay-single-channel - 3.0.0.beta1 + 3.0.0.beta2 pom 单商户支付通道功能实现 @@ -35,8 +35,8 @@ 1.4.8 4.5.0 - 3.0.0.beta1 - 3.0.0.beta1 + 3.0.0.beta2 + 3.0.0.beta2 @@ -67,7 +67,7 @@ org.dromara.daxpay daxpay-single-service - 3.0.0.beta1 + 3.0.0.beta2 diff --git a/daxpay-single/daxpay-single-core/pom.xml b/daxpay-single/daxpay-single-core/pom.xml index 6e2d95b4a..19bf07b83 100644 --- a/daxpay-single/daxpay-single-core/pom.xml +++ b/daxpay-single/daxpay-single-core/pom.xml @@ -6,7 +6,7 @@ org.dromara.daxpay daxpay-single - 3.0.0.beta1 + 3.0.0.beta2 daxpay-single-core diff --git a/daxpay-single/daxpay-single-service/pom.xml b/daxpay-single/daxpay-single-service/pom.xml index 123da5a1f..59621c238 100644 --- a/daxpay-single/daxpay-single-service/pom.xml +++ b/daxpay-single/daxpay-single-service/pom.xml @@ -6,7 +6,7 @@ org.dromara.daxpay daxpay-single - 3.0.0.beta1 + 3.0.0.beta2 daxpay-single-service diff --git a/daxpay-single/daxpay-single-unisdk/pom.xml b/daxpay-single/daxpay-single-unisdk/pom.xml index fe0160199..2623bc750 100644 --- a/daxpay-single/daxpay-single-unisdk/pom.xml +++ b/daxpay-single/daxpay-single-unisdk/pom.xml @@ -6,7 +6,7 @@ org.dromara.daxpay daxpay-single - 3.0.0.beta1 + 3.0.0.beta2 daxpay-single-unisdk diff --git a/daxpay-single/pom.xml b/daxpay-single/pom.xml index b8395f391..7589b6f11 100644 --- a/daxpay-single/pom.xml +++ b/daxpay-single/pom.xml @@ -13,7 +13,7 @@ org.dromara.daxpay daxpay-single - 3.0.0.beta1 + 3.0.0.beta2 pom 单商户支付核心功能实现 @@ -33,8 +33,8 @@ 0.2.0 8.5.2 - 3.0.0.beta1 - 3.0.0.beta1 + 3.0.0.beta2 + 3.0.0.beta2 diff --git a/pom.xml b/pom.xml index 79b6b1b51..7b1b17a46 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.dromara.daxpay daxpay - 3.0.0.beta1 + 3.0.0.beta2 pom dax-pay-single From a48e37c7b7f1715a9f6c830098ff1e591e45960d Mon Sep 17 00:00:00 2001 From: DaxPay Date: Fri, 6 Dec 2024 16:46:27 +0800 Subject: [PATCH 12/54] =?UTF-8?q?build=20docker=20=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E9=95=9C=E5=83=8F=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE,=20all?= =?UTF-8?q?=20on=20one=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 12 ++--- _config/mysql/dax-pay-single.sql | 4 +- daxpay-single-server/pom.xml | 25 ++++----- .../org/dromara/daxpay/FrontWebConfig.java | 18 +++++++ .../src/main/resources/application-dev.yml | 22 ++++---- ...cation-demo.yml => application-docker.yml} | 51 +++++++++---------- .../src/main/resources/logback-spring.xml | 16 +++++- .../core/enums/ChannelAuthStatusEnum.java | 2 +- .../daxpay/core/enums/SignTypeEnum.java | 2 +- .../param/checkout/CheckoutCreatParam.java | 7 --- .../checkout/CheckoutAssistService.java | 4 ++ docker-compose.yml | 45 ++++++++++++---- 12 files changed, 129 insertions(+), 79 deletions(-) rename daxpay-single-server/src/main/resources/{application-demo.yml => application-docker.yml} (64%) diff --git a/Dockerfile b/Dockerfile index f75c69b5c..67ce43772 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ -# java8基础镜像 -FROM registry.cn-beijing.aliyuncs.com/xxm1995/java8 +# java21基础镜像 +FROM m.daocloud.io/docker.io/eclipse-temurin:21.0.4_7-jdk-alpine # 作者信息 -MAINTAINER xxm1995@outlook.com +MAINTAINER daxpay@daxpay.cn # 时区设置 ENV TZ=Asia/Shanghai @@ -20,10 +20,10 @@ ENV JAVA_ARGS="" WORKDIR / # 端口暴露 -EXPOSE 9000 +EXPOSE 9999 # 添加执行jar包 -ADD daxpay-single-start/target/daxpay-start.jar dax-start.jar +ADD daxpay-single-start/target/daxpay-server.jar daxpay-server.jar # 执行启动命令 -CMD java $JAVA_OPTS -jar dax-start.jar +CMD java $JAVA_OPTS -jar daxpay-server.jar diff --git a/_config/mysql/dax-pay-single.sql b/_config/mysql/dax-pay-single.sql index e33fe8fb8..150ab3638 100644 --- a/_config/mysql/dax-pay-single.sql +++ b/_config/mysql/dax-pay-single.sql @@ -1532,8 +1532,8 @@ CREATE TABLE `starter_file_platform` ( -- ---------------------------- -- Records of starter_file_platform -- ---------------------------- -INSERT INTO `starter_file_platform` VALUES (1000, 'local', '本地存储', 'http://127.0.0.1:9999', 0, 1811365615815487488, '2024-08-13 12:32:37', 1811365615815487488, '2024-10-06 17:17:39', 0); -INSERT INTO `starter_file_platform` VALUES (2000, 'minio', 'minio存储', 'http://127.0.0.1:9002/daxpay', 1, 1811365615815487488, '2024-08-13 12:32:40', 1811365615815487488, '2024-10-06 17:17:39', 3); +INSERT INTO `starter_file_platform` VALUES (1000, 'local', '本地存储', 'http://127.0.0.1:9999/storage', 1, 1811365615815487488, '2024-08-13 12:32:37', 1811365615815487488, '2024-10-06 17:17:39', 0); +INSERT INTO `starter_file_platform` VALUES (2000, 'minio', 'minio存储', 'http://127.0.0.1:9002/daxpay', 0, 1811365615815487488, '2024-08-13 12:32:40', 1811365615815487488, '2024-10-06 17:17:39', 3); -- ---------------------------- -- Table structure for starter_file_upload_info diff --git a/daxpay-single-server/pom.xml b/daxpay-single-server/pom.xml index f11f49476..35724ce62 100644 --- a/daxpay-single-server/pom.xml +++ b/daxpay-single-server/pom.xml @@ -13,7 +13,7 @@ org.dromara.daxpay daxpay-single-server jar - 3.0.0.beta1 + 3.0.0.beta2 daxpay服务端 @@ -29,8 +29,8 @@ 4.5.0 8.5.2 - 3.0.0.beta1 - 3.0.0.beta1 + 3.0.0.beta2 + 3.0.0.beta2 @@ -64,17 +64,16 @@ - - org.postgresql - postgresql - runtime - + + + + - - - - + + com.mysql + mysql-connector-j + @@ -124,6 +123,8 @@ xls docx doc + ttf + woff diff --git a/daxpay-single-server/src/main/java/org/dromara/daxpay/FrontWebConfig.java b/daxpay-single-server/src/main/java/org/dromara/daxpay/FrontWebConfig.java index 8a66b8aae..c4b341e3a 100644 --- a/daxpay-single-server/src/main/java/org/dromara/daxpay/FrontWebConfig.java +++ b/daxpay-single-server/src/main/java/org/dromara/daxpay/FrontWebConfig.java @@ -3,6 +3,7 @@ package org.dromara.daxpay; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** @@ -15,9 +16,26 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; public class FrontWebConfig implements WebMvcConfigurer { private final FrontH5Interceptor h5Interceptor; private final FrontWebInterceptor webInterceptor; + + /** + * 内嵌服务重定向 + */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(h5Interceptor).addPathPatterns("/h5/**"); registry.addInterceptor(webInterceptor).addPathPatterns("/web/**"); } + + /** + * 重写资源路径配置 (内嵌服务时使用) + */ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + // 移动端网页映射 + registry.addResourceHandler("/h5/**").addResourceLocations("classpath:/static/h5/"); + // 电脑端网页映射 + registry.addResourceHandler("/web/**").addResourceLocations("classpath:/static/web/"); + // 上传文件访问映射 + registry.addResourceHandler("/storage/**").addResourceLocations("file:/data/files/"); + } } diff --git a/daxpay-single-server/src/main/resources/application-dev.yml b/daxpay-single-server/src/main/resources/application-dev.yml index 2071dec59..85ec7c7f3 100644 --- a/daxpay-single-server/src/main/resources/application-dev.yml +++ b/daxpay-single-server/src/main/resources/application-dev.yml @@ -5,15 +5,15 @@ spring: datasource: master: # Postgresql连接 - driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://postgresql:5432/dax-pay-single?serverTimezone=Asia/Shanghai&autoReconnect=true&reWriteBatchedInserts=true - username: bootx - password: bootx123 +# driver-class-name: org.postgresql.Driver +# url: jdbc:postgresql://postgresql:5432/daxpay?serverTimezone=Asia/Shanghai&autoReconnect=true&reWriteBatchedInserts=true +# username: bootx +# password: bootx123 # MySQL连接 -# driver-class-name: com.mysql.cj.jdbc.Driver -# url: jdbc:mysql://mysql/dax-pay-single?serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&nullCatalogMeansCurrent=true -# username: root -# password: root + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://mysql:3306/dax-pay-single?serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true + username: root + password: root hikari: keepalive-time: 300000 data: @@ -55,7 +55,10 @@ bootx-platform: - org.dromara.daxpay starter: auth: + # 是否启用超级管理员登录 enable-admin: true + # 用户管理列表中是否显示超级管理员 + admin-in-list: true ignore-urls: - '/actuator/**' - '/v3/api-docs/**' @@ -71,9 +74,6 @@ bootx-platform: - '/css/**' - '/error' - '/favicon.ico' - file-upload: - # 使用后端代理访问, 线上请使用 Nginx 配置或者直连方式,效率更高 - forward-server-url: http://127.0.0.1:9999 dax-pay: # 推荐只使用字母和数字, 特殊符号会导致部分通道出问题 env: DEV diff --git a/daxpay-single-server/src/main/resources/application-demo.yml b/daxpay-single-server/src/main/resources/application-docker.yml similarity index 64% rename from daxpay-single-server/src/main/resources/application-demo.yml rename to daxpay-single-server/src/main/resources/application-docker.yml index 6a8bd6fb5..67fb89166 100644 --- a/daxpay-single-server/src/main/resources/application-demo.yml +++ b/daxpay-single-server/src/main/resources/application-docker.yml @@ -4,19 +4,19 @@ spring: primary: master datasource: master: - # Postgresql连接 - driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://127.0.0.1:5432/dax-pay-single-demo?serverTimezone=Asia/Shanghai&autoReconnect=true&reWriteBatchedInserts=true - username: bootx - password: bootx123 + # MySQL连接 + driver-class-name: com.mysql.cj.jdbc.Driver + url: ${MYSQL_URL} + username: ${MYSQL_USERNAME} + password: ${MYSQL_PASSWORD} hikari: keepalive-time: 300000 data: redis: - host: 127.0.0.1 - port: 6379 - database: 14 - password: bootx123 + host: ${REDIS_HOST} + port: ${REDIS_PORT} + database: ${REDIS_DATABASE} + password: ${REDIS_PASSWORD} lettuce: pool: max-wait: 1000ms @@ -26,8 +26,8 @@ springdoc: default-flat-param-object: true knife4j: enable: true - # 关闭swagger接口 - production: true + # 为true 关闭swagger接口 + production: ${KNIFE4J_PRODUCTION:false} # 基础脚手架配置 bootx-platform: common: @@ -50,26 +50,32 @@ bootx-platform: starter: auth: # 是否启用超级管理员登录 - enable-admin: false + enable-admin: ${DAXPAY_ENABLE_ADMIN:true} # 用户管理列表中是否显示超级管理员 - admin-in-list: false + admin-in-list: ${DAXPAY_ADMIN-IN-LIST:true} ignore-urls: - '/actuator/**' - - '/swagger-resources/**' - '/token/**' - '/ws/**' + - '/v3/api-docs/**' + - '/doc.html' + - '/swagger-resources/**' - '/webjars/**' + - '/storage/**' - '/web/**' - '/h5/**' - '/css/**' - '/error' - '/favicon.ico' - file-upload: - # 使用后端代理访问, 线上请使用 Nginx 配置或者直连方式,效率更高 - forward-server-url: http://127.0.0.1:9999 + audit-log: + ip2region: + # 默认使用索引模式 + search-type: vector_index + # 文件存储地址 + file-path: /data/ip2region/ip2region.xdb dax-pay: # 推荐只使用字母和数字, 特殊符号会导致部分通道出问题 - env: DEMO + env: DAX machine-no: 70 dromara: # 注意, 不要设置 domain 访问路径, 自行进行拼接访问路径, 来保证可迁移性 @@ -82,12 +88,3 @@ dromara: enable-storage: true base-path: /file/ # 基基础存储路径 前缀和结尾都必须为 / storage-path: /data/files/ # 存储路径, 结尾必须为 / - # 例如 minio地址 http://127.0.0.1:9002 桶名称 daxpay, 拼接后的地址为 http://127.0.0.1:9002/daxpay/ - minio: - - platform: minio - enable-storage: true - access-key: yDAArSoyQAligC2IGf7C - secret-key: vDgpt5R4kR2UCapMzx32Rb6qZegok21dRsU6XJ1j - end-point: http://127.0.0.1:9002 # minio访问地址 - bucket-name: daxpay # 存储桶名称 - base-path: /file/ # 基础存储路径 前缀和结尾都必须为 / diff --git a/daxpay-single-server/src/main/resources/logback-spring.xml b/daxpay-single-server/src/main/resources/logback-spring.xml index 81ddd63ff..d6465fea5 100644 --- a/daxpay-single-server/src/main/resources/logback-spring.xml +++ b/daxpay-single-server/src/main/resources/logback-spring.xml @@ -4,7 +4,6 @@ 默认情况下,Spring Boot 不会 在 jar 文件之外寻找资源。 如果你想使用外部 logback 配置文件,你必须在启动 jar 时传递它的位置:$ java -jar -Dlogging.config=./logback-spring.xml app.jar --> - @@ -18,9 +17,24 @@ + + + ${logdir}/${appname}.log + + ${logdir}/${appname}.log.%d{yyyy-MM-dd}.gz + + 30 + + + UTF-8 + %date{yyyy-MM-dd HH:mm:ssS} | %-5level[%X{traceId:-}] %thread - %logger{36}| %msg%n + + + + diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/ChannelAuthStatusEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/ChannelAuthStatusEnum.java index 725617a72..8f561edb5 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/ChannelAuthStatusEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/ChannelAuthStatusEnum.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * 通道认证状态 + * 认证结果状态 * @author xxm * @since 2024/9/24 */ diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/SignTypeEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/SignTypeEnum.java index 87738c09f..1488a20a9 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/SignTypeEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/SignTypeEnum.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * 支付签名类型 + * 签名类型 * 字典 sign_type * @author xxm * @since 2023/12/24 diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutCreatParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutCreatParam.java index 40590ead1..4ebe77c07 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutCreatParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/checkout/CheckoutCreatParam.java @@ -69,13 +69,6 @@ public class CheckoutCreatParam extends PaymentCommonParam { @Digits(integer = 8, fraction = 2, message = "支付金额精度到分, 且要小于一亿元") private BigDecimal amount; - /** - * 支付扩展参数 - */ - @Schema(description = "支付扩展参数") - @Size(max = 2048, message = "支付扩展参数不可超过2048位") - private String extraParam; - /** 商户扩展参数,回调时会原样返回 */ @Schema(description = "商户扩展参数") @Size(max = 500, message = "商户扩展参数不可超过500位") diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java index c95ebab37..5b1a7e339 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java @@ -127,6 +127,10 @@ public class CheckoutAssistService { .setStatus(PayStatusEnum.WAIT.getCode()) .setRefundStatus(PayRefundStatusEnum.NO_REFUND.getCode()) .setExpiredTime(expiredTime) + .setAttach(checkoutParam.getAttach()) + .setReqTime(checkoutParam.getReqTime()) + .setNotifyUrl(checkoutParam.getNotifyUrl()) + .setReturnUrl(checkoutParam.getReturnUrl()) .setRefundableBalance(checkoutParam.getAmount()); // 如果支持分账, 设置分账状态为待分账 if (order.getAllocation()) { diff --git a/docker-compose.yml b/docker-compose.yml index 60e00e6f6..0b06b78bb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,15 +1,38 @@ version: '3' services: - platform: - image: dax-start:latest + daxpay-single: + image: daxpay/daxpay-single:3.0.0.beta2 restart: always - ports: - - "9000:9000" + # window上不支持host网络模式, 需要更改为 bridge 网络模式, 然后走端口映射 + network_mode: host + # 如果不可以使用host网络模式时使用这个, 此时数据库相关的连接地址将不可以使用 127.0.0.1 +# ports: + # 端口映射 外部端口:容器端口 +# - "9999:9999" + # 读取外部化配置文件(根据实际服务器环境做修改), 宿主机目录:容器目录 volumes: - # 读取外部化配置文件(根据实际服务器环境做修改), 宿主机目录:容器目录 - - ./logs/:/logs # 日志 - - ./files/:/data/files # 上传文件目录 - - ./application.yml:/application.yml # 启动配置文件 - - ./application-demo.yml:/application-demo.yml - - ./logback-spring.xml:/logback-spring.xml # 日志框架配置 - - ./ip2region/ip2region.xdb :/data/ip2region/ip2region.xdb # ip归属地数据库 + # 日志 + - ./data/logs/:/logs + # 上传文件目录 + - ./data/files/:/data/files + environment: + # mysql数据库连接地址 + - MYSQL_URL=jdbc:mysql://127.0.0.1:3306/dax-pay-single?serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true + # mysql数据库账号 + - MYSQL_USERNAME=root + # mysql数据库密码 + - MYSQL_PASSWORD=root + # Redis 连接地址 + - REDIS_HOST=127.0.0.1 + # Redis 端口 + - REDIS_PORT=6379 + # Redis 库号 + - REDIS_DATABASE=5 + # Redis 密码, 如果不设置密码则留空 + - REDIS_PASSWORD=daxpay + # 是否关闭swagger接口 + - KNIFE4J_PRODUCTION=false + # 是否启用超级管理员登录, 正式环境不要开启 + - DAXPAY_ENABLE_ADMIN=true + # 用户管理列表中是否显示超级管理员 + - DAXPAY_ADMIN-IN-LIST=true From a896e5e336e4ed0141ec9851583ee6ab6497f0a0 Mon Sep 17 00:00:00 2001 From: bootx Date: Sun, 8 Dec 2024 10:24:55 +0800 Subject: [PATCH 13/54] =?UTF-8?q?build=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E5=92=8C=E9=85=8D=E7=BD=AE=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config/postgresql/dax-pay-single.sql | 4 ++-- _doc/ChangeLog.md | 2 +- .../channel/union/sdk/api/UnionPayKit.java | 6 ++--- daxpay-single-server/pom.xml | 17 +++++++------- .../src/main/resources/application-dev.yml | 23 ++++++++++--------- .../src/main/resources/application-docker.yml | 3 ++- 6 files changed, 28 insertions(+), 27 deletions(-) diff --git a/_config/postgresql/dax-pay-single.sql b/_config/postgresql/dax-pay-single.sql index d0092cd60..d0076a4b8 100644 --- a/_config/postgresql/dax-pay-single.sql +++ b/_config/postgresql/dax-pay-single.sql @@ -252,7 +252,7 @@ CREATE TABLE "public"."base_param" ( "version" int4 NOT NULL, "deleted" bool NOT NULL, "name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, - "key" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "param_key" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, "value" varchar(500) COLLATE "pg_catalog"."default" NOT NULL, "type" varchar(20) COLLATE "pg_catalog"."default", "enable" bool NOT NULL, @@ -268,7 +268,7 @@ COMMENT ON COLUMN "public"."base_param"."last_modified_time" IS '最后修改时 COMMENT ON COLUMN "public"."base_param"."version" IS '版本号'; COMMENT ON COLUMN "public"."base_param"."deleted" IS '删除标志'; COMMENT ON COLUMN "public"."base_param"."name" IS '参数名称'; -COMMENT ON COLUMN "public"."base_param"."key" IS '参数键名'; +COMMENT ON COLUMN "public"."base_param"."param_key" IS '参数键名'; COMMENT ON COLUMN "public"."base_param"."value" IS '参数值'; COMMENT ON COLUMN "public"."base_param"."type" IS '参数类型'; COMMENT ON COLUMN "public"."base_param"."enable" IS '启用状态'; diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index bb75239f7..f237586d4 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,5 +1,5 @@ # CHANGELOG -## [v3.0.0.beta2] 2024-11-08 +## [v3.0.0.beta2] 2024-12-05 - 新增: 增加PC收银台功能 - 新增: 增加H5收银台功能 - 新增: 增加聚合收银台功能 diff --git a/daxpay-single-channel/daxpay-single-union/src/main/java/org/dromara/daxpay/channel/union/sdk/api/UnionPayKit.java b/daxpay-single-channel/daxpay-single-union/src/main/java/org/dromara/daxpay/channel/union/sdk/api/UnionPayKit.java index 3b791f343..bf0632431 100644 --- a/daxpay-single-channel/daxpay-single-union/src/main/java/org/dromara/daxpay/channel/union/sdk/api/UnionPayKit.java +++ b/daxpay-single-channel/daxpay-single-union/src/main/java/org/dromara/daxpay/channel/union/sdk/api/UnionPayKit.java @@ -238,10 +238,8 @@ public class UnionPayKit extends BasePayService { * @return 具体的时间字符串 */ private String getPayTimeout(Date expirationTime) { - if (null != expirationTime) { - return DateUtil.format(expirationTime, DatePattern.PURE_DATETIME_PATTERN); - } - return DateUtil.format(new Timestamp(System.currentTimeMillis() + 30 * 60 * 1000), DatePattern.PURE_DATETIME_PATTERN); + Date date = Objects.requireNonNullElseGet(expirationTime, () -> new Timestamp(System.currentTimeMillis() + 30 * 60 * 1000)); + return DateUtil.format(date,DatePattern.PURE_DATETIME_PATTERN); } /** diff --git a/daxpay-single-server/pom.xml b/daxpay-single-server/pom.xml index 35724ce62..1bf407ab6 100644 --- a/daxpay-single-server/pom.xml +++ b/daxpay-single-server/pom.xml @@ -64,16 +64,17 @@ - - - - + + org.postgresql + postgresql + runtime + - - com.mysql - mysql-connector-j - + + + + diff --git a/daxpay-single-server/src/main/resources/application-dev.yml b/daxpay-single-server/src/main/resources/application-dev.yml index 85ec7c7f3..0b0aef852 100644 --- a/daxpay-single-server/src/main/resources/application-dev.yml +++ b/daxpay-single-server/src/main/resources/application-dev.yml @@ -5,15 +5,15 @@ spring: datasource: master: # Postgresql连接 -# driver-class-name: org.postgresql.Driver -# url: jdbc:postgresql://postgresql:5432/daxpay?serverTimezone=Asia/Shanghai&autoReconnect=true&reWriteBatchedInserts=true -# username: bootx -# password: bootx123 + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://127.0.0.1:5432/dax-pay-single?serverTimezone=Asia/Shanghai&autoReconnect=true&reWriteBatchedInserts=true + username: bootx + password: bootx123 # MySQL连接 - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://mysql:3306/dax-pay-single?serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true - username: root - password: root +# driver-class-name: com.mysql.cj.jdbc.Driver +# url: jdbc:mysql://127.0.0.1:3306/dax-pay-single?serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true +# username: root +# password: root hikari: keepalive-time: 300000 data: @@ -55,10 +55,7 @@ bootx-platform: - org.dromara.daxpay starter: auth: - # 是否启用超级管理员登录 enable-admin: true - # 用户管理列表中是否显示超级管理员 - admin-in-list: true ignore-urls: - '/actuator/**' - '/v3/api-docs/**' @@ -72,8 +69,12 @@ bootx-platform: - '/web/**' - '/h5/**' - '/css/**' + - '/**' - '/error' - '/favicon.ico' + file-upload: + # 使用后端代理访问, 线上请使用 Nginx 配置或者直连方式,效率更高 + forward-server-url: http://127.0.0.1:9999 dax-pay: # 推荐只使用字母和数字, 特殊符号会导致部分通道出问题 env: DEV diff --git a/daxpay-single-server/src/main/resources/application-docker.yml b/daxpay-single-server/src/main/resources/application-docker.yml index 67fb89166..7ea765c3c 100644 --- a/daxpay-single-server/src/main/resources/application-docker.yml +++ b/daxpay-single-server/src/main/resources/application-docker.yml @@ -25,8 +25,9 @@ springdoc: # 默认展开对象类型的属性, 主要用在get类型的参数中 default-flat-param-object: true knife4j: + # 开启接口文档增强特性 enable: true - # 为true 关闭swagger接口 + # 是否为生产环境, 为true关闭swagger接口 production: ${KNIFE4J_PRODUCTION:false} # 基础脚手架配置 bootx-platform: From 16e05009b84b064101fedf2fe5184c9071e78165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E5=91=80?= Date: Thu, 5 Dec 2024 01:12:25 +0000 Subject: [PATCH 14/54] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=BE=A4=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 喵呀 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 86c3c3c53..fe0a8b81a 100644 --- a/README.md +++ b/README.md @@ -170,9 +170,9 @@ public class PayOrderTest { 扫码加入QQ交流群 -交流二群: 598644350 +交流三群: 879409917

- +

扫码加入钉钉交流群: [加群连接](https://qr.dingtalk.com/action/joingroup?code=v1,k1,AzkcWLa8J/OHXi+nTWwNRc68IAJ0ckWXEEIvrJofq2A=&_dt_no_comment=1&origin=11) From 8c180d6f2a6ffff340403b59de27108669c00830 Mon Sep 17 00:00:00 2001 From: bootx Date: Sun, 8 Dec 2024 22:31:07 +0800 Subject: [PATCH 15/54] =?UTF-8?q?fix=20pg=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=92=8C=E5=AD=97=E6=AE=B5=E4=B8=8EMySQL?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config/postgresql/dax-pay-single.sql | 6 +++--- .../record/callback/TradeCallbackRecordService.java | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/_config/postgresql/dax-pay-single.sql b/_config/postgresql/dax-pay-single.sql index d0076a4b8..129b7d669 100644 --- a/_config/postgresql/dax-pay-single.sql +++ b/_config/postgresql/dax-pay-single.sql @@ -160,7 +160,7 @@ INSERT INTO "public"."base_dict_item" VALUES (1824285656248487936, 1824285303885 INSERT INTO "public"."base_dict_item" VALUES (1824285688691429376, 1824285303885008896, 'pay_method', 'web', 'web支付', 3, 't', '', 1811365615815487488, '2024-08-16 11:22:56.430664', 1811365615815487488, '2024-08-16 11:22:56.431781', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1824285724460453888, 1824285303885008896, 'pay_method', 'qrcode', '扫码支付', 4, 't', '', 1811365615815487488, '2024-08-16 11:23:04.958598', 1811365615815487488, '2024-08-16 11:23:04.95963', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1824285781570097152, 1824285303885008896, 'pay_method', 'barcode', '付款码', 5, 't', '', 1811365615815487488, '2024-08-16 11:23:18.575096', 1811365615815487488, '2024-08-16 11:23:18.576136', 0, 'f'); -INSERT INTO "public"."base_dict_item" VALUES (1824285824247140352, 1824285303885008896, 'pay_method', 'jsapi', '小程序支付', 6, 't', '', 1811365615815487488, '2024-08-16 11:23:28.74936', 1811365615815487488, '2024-08-16 11:23:28.750936', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1824285824247140352, 1824285303885008896, 'pay_method', 'jsapi', 'JSAPI', 6, 't', '', 1811365615815487488, '2024-08-16 11:23:28.74936', 1811365615815487488, '2024-08-16 11:23:28.750936', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1824050709768245248, 1824050661785407488, 'pay_status', 'progress', '支付中', 1, 't', '', 0, '2024-08-15 19:49:13.08964', 0, '2024-08-15 19:49:13.090167', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1824050788306587648, 1824050661785407488, 'pay_status', 'close', '支付关闭', 3, 't', '', 0, '2024-08-15 19:49:31.814754', 0, '2024-08-15 19:49:31.815791', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1824050865460809728, 1824050661785407488, 'pay_status', 'cancel', '支付撤销', 4, 't', '', 0, '2024-08-15 19:49:50.209986', 0, '2024-08-15 19:49:50.211016', 0, 'f'); @@ -219,8 +219,8 @@ INSERT INTO "public"."base_dict_item" VALUES (1843538204528570368, 1843536733108 INSERT INTO "public"."base_dict_item" VALUES (1843538242730291200, 1843536733108006912, 'alloc_relation_type', 'supplier', '供应商', 10, 't', '', 1811365615815487488, '2024-10-08 14:25:43.008972', 1811365615815487488, '2024-10-08 14:25:43.008972', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1843538293854662656, 1843536733108006912, 'alloc_relation_type', 'custom', '自定义', 11, 't', '', 1811365615815487488, '2024-10-08 14:25:55.19713', 1811365615815487488, '2024-10-08 14:25:55.19713', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1825171779002728448, 1825135068277334016, 'transfer_payee_type', 'login_name', '登录账号', 4, 't', '', 1811365615815487488, '2024-08-18 22:03:56.823151', 1811365615815487488, '2024-10-08 17:52:07.717985', 3, 'f'); -INSERT INTO "public"."base_dict_item" VALUES (1840650104185905152, 1840650057641713664, 'cashier_type', 'wechat_pay', '微信收银台', 1, 't', '', 1811365615815487488, '2024-09-30 15:09:17.120403', 1811365615815487488, '2024-09-30 15:09:17.120403', 0, 'f'); -INSERT INTO "public"."base_dict_item" VALUES (1840650136427520000, 1840650057641713664, 'cashier_type', 'alipay', '支付宝收银台', 2, 't', '', 1811365615815487488, '2024-09-30 15:09:24.807694', 1811365615815487488, '2024-09-30 15:09:24.807694', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1840650104185905152, 1840650057641713664, 'cashier_code_type', 'wechat_pay', '微信码牌', 1, 't', '', 1811365615815487488, '2024-09-30 15:09:17.120403', 1811365615815487488, '2024-09-30 15:09:17.120403', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1840650136427520000, 1840650057641713664, 'cashier_code_type', 'alipay', '支付宝码牌', 2, 't', '', 1811365615815487488, '2024-09-30 15:09:24.807694', 1811365615815487488, '2024-09-30 15:09:24.807694', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1825171656562606080, 1825135068277334016, 'transfer_payee_type', 'user_id', '用户ID', 2, 't', '', 1811365615815487488, '2024-08-18 22:03:27.631478', 1811365615815487488, '2024-10-08 17:50:20.130589', 2, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1825171693782859776, 1825135068277334016, 'transfer_payee_type', 'open_id', 'OpenId', 1, 't', '', 1811365615815487488, '2024-08-18 22:03:36.505827', 1811365615815487488, '2024-10-08 17:51:28.00028', 3, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1843536564304048128, 1843536439208931328, 'alloc_receiver_type', 'open_id', 'OpenId', 0, 't', '', 1811365615815487488, '2024-10-08 14:19:02.84085', 1811365615815487488, '2024-10-08 17:51:46.206937', 3, 'f'); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/record/callback/TradeCallbackRecordService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/record/callback/TradeCallbackRecordService.java index 376ce9b31..b3982dc35 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/record/callback/TradeCallbackRecordService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/record/callback/TradeCallbackRecordService.java @@ -5,21 +5,20 @@ import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.util.JsonUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.service.common.context.CallbackLocal; import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.dao.record.callback.TradeCallbackRecordManager; import org.dromara.daxpay.service.entity.record.callback.TradeCallbackRecord; import org.dromara.daxpay.service.param.record.TradeCallbackRecordQuery; import org.dromara.daxpay.service.result.record.callback.TradeCallbackRecordResult; -import cn.hutool.json.JSONUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** - * + * 交易回调记录 * @author xxm * @since 2024/7/22 */ From 69d03944414986324fe8fb70aff57570e0094226 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Mon, 9 Dec 2024 13:49:51 +0800 Subject: [PATCH 16/54] =?UTF-8?q?refactor(daxpay):=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E6=94=B6=E9=93=B6=E5=8F=B0=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starter/auth/exception/RouterCheckException.java | 2 +- .../service/controller/unipay/CheckoutController.java | 6 +++--- .../daxpay/service/service/checkout/CheckoutService.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/exception/RouterCheckException.java b/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/exception/RouterCheckException.java index 09213ee5b..71a367331 100644 --- a/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/exception/RouterCheckException.java +++ b/bootx-platform/bootx-platform-starter/starter-auth/src/main/java/cn/bootx/platform/starter/auth/exception/RouterCheckException.java @@ -11,7 +11,7 @@ import cn.bootx.platform.core.exception.BizInfoException; public class RouterCheckException extends BizInfoException { public RouterCheckException() { - super("没有对应请求路径的权限"); + super("未登录或不拥有改请求路径的请求权限"); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java index fe3751581..e6d8fc97b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CheckoutController.java @@ -39,9 +39,9 @@ public class CheckoutController { @PaymentVerify @Operation(summary = "创建一个收银台链接") - @PostMapping("/creat") - public DaxResult creat(@RequestBody CheckoutCreatParam checkoutParam){ - return DaxRes.ok(checkoutService.creat(checkoutParam)); + @PostMapping("/create") + public DaxResult create(@RequestBody CheckoutCreatParam checkoutParam){ + return DaxRes.ok(checkoutService.create(checkoutParam)); } @Operation(summary = "根据订单号和收银台方式获取收银台链接") diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java index f74c77068..ea2bf25c8 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutService.java @@ -56,7 +56,7 @@ public class CheckoutService { /** * 生成收银台链接 */ - public CheckoutUrlResult creat(CheckoutCreatParam checkoutParam){ + public CheckoutUrlResult create(CheckoutCreatParam checkoutParam){ // 校验支付限额 checkoutAssistService.validationLimitAmount(checkoutParam); // 校验超时时间, 不可早于当前 From 68ec92a00ee59484cebe78b1730301b6bd20e79f Mon Sep 17 00:00:00 2001 From: DaxPay Date: Mon, 9 Dec 2024 19:49:48 +0800 Subject: [PATCH 17/54] =?UTF-8?q?refactor(allocation):=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E5=88=86=E8=B4=A6=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=20-=20=E4=BC=98=E5=8C=96=E5=88=86=E8=B4=A6=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20-=20=E9=87=8D=E5=91=BD=E5=90=8D=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=B1=BB=E5=92=8C=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E5=85=B6=E5=91=BD=E5=90=8D=E6=9B=B4=E5=8A=A0=E6=B8=85=E6=99=B0?= =?UTF-8?q?=E5=92=8C=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 6 +- ...ultEnum.java => AllocationResultEnum.java} | 2 +- ...tusEnum.java => AllocationStatusEnum.java} | 8 +- ...onParam.java => QueryAllocOrderParam.java} | 2 +- .../AllocDetailResult.java | 2 +- .../AllocOrderResult.java} | 16 +-- .../AllocationResult.java} | 8 +- .../{receiver => }/AllocStartResultBo.java | 2 +- .../allocation/AllocController.java | 52 ++++++++ .../allocation/AllocGroupController.java | 10 +- ...troller.java => AllocOrderController.java} | 18 +-- .../allocation/AllocReceiverController.java | 6 +- .../unipay/UniAllocationController.java | 14 +-- .../allocation/AllocConfigConvert.java | 22 ++++ .../convert/allocation/AllocGroupConvert.java | 6 +- .../allocation/AllocGroupReceiverConvert.java | 6 +- .../convert/allocation/AllocOrderConvert.java | 28 +++++ .../allocation/AllocReceiverConvert.java | 4 +- .../allocation/AllocTransactionConvert.java | 22 ---- ...ionManager.java => AllocOrderManager.java} | 18 +-- ...ctionMapper.java => AllocOrderMapper.java} | 4 +- .../service/dao/config/AllocConfigManger.java | 21 +++- .../service/dao/config/AllocConfigMapper.java | 2 +- .../entity/allocation/AllocConfig.java | 46 ++++++++ .../allocation/receiver/AllocGroup.java | 8 +- .../receiver/AllocGroupReceiver.java | 8 +- .../allocation/receiver/AllocReceiver.java | 6 +- ...tionAndDetail.java => AllocAndDetail.java} | 3 +- .../allocation/transaction/AllocDetail.java | 6 +- ...{AllocTransaction.java => AllocOrder.java} | 18 +-- .../service/entity/config/AllocConfig.java | 33 ------ .../param/allocation/AllocConfigParam.java | 34 ++++++ .../result/allocation/AllocConfigResult.java | 27 +++++ .../allocation/order/AllocDetailVo.java | 68 +++++++++++ .../result/allocation/order/AllocOrderVo.java | 111 ++++++++++++++++++ .../receiver/AllocGroupReceiverVo.java} | 4 +- .../allocation/receiver/AllocGroupVo.java} | 4 +- .../allocation/receiver/AllocReceiverVo.java} | 4 +- .../allocation/AllocConfigService.java | 59 ++++++++++ .../service/allocation/AllocationService.java | 76 ++++++------ .../AllocOrderQueryService.java} | 20 ++-- .../AllocOrderService.java} | 38 +++--- .../AllocationAssistService.java} | 20 ++-- .../receiver/AllocGroupService.java | 14 +-- .../receiver/AllocReceiverService.java | 26 ++-- .../service/develop/DevelopTradeService.java | 2 +- .../strategy/AbsAllocationStrategy.java | 8 +- 47 files changed, 663 insertions(+), 259 deletions(-) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/{AllocTransactionResultEnum.java => AllocationResultEnum.java} (91%) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/{AllocTransactionStatusEnum.java => AllocationStatusEnum.java} (68%) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/{QueryAllocTransactionParam.java => QueryAllocOrderParam.java} (88%) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/{transaction => order}/AllocDetailResult.java (96%) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/{transaction/AllocTransactionResult.java => order/AllocOrderResult.java} (84%) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/{transaction/AllocResult.java => order/AllocationResult.java} (74%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/{receiver => }/AllocStartResultBo.java (81%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocController.java rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/{AllocTransactionController.java => AllocOrderController.java} (75%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocConfigConvert.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocTransactionConvert.java rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/{AllocTransactionManager.java => AllocOrderManager.java} (67%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/{AllocTransactionMapper.java => AllocOrderMapper.java} (73%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/{TransactionAndDetail.java => AllocAndDetail.java} (63%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/{AllocTransaction.java => AllocOrder.java} (78%) delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/config/AllocConfig.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/allocation/AllocConfigParam.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/AllocConfigResult.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocDetailVo.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocOrderVo.java rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/{bo/allocation/receiver/AllocGroupReceiverResultBo.java => result/allocation/receiver/AllocGroupReceiverVo.java} (92%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/{bo/allocation/receiver/AllocGroupResultBo.java => result/allocation/receiver/AllocGroupVo.java} (87%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/{bo/allocation/receiver/AllocReceiverResultBo.java => result/allocation/receiver/AllocReceiverVo.java} (92%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/{transaction/AllocQueryService.java => order/AllocOrderQueryService.java} (69%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/{transaction/AllocTransactionService.java => order/AllocOrderService.java} (86%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/{transaction/AllocAssistService.java => order/AllocationAssistService.java} (91%) diff --git a/daxpay-single-server/src/main/resources/application-dev.yml b/daxpay-single-server/src/main/resources/application-dev.yml index 0b0aef852..7aefbf8df 100644 --- a/daxpay-single-server/src/main/resources/application-dev.yml +++ b/daxpay-single-server/src/main/resources/application-dev.yml @@ -6,14 +6,14 @@ spring: master: # Postgresql连接 driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://127.0.0.1:5432/dax-pay-single?serverTimezone=Asia/Shanghai&autoReconnect=true&reWriteBatchedInserts=true + url: jdbc:postgresql://postgresql:5432/dax-pay-single?serverTimezone=Asia/Shanghai&autoReconnect=true&reWriteBatchedInserts=true username: bootx password: bootx123 # MySQL连接 # driver-class-name: com.mysql.cj.jdbc.Driver -# url: jdbc:mysql://127.0.0.1:3306/dax-pay-single?serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true +# url: jdbc:mysql://mysql:3306/dax-pay-single?serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # username: root -# password: root +# password: bootx123 hikari: keepalive-time: 300000 data: diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocTransactionResultEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationResultEnum.java similarity index 91% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocTransactionResultEnum.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationResultEnum.java index df3b7fa1a..2fe616f4c 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocTransactionResultEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationResultEnum.java @@ -10,7 +10,7 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum AllocTransactionResultEnum { +public enum AllocationResultEnum { ALL_PENDING("all_pending", "处理中"), ALL_SUCCESS("all_success", "全部成功"), diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocTransactionStatusEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationStatusEnum.java similarity index 68% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocTransactionStatusEnum.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationStatusEnum.java index f69e0241b..dfb29d127 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocTransactionStatusEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationStatusEnum.java @@ -10,12 +10,12 @@ import lombok.Getter; */ @Getter @AllArgsConstructor -public enum AllocTransactionStatusEnum { +public enum AllocationStatusEnum { - ALLOC_PROCESSING("alloc_processing", "分账处理中"), - ALLOC_END("alloc_end", "分账完成"), + PROCESSING("processing", "分账处理中"), + ALLOC_END("alloc_end", "分账处理完成"), ALLOC_FAILED("alloc_failed", "分账失败"), - FINISH("finish", "完结"), + FINISH("finish", "分账完结"), FINISH_FAILED("finish_failed", "完结失败"), IGNORE("ignore", "忽略"), ; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/QueryAllocTransactionParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/QueryAllocOrderParam.java similarity index 88% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/QueryAllocTransactionParam.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/QueryAllocOrderParam.java index b3a8387e4..0934b643a 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/QueryAllocTransactionParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/QueryAllocOrderParam.java @@ -13,7 +13,7 @@ import org.dromara.daxpay.core.param.PaymentCommonParam; @EqualsAndHashCode(callSuper = true) @Data @Schema(title = "支付订单查询参数") -public class QueryAllocTransactionParam extends PaymentCommonParam { +public class QueryAllocOrderParam extends PaymentCommonParam { @Schema(description = "分账单号") private String allocNo; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/transaction/AllocDetailResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocDetailResult.java similarity index 96% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/transaction/AllocDetailResult.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocDetailResult.java index bba0c56f4..ec3b7c79d 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/transaction/AllocDetailResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocDetailResult.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.core.result.allocation.transaction; +package org.dromara.daxpay.core.result.allocation.order; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/transaction/AllocTransactionResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocOrderResult.java similarity index 84% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/transaction/AllocTransactionResult.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocOrderResult.java index a16bb7b9f..0e3642e96 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/transaction/AllocTransactionResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocOrderResult.java @@ -1,24 +1,24 @@ -package org.dromara.daxpay.core.result.allocation.transaction; +package org.dromara.daxpay.core.result.allocation.order; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; -import org.dromara.daxpay.core.enums.AllocTransactionResultEnum; -import org.dromara.daxpay.core.enums.AllocTransactionStatusEnum; +import org.dromara.daxpay.core.enums.AllocationResultEnum; +import org.dromara.daxpay.core.enums.AllocationStatusEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import java.time.LocalDateTime; import java.util.List; /** - * 分账订单返回结果 + * 分账订单 * @author xxm * @since 2024/5/21 */ @Data @Accessors(chain = true) -@Schema(title = "分账订单返回结果") -public class AllocTransactionResult { +@Schema(title = "分账订单") +public class AllocOrderResult { /** 分账单号 */ @Schema(description = "分账单号") @@ -73,14 +73,14 @@ public class AllocTransactionResult { /** * 状态 - * @see AllocTransactionStatusEnum + * @see AllocationStatusEnum */ @Schema(description = "状态") private String status; /** * 处理结果 - * @see AllocTransactionResultEnum + * @see AllocationResultEnum */ @Schema(description = "处理结果") private String result; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/transaction/AllocResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocationResult.java similarity index 74% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/transaction/AllocResult.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocationResult.java index 4ce8b5bef..308303487 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/transaction/AllocResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocationResult.java @@ -1,9 +1,9 @@ -package org.dromara.daxpay.core.result.allocation.transaction; +package org.dromara.daxpay.core.result.allocation.order; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; -import org.dromara.daxpay.core.enums.AllocTransactionStatusEnum; +import org.dromara.daxpay.core.enums.AllocationStatusEnum; /** * 分账请求结果 @@ -13,7 +13,7 @@ import org.dromara.daxpay.core.enums.AllocTransactionStatusEnum; @Data @Accessors(chain = true) @Schema(title = "分账请求结果") -public class AllocResult { +public class AllocationResult { /** 分账订单号 */ @Schema(description = "分账订单号") private String allocNo; @@ -24,7 +24,7 @@ public class AllocResult { /** * 分账状态 - * @see AllocTransactionStatusEnum + * @see AllocationStatusEnum */ @Schema(description = "分账状态") private String status; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/receiver/AllocStartResultBo.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocStartResultBo.java similarity index 81% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/receiver/AllocStartResultBo.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocStartResultBo.java index cb74da3a1..b245f5599 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/receiver/AllocStartResultBo.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocStartResultBo.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.bo.allocation.receiver; +package org.dromara.daxpay.service.bo.allocation; import lombok.Data; import lombok.experimental.Accessors; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocController.java new file mode 100644 index 000000000..1f9a155c5 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocController.java @@ -0,0 +1,52 @@ +package org.dromara.daxpay.service.controller.allocation; + +import cn.bootx.platform.core.annotation.RequestGroup; +import cn.bootx.platform.core.annotation.RequestPath; +import cn.bootx.platform.core.rest.Res; +import cn.bootx.platform.core.rest.result.Result; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.dromara.daxpay.service.param.allocation.AllocConfigParam; +import org.dromara.daxpay.service.result.allocation.AllocConfigResult; +import org.dromara.daxpay.service.service.allocation.AllocConfigService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 分账配置 + * @author xxm + * @since 2024/12/9 + */ +@Validated +@Tag(name = "分账配置") +@RestController +@RequestGroup(groupCode = "AllocConfig", groupName = "分账配置", moduleCode = "Alloc", moduleName = "分账管理" ) +@RequestMapping("/allocation/config") +@RequiredArgsConstructor +public class AllocController { + private final AllocConfigService allocConfigService; + + @RequestPath("保存") + @Operation(summary = "修改") + @PostMapping("/save") + public Result add(@Validated @RequestBody AllocConfigParam param) { + allocConfigService.save(param); + return Res.ok(); + } + + @RequestPath("修改") + @Operation(summary = "修改") + @PostMapping("/update") + public Result update(@Validated @RequestBody AllocConfigParam param) { + allocConfigService.update(param); + return Res.ok(); + } + + @RequestPath("根据应用ID查询详情") + @Operation(summary = "根据应用ID查询详情") + @GetMapping("/findByAppId") + public Result findByAppId(String appId) { + return Res.ok(allocConfigService.findByAppId(appId)); + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocGroupController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocGroupController.java index 7d45270db..672d3e6a9 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocGroupController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocGroupController.java @@ -10,12 +10,12 @@ import cn.bootx.platform.core.util.ValidationUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocGroupResultBo; +import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupVo; import org.dromara.daxpay.service.param.allocation.group.AllocGroupBindParam; import org.dromara.daxpay.service.param.allocation.group.AllocGroupParam; import org.dromara.daxpay.service.param.allocation.group.AllocGroupQuery; import org.dromara.daxpay.service.param.allocation.group.AllocGroupUnbindParam; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocGroupReceiverResultBo; +import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; import org.dromara.daxpay.service.service.allocation.receiver.AllocGroupService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -40,14 +40,14 @@ public class AllocGroupController { @RequestPath("分页") @Operation(summary = "分页") @GetMapping("/page") - public Result> page(PageParam pageParam, AllocGroupQuery query){ + public Result> page(PageParam pageParam, AllocGroupQuery query){ return Res.ok(allocGroupService.page(pageParam,query)); } @RequestPath("查询详情") @Operation(summary = "查询详情") @GetMapping("/findById") - public Result findById(Long id){ + public Result findById(Long id){ return Res.ok(allocGroupService.findById(id)); } @@ -61,7 +61,7 @@ public class AllocGroupController { @RequestPath("查询分账接收方信息") @Operation(summary = "查询分账接收方信息") @GetMapping("/findReceiversByGroups") - public Result> findReceiversByGroups(Long groupId){ + public Result> findReceiversByGroups(Long groupId){ return Res.ok(allocGroupService.findReceiversByGroups(groupId)); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocTransactionController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java similarity index 75% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocTransactionController.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java index 41bba1691..f57a7c4b5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocTransactionController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java @@ -1,5 +1,6 @@ package org.dromara.daxpay.service.controller.allocation; +import cn.bootx.platform.core.annotation.RequestGroup; import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; @@ -8,11 +9,11 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.dromara.daxpay.core.param.allocation.transaction.AllocFinishParam; -import org.dromara.daxpay.core.result.allocation.transaction.AllocDetailResult; -import org.dromara.daxpay.core.result.allocation.transaction.AllocTransactionResult; +import org.dromara.daxpay.core.result.allocation.order.AllocDetailResult; +import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; import org.dromara.daxpay.service.param.order.allocation.AllocOrderQuery; import org.dromara.daxpay.service.service.allocation.AllocationService; -import org.dromara.daxpay.service.service.allocation.transaction.AllocQueryService; +import org.dromara.daxpay.service.service.allocation.order.AllocOrderQueryService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -27,17 +28,18 @@ import java.util.List; */ @Tag(name = "分账订单控制器") @RestController -@RequestMapping("/allocation/transaction") +@RequestGroup(groupCode = "AllocOrder", groupName = "分账订单", moduleCode = "Alloc", moduleName = "分账管理" ) +@RequestMapping("/allocation/order") @RequiredArgsConstructor -public class AllocTransactionController { +public class AllocOrderController { - private final AllocQueryService queryService; + private final AllocOrderQueryService queryService; private final AllocationService allocationService; @Operation(summary = "分页") @GetMapping("/page") - public Result> page(PageParam pageParam, AllocOrderQuery param){ + public Result> page(PageParam pageParam, AllocOrderQuery param){ return Res.ok(queryService.page(pageParam,param)); } @@ -49,7 +51,7 @@ public class AllocTransactionController { @Operation(summary = "查询详情") @GetMapping("/findById") - public Result findById(Long id){ + public Result findById(Long id){ return Res.ok(queryService.findById(id)); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocReceiverController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocReceiverController.java index 88d91f1f6..1dbd279b2 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocReceiverController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocReceiverController.java @@ -14,7 +14,7 @@ import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverAddParam; import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverRemoveParam; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocReceiverResultBo; +import org.dromara.daxpay.service.result.allocation.receiver.AllocReceiverVo; import org.dromara.daxpay.service.param.allocation.receiver.AllocReceiverQuery; import org.dromara.daxpay.service.service.allocation.receiver.AllocReceiverService; import org.dromara.daxpay.service.service.assist.PaymentAssistService; @@ -42,14 +42,14 @@ public class AllocReceiverController { @RequestPath("分页") @Operation(summary = "分页") @GetMapping("/page") - public Result> page(PageParam pageParam, AllocReceiverQuery query){ + public Result> page(PageParam pageParam, AllocReceiverQuery query){ return Res.ok(receiverService.page(pageParam, query)); } @RequestPath("查询详情") @Operation(summary = "查询详情") @GetMapping("/findById") - public Result findById(Long id){ + public Result findById(Long id){ return Res.ok(receiverService.findById(id)); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java index 817903cf7..7e9f51de2 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java @@ -9,11 +9,11 @@ import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverQueryParam import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverRemoveParam; import org.dromara.daxpay.core.param.allocation.transaction.AllocFinishParam; import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; -import org.dromara.daxpay.core.param.allocation.transaction.QueryAllocTransactionParam; +import org.dromara.daxpay.core.param.allocation.transaction.QueryAllocOrderParam; import org.dromara.daxpay.core.result.DaxResult; +import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; +import org.dromara.daxpay.core.result.allocation.order.AllocationResult; import org.dromara.daxpay.core.result.allocation.receiver.AllocReceiverResult; -import org.dromara.daxpay.core.result.allocation.transaction.AllocResult; -import org.dromara.daxpay.core.result.allocation.transaction.AllocTransactionResult; import org.dromara.daxpay.core.util.DaxRes; import org.dromara.daxpay.service.common.anno.PaymentVerify; import org.dromara.daxpay.service.service.allocation.AllocationService; @@ -40,20 +40,20 @@ public class UniAllocationController { @Operation(summary = "发起分账接口") @PostMapping("/start") - public DaxResult start(@RequestBody AllocationParam param){ + public DaxResult start(@RequestBody AllocationParam param){ return DaxRes.ok(allocationService.allocation(param)); } @Operation(summary = "分账完结接口") @PostMapping("/finish") - public DaxResult finish(AllocFinishParam param){ + public DaxResult finish(AllocFinishParam param){ return DaxRes.ok(allocationService.finish(param)); } @Operation(summary = "分账写你查询接口") @PostMapping("/query") - public DaxResult query(@RequestBody QueryAllocTransactionParam param){ - return DaxRes.ok(allocationService.queryAllocTransaction(param)); + public DaxResult query(@RequestBody QueryAllocOrderParam param){ + return DaxRes.ok(allocationService.queryAllocOrder(param)); } @Operation(summary = "分账接收方查询接口") diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocConfigConvert.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocConfigConvert.java new file mode 100644 index 000000000..e058e5568 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocConfigConvert.java @@ -0,0 +1,22 @@ +package org.dromara.daxpay.service.convert.allocation; + +import org.dromara.daxpay.service.entity.allocation.AllocConfig; +import org.dromara.daxpay.service.param.allocation.AllocConfigParam; +import org.dromara.daxpay.service.result.allocation.AllocConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 分账配置 + * @author xxm + * @since 2024/12/9 + */ +@Mapper +public interface AllocConfigConvert { + + AllocConfigConvert CONVERT = Mappers.getMapper(AllocConfigConvert.class); + + AllocConfigResult toResult(AllocConfig in); + + AllocConfig toEntity(AllocConfigParam in); +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupConvert.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupConvert.java index c597b059f..f475d5942 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupConvert.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupConvert.java @@ -2,7 +2,7 @@ package org.dromara.daxpay.service.convert.allocation; import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroup; import org.dromara.daxpay.service.param.allocation.group.AllocGroupParam; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocGroupResultBo; +import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -15,7 +15,7 @@ import org.mapstruct.factory.Mappers; public interface AllocGroupConvert { AllocGroupConvert CONVERT = Mappers.getMapper(AllocGroupConvert.class); - AllocGroupResultBo convert(AllocGroup in); + AllocGroupVo toVo(AllocGroup in); - AllocGroup convert(AllocGroupParam in); + AllocGroup toEntity(AllocGroupParam in); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupReceiverConvert.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupReceiverConvert.java index 9ea0e4a4c..b00d52d43 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupReceiverConvert.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocGroupReceiverConvert.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.service.convert.allocation; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocGroupReceiverResultBo; +import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroupReceiver; import org.dromara.daxpay.service.param.allocation.group.AllocGroupReceiverParam; import org.mapstruct.Mapper; @@ -15,7 +15,7 @@ import org.mapstruct.factory.Mappers; public interface AllocGroupReceiverConvert { AllocGroupReceiverConvert CONVERT = Mappers.getMapper(AllocGroupReceiverConvert.class); - AllocGroupReceiverResultBo convert(AllocGroupReceiver in); + AllocGroupReceiverVo toVo(AllocGroupReceiver in); - AllocGroupReceiver convert(AllocGroupReceiverParam in); + AllocGroupReceiver toEntity(AllocGroupReceiverParam in); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java new file mode 100644 index 000000000..926ddf66e --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java @@ -0,0 +1,28 @@ +package org.dromara.daxpay.service.convert.allocation; + +import org.dromara.daxpay.core.result.allocation.order.AllocDetailResult; +import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.result.allocation.order.AllocDetailVo; +import org.dromara.daxpay.service.result.allocation.order.AllocOrderVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author xxm + * @since 2024/11/15 + */ +@Mapper +public interface AllocOrderConvert { + AllocOrderConvert CONVERT = Mappers.getMapper(AllocOrderConvert.class); + + AllocOrderResult toResult(AllocOrder in); + + AllocDetailResult toResult(AllocDetail in); + + AllocOrderVo toVo(AllocOrder in); + + AllocDetailVo toVo(AllocDetail in); +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocReceiverConvert.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocReceiverConvert.java index fa1fb6735..19f13f1f3 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocReceiverConvert.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocReceiverConvert.java @@ -2,7 +2,7 @@ package org.dromara.daxpay.service.convert.allocation; import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverAddParam; import org.dromara.daxpay.core.result.allocation.receiver.AllocReceiverResult; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocReceiverResultBo; +import org.dromara.daxpay.service.result.allocation.receiver.AllocReceiverVo; import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -20,7 +20,7 @@ public interface AllocReceiverConvert { AllocReceiver convert(AllocReceiverAddParam in); - AllocReceiverResultBo toBo(AllocReceiver in); + AllocReceiverVo toBo(AllocReceiver in); AllocReceiverResult toResult(AllocReceiver in); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocTransactionConvert.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocTransactionConvert.java deleted file mode 100644 index 098d4afd5..000000000 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocTransactionConvert.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.dromara.daxpay.service.convert.allocation; - -import org.dromara.daxpay.core.result.allocation.transaction.AllocDetailResult; -import org.dromara.daxpay.core.result.allocation.transaction.AllocTransactionResult; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocTransaction; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * - * @author xxm - * @since 2024/11/15 - */ -@Mapper -public interface AllocTransactionConvert { - AllocTransactionConvert CONVERT = Mappers.getMapper(AllocTransactionConvert.class); - - AllocTransactionResult toResult(AllocTransaction in); - - AllocDetailResult toResult(AllocDetail in); -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocTransactionManager.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocOrderManager.java similarity index 67% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocTransactionManager.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocOrderManager.java index a8e47974c..94e1a3089 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocTransactionManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocOrderManager.java @@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocTransaction; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.dromara.daxpay.service.param.order.allocation.AllocOrderQuery; import org.springframework.stereotype.Repository; @@ -23,23 +23,23 @@ import java.util.Optional; @Slf4j @Repository @RequiredArgsConstructor -public class AllocTransactionManager extends BaseManager { +public class AllocOrderManager extends BaseManager { /** * 分页 */ - public Page page(PageParam pageParam, AllocOrderQuery param){ - Page mpPage = MpUtil.getMpPage(pageParam, AllocTransaction.class); - QueryWrapper generator = QueryGenerator.generator(param); + public Page page(PageParam pageParam, AllocOrderQuery param){ + Page mpPage = MpUtil.getMpPage(pageParam, AllocOrder.class); + QueryWrapper generator = QueryGenerator.generator(param); return this.page(mpPage, generator); } /** * 根据商户分账单号查询数据 */ - public Optional findByBizAllocNo(String bizAllocNo, String appId) { + public Optional findByBizAllocNo(String bizAllocNo, String appId) { return lambdaQuery() - .eq(AllocTransaction::getBizAllocNo, bizAllocNo) + .eq(AllocOrder::getBizAllocNo, bizAllocNo) .eq(MchAppBaseEntity::getAppId, appId) .oneOpt(); } @@ -47,9 +47,9 @@ public class AllocTransactionManager extends BaseManager findByAllocNo(String allocNo, String appId) { + public Optional findByAllocNo(String allocNo, String appId) { return lambdaQuery() - .eq(AllocTransaction::getAllocNo, allocNo) + .eq(AllocOrder::getAllocNo, allocNo) .eq(MchAppBaseEntity::getAppId, appId) .oneOpt(); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocTransactionMapper.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocOrderMapper.java similarity index 73% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocTransactionMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocOrderMapper.java index 0f3934147..714b5a540 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocTransactionMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocOrderMapper.java @@ -2,7 +2,7 @@ package org.dromara.daxpay.service.dao.allocation.transaction; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocTransaction; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; /** * @@ -10,5 +10,5 @@ import org.dromara.daxpay.service.entity.allocation.transaction.AllocTransaction * @since 2024/11/14 */ @Mapper -public interface AllocTransactionMapper extends MPJBaseMapper { +public interface AllocOrderMapper extends MPJBaseMapper { } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManger.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManger.java index bbd9eab53..8eff1c12a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManger.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManger.java @@ -3,11 +3,14 @@ package org.dromara.daxpay.service.dao.config; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.service.entity.config.AllocConfig; +import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.springframework.stereotype.Repository; +import java.util.Optional; + /** - * + * 分账配置 * @author xxm * @since 2024/10/6 */ @@ -15,4 +18,18 @@ import org.springframework.stereotype.Repository; @Repository @RequiredArgsConstructor public class AllocConfigManger extends BaseManager { + + /** + * 判断是都已经存在数据 + */ + public boolean existsByAppId(String appId) { + return existedByField(MchAppBaseEntity::getAppId, appId); + } + + /** + * 根据应用ID进行查询 + */ + public Optional findByAppId(String appId) { + return findByField(MchAppBaseEntity::getAppId, appId); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigMapper.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigMapper.java index 743640e8c..fb60cdf3b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigMapper.java @@ -2,7 +2,7 @@ package org.dromara.daxpay.service.dao.config; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; -import org.dromara.daxpay.service.entity.config.AllocConfig; +import org.dromara.daxpay.service.entity.allocation.AllocConfig; /** * diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java new file mode 100644 index 000000000..6ed19b714 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java @@ -0,0 +1,46 @@ +package org.dromara.daxpay.service.entity.allocation; + +import cn.bootx.platform.common.mybatisplus.function.ToResult; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; +import org.dromara.daxpay.service.convert.allocation.AllocConfigConvert; +import org.dromara.daxpay.service.param.allocation.AllocConfigParam; +import org.dromara.daxpay.service.result.allocation.AllocConfigResult; + +import java.math.BigDecimal; + +/** + * 分账配置 + * @author xxm + * @since 2024/10/6 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("pay_alloc_config") +public class AllocConfig extends MchAppBaseEntity implements ToResult { + + /** 是否自动分账 */ + private Boolean autoAlloc; + + /** 分账起始额 */ + private BigDecimal minAmount; + + + /** + * 创建对象 + */ + public static AllocConfig init(AllocConfigParam param) { + return AllocConfigConvert.CONVERT.toEntity(param); + } + /** + * 转换 + */ + @Override + public AllocConfigResult toResult() { + return AllocConfigConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroup.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroup.java index ac1ef3802..d77c78634 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroup.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroup.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocGroupResultBo; +import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupVo; import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; import org.dromara.daxpay.service.convert.allocation.AllocGroupConvert; @@ -22,7 +22,7 @@ import java.math.BigDecimal; @Data @Accessors(chain = true) @TableName("pay_alloc_group") -public class AllocGroup extends MchAppBaseEntity implements ToResult { +public class AllocGroup extends MchAppBaseEntity implements ToResult { /** 分账组编码 */ private String groupNo; @@ -44,7 +44,7 @@ public class AllocGroup extends MchAppBaseEntity implements ToResult { +public class AllocGroupReceiver extends MchAppBaseEntity implements ToResult { /** 分账组ID */ private Long groupId; @@ -32,7 +32,7 @@ public class AllocGroupReceiver extends MchAppBaseEntity implements ToResult { +public class AllocReceiver extends MchAppBaseEntity implements ToResult { /** 分账接收方编号, 需要保证唯一 */ private String receiverNo; @@ -58,7 +58,7 @@ public class AllocReceiver extends MchAppBaseEntity implements ToResult details) {} +public record AllocAndDetail(AllocOrder transaction, List details) {} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java index 90fa9ebfb..e8b766aaa 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java @@ -7,9 +7,9 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.dromara.daxpay.core.enums.AllocDetailResultEnum; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.result.allocation.transaction.AllocDetailResult; +import org.dromara.daxpay.core.result.allocation.order.AllocDetailResult; import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.convert.allocation.AllocTransactionConvert; +import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -72,6 +72,6 @@ public class AllocDetail extends MchAppBaseEntity implements ToResult { +public class AllocOrder extends MchAppBaseEntity implements ToResult { /** 分账单号 */ private String allocNo; @@ -70,13 +70,13 @@ public class AllocTransaction extends MchAppBaseEntity implements ToResult details; + +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/receiver/AllocGroupReceiverResultBo.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupReceiverVo.java similarity index 92% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/receiver/AllocGroupReceiverResultBo.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupReceiverVo.java index a4b7414c7..4a3918f70 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/receiver/AllocGroupReceiverResultBo.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupReceiverVo.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.bo.allocation.receiver; +package org.dromara.daxpay.service.result.allocation.receiver; import cn.bootx.platform.common.jackson.sensitive.SensitiveInfo; import io.swagger.v3.oas.annotations.media.Schema; @@ -19,7 +19,7 @@ import java.math.BigDecimal; @Data @Accessors(chain = true) @Schema(title = "分账组接收方信息") -public class AllocGroupReceiverResultBo extends MchAppResult { +public class AllocGroupReceiverVo extends MchAppResult { @Schema(description = "接收方ID") private Long receiverId; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/receiver/AllocGroupResultBo.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupVo.java similarity index 87% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/receiver/AllocGroupResultBo.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupVo.java index e9dff491a..3d3eec503 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/receiver/AllocGroupResultBo.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupVo.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.bo.allocation.receiver; +package org.dromara.daxpay.service.result.allocation.receiver; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -17,7 +17,7 @@ import java.math.BigDecimal; @Data @Accessors(chain = true) @Schema(title = "分账组") -public class AllocGroupResultBo extends MchAppResult { +public class AllocGroupVo extends MchAppResult { @Schema(description = "分账组编号") private String groupNo; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/receiver/AllocReceiverResultBo.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java similarity index 92% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/receiver/AllocReceiverResultBo.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java index 679a4d054..7774b4169 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/receiver/AllocReceiverResultBo.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.bo.allocation.receiver; +package org.dromara.daxpay.service.result.allocation.receiver; import cn.bootx.platform.common.jackson.sensitive.SensitiveInfo; import io.swagger.v3.oas.annotations.media.Schema; @@ -17,7 +17,7 @@ import org.dromara.daxpay.core.result.MchAppResult; @Data @Accessors(chain = true) @Schema(title = "分账接收方") -public class AllocReceiverResultBo extends MchAppResult { +public class AllocReceiverVo extends MchAppResult { @Schema(description = "接收方编号") private String receiverNo; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java new file mode 100644 index 000000000..bc1bf7505 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java @@ -0,0 +1,59 @@ +package org.dromara.daxpay.service.service.allocation; + +import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.exception.RepetitiveOperationException; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.service.convert.allocation.AllocConfigConvert; +import org.dromara.daxpay.service.dao.config.AllocConfigManger; +import org.dromara.daxpay.service.entity.allocation.AllocConfig; +import org.dromara.daxpay.service.param.allocation.AllocConfigParam; +import org.dromara.daxpay.service.result.allocation.AllocConfigResult; +import org.springframework.stereotype.Service; + +/** + * 分账配置 + * @author xxm + * @since 2024/12/9 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AllocConfigService { + private final AllocConfigManger allocConfigManger; + + /** + * 新增 + */ + public void save(AllocConfigParam param) { + // 判断是否已经存在 + if (allocConfigManger.existsByAppId(param.getAppId())){ + throw new RepetitiveOperationException("该应用已存在收银台配置"); + } + + AllocConfig entity = AllocConfigConvert.CONVERT.toEntity(param); + allocConfigManger.save(entity); + } + + /** + * 修改 + */ + public void update(AllocConfigParam param) { + AllocConfig config = allocConfigManger.findById(param.getId()) + .orElseThrow(() -> new DataNotExistException("分账配置不存在")); + BeanUtil.copyProperties(config, param, CopyOptions.create().ignoreNullValue()); + allocConfigManger.updateById(config); + } + + /** + * 根据AppId查询 + */ + public AllocConfigResult findByAppId(String appId) { + return allocConfigManger.findByAppId(appId).map(AllocConfig::toResult) + .orElse(new AllocConfigResult().setAutoAlloc(false)); + } + + +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java index baf14f918..2e2db8265 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java @@ -6,24 +6,24 @@ import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.core.enums.AllocTransactionResultEnum; -import org.dromara.daxpay.core.enums.AllocTransactionStatusEnum; +import org.dromara.daxpay.core.enums.AllocationResultEnum; +import org.dromara.daxpay.core.enums.AllocationStatusEnum; import org.dromara.daxpay.core.exception.DataErrorException; import org.dromara.daxpay.core.exception.TradeStatusErrorException; import org.dromara.daxpay.core.param.allocation.transaction.AllocFinishParam; import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; -import org.dromara.daxpay.core.param.allocation.transaction.QueryAllocTransactionParam; -import org.dromara.daxpay.core.result.allocation.transaction.AllocResult; -import org.dromara.daxpay.core.result.allocation.transaction.AllocTransactionResult; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocStartResultBo; -import org.dromara.daxpay.service.convert.allocation.AllocTransactionConvert; +import org.dromara.daxpay.core.param.allocation.transaction.QueryAllocOrderParam; +import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; +import org.dromara.daxpay.core.result.allocation.order.AllocationResult; +import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocTransactionManager; +import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocTransaction; -import org.dromara.daxpay.service.entity.allocation.transaction.TransactionAndDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocAndDetail; import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.allocation.transaction.AllocAssistService; +import org.dromara.daxpay.service.service.allocation.order.AllocationAssistService; import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; import org.dromara.daxpay.service.util.PaymentStrategyFactory; import org.springframework.stereotype.Service; @@ -34,8 +34,8 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -import static org.dromara.daxpay.core.enums.AllocTransactionStatusEnum.ALLOC_END; -import static org.dromara.daxpay.core.enums.AllocTransactionStatusEnum.FINISH_FAILED; +import static org.dromara.daxpay.core.enums.AllocationStatusEnum.ALLOC_END; +import static org.dromara.daxpay.core.enums.AllocationStatusEnum.FINISH_FAILED; /** * 分账处理 @@ -47,11 +47,11 @@ import static org.dromara.daxpay.core.enums.AllocTransactionStatusEnum.FINISH_FA @RequiredArgsConstructor public class AllocationService { - private final AllocTransactionManager allocationOrderManager; + private final AllocOrderManager allocationOrderManager; private final AllocDetailManager allocOrderDetailManager; - private final AllocAssistService allocationAssistService; + private final AllocationAssistService allocationAssistService; private final LockTemplate lockTemplate; @@ -59,7 +59,7 @@ public class AllocationService { * 开启分账 多次请求只会分账一次 * 优先级 分账接收方列表 > 分账组编号 > 默认分账组 */ - public AllocResult allocation(AllocationParam param) { + public AllocationResult allocation(AllocationParam param) { // 判断是否已经有分账订单 var allocOrder = allocationOrderManager.findByBizAllocNo(param.getBizAllocNo(), param.getAppId()).orElse(null); if (Objects.nonNull(allocOrder)){ @@ -75,20 +75,20 @@ public class AllocationService { /** * 开启分账 优先级 分账接收方列表 > 分账组编号 > 默认分账组 */ - public AllocResult allocation(AllocationParam param, PayOrder payOrder) { + public AllocationResult allocation(AllocationParam param, PayOrder payOrder) { LockInfo lock = lockTemplate.lock("payment:allocation:" + payOrder.getId(),10000,200); if (Objects.isNull(lock)){ throw new RepetitiveOperationException("分账发起处理中,请勿重复操作"); } try { // 构建分账订单相关信息 - TransactionAndDetail orderAndDetail = allocationAssistService.checkAndCreateAlloc(param, payOrder); + AllocAndDetail orderAndDetail = allocationAssistService.checkAndCreateAlloc(param, payOrder); // 检查是否需要进行分账 var order = orderAndDetail.transaction(); List details = orderAndDetail.details(); // 无需进行分账, - if (Objects.equals(order.getStatus(), AllocTransactionStatusEnum.IGNORE.getCode())){ - return new AllocResult() + if (Objects.equals(order.getStatus(), AllocationStatusEnum.IGNORE.getCode())){ + return new AllocationResult() .setAllocNo(order.getAllocNo()) .setBizAllocNo(order.getBizAllocNo()) .setStatus(order.getStatus()); @@ -102,19 +102,19 @@ public class AllocationService { // 分账处理 AllocStartResultBo result = allocationStrategy.start(); // 执行中 - order.setStatus(AllocTransactionStatusEnum.ALLOC_PROCESSING.getCode()) - .setResult(AllocTransactionResultEnum.ALL_PENDING.getCode()) + order.setStatus(AllocationStatusEnum.PROCESSING.getCode()) + .setResult(AllocationResultEnum.ALL_PENDING.getCode()) .setOutAllocNo(result.getOutAllocNo()) .setErrorMsg(null); } catch (Exception e) { log.error("分账出现错误:", e); // 失败 - order.setStatus(AllocTransactionStatusEnum.ALLOC_FAILED.getCode()) + order.setStatus(AllocationStatusEnum.ALLOC_FAILED.getCode()) .setErrorMsg(e.getMessage()); // TODO 返回异常处理 } allocationOrderManager.updateById(order); - return new AllocResult() + return new AllocationResult() .setAllocNo(order.getAllocNo()) .setBizAllocNo(order.getBizAllocNo()) .setStatus(order.getStatus()); @@ -126,7 +126,7 @@ public class AllocationService { /** * 重新分账 */ - private AllocResult retryAlloc(AllocationParam param, AllocTransaction order){ + private AllocationResult retryAlloc(AllocationParam param, AllocOrder order){ LockInfo lock = lockTemplate.lock("payment:allocation:" + order.getOrderId(),10000,200); if (Objects.isNull(lock)){ throw new RepetitiveOperationException("分账发起处理中,请勿重复操作"); @@ -134,8 +134,8 @@ public class AllocationService { try { // 需要是分账中分账中或者完成状态才能重新分账 List list = Arrays.asList(ALLOC_END.getCode(), - AllocTransactionStatusEnum.ALLOC_FAILED.getCode(), - AllocTransactionStatusEnum.ALLOC_PROCESSING.getCode()); + AllocationStatusEnum.ALLOC_FAILED.getCode(), + AllocationStatusEnum.PROCESSING.getCode()); if (!list.contains(order.getStatus())){ throw new TradeStatusErrorException("分账单状态错误,无法重试"); } @@ -150,16 +150,16 @@ public class AllocationService { try { // 重复分账处理 allocationStrategy.start(); - order.setStatus(AllocTransactionStatusEnum.ALLOC_PROCESSING.getCode()) + order.setStatus(AllocationStatusEnum.PROCESSING.getCode()) .setErrorMsg(null); } catch (Exception e) { log.error("重新分账出现错误:", e); - order.setStatus(AllocTransactionStatusEnum.ALLOC_FAILED.getCode()) + order.setStatus(AllocationStatusEnum.ALLOC_FAILED.getCode()) .setErrorMsg(e.getMessage()); } allocationOrderManager.updateById(order); - return new AllocResult() + return new AllocationResult() .setAllocNo(order.getAllocNo()) .setBizAllocNo(order.getBizAllocNo()) .setStatus(order.getStatus()); @@ -171,8 +171,8 @@ public class AllocationService { /** * 分账完结 */ - public AllocResult finish(AllocFinishParam param) { - AllocTransaction allocOrder; + public AllocationResult finish(AllocFinishParam param) { + AllocOrder allocOrder; if (Objects.nonNull(param.getAllocNo())){ allocOrder = allocationOrderManager.findByAllocNo(param.getAllocNo(), param.getAppId()) .orElseThrow(() -> new DataNotExistException("未查询到分账单信息")); @@ -186,7 +186,7 @@ public class AllocationService { /** * 分账完结 */ - public AllocResult finish(AllocTransaction allocOrder) { + public AllocationResult finish(AllocOrder allocOrder) { // 只有分账结束后才可以完结 if (!Arrays.asList(ALLOC_END.getCode(),FINISH_FAILED.getCode()).contains(allocOrder.getStatus())) { throw new TradeStatusErrorException("分账单状态错误"); @@ -203,7 +203,7 @@ public class AllocationService { // 完结处理 allocationStrategy.finish(); // 完结状态 - allocOrder.setStatus(AllocTransactionStatusEnum.FINISH.getCode()) + allocOrder.setStatus(AllocationStatusEnum.FINISH.getCode()) .setFinishTime(LocalDateTime.now()) .setErrorMsg(null); } catch (Exception e) { @@ -213,7 +213,7 @@ public class AllocationService { .setErrorMsg(e.getMessage()); } allocationOrderManager.updateById(allocOrder); - return new AllocResult() + return new AllocationResult() .setAllocNo(allocOrder.getAllocNo()) .setBizAllocNo(allocOrder.getBizAllocNo()) .setStatus(allocOrder.getStatus()); @@ -223,14 +223,14 @@ public class AllocationService { /** * 查询分账结果 */ - public AllocTransactionResult queryAllocTransaction(QueryAllocTransactionParam param) { + public AllocOrderResult queryAllocOrder(QueryAllocOrderParam param) { // 查询分账单 var allocOrder = allocationOrderManager.findByAllocNo(param.getAllocNo(), param.getAppId()) .orElseThrow(() -> new DataErrorException("分账单不存在")); - var result = AllocTransactionConvert.CONVERT.toResult(allocOrder); + var result = AllocOrderConvert.CONVERT.toResult(allocOrder); // 查询分账单明细 var details = allocOrderDetailManager.findAllByOrderId(allocOrder.getId()).stream() - .map(AllocTransactionConvert.CONVERT::toResult) + .map(AllocOrderConvert.CONVERT::toResult) .collect(Collectors.toList()); result.setDetails(details); return result; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/transaction/AllocQueryService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java similarity index 69% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/transaction/AllocQueryService.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java index 26accb554..684eb239c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/transaction/AllocQueryService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.allocation.transaction; +package org.dromara.daxpay.service.service.allocation.order; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.DataNotExistException; @@ -6,12 +6,12 @@ import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.core.result.allocation.transaction.AllocDetailResult; -import org.dromara.daxpay.core.result.allocation.transaction.AllocTransactionResult; +import org.dromara.daxpay.core.result.allocation.order.AllocDetailResult; +import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocTransactionManager; +import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocTransaction; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.dromara.daxpay.service.param.order.allocation.AllocOrderQuery; import org.springframework.stereotype.Service; @@ -25,24 +25,24 @@ import java.util.List; @Slf4j @Service @RequiredArgsConstructor -public class AllocQueryService { +public class AllocOrderQueryService { private final AllocDetailManager allocOrderDetailManager; - private final AllocTransactionManager allocationOrderManager; + private final AllocOrderManager allocationOrderManager; /** * 分页查询 */ - public PageResult page(PageParam pageParam, AllocOrderQuery param){ + public PageResult page(PageParam pageParam, AllocOrderQuery param){ return MpUtil.toPageResult(allocationOrderManager.page(pageParam, param)); } /** * 查询详情 */ - public AllocTransactionResult findById(Long id) { - return allocationOrderManager.findById(id).map(AllocTransaction::toResult).orElseThrow(() -> new DataNotExistException("分账订单不存在")); + public AllocOrderResult findById(Long id) { + return allocationOrderManager.findById(id).map(AllocOrder::toResult).orElseThrow(() -> new DataNotExistException("分账订单不存在")); } /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/transaction/AllocTransactionService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java similarity index 86% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/transaction/AllocTransactionService.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java index ad5cce38e..c0ecfcf58 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/transaction/AllocTransactionService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.allocation.transaction; +package org.dromara.daxpay.service.service.allocation.order; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.BigDecimalUtil; @@ -6,20 +6,20 @@ import cn.hutool.core.util.IdUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.AllocTransactionResultEnum; -import org.dromara.daxpay.core.enums.AllocTransactionStatusEnum; +import org.dromara.daxpay.core.enums.AllocationResultEnum; +import org.dromara.daxpay.core.enums.AllocationStatusEnum; import org.dromara.daxpay.core.enums.PayAllocStatusEnum; import org.dromara.daxpay.core.param.allocation.transaction.ReceiverParam; import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocGroupReceiverResultBo; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; import org.dromara.daxpay.service.dao.allocation.receiver.AllocReceiverManager; import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocTransactionManager; +import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocTransaction; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.TransactionAndDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocAndDetail; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -39,11 +39,11 @@ import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor -public class AllocTransactionService { +public class AllocOrderService { private final AllocReceiverManager receiverManager; - private final AllocTransactionManager transactionManager; + private final AllocOrderManager transactionManager; private final AllocDetailManager transactionDetailManager; @@ -53,7 +53,7 @@ public class AllocTransactionService { * 生成分账订单, 根据分账组创建 */ @Transactional(rollbackFor = Exception.class) - public TransactionAndDetail createAndUpdate(AllocationParam param, PayOrder payOrder, List receiversByGroups) { + public AllocAndDetail createAndUpdate(AllocationParam param, PayOrder payOrder, List receiversByGroups) { // 订单明细 List details = receiversByGroups.stream() .map(o -> { @@ -88,7 +88,7 @@ public class AllocTransactionService { * 生成分账订单, 通过传入的分账方创建 */ @Transactional(rollbackFor = Exception.class) - public TransactionAndDetail createAndUpdate(AllocationParam param, PayOrder payOrder) { + public AllocAndDetail createAndUpdate(AllocationParam param, PayOrder payOrder) { List receiverNos = param.getReceivers() .stream() .map(ReceiverParam::getReceiverNo) @@ -140,7 +140,7 @@ public class AllocTransactionService { /** * 保存分账相关订单信息 */ - private TransactionAndDetail saveAllocOrder(AllocationParam param, PayOrder payOrder, List details) { + private AllocAndDetail saveAllocOrder(AllocationParam param, PayOrder payOrder, List details) { long allocId = IdUtil.getSnowflakeNextId(); // 分账明细设置ID details.forEach(o -> o.setAllocationId(allocId)); @@ -149,7 +149,7 @@ public class AllocTransactionService { .map(AllocDetail::getAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); // 分账订单 - var allocOrder = new AllocTransaction() + var allocOrder = new AllocOrder() .setOrderId(payOrder.getId()) .setOrderNo(payOrder.getOrderNo()) .setBizOrderNo(payOrder.getBizOrderNo()) @@ -159,17 +159,17 @@ public class AllocTransactionService { .setBizAllocNo(param.getBizAllocNo()) .setChannel(payOrder.getChannel()) .setDescription(param.getDescription()) - .setStatus(AllocTransactionStatusEnum.ALLOC_PROCESSING.getCode()) - .setResult(AllocTransactionResultEnum.ALL_PENDING.getCode()) + .setStatus(AllocationStatusEnum.PROCESSING.getCode()) + .setResult(AllocationResultEnum.ALL_PENDING.getCode()) .setAmount(sumAmount) .setNotifyUrl(param.getNotifyUrl()) .setAttach(param.getAttach()) .setClientIp(param.getClientIp()); // 如果分账订单金额为0, 设置为忽略状态 if (BigDecimalUtil.isEqual(sumAmount, BigDecimal.ZERO)) { - allocOrder.setStatus(AllocTransactionStatusEnum.IGNORE.getCode()) + allocOrder.setStatus(AllocationStatusEnum.IGNORE.getCode()) .setFinishTime(LocalDateTime.now()) - .setResult(AllocTransactionStatusEnum.ALLOC_FAILED.getCode()) + .setResult(AllocationStatusEnum.ALLOC_FAILED.getCode()) .setErrorMsg("分账比例有误或金额太小, 无法进行分账"); } @@ -179,7 +179,7 @@ public class AllocTransactionService { payOrderManager.updateById(payOrder); transactionDetailManager.saveAll(details); transactionManager.save(allocOrder); - return new TransactionAndDetail(allocOrder,details); + return new AllocAndDetail(allocOrder,details); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/transaction/AllocAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocationAssistService.java similarity index 91% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/transaction/AllocAssistService.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocationAssistService.java index da8a1f738..98273ddee 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/transaction/AllocAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocationAssistService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.service.allocation.transaction; +package org.dromara.daxpay.service.service.allocation.order; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.hutool.core.collection.CollUtil; @@ -13,11 +13,11 @@ import org.dromara.daxpay.core.exception.TradeStatusErrorException; import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; import org.dromara.daxpay.service.dao.allocation.receiver.AllocGroupManager; import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocTransactionManager; +import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroup; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocTransaction; -import org.dromara.daxpay.service.entity.allocation.transaction.TransactionAndDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocAndDetail; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.service.allocation.receiver.AllocGroupService; import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; @@ -36,9 +36,9 @@ import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor -public class AllocAssistService { +public class AllocationAssistService { - private final AllocTransactionManager transactionManager; + private final AllocOrderManager transactionManager; private final PayOrderQueryService payOrderQueryService; @@ -46,7 +46,7 @@ public class AllocAssistService { private final AllocGroupService allocationGroupService; - private final AllocTransactionService allocOrderService; + private final AllocOrderService allocOrderService; private final AllocDetailManager allocOrderDetailManager; @@ -55,7 +55,7 @@ public class AllocAssistService { * 根据新传入的分账订单更新订单信息 */ @Transactional(rollbackFor = Exception.class) - public void updateOrder(AllocationParam allocationParam, AllocTransaction orderExtra) { + public void updateOrder(AllocationParam allocationParam, AllocOrder orderExtra) { // 扩展信息 orderExtra.setClientIp(allocationParam.getClientIp()) .setNotifyUrl(allocationParam.getNotifyUrl()) @@ -85,9 +85,9 @@ public class AllocAssistService { /** * 构建分账订单相关信息 */ - public TransactionAndDetail checkAndCreateAlloc(AllocationParam param, PayOrder payOrder){ + public AllocAndDetail checkAndCreateAlloc(AllocationParam param, PayOrder payOrder){ // 创建分账单和明细并保存, 同时更新支付订单状态 使用事务 - TransactionAndDetail orderAndDetail; + AllocAndDetail orderAndDetail; // 判断是否传输了分账接收方列表 if (CollUtil.isNotEmpty(param.getReceivers())) { orderAndDetail = allocOrderService.createAndUpdate(param, payOrder); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocGroupService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocGroupService.java index 6575d671f..40e3a9745 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocGroupService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocGroupService.java @@ -10,7 +10,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocGroupReceiverResultBo; +import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; import org.dromara.daxpay.service.convert.allocation.AllocGroupConvert; import org.dromara.daxpay.service.dao.allocation.receiver.AllocGroupManager; import org.dromara.daxpay.service.dao.allocation.receiver.AllocGroupReceiverManager; @@ -19,7 +19,7 @@ import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroup; import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroupReceiver; import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; import org.dromara.daxpay.service.param.allocation.group.*; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocGroupResultBo; +import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupVo; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -46,21 +46,21 @@ public class AllocGroupService { /** * 分页 */ - public PageResult page(PageParam pageParam, AllocGroupQuery query){ + public PageResult page(PageParam pageParam, AllocGroupQuery query){ return MpUtil.toPageResult(groupManager.page(pageParam, query)); } /** * 查询详情 */ - public AllocGroupResultBo findById(Long id){ + public AllocGroupVo findById(Long id){ return groupManager.findById(id).map(AllocGroup::toResult).orElseThrow(()->new DataNotExistException("分账组不存在")); } /** * 查询分账接收方 */ - public List findReceiversByGroups(Long groupId){ + public List findReceiversByGroups(Long groupId){ List groupReceivers = groupReceiverManager.findByGroupId(groupId); List receiverIds = groupReceivers.stream() .map(AllocGroupReceiver::getReceiverId) @@ -73,7 +73,7 @@ public class AllocGroupService { return groupReceivers.stream() .map(o -> { AllocReceiver receiver = receiverMap.get(o.getReceiverId()); - AllocGroupReceiverResultBo result = new AllocGroupReceiverResultBo() + AllocGroupReceiverVo result = new AllocGroupReceiverVo() .setReceiverId(receiver.getId()) .setReceiverNo(receiver.getReceiverNo()) .setReceiverAccount(receiver.getReceiverAccount()) @@ -92,7 +92,7 @@ public class AllocGroupService { * 创建分账组 */ public void create(AllocGroupParam param){ - AllocGroup group = AllocGroupConvert.CONVERT.convert(param); + AllocGroup group = AllocGroupConvert.CONVERT.toEntity(param); group.setTotalRate(BigDecimal.ZERO); groupManager.save(group); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocReceiverService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocReceiverService.java index aee595fdc..009e4a653 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocReceiverService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocReceiverService.java @@ -1,6 +1,5 @@ package org.dromara.daxpay.service.service.allocation.receiver; -import cn.bootx.platform.baseapi.service.dict.DictionaryItemService; import cn.bootx.platform.common.mybatisplus.util.MpUtil; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.exception.ValidationFailedException; @@ -8,7 +7,6 @@ import cn.bootx.platform.core.rest.dto.LabelValue; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.hutool.core.util.IdUtil; -import cn.hutool.extra.spring.SpringUtil; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import lombok.RequiredArgsConstructor; @@ -20,14 +18,15 @@ import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverAddParam; import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverQueryParam; import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverRemoveParam; import org.dromara.daxpay.core.result.allocation.receiver.AllocReceiverResult; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocReceiverResultBo; import org.dromara.daxpay.service.convert.allocation.AllocReceiverConvert; import org.dromara.daxpay.service.dao.allocation.receiver.AllocGroupReceiverManager; import org.dromara.daxpay.service.dao.allocation.receiver.AllocReceiverManager; +import org.dromara.daxpay.service.dao.constant.ChannelConstManager; import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; +import org.dromara.daxpay.service.entity.constant.ChannelConst; import org.dromara.daxpay.service.param.allocation.receiver.AllocReceiverQuery; +import org.dromara.daxpay.service.result.allocation.receiver.AllocReceiverVo; import org.dromara.daxpay.service.strategy.AbsAllocReceiverStrategy; -import org.dromara.daxpay.service.strategy.PaymentStrategy; import org.dromara.daxpay.service.util.PaymentStrategyFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -50,20 +49,21 @@ public class AllocReceiverService { private final AllocReceiverManager allocReceiverManager; + private final ChannelConstManager channelConstManager; + private final LockTemplate lockTemplate; - private final DictionaryItemService dictionaryItemService; /** * 分页 */ - public PageResult page(PageParam pageParam, AllocReceiverQuery query) { + public PageResult page(PageParam pageParam, AllocReceiverQuery query) { return MpUtil.toPageResult(allocReceiverManager.page(pageParam, query)); } /** * 查询详情 */ - public AllocReceiverResultBo findById(Long id) { + public AllocReceiverVo findById(Long id) { return allocReceiverManager.findById(id) .map(AllocReceiver::toResult) .orElseThrow(() -> new DataNotExistException("分账接收方不存在")); @@ -156,15 +156,9 @@ public class AllocReceiverService { * 可分账的通道列表 */ public List findChannels() { - // 先查询策略, 然后查询通道并进行过滤 - List channelCodes = SpringUtil.getBeansOfType(AbsAllocReceiverStrategy.class) - .values() - .stream() - .map(PaymentStrategy::getChannel) - .toList(); - return dictionaryItemService.findEnableByDictCode("channel").stream() - .filter(item -> channelCodes.contains(item.getCode())) - .map(item -> new LabelValue(item.getName(), item.getCode())) + return channelConstManager.findAllByEnable().stream() + .filter(ChannelConst::isAllocatable) + .map(item->new LabelValue(item.getName(), item.getCode())) .toList(); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/develop/DevelopTradeService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/develop/DevelopTradeService.java index f35594cd4..6608b32ef 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/develop/DevelopTradeService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/develop/DevelopTradeService.java @@ -82,6 +82,6 @@ public class DevelopTradeService { paymentAssistService.initMchApp(param.getAppId()); // 签名校验 paymentAssistService.signVerify(param); - return checkoutService.creat(param); + return checkoutService.create(param); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java index 0f3d2ce12..cf88cbc6d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java @@ -3,9 +3,9 @@ package org.dromara.daxpay.service.strategy; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.service.bo.allocation.receiver.AllocStartResultBo; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocTransaction; +import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import java.util.List; @@ -18,14 +18,14 @@ import java.util.List; @Getter @Setter public abstract class AbsAllocationStrategy implements PaymentStrategy{ - private AllocTransaction transaction; + private AllocOrder transaction; private List details; /** * 初始化参数 */ - public void initParam(AllocTransaction transaction, List details) { + public void initParam(AllocOrder transaction, List details) { this.transaction = transaction; this.details = details; } From 181993c4d31499c03af0824a934a4b356e12cb70 Mon Sep 17 00:00:00 2001 From: bootx Date: Mon, 9 Dec 2024 22:34:15 +0800 Subject: [PATCH 18/54] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9D=E5=88=86=E8=B4=A6=E5=92=8C=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AliPayConfigController.java | 4 +- ...gConvert.java => AliPayConfigConvert.java} | 8 +- .../alipay/entity/config/AliPayConfig.java | 12 +- .../{AlipayParam.java => AliPayParam.java} | 2 +- ...figResult.java => AliPayConfigResult.java} | 2 +- .../allocation/AliPayAllocationService.java | 178 ++++++++++++++++++ .../service/config/AliPayConfigService.java | 8 +- .../alipay/service/pay/AliPayService.java | 8 +- .../strategy/AliAllocationStrategy.java | 46 +++++ ...tegy.java => AliPayReconcileStrategy.java} | 2 +- .../alipay/strategy/AliPayStrategy.java | 8 +- .../WeChatPayAllocationV2Service.java | 16 ++ .../WeChatPayAllocationV3Service.java | 106 +++++++++++ .../WechatPayAllocReceiverV2Service.java | 2 +- .../WechatPayAllocReceiverV3Service.java | 2 +- .../strategy/WechatAllocReceiverStrategy.java | 4 +- .../strategy/WechatAllocationStrategy.java | 49 +++++ .../bo/allocation/AllocStartResultBo.java | 6 + .../strategy/AbsAllocationStrategy.java | 12 +- 19 files changed, 439 insertions(+), 36 deletions(-) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/{AlipayConfigConvert.java => AliPayConfigConvert.java} (67%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/{AlipayParam.java => AliPayParam.java} (97%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/{AlipayConfigResult.java => AliPayConfigResult.java} (98%) create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{AlipayReconcileStrategy.java => AliPayReconcileStrategy.java} (96%) create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/{ => receiver}/WechatPayAllocReceiverV2Service.java (98%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/{ => receiver}/WechatPayAllocReceiverV3Service.java (98%) create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayConfigController.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayConfigController.java index 450ab25c7..8c29fc29d 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayConfigController.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayConfigController.java @@ -9,7 +9,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.dromara.daxpay.channel.alipay.param.config.AliPayConfigParam; -import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; +import org.dromara.daxpay.channel.alipay.result.config.AliPayConfigResult; import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -31,7 +31,7 @@ public class AliPayConfigController { @RequestPath("获取配置") @Operation(summary = "获取配置") @GetMapping("/findById") - public Result findById(@NotNull(message = "ID不可为空") Long id) { + public Result findById(@NotNull(message = "ID不可为空") Long id) { return Res.ok(alipayConfigService.findById(id)); } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AlipayConfigConvert.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AliPayConfigConvert.java similarity index 67% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AlipayConfigConvert.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AliPayConfigConvert.java index 4570571af..1393554e6 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AlipayConfigConvert.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AliPayConfigConvert.java @@ -2,7 +2,7 @@ package org.dromara.daxpay.channel.alipay.convert.config; import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.param.config.AliPayConfigParam; -import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; +import org.dromara.daxpay.channel.alipay.result.config.AliPayConfigResult; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -12,10 +12,10 @@ import org.mapstruct.factory.Mappers; * @since 2024/6/25 */ @Mapper -public interface AlipayConfigConvert { - AlipayConfigConvert CONVERT = Mappers.getMapper(AlipayConfigConvert.class); +public interface AliPayConfigConvert { + AliPayConfigConvert CONVERT = Mappers.getMapper(AliPayConfigConvert.class); - AlipayConfigResult toResult(AliPayConfig in); + AliPayConfigResult toResult(AliPayConfig in); AliPayConfig copy(AliPayConfig in); diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java index 0a4a45fd5..49547766c 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java @@ -3,8 +3,8 @@ package org.dromara.daxpay.channel.alipay.entity.config; import cn.bootx.platform.common.mybatisplus.function.ToResult; import cn.bootx.platform.core.util.JsonUtil; import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.convert.config.AlipayConfigConvert; -import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; +import org.dromara.daxpay.channel.alipay.convert.config.AliPayConfigConvert; +import org.dromara.daxpay.channel.alipay.result.config.AliPayConfigResult; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.entity.config.ChannelConfig; import lombok.Data; @@ -19,7 +19,7 @@ import java.math.BigDecimal; */ @Data @Accessors(chain = true) -public class AliPayConfig implements ToResult { +public class AliPayConfig implements ToResult { /** 主键 */ private Long id; @@ -78,7 +78,7 @@ public class AliPayConfig implements ToResult { channelConfig.setAppId(this.getAppId()); channelConfig.setEnable(this.getEnable()); channelConfig.setChannel(ChannelEnum.ALI.getCode()); - AliPayConfig copy = AlipayConfigConvert.CONVERT.copy(this); + AliPayConfig copy = AliPayConfigConvert.CONVERT.copy(this); // 清空不需要序列化的字段 copy.setId(null).setAppId(null).setEnable(null).setAliAppId(null).setAppId(null); String jsonStr = JsonUtil.toJsonStr(copy); @@ -99,7 +99,7 @@ public class AliPayConfig implements ToResult { } @Override - public AlipayConfigResult toResult() { - return AlipayConfigConvert.CONVERT.toResult(this); + public AliPayConfigResult toResult() { + return AliPayConfigConvert.CONVERT.toResult(this); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AliPayParam.java similarity index 97% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AliPayParam.java index 1f6c1c250..671c42e19 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AliPayParam.java @@ -10,7 +10,7 @@ import lombok.Data; */ @Data @Schema(title = "支付宝支付参数") -public class AlipayParam { +public class AliPayParam { /** * 授权码(主动扫描用户的付款码) */ diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AliPayConfigResult.java similarity index 98% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AliPayConfigResult.java index ed4070179..4622c9407 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AliPayConfigResult.java @@ -16,7 +16,7 @@ import java.math.BigDecimal; @Data @Accessors(chain = true) @Schema(title = "支付宝配置") -public class AlipayConfigResult { +public class AliPayConfigResult { /** 主键 */ @Schema(description = "主键") diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java new file mode 100644 index 000000000..bf53d56ec --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java @@ -0,0 +1,178 @@ +package org.dromara.daxpay.channel.alipay.service.allocation; + +import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; +import cn.hutool.core.util.StrUtil; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayResponse; +import com.alipay.api.domain.AlipayTradeOrderSettleModel; +import com.alipay.api.domain.OpenApiRoyaltyDetailInfoPojo; +import com.alipay.api.domain.SettleExtendParams; +import com.alipay.api.request.AlipayTradeOrderSettleRequest; +import com.alipay.api.response.AlipayTradeOrderSettleResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.alipay.code.AliPayCode; +import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.core.enums.AllocDetailResultEnum; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.springframework.stereotype.Service; + +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 支付宝分账服务 + * @author xxm + * @since 2024/12/9 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AliPayAllocationService { + private final AliPayConfigService aliPayConfigService; + + /** + * 发起分账 + */ + public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails){ + // 分账主体参数 + AlipayTradeOrderSettleModel model = new AlipayTradeOrderSettleModel(); + model.setOutRequestNo(allocOrder.getAllocNo()); + model.setTradeNo(allocOrder.getOutOrderNo()); + model.setRoyaltyMode(AliPayCode.ALLOC_ASYNC); + + // 分账子参数 根据Id排序 + orderDetails.sort(Comparator.comparing(MpIdEntity::getId)); + List royaltyParameters = orderDetails.stream() + .map(o -> { + OpenApiRoyaltyDetailInfoPojo infoPojo = new OpenApiRoyaltyDetailInfoPojo(); + infoPojo.setAmount(PayUtil.toDecimal(o.getAmount()).toPlainString()); + infoPojo.setTransIn(o.getReceiverAccount()); + return infoPojo; + }) + .collect(Collectors.toList()); + model.setRoyaltyParameters(royaltyParameters); + AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); + request.setBizModel(model); + AlipayTradeOrderSettleResponse response = null; + try { + response = aliPayConfigService.execute(request); + this.verifyErrorMsg(response); + } catch (AlipayApiException e) { + log.error("网关返回分账失败: {}", e.getMessage()); + throw new TradeFailException(e.getMessage()); + } + // 需要写入到分账订单中 + String settleNo = response.getSettleNo(); + return new AllocStartResultBo().setOutAllocNo(settleNo); + } + + /** + * 分账完结 + */ + public void finish(AllocOrder allocOrder, List orderDetails){ + // 分账主体参数 + AlipayTradeOrderSettleModel model = new AlipayTradeOrderSettleModel(); + model.setOutRequestNo(String.valueOf(allocOrder.getAllocNo())); + model.setTradeNo(allocOrder.getOutOrderNo()); + model.setRoyaltyMode(AliPayCode.ALLOC_ASYNC); + // 分账完结参数 + SettleExtendParams extendParams = new SettleExtendParams(); + extendParams.setRoyaltyFinish(Boolean.TRUE.toString()); + model.setExtendParams(extendParams); + + // 分账子参数 根据Id排序 + orderDetails.sort(Comparator.comparing(MpIdEntity::getId)); + List royaltyParameters = orderDetails.stream() + .map(o -> { + OpenApiRoyaltyDetailInfoPojo infoPojo = new OpenApiRoyaltyDetailInfoPojo(); + infoPojo.setAmount(PayUtil.toDecimal(o.getAmount()).toPlainString()); + infoPojo.setTransIn(o.getReceiverAccount()); + return infoPojo; + }) + .collect(Collectors.toList()); + model.setRoyaltyParameters(royaltyParameters); + AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); + request.setBizModel(model); + AlipayTradeOrderSettleResponse response = null; + try { + response = aliPayConfigService.execute(request); + } catch (AlipayApiException e) { + log.error("网关返回分账失败: {}", e.getMessage()); + throw new TradeFailException(e.getMessage()); + } + this.verifyErrorMsg(response); + } + + /** + * 分账状态同步 + */ +// @SneakyThrows +// public AllocRemoteSyncResult sync(AllocOrder allocOrder, List allocOrderDetails, AliPayConfig config){ +// AlipayClient alipayClient = aliPayConfigService.getAlipayClient(config); +// AlipayTradeOrderSettleQueryModel model = new AlipayTradeOrderSettleQueryModel(); +// model.setTradeNo(allocOrder.getOutOrderNo()); +// model.setOutRequestNo(allocOrder.getAllocNo()); +// AlipayTradeOrderSettleQueryRequest request = new AlipayTradeOrderSettleQueryRequest(); +// request.setBizModel(model); +// AlipayTradeOrderSettleQueryResponse response = alipayClient.execute(request); +// // 验证 +// this.verifyErrorMsg(response); +// Map detailMap = allocOrderDetails.stream() +// .collect(Collectors.toMap(AllocOrderDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); +// List royaltyDetailList = response.getRoyaltyDetailList(); +// for (RoyaltyDetail receiver : royaltyDetailList) { +// AllocOrderDetail detail = detailMap.get(receiver.getTransIn()); +// if (Objects.nonNull(detail)) { +// detail.setResult(this.getDetailResultEnum(receiver.getState()).getCode()); +// detail.setErrorCode(receiver.getErrorCode()); +// detail.setErrorMsg(receiver.getErrorDesc()); +// // 如果是完成, 更新时间 +// if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ +// LocalDateTime finishTime = LocalDateTimeUtil.of(receiver.getExecuteDt()); +// detail.setFinishTime(finishTime) +// .setErrorMsg(null) +// .setErrorCode(null); +// } +// } +// } +// return new AllocRemoteSyncResult().setSyncInfo(JSONUtil.toJsonStr(response)); +// } + + /** + * 验证错误信息 + */ + private void verifyErrorMsg(AlipayResponse alipayResponse) { + if (alipayResponse.isSuccess()) { + String errorMsg = alipayResponse.getSubMsg(); + if (StrUtil.isBlank(errorMsg)) { + errorMsg = alipayResponse.getMsg(); + } + log.error("分账处理失败 {}", errorMsg); + throw new TradeFailException(errorMsg); + } + } + + /** + * 转换支付宝分账类型到系统中统一的状态 + */ + private AllocDetailResultEnum getDetailResultEnum (String result){ + // 进行中 + if(Objects.equals(AliPayCode.ALLOC_PROCESSING, result)){ + return AllocDetailResultEnum.PENDING; + } + // 成功 + if(Objects.equals(AliPayCode.ALLOC_SUCCESS, result)){ + return AllocDetailResultEnum.SUCCESS; + } + // 失败 + return AllocDetailResultEnum.FAIL; + } + +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AliPayConfigService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AliPayConfigService.java index 98ccca3e0..4ff28398f 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AliPayConfigService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AliPayConfigService.java @@ -12,10 +12,10 @@ import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.convert.config.AlipayConfigConvert; +import org.dromara.daxpay.channel.alipay.convert.config.AliPayConfigConvert; import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; import org.dromara.daxpay.channel.alipay.param.config.AliPayConfigParam; -import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; +import org.dromara.daxpay.channel.alipay.result.config.AliPayConfigResult; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.exception.ChannelNotEnableException; import org.dromara.daxpay.core.exception.ConfigNotEnableException; @@ -48,7 +48,7 @@ public class AliPayConfigService { /** * 查询 */ - public AlipayConfigResult findById(Long id) { + public AliPayConfigResult findById(Long id) { return channelConfigManager.findById(id) .map(AliPayConfig::convertConfig) .map(AliPayConfig::toResult) @@ -71,7 +71,7 @@ public class AliPayConfigService { * 添加 */ public void save(AliPayConfigParam param) { - AliPayConfig entity = AlipayConfigConvert.CONVERT.toEntity(param); + AliPayConfig entity = AliPayConfigConvert.CONVERT.toEntity(param); ChannelConfig channelConfig = entity.toChannelConfig(); // 判断商户应用下是否存在该配置 if (channelConfigManager.existsByAppIdAndChannel(channelConfig.getAppId(), channelConfig.getChannel())){ diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/pay/AliPayService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/pay/AliPayService.java index 62f0c4b04..f254ac26f 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/pay/AliPayService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/pay/AliPayService.java @@ -3,7 +3,7 @@ package org.dromara.daxpay.channel.alipay.service.pay; import cn.bootx.platform.core.util.BigDecimalUtil; import org.dromara.daxpay.channel.alipay.code.AliPayCode; import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; -import org.dromara.daxpay.channel.alipay.param.pay.AlipayParam; +import org.dromara.daxpay.channel.alipay.param.pay.AliPayParam; import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; import org.dromara.daxpay.core.enums.PayMethodEnum; import org.dromara.daxpay.core.exception.AmountExceedLimitException; @@ -57,7 +57,7 @@ public class AliPayService { /** * 调起支付 */ - public PayResultBo pay(PayOrder payOrder, AlipayParam aliPayParam) { + public PayResultBo pay(PayOrder payOrder, AliPayParam aliPayParam) { String amount = PayUtil.toDecimal(payOrder.getAmount()).toString(); String payBody = null; // 异步线程存储 @@ -209,7 +209,7 @@ public class AliPayService { * jsapi支付 */ @SneakyThrows - public String jsapiPay(String amount, PayOrder payOrder, AlipayParam aliPayParam) { + public String jsapiPay(String amount, PayOrder payOrder, AliPayParam aliPayParam) { // 构造请求参数以调用接口 AlipayTradeCreateRequest request = new AlipayTradeCreateRequest(); AlipayTradeCreateModel model = new AlipayTradeCreateModel(); @@ -280,7 +280,7 @@ public class AliPayService { * 付款码支付 */ @SneakyThrows - public void barCode(String amount, PayOrder payOrder, AlipayParam aliPayParam, PayResultBo result) { + public void barCode(String amount, PayOrder payOrder, AliPayParam aliPayParam, PayResultBo result) { AlipayTradePayModel model = new AlipayTradePayModel(); model.setSubject(payOrder.getTitle()); model.setOutTradeNo(payOrder.getOrderNo()); diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java new file mode 100644 index 000000000..9518195b6 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java @@ -0,0 +1,46 @@ +package org.dromara.daxpay.channel.alipay.strategy; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.alipay.service.allocation.AliPayAllocationService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; +import org.springframework.stereotype.Component; + +/** + * 支付宝分账 + * @author xxm + * @since 2024/12/9 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class AliAllocationStrategy extends AbsAllocationStrategy { + + private final AliPayAllocationService aliPayAllocationService; + + /** + * 分账通道 + */ + @Override + public String getChannel() { + return ChannelEnum.ALI.getCode(); + } + + /** + * 开始分账 + */ + @Override + public AllocStartResultBo start() { + return aliPayAllocationService.start(getOrder(), getDetails()); + } + + /** + * 分账完结 + */ + @Override + public void finish() { + aliPayAllocationService.finish(getOrder(), getDetails()); + } +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AlipayReconcileStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayReconcileStrategy.java similarity index 96% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AlipayReconcileStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayReconcileStrategy.java index ea1f8371d..32b0bed27 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AlipayReconcileStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayReconcileStrategy.java @@ -25,7 +25,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Service @Scope(SCOPE_PROTOTYPE) @RequiredArgsConstructor -public class AlipayReconcileStrategy extends AbsReconcileStrategy { +public class AliPayReconcileStrategy extends AbsReconcileStrategy { private final AliPayReconcileService reconcileService; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayStrategy.java index 92ce49faf..4466c6971 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayStrategy.java @@ -2,7 +2,7 @@ package org.dromara.daxpay.channel.alipay.strategy; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.JsonUtil; -import org.dromara.daxpay.channel.alipay.param.pay.AlipayParam; +import org.dromara.daxpay.channel.alipay.param.pay.AliPayParam; import org.dromara.daxpay.channel.alipay.service.pay.AliPayService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.trade.PayResultBo; @@ -27,7 +27,7 @@ public class AliPayStrategy extends AbsPayStrategy { private final AliPayService aliPayService; - private AlipayParam aliPayParam; + private AliPayParam aliPayParam; @Override public String getChannel() { @@ -43,10 +43,10 @@ public class AliPayStrategy extends AbsPayStrategy { // 支付宝参数验证 String channelParam = this.getPayParam().getExtraParam(); if (StrUtil.isNotBlank(channelParam)) { - this.aliPayParam = JsonUtil.toBean(channelParam, AlipayParam.class); + this.aliPayParam = JsonUtil.toBean(channelParam, AliPayParam.class); } else { - this.aliPayParam = new AlipayParam(); + this.aliPayParam = new AliPayParam(); } } catch (JSONException e) { diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java new file mode 100644 index 000000000..4cce6cb38 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java @@ -0,0 +1,16 @@ +package org.dromara.daxpay.channel.wechat.service.allocation; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 微信分账V2版本接口 + * @author xxm + * @since 2024/12/9 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WeChatPayAllocationV2Service { +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java new file mode 100644 index 000000000..b9a1bbb7f --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java @@ -0,0 +1,106 @@ +package org.dromara.daxpay.channel.wechat.service.allocation; + +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeV3Request; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; +import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.ProfitSharingService; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; +import org.dromara.daxpay.core.exception.ConfigErrorException; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.springframework.stereotype.Service; + +import java.util.List; + +import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; +import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; + +/** + * 微信分账V3版本接口 + * @author xxm + * @since 2024/12/9 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WeChatPayAllocationV3Service { + private final WechatPayConfigService wechatPayConfigService; + + /** + * 发起分账 + */ + public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails, WechatPayConfig config){ + + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + + ProfitSharingV3Request request = new ProfitSharingV3Request(); + request.setOutOrderNo(allocOrder.getAllocNo()); + request.setTransactionId(allocOrder.getOutOrderNo()); + request.setUnfreezeUnsplit(true); + + // 分账接收方信息 + var receivers = orderDetails.stream() + .map(o -> { + AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType()); + String receiverType = this.getReceiverType(receiverTypeEnum); + var receiver = new ProfitSharingV3Request.Receiver(); + receiver.setType(receiverType); + receiver.setAmount(PayUtil.convertCentAmount(o.getAmount())); + receiver.setAccount(o.getReceiverAccount()); + receiver.setName(o.getReceiverName()); + receiver.setDescription("订单分账"); + receiver.setRelationType("PARTNER"); + return receiver; + }) + .toList(); + + request.setReceivers(receivers); + try { + ProfitSharingV3Result result = sharingService.profitSharingV3(request); + + return new AllocStartResultBo().setOutAllocNo(result.getOrderId()); + } catch (WxPayException e) { + throw new OperationFailException("微信分账V3失败: "+e.getMessage()); + } + } + + /** + * 分账完结 + */ + public void finish(AllocOrder allocOrder, List orderDetails, WechatPayConfig config){ + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + var request = new ProfitSharingUnfreezeV3Request(); + request.setOutOrderNo(allocOrder.getAllocNo()); + request.setTransactionId(allocOrder.getOutOrderNo()); + request.setDescription("分账完结"); + try { + sharingService.profitSharingUnfreeze(request); + } catch (WxPayException e) { + throw new OperationFailException("微信分账V3失败: "+e.getMessage()); + } + } + + /** + * 获取分账接收方类型编码 + */ + private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ + if (receiverTypeEnum == OPEN_ID){ + return "PERSONAL_OPENID"; + } + if (receiverTypeEnum == MERCHANT_NO){ + return "MERCHANT_ID"; + } + throw new ConfigErrorException("分账接收方类型错误"); + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatPayAllocReceiverV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV2Service.java similarity index 98% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatPayAllocReceiverV2Service.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV2Service.java index ecf76da13..1ab17a34d 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatPayAllocReceiverV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV2Service.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.service.allocation; +package org.dromara.daxpay.channel.wechat.service.allocation.receiver; import com.github.binarywang.wxpay.bean.profitsharing.Receiver; import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverRequest; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatPayAllocReceiverV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV3Service.java similarity index 98% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatPayAllocReceiverV3Service.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV3Service.java index 264a9714b..0b9e9b9e1 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WechatPayAllocReceiverV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV3Service.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.service.allocation; +package org.dromara.daxpay.channel.wechat.service.allocation.receiver; import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverV3Request; import com.github.binarywang.wxpay.exception.WxPayException; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocReceiverStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocReceiverStrategy.java index 7ddc0be9f..a8436e910 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocReceiverStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocReceiverStrategy.java @@ -4,8 +4,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.allocation.WechatPayAllocReceiverV2Service; -import org.dromara.daxpay.channel.wechat.service.allocation.WechatPayAllocReceiverV3Service; +import org.dromara.daxpay.channel.wechat.service.allocation.receiver.WechatPayAllocReceiverV2Service; +import org.dromara.daxpay.channel.wechat.service.allocation.receiver.WechatPayAllocReceiverV3Service; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; import org.dromara.daxpay.core.enums.ChannelEnum; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java new file mode 100644 index 000000000..47e59ae89 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java @@ -0,0 +1,49 @@ +package org.dromara.daxpay.channel.wechat.strategy; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 微信分账策略 + * @author xxm + * @since 2024/12/9 + */ +@Slf4j +@Scope(SCOPE_PROTOTYPE) +@Component +@RequiredArgsConstructor +public class WechatAllocationStrategy extends AbsAllocationStrategy { + + + /** + * 分账通道 + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT.getCode(); + } + + /** + * 开始分账 + */ + @Override + public AllocStartResultBo start() { + return null; + } + + /** + * + */ + @Override + public void finish() { + + } + +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocStartResultBo.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocStartResultBo.java index b245f5599..92c4cb718 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocStartResultBo.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocStartResultBo.java @@ -2,6 +2,7 @@ package org.dromara.daxpay.service.bo.allocation; import lombok.Data; import lombok.experimental.Accessors; +import org.dromara.daxpay.core.enums.AllocationStatusEnum; /** * 分账操作结果 @@ -14,4 +15,9 @@ public class AllocStartResultBo { /** 通道分账号 */ private String outAllocNo; + /** + * 分账状态 + * @see AllocationStatusEnum + */ + private String status; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java index cf88cbc6d..352455b7f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java @@ -18,25 +18,27 @@ import java.util.List; @Getter @Setter public abstract class AbsAllocationStrategy implements PaymentStrategy{ - private AllocOrder transaction; + private AllocOrder order; private List details; /** * 初始化参数 */ - public void initParam(AllocOrder transaction, List details) { - this.transaction = transaction; + public void initParam(AllocOrder order, List details) { + this.order = order; this.details = details; } /** * 操作前处理, 校验和初始化支付配置 */ - public abstract void doBeforeHandler(); + public void doBeforeHandler(){ + + }; /** - * 分账启动 + * 开始分账 */ public abstract AllocStartResultBo start(); From 1096906e15fb8d42792520629dd3221aab2b0fe9 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Tue, 10 Dec 2024 11:09:28 +0800 Subject: [PATCH 19/54] =?UTF-8?q?fix=20SDK=E5=8F=82=E6=95=B0=E5=92=8C?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=AF=B9=E8=B1=A1=E4=B8=8E=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdk/model/trade/pay/PaySyncModel.java | 13 ++++++--- .../model/trade/refund/RefundSyncModel.java | 16 +++++++--- .../trade/transfer/TransferSyncModel.java | 29 +++++++++++++++++++ .../trade/transfer/TransferSyncParam.java | 8 ++--- .../core/result/trade/pay/PaySyncResult.java | 2 +- 5 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/transfer/TransferSyncModel.java diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/pay/PaySyncModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/pay/PaySyncModel.java index 183f4ed6f..f99abccd2 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/pay/PaySyncModel.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/pay/PaySyncModel.java @@ -1,7 +1,7 @@ package org.dromara.daxpay.single.sdk.model.trade.pay; -import org.dromara.daxpay.single.sdk.code.PaySyncStatusEnum; import lombok.Data; +import org.dromara.daxpay.single.sdk.code.PayStatusEnum; /** * 交易同步结果 @@ -12,9 +12,14 @@ import lombok.Data; public class PaySyncModel{ /** - * 同步结果 - * @see PaySyncStatusEnum + * 退款订单同步后的状态状态 + * @see PayStatusEnum */ - private String status; + private String orderStatus; + + /** + * 是否触发了调整 + */ + private boolean adjust; } diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/refund/RefundSyncModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/refund/RefundSyncModel.java index fd282eb14..586c1c96a 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/refund/RefundSyncModel.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/refund/RefundSyncModel.java @@ -1,7 +1,8 @@ package org.dromara.daxpay.single.sdk.model.trade.refund; -import org.dromara.daxpay.single.sdk.code.RefundSyncStatusEnum; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.dromara.daxpay.single.sdk.code.RefundStatusEnum; /** * 交易同步结果 @@ -12,9 +13,16 @@ import lombok.Data; public class RefundSyncModel{ /** - * 同步结果 - * @see RefundSyncStatusEnum + * 退款订单同步后的状态状态 + * @see RefundStatusEnum */ - private String status; + @Schema(description = "同步状态") + private String orderStatus; + + /** + * 是否触发了调整 + */ + @Schema(description = "是否触发了调整") + private boolean adjust; } diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/transfer/TransferSyncModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/transfer/TransferSyncModel.java new file mode 100644 index 000000000..0ce7ad227 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/trade/transfer/TransferSyncModel.java @@ -0,0 +1,29 @@ + +package org.dromara.daxpay.single.sdk.model.trade.transfer; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.dromara.daxpay.single.sdk.code.RefundStatusEnum; + +/** + * 交易同步结果 + * @author xxm + * @since 2023/12/27 + */ +@Data +public class TransferSyncModel { + + /** + * 转账订单同步后的状态状态 + * @see RefundStatusEnum + */ + @Schema(description = "同步状态") + private String orderStatus; + + /** + * 是否触发了调整 + */ + @Schema(description = "是否触发了调整") + private boolean adjust; + +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferSyncParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferSyncParam.java index ce5c2d128..f4937a225 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferSyncParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/trade/transfer/TransferSyncParam.java @@ -4,7 +4,7 @@ import cn.hutool.core.lang.TypeReference; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; -import org.dromara.daxpay.single.sdk.model.trade.refund.RefundSyncModel; +import org.dromara.daxpay.single.sdk.model.trade.transfer.TransferSyncModel; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; import org.dromara.daxpay.single.sdk.util.JsonUtil; @@ -17,7 +17,7 @@ import org.dromara.daxpay.single.sdk.util.JsonUtil; @EqualsAndHashCode(callSuper = true) @Data @Accessors(chain = true) -public class TransferSyncParam extends DaxPayRequest { +public class TransferSyncParam extends DaxPayRequest { /** 商户转账号 */ private String bizTransferNo; @@ -37,7 +37,7 @@ public class TransferSyncParam extends DaxPayRequest { * 将请求返回结果反序列化为实体类 */ @Override - public DaxPayResult toModel(String json) { - return JsonUtil.toBean(json, new TypeReference>() {}); + public DaxPayResult toModel(String json) { + return JsonUtil.toBean(json, new TypeReference>() {}); } } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/trade/pay/PaySyncResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/trade/pay/PaySyncResult.java index 623467a2d..268e271eb 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/trade/pay/PaySyncResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/trade/pay/PaySyncResult.java @@ -16,7 +16,7 @@ import lombok.experimental.Accessors; public class PaySyncResult { /** - * 退款订单同步后的状态状态 + * 订单同步后的状态状态 * @see org.dromara.daxpay.core.enums.PayStatusEnum */ @Schema(description = "同步状态") From 5113993111589c12b19e8afb9217ca3f5453ab1a Mon Sep 17 00:00:00 2001 From: DaxPay Date: Tue, 10 Dec 2024 11:35:49 +0800 Subject: [PATCH 20/54] =?UTF-8?q?fix=20sm3=E7=AD=BE=E5=90=8D=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../daxpay/service/service/assist/PaymentAssistService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/assist/PaymentAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/assist/PaymentAssistService.java index 462d15797..d1cd9ae79 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/assist/PaymentAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/assist/PaymentAssistService.java @@ -94,7 +94,7 @@ public class PaymentAssistService { else if (Objects.equals(SignTypeEnum.MD5.getCode(), signType)){ result.setSign(PaySignUtil.md5Sign(result, mchAppInfo.getSignSecret())); } else if (Objects.equals(SignTypeEnum.SM3.getCode(), signType)){ - result.setSign(PaySignUtil.md5Sign(result, mchAppInfo.getSignSecret())); + result.setSign(PaySignUtil.sm3Sign(result, mchAppInfo.getSignSecret())); } else { throw new ValidationFailedException("未获取到签名方式,请检查"); @@ -113,7 +113,7 @@ public class PaymentAssistService { else if (Objects.equals(SignTypeEnum.MD5.getCode(), signType)){ return PaySignUtil.md5Sign(param, mchAppInfo.getSignSecret()); } else if (Objects.equals(SignTypeEnum.SM3.getCode(), signType)){ - return PaySignUtil.md5Sign(param, mchAppInfo.getSignSecret()); + return PaySignUtil.sm3Sign(param, mchAppInfo.getSignSecret()); } else { throw new ValidationFailedException("未获取到签名方式,请检查"); From 2dfe9574bb609f4ee66bfd545c383c3b4fad9f00 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Tue, 10 Dec 2024 20:53:15 +0800 Subject: [PATCH 21/54] =?UTF-8?q?feat(allocation):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=88=86=E8=B4=A6=E6=8E=A5=E6=94=B6=E6=96=B9=E5=92=8C=E5=88=86?= =?UTF-8?q?=E8=B4=A6=E7=BB=84=E5=8A=9F=E8=83=BD-=20=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=97=B6=EF=BC=8C=E5=88=86=E8=B4=A6=E7=BB=84?= =?UTF-8?q?=E5=92=8C=E6=8E=A5=E6=94=B6=E6=96=B9=E7=BC=96=E5=8F=B7=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 3 +++ .../service/allocation/AliPayAllocationService.java | 8 ++++---- .../wechat/service/pay/WechatPayV2Service.java | 2 ++ .../daxpay/core/enums/AllocationResultEnum.java | 1 + .../daxpay/core/enums/AllocationStatusEnum.java | 1 + .../allocation/receiver/AllocReceiverAddParam.java | 4 ++++ .../controller/allocation/AllocGroupController.java | 7 ------- .../allocation/AllocReceiverController.java | 12 ++---------- .../entity/allocation/receiver/AllocGroup.java | 1 + .../entity/allocation/receiver/AllocReceiver.java | 3 +++ .../entity/allocation/transaction/AllocOrder.java | 2 +- .../allocation/receiver/AllocGroupReceiverVo.java | 3 +++ .../result/allocation/receiver/AllocReceiverVo.java | 3 +++ .../allocation/receiver/AllocGroupService.java | 12 +++++------- .../allocation/receiver/AllocReceiverService.java | 12 ++++++++++++ 15 files changed, 45 insertions(+), 29 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index 0f70f7ac6..03091d6d8 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -12,6 +12,9 @@ - [ ] 分账接口开发 - [ ] 网关配套移动端开发 - [ ] 同步回调页 +- [ ] 分账接收方和分账组优化 + - [ ] 后台管理时, 编号自动生成 + - [ ] 显示数据 - [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 - [x] 支付订单新增待支付状态 ## 3.0.0.beta2 收银台 diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java index bf53d56ec..d9bf9c452 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java @@ -148,11 +148,11 @@ public class AliPayAllocationService { /** * 验证错误信息 */ - private void verifyErrorMsg(AlipayResponse alipayResponse) { - if (alipayResponse.isSuccess()) { - String errorMsg = alipayResponse.getSubMsg(); + private void verifyErrorMsg(AlipayResponse response) { + if (!response.isSuccess()) { + String errorMsg = response.getSubMsg(); if (StrUtil.isBlank(errorMsg)) { - errorMsg = alipayResponse.getMsg(); + errorMsg = response.getMsg(); } log.error("分账处理失败 {}", errorMsg); throw new TradeFailException(errorMsg); diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV2Service.java index 36e2850b7..4bf4e0b83 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV2Service.java @@ -142,6 +142,8 @@ public class WechatPayV2Service { private String qrCodePay(PayOrder payOrder, WechatPayConfig wechatPayConfig) { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); WxPayUnifiedOrderRequest request = this.buildRequest(payOrder); + // NATIVE此参数必传。此id为二维码中包含的商品Id,商户自行定义。 + request.setProductId(payOrder.getOrderNo()); try { var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.NATIVE, request); return result.getCodeUrl(); diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationResultEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationResultEnum.java index 2fe616f4c..7d88671d9 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationResultEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationResultEnum.java @@ -5,6 +5,7 @@ import lombok.Getter; /** * 分账订单处理结果 + * 字典: allocation_result * @author xxm * @since 2024/4/16 */ diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationStatusEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationStatusEnum.java index dfb29d127..851eb7b79 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationStatusEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocationStatusEnum.java @@ -5,6 +5,7 @@ import lombok.Getter; /** * 分账状态枚举 + * 字典 allocation_status * @author xxm * @since 2024/4/7 */ diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverAddParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverAddParam.java index eeb7c64b8..5ef01c570 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverAddParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/receiver/AllocReceiverAddParam.java @@ -28,6 +28,10 @@ public class AllocReceiverAddParam extends PaymentCommonParam { @Size(max = 32, message = "接收者编号不可超过32位") private String receiverNo; + @Schema(description = "接收方名称") + @Size(max = 50, message = "接收方名称不可超过50位") + private String name; + /** * 所属通道 * @see ChannelEnum diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocGroupController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocGroupController.java index 672d3e6a9..722e04f7c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocGroupController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocGroupController.java @@ -51,13 +51,6 @@ public class AllocGroupController { return Res.ok(allocGroupService.findById(id)); } - @RequestPath("编码是否存在") - @Operation(summary = "编码是否存在") - @GetMapping("/existsByGroupNo") - public Result existsByGroupNo(String groupNo, String appId){ - return Res.ok(allocGroupService.existsByGroupNo(groupNo, appId)); - } - @RequestPath("查询分账接收方信息") @Operation(summary = "查询分账接收方信息") @GetMapping("/findReceiversByGroups") diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocReceiverController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocReceiverController.java index 1dbd279b2..13e06c666 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocReceiverController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocReceiverController.java @@ -10,12 +10,11 @@ import cn.bootx.platform.core.rest.result.Result; import cn.bootx.platform.core.util.ValidationUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverAddParam; import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverRemoveParam; -import org.dromara.daxpay.service.result.allocation.receiver.AllocReceiverVo; import org.dromara.daxpay.service.param.allocation.receiver.AllocReceiverQuery; +import org.dromara.daxpay.service.result.allocation.receiver.AllocReceiverVo; import org.dromara.daxpay.service.service.allocation.receiver.AllocReceiverService; import org.dromara.daxpay.service.service.assist.PaymentAssistService; import org.springframework.validation.annotation.Validated; @@ -53,20 +52,13 @@ public class AllocReceiverController { return Res.ok(receiverService.findById(id)); } - @RequestPath("编码是否存在") - @Operation(summary = "编码是否存在") - @GetMapping("/existsByReceiverNo") - public Result existsByReceiverNo(@NotBlank(message = "接收者编号必填") String receiverNo,@NotBlank(message = "商户应用ID必填") String appId){ - return Res.ok(receiverService.existsByReceiverNo(receiverNo, appId)); - } - @RequestPath("添加") @Operation(summary = "添加") @PostMapping("/add") public Result add(@RequestBody AllocReceiverAddParam param){ ValidationUtil.validateParam(param); paymentAssistService.initMchApp(param.getAppId()); - receiverService.addAndSync(param); + receiverService.add(param); return Res.ok(); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroup.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroup.java index d77c78634..6a529f4ef 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroup.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocGroup.java @@ -41,6 +41,7 @@ public class AllocGroup extends MchAppBaseEntity implements ToResult { /** 分账单号 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupReceiverVo.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupReceiverVo.java index 4a3918f70..4945337e4 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupReceiverVo.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocGroupReceiverVo.java @@ -27,6 +27,9 @@ public class AllocGroupReceiverVo extends MchAppResult { @Schema(description = "接收方编号") private String receiverNo; + @Schema(description = "接收方名称") + private String name; + @Schema(description = "分账比例(百分之多少)") private BigDecimal rate; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java index 7774b4169..25790e919 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java @@ -22,6 +22,9 @@ public class AllocReceiverVo extends MchAppResult { @Schema(description = "接收方编号") private String receiverNo; + /** 名称 */ + private String name; + /** * @see ChannelEnum */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocGroupService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocGroupService.java index 40e3a9745..d95036c5a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocGroupService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocGroupService.java @@ -8,6 +8,7 @@ import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.lang.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; @@ -76,6 +77,7 @@ public class AllocGroupService { AllocGroupReceiverVo result = new AllocGroupReceiverVo() .setReceiverId(receiver.getId()) .setReceiverNo(receiver.getReceiverNo()) + .setName(receiver.getName()) .setReceiverAccount(receiver.getReceiverAccount()) .setReceiverName(receiver.getReceiverName()) .setRate(o.getRate()) @@ -92,8 +94,11 @@ public class AllocGroupService { * 创建分账组 */ public void create(AllocGroupParam param){ + String uuid = UUID.fastUUID().toString(true); AllocGroup group = AllocGroupConvert.CONVERT.toEntity(param); group.setTotalRate(BigDecimal.ZERO); + // 默认设置分账组编号 + group.setGroupNo(uuid); groupManager.save(group); } @@ -241,11 +246,4 @@ public class AllocGroupService { groupReceiverManager.updateById(groupReceiver); groupManager.updateById(group); } - - /** - * 判断分账组编号是否存在 - */ - public boolean existsByGroupNo(String groupNo, String appId) { - return groupManager.existedByGroupNo(groupNo, appId); - } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocReceiverService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocReceiverService.java index 009e4a653..202295705 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocReceiverService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/receiver/AllocReceiverService.java @@ -6,6 +6,7 @@ import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.rest.dto.LabelValue; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; +import cn.hutool.core.lang.UUID; import cn.hutool.core.util.IdUtil; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; @@ -86,6 +87,17 @@ public class AllocReceiverService { return new AllocReceiverResult().setReceivers(list); } + /** + * 添加. 通过界面操作 + */ + @Transactional(rollbackFor = Exception.class) + public void add(AllocReceiverAddParam param){ + // 生成编码 + String uuid = UUID.fastUUID().toString(true); + param.setReceiverNo(uuid); + this.addAndSync(param); + } + /** * 添加分账接收方并同步到三方支付系统中 From 8708339502e8222677cb109ed3ae5b38f67be845 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Wed, 11 Dec 2024 18:07:15 +0800 Subject: [PATCH 22/54] =?UTF-8?q?style(allocation):=20=E5=88=86=E8=B4=A6?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=81=94=E8=B0=83=E5=92=8C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/ChangeLog.md | 7 +++++++ .../controller/allocation/AllocOrderController.java | 12 ++++++------ .../entity/allocation/transaction/AllocDetail.java | 8 ++++---- .../entity/allocation/transaction/AllocOrder.java | 8 ++++---- .../allocation/order/AllocOrderQueryService.java | 12 ++++++------ 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index f237586d4..2308272f3 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,4 +1,11 @@ # CHANGELOG +## [v3.0.0.beta3] 2024-12-05 +- 新增: 增加支付宝分账功能 +- 优化: 优化分账 +- fix: 修复微信v2当面付发起失败问题 +- fix sm3签名校验问题 +- fix SDK参数和返回对象与接口不一致修改 + ## [v3.0.0.beta2] 2024-12-05 - 新增: 增加PC收银台功能 - 新增: 增加H5收银台功能 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java index f57a7c4b5..c31705dab 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java @@ -9,9 +9,9 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.dromara.daxpay.core.param.allocation.transaction.AllocFinishParam; -import org.dromara.daxpay.core.result.allocation.order.AllocDetailResult; -import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; import org.dromara.daxpay.service.param.order.allocation.AllocOrderQuery; +import org.dromara.daxpay.service.result.allocation.order.AllocDetailVo; +import org.dromara.daxpay.service.result.allocation.order.AllocOrderVo; import org.dromara.daxpay.service.service.allocation.AllocationService; import org.dromara.daxpay.service.service.allocation.order.AllocOrderQueryService; import org.springframework.web.bind.annotation.GetMapping; @@ -39,25 +39,25 @@ public class AllocOrderController { @Operation(summary = "分页") @GetMapping("/page") - public Result> page(PageParam pageParam, AllocOrderQuery param){ + public Result> page(PageParam pageParam, AllocOrderQuery param){ return Res.ok(queryService.page(pageParam,param)); } @Operation(summary = "分账明细列表") @GetMapping("/detail/findAll") - public Result> findDetailsByOrderId(Long orderId){ + public Result> findDetailsByOrderId(Long orderId){ return Res.ok(queryService.findDetailsByOrderId(orderId)); } @Operation(summary = "查询详情") @GetMapping("/findById") - public Result findById(Long id){ + public Result findById(Long id){ return Res.ok(queryService.findById(id)); } @Operation(summary = "查询明细详情") @GetMapping("/detail/findById") - public Result findDetailById(Long id){ + public Result findDetailById(Long id){ return Res.ok(queryService.findDetailById(id)); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java index e8b766aaa..c85ac7cc9 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java @@ -7,9 +7,9 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.dromara.daxpay.core.enums.AllocDetailResultEnum; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.result.allocation.order.AllocDetailResult; import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; +import org.dromara.daxpay.service.result.allocation.order.AllocDetailVo; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -23,7 +23,7 @@ import java.time.LocalDateTime; @Data @Accessors(chain = true) @TableName("pay_alloc_detail") -public class AllocDetail extends MchAppBaseEntity implements ToResult { +public class AllocDetail extends MchAppBaseEntity implements ToResult { /** 分账订单ID */ private Long allocationId; @@ -71,7 +71,7 @@ public class AllocDetail extends MchAppBaseEntity implements ToResult { +public class AllocOrder extends MchAppBaseEntity implements ToResult { /** 分账单号 */ private String allocNo; @@ -106,7 +106,7 @@ public class AllocOrder extends MchAppBaseEntity implements ToResult page(PageParam pageParam, AllocOrderQuery param){ + public PageResult page(PageParam pageParam, AllocOrderQuery param){ return MpUtil.toPageResult(allocationOrderManager.page(pageParam, param)); } /** * 查询详情 */ - public AllocOrderResult findById(Long id) { + public AllocOrderVo findById(Long id) { return allocationOrderManager.findById(id).map(AllocOrder::toResult).orElseThrow(() -> new DataNotExistException("分账订单不存在")); } /** * 查询订单明细列表 */ - public List findDetailsByOrderId(Long orderId){ + public List findDetailsByOrderId(Long orderId){ return MpUtil.toListResult(allocOrderDetailManager.findAllByOrderId(orderId)); } /** * 查询订单明细详情 */ - public AllocDetailResult findDetailById(Long id){ + public AllocDetailVo findDetailById(Long id){ return allocOrderDetailManager.findById(id).map(AllocDetail::toResult).orElseThrow(() -> new DataNotExistException("分账订单明细不存在")); } From 6229c5a69a6c170fd570a6be777604f040d41020 Mon Sep 17 00:00:00 2001 From: bootx Date: Wed, 11 Dec 2024 23:28:02 +0800 Subject: [PATCH 23/54] =?UTF-8?q?feat:=20=E5=88=86=E8=B4=A6=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=88=9B=E5=BB=BA=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=92=8C=E8=BF=94=E5=9B=9E=E5=AD=97=E6=AE=B5=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/enums/AllocDetailResultEnum.java | 1 + .../allocation/order/AllocDetailResult.java | 7 ++--- .../allocation/AllocOrderController.java | 3 +++ .../allocation/receiver/AllocReceiver.java | 2 ++ .../allocation/order/AllocDetailVo.java | 26 ++++++++++++++++--- .../result/allocation/order/AllocOrderVo.java | 8 ++---- .../allocation/order/AllocOrderService.java | 4 +-- 7 files changed, 36 insertions(+), 15 deletions(-) diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocDetailResultEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocDetailResultEnum.java index 46360a848..93d2368a5 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocDetailResultEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/AllocDetailResultEnum.java @@ -5,6 +5,7 @@ import lombok.Getter; /** * 分账明细处理结果 + * 字典: alloc_detail_result * @author xxm * @since 2024/4/16 */ diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocDetailResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocDetailResult.java index ec3b7c79d..8809c4bbc 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocDetailResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocDetailResult.java @@ -6,6 +6,7 @@ import lombok.experimental.Accessors; import org.dromara.daxpay.core.enums.AllocDetailResultEnum; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; +import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -23,11 +24,11 @@ public class AllocDetailResult { /** 分账金额 */ @Schema(description = "分账金额") - private Integer amount; + private BigDecimal amount; /** 分账比例 */ - @Schema(description = "分账比例(万分之多少)") - private Integer rate; + @Schema(description = "分账比例(百分之多少)") + private BigDecimal rate; /** * 分账接收方类型 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java index c31705dab..9548e80b1 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java @@ -5,6 +5,7 @@ import cn.bootx.platform.core.rest.Res; import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import cn.bootx.platform.core.rest.result.Result; +import com.fhs.core.trans.anno.TransMethodResult; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -43,6 +44,7 @@ public class AllocOrderController { return Res.ok(queryService.page(pageParam,param)); } + @TransMethodResult @Operation(summary = "分账明细列表") @GetMapping("/detail/findAll") public Result> findDetailsByOrderId(Long orderId){ @@ -55,6 +57,7 @@ public class AllocOrderController { return Res.ok(queryService.findById(id)); } + @TransMethodResult @Operation(summary = "查询明细详情") @GetMapping("/detail/findById") public Result findDetailById(Long id){ diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocReceiver.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocReceiver.java index 8b6f3295e..727600f94 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocReceiver.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/receiver/AllocReceiver.java @@ -2,6 +2,7 @@ package org.dromara.daxpay.service.entity.allocation.receiver; import cn.bootx.platform.common.mybatisplus.function.ToResult; import com.baomidou.mybatisplus.annotation.TableName; +import lombok.experimental.FieldNameConstants; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; import org.dromara.daxpay.core.enums.AllocRelationTypeEnum; import org.dromara.daxpay.core.enums.ChannelEnum; @@ -21,6 +22,7 @@ import org.dromara.daxpay.service.result.allocation.receiver.AllocReceiverVo; */ @EqualsAndHashCode(callSuper = true) @Data +@FieldNameConstants @Accessors(chain = true) @TableName("pay_alloc_receiver") public class AllocReceiver extends MchAppBaseEntity implements ToResult { diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocDetailVo.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocDetailVo.java index 23355f495..95e08aeaa 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocDetailVo.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocDetailVo.java @@ -1,13 +1,19 @@ package org.dromara.daxpay.service.result.allocation.order; +import com.fhs.core.trans.anno.Trans; +import com.fhs.core.trans.constant.TransType; +import com.fhs.core.trans.vo.TransPojo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import lombok.experimental.FieldNameConstants; import org.dromara.daxpay.core.enums.AllocDetailResultEnum; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; import org.dromara.daxpay.core.result.MchAppResult; +import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; +import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -17,20 +23,32 @@ import java.time.LocalDateTime; */ @EqualsAndHashCode(callSuper = true) @Data +@FieldNameConstants @Accessors(chain = true) @Schema(title = "分账订单明细") -public class AllocDetailVo extends MchAppResult { +public class AllocDetailVo extends MchAppResult implements TransPojo { + + /** 分账订单ID */ + @Schema(description = "分账订单ID") + private Long allocationId; @Schema(description = "分账接收方编号") private String receiverNo; + @Trans(type = TransType.SIMPLE, target = AllocReceiver.class, fields = AllocReceiver.Fields.name, ref = AllocDetailVo.Fields.name) + @Schema(description = "分账接收方Id") + private Long receiverId; + + @Schema(description = "名称") + private String name; + /** 分账金额 */ @Schema(description = "分账金额") - private Integer amount; + private BigDecimal amount; /** 分账比例 */ - @Schema(description = "分账比例(万分之多少)") - private Integer rate; + @Schema(description = "分账比例(百分之多少)") + private BigDecimal rate; /** * 分账接收方类型 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocOrderVo.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocOrderVo.java index b47495711..1181e60ce 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocOrderVo.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/order/AllocOrderVo.java @@ -9,8 +9,8 @@ import org.dromara.daxpay.core.enums.AllocationStatusEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.result.MchAppResult; +import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.List; /** * 分账订单 @@ -66,7 +66,7 @@ public class AllocOrderVo extends MchAppResult { * 总分账金额 */ @Schema(description = "总分账金额") - private Integer amount; + private BigDecimal amount; /** * 分账描述 @@ -104,8 +104,4 @@ public class AllocOrderVo extends MchAppResult { @Schema(description = "分账订单完成时间") private LocalDateTime finishTime; - /** 分账明细 */ - @Schema(description = "分账明细") - private List details; - } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java index c0ecfcf58..4a191e583 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java @@ -65,10 +65,10 @@ public class AllocOrderService { AllocDetail detail = new AllocDetail() .setReceiverNo(o.getReceiverNo()) - .setReceiverId(o.getId()) + .setReceiverId(o.getReceiverId()) .setAmount(amount) .setResult(AllocDetailResultEnum.PENDING.getCode()) - .setRate(amount) + .setRate(o.getRate()) .setReceiverType(o.getReceiverType()) .setReceiverName(o.getReceiverName()) .setReceiverAccount(o.getReceiverAccount()); From 13c28069ecc0f2ab5979dd269f4c6cd219ad93a2 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Mon, 16 Dec 2024 16:34:45 +0800 Subject: [PATCH 24/54] =?UTF-8?q?feat=20=E5=88=86=E8=B4=A6=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../allocation/AliPayAllocationService.java | 83 ++++---- .../strategy/AliAllocationStrategy.java | 9 + .../strategy/WechatAllocationStrategy.java | 9 + .../daxpay/core/enums/TradeTypeEnum.java | 4 +- .../transaction/AllocSyncParam.java | 26 +++ .../transaction/AllocationParam.java | 24 +++ .../allocation/transaction/ReceiverParam.java | 34 ---- .../result/allocation/AllocSyncResult.java | 16 ++ .../{order => }/AllocationResult.java | 2 +- .../bo/allocation/AllocSyncResultBo.java | 16 ++ .../allocation/AllocOrderController.java | 25 ++- .../unipay/UniAllocationController.java | 16 +- .../service/allocation/AllocationService.java | 49 ++++- .../allocation/AllocationSyncService.java | 187 ++++++++++++++++++ .../order/AllocOrderQueryService.java | 39 ++++ .../allocation/order/AllocOrderService.java | 61 +++++- .../order/AllocationAssistService.java | 124 ------------ .../strategy/AbsAllocationStrategy.java | 7 + 18 files changed, 514 insertions(+), 217 deletions(-) create mode 100644 daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocSyncParam.java delete mode 100644 daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/ReceiverParam.java create mode 100644 daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocSyncResult.java rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/{order => }/AllocationResult.java (92%) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocSyncResultBo.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java delete mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocationAssistService.java diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java index d9bf9c452..dd87dd013 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java @@ -1,29 +1,37 @@ package org.dromara.daxpay.channel.alipay.service.allocation; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; +import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayResponse; -import com.alipay.api.domain.AlipayTradeOrderSettleModel; -import com.alipay.api.domain.OpenApiRoyaltyDetailInfoPojo; -import com.alipay.api.domain.SettleExtendParams; +import com.alipay.api.domain.*; +import com.alipay.api.request.AlipayTradeOrderSettleQueryRequest; import com.alipay.api.request.AlipayTradeOrderSettleRequest; +import com.alipay.api.response.AlipayTradeOrderSettleQueryResponse; import com.alipay.api.response.AlipayTradeOrderSettleResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.alipay.code.AliPayCode; import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; import org.dromara.daxpay.core.enums.AllocDetailResultEnum; +import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -60,7 +68,7 @@ public class AliPayAllocationService { model.setRoyaltyParameters(royaltyParameters); AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); request.setBizModel(model); - AlipayTradeOrderSettleResponse response = null; + AlipayTradeOrderSettleResponse response; try { response = aliPayConfigService.execute(request); this.verifyErrorMsg(response); @@ -79,7 +87,7 @@ public class AliPayAllocationService { public void finish(AllocOrder allocOrder, List orderDetails){ // 分账主体参数 AlipayTradeOrderSettleModel model = new AlipayTradeOrderSettleModel(); - model.setOutRequestNo(String.valueOf(allocOrder.getAllocNo())); + model.setOutRequestNo(allocOrder.getAllocNo()); model.setTradeNo(allocOrder.getOutOrderNo()); model.setRoyaltyMode(AliPayCode.ALLOC_ASYNC); // 分账完结参数 @@ -113,37 +121,40 @@ public class AliPayAllocationService { /** * 分账状态同步 */ -// @SneakyThrows -// public AllocRemoteSyncResult sync(AllocOrder allocOrder, List allocOrderDetails, AliPayConfig config){ -// AlipayClient alipayClient = aliPayConfigService.getAlipayClient(config); -// AlipayTradeOrderSettleQueryModel model = new AlipayTradeOrderSettleQueryModel(); -// model.setTradeNo(allocOrder.getOutOrderNo()); -// model.setOutRequestNo(allocOrder.getAllocNo()); -// AlipayTradeOrderSettleQueryRequest request = new AlipayTradeOrderSettleQueryRequest(); -// request.setBizModel(model); -// AlipayTradeOrderSettleQueryResponse response = alipayClient.execute(request); -// // 验证 -// this.verifyErrorMsg(response); -// Map detailMap = allocOrderDetails.stream() -// .collect(Collectors.toMap(AllocOrderDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); -// List royaltyDetailList = response.getRoyaltyDetailList(); -// for (RoyaltyDetail receiver : royaltyDetailList) { -// AllocOrderDetail detail = detailMap.get(receiver.getTransIn()); -// if (Objects.nonNull(detail)) { -// detail.setResult(this.getDetailResultEnum(receiver.getState()).getCode()); -// detail.setErrorCode(receiver.getErrorCode()); -// detail.setErrorMsg(receiver.getErrorDesc()); -// // 如果是完成, 更新时间 -// if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ -// LocalDateTime finishTime = LocalDateTimeUtil.of(receiver.getExecuteDt()); -// detail.setFinishTime(finishTime) -// .setErrorMsg(null) -// .setErrorCode(null); -// } -// } -// } -// return new AllocRemoteSyncResult().setSyncInfo(JSONUtil.toJsonStr(response)); -// } + public AllocSyncResultBo sync(AllocOrder allocOrder, List allocOrderDetails){ + AlipayTradeOrderSettleQueryModel model = new AlipayTradeOrderSettleQueryModel(); + model.setOutRequestNo(allocOrder.getAllocNo()); + model.setTradeNo(allocOrder.getOutOrderNo()); + AlipayTradeOrderSettleQueryRequest request = new AlipayTradeOrderSettleQueryRequest(); + request.setBizModel(model); + AlipayTradeOrderSettleQueryResponse response; + try { + response = aliPayConfigService.execute(request); + } catch (AlipayApiException e) { + throw new OperationFailException(e.getMessage()); + } + // 验证 + this.verifyErrorMsg(response); + Map detailMap = allocOrderDetails.stream() + .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); + List royaltyDetailList = response.getRoyaltyDetailList(); + for (RoyaltyDetail receiver : royaltyDetailList) { + var detail = detailMap.get(receiver.getTransIn()); + if (Objects.nonNull(detail)) { + detail.setResult(this.getDetailResultEnum(receiver.getState()).getCode()); + detail.setErrorCode(receiver.getErrorCode()); + detail.setErrorMsg(receiver.getErrorDesc()); + // 如果是完成, 更新时间 + if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ + LocalDateTime finishTime = LocalDateTimeUtil.of(receiver.getExecuteDt()); + detail.setFinishTime(finishTime) + .setErrorMsg(null) + .setErrorCode(null); + } + } + } + return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(response)); + } /** * 验证错误信息 diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java index 9518195b6..34b9fbdbf 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java @@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.alipay.service.allocation.AliPayAllocationService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; import org.springframework.stereotype.Component; @@ -43,4 +44,12 @@ public class AliAllocationStrategy extends AbsAllocationStrategy { public void finish() { aliPayAllocationService.finish(getOrder(), getDetails()); } + + /** + * 同步状态 + */ + @Override + public AllocSyncResultBo doSync() { + return aliPayAllocationService.sync(getOrder(), getDetails()); + } } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java index 47e59ae89..ebe433442 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java @@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -46,4 +47,12 @@ public class WechatAllocationStrategy extends AbsAllocationStrategy { } + /** + * 同步状态 + */ + @Override + public AllocSyncResultBo doSync() { + return null; + } + } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/TradeTypeEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/TradeTypeEnum.java index 6a35ac397..9f9198c05 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/TradeTypeEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/TradeTypeEnum.java @@ -18,7 +18,9 @@ public enum TradeTypeEnum { PAY("pay","支付"), REFUND("refund","退款"), - TRANSFER("transfer","转账"),; + TRANSFER("transfer","转账"), + ALLOCATION("allocation","分账"), + ; private final String code; private final String name; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocSyncParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocSyncParam.java new file mode 100644 index 000000000..8b83a0fcb --- /dev/null +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocSyncParam.java @@ -0,0 +1,26 @@ +package org.dromara.daxpay.core.param.allocation.transaction; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.daxpay.core.param.PaymentCommonParam; + +/** + * 分账同步请求参数 + * @author xxm + * @since 2024/4/12 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Schema(title = "分账同步请求参数") +public class AllocSyncParam extends PaymentCommonParam { + + @Schema(description = "分账号") + @Size(max = 32, message = "分账号不可超过32位") + private String allocNo; + + @Schema(description = "商户分账号") + @Size(max = 100, message = "商户分账号不可超过100位") + private String bizAllocNo; +} diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocationParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocationParam.java index f195314eb..b2c9afeb4 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocationParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocationParam.java @@ -2,13 +2,16 @@ package org.dromara.daxpay.core.param.allocation.transaction; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; +import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.dromara.daxpay.core.param.PaymentCommonParam; +import java.math.BigDecimal; import java.util.List; /** @@ -64,4 +67,25 @@ public class AllocationParam extends PaymentCommonParam { @Schema(description = "商户扩展参数") private String attach; + /** + * 分账接收方列表 + */ + @Data + @Accessors(chain = true) + @Schema(title = "分账接收方列表") + public static class ReceiverParam { + + /** 分账接收方编号 */ + @Schema(description = "分账接收方编号") + @NotBlank(message = "分账接收方编号必填") + @Size(max = 32, message = "分账接收方编号不可超过32位") + private String receiverNo; + + /** 分账金额 */ + @Schema(description = "分账金额") + @NotNull(message = "分账金额必填") + @Min(value = 1,message = "分账金额至少为0.01元") + private BigDecimal amount; + } + } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/ReceiverParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/ReceiverParam.java deleted file mode 100644 index 70510480e..000000000 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/ReceiverParam.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.dromara.daxpay.core.param.allocation.transaction; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 分账接收方列表 - * @author xxm - * @since 2024/5/21 - */ -@Data -@Accessors(chain = true) -@Schema(title = "分账接收方列表") -public class ReceiverParam { - - /** 分账接收方编号 */ - @Schema(description = "分账接收方编号") - @NotBlank(message = "分账接收方编号必填") - @Size(max = 32, message = "分账接收方编号不可超过32位") - private String receiverNo; - - /** 分账金额 */ - @Schema(description = "分账金额") - @NotNull(message = "分账金额必填") - @Min(value = 1,message = "分账金额至少为0.01元") - private BigDecimal amount; -} diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocSyncResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocSyncResult.java new file mode 100644 index 000000000..5d4d102af --- /dev/null +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocSyncResult.java @@ -0,0 +1,16 @@ +package org.dromara.daxpay.core.result.allocation; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 分账同步接口返回类 + * @author xxm + * @since 2024/5/20 + */ +@Data +@Accessors(chain = true) +@Schema(title = "分账同步接口") +public class AllocSyncResult { +} diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocationResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocationResult.java similarity index 92% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocationResult.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocationResult.java index 308303487..80a8f3901 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocationResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocationResult.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.core.result.allocation.order; +package org.dromara.daxpay.core.result.allocation; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocSyncResultBo.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocSyncResultBo.java new file mode 100644 index 000000000..cedc0fc17 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/bo/allocation/AllocSyncResultBo.java @@ -0,0 +1,16 @@ +package org.dromara.daxpay.service.bo.allocation; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 分账同步结果 + * @author xxm + * @since 2024/5/23 + */ +@Data +@Accessors(chain = true) +public class AllocSyncResultBo { + /** 同步时网关返回的对象, 序列化为json字符串 */ + private String syncInfo; +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java index 9548e80b1..36f7054fa 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocOrderController.java @@ -8,13 +8,15 @@ import cn.bootx.platform.core.rest.result.Result; import com.fhs.core.trans.anno.TransMethodResult; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.core.param.allocation.transaction.AllocFinishParam; import org.dromara.daxpay.service.param.order.allocation.AllocOrderQuery; import org.dromara.daxpay.service.result.allocation.order.AllocDetailVo; import org.dromara.daxpay.service.result.allocation.order.AllocOrderVo; import org.dromara.daxpay.service.service.allocation.AllocationService; +import org.dromara.daxpay.service.service.allocation.AllocationSyncService; import org.dromara.daxpay.service.service.allocation.order.AllocOrderQueryService; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -27,6 +29,7 @@ import java.util.List; * @author xxm * @since 2024/4/7 */ +@Validated @Tag(name = "分账订单控制器") @RestController @RequestGroup(groupCode = "AllocOrder", groupName = "分账订单", moduleCode = "Alloc", moduleName = "分账管理" ) @@ -38,6 +41,8 @@ public class AllocOrderController { private final AllocationService allocationService; + private final AllocationSyncService allocationSyncService; + @Operation(summary = "分页") @GetMapping("/page") public Result> page(PageParam pageParam, AllocOrderQuery param){ @@ -64,13 +69,23 @@ public class AllocOrderController { return Res.ok(queryService.findDetailById(id)); } + @Operation(summary = "分账重试") + @PostMapping("/retry") + public Result retry(@NotNull(message = "分账单ID不可为空") Long id){ + return Res.ok(); + } @Operation(summary = "分账完结") @PostMapping("/finish") - public Result finish(String allocNo){ - AllocFinishParam param = new AllocFinishParam(); - param.setAllocNo(allocNo); - allocationService.finish(param); + public Result finish(@NotNull(message = "分账单ID不可为空")Long id){ + allocationService.finish(id); + return Res.ok(); + } + + @Operation(summary = "分账同步") + @PostMapping("/sync") + public Result sync(@NotNull(message = "分账单ID不可为空") Long id){ + allocationSyncService.sync(id); return Res.ok(); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java index 7e9f51de2..6f8a48887 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java @@ -8,15 +8,18 @@ import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverAddParam; import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverQueryParam; import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverRemoveParam; import org.dromara.daxpay.core.param.allocation.transaction.AllocFinishParam; +import org.dromara.daxpay.core.param.allocation.transaction.AllocSyncParam; import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; import org.dromara.daxpay.core.param.allocation.transaction.QueryAllocOrderParam; import org.dromara.daxpay.core.result.DaxResult; +import org.dromara.daxpay.core.result.allocation.AllocSyncResult; import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; -import org.dromara.daxpay.core.result.allocation.order.AllocationResult; +import org.dromara.daxpay.core.result.allocation.AllocationResult; import org.dromara.daxpay.core.result.allocation.receiver.AllocReceiverResult; import org.dromara.daxpay.core.util.DaxRes; import org.dromara.daxpay.service.common.anno.PaymentVerify; import org.dromara.daxpay.service.service.allocation.AllocationService; +import org.dromara.daxpay.service.service.allocation.AllocationSyncService; import org.dromara.daxpay.service.service.allocation.receiver.AllocReceiverService; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -37,6 +40,7 @@ import org.springframework.web.bind.annotation.RestController; public class UniAllocationController { private final AllocReceiverService allocReceiverService; private final AllocationService allocationService; + private final AllocationSyncService allocationSyncService; @Operation(summary = "发起分账接口") @PostMapping("/start") @@ -46,11 +50,17 @@ public class UniAllocationController { @Operation(summary = "分账完结接口") @PostMapping("/finish") - public DaxResult finish(AllocFinishParam param){ + public DaxResult finish(@RequestBody AllocFinishParam param){ return DaxRes.ok(allocationService.finish(param)); } - @Operation(summary = "分账写你查询接口") + @Operation(summary = "分账同步接口") + @PostMapping("/sync") + public DaxResult sync(@RequestBody AllocSyncParam param){ + return DaxRes.ok(allocationSyncService.sync(param)); + } + + @Operation(summary = "分账订单查询接口") @PostMapping("/query") public DaxResult query(@RequestBody QueryAllocOrderParam param){ return DaxRes.ok(allocationService.queryAllocOrder(param)); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java index 2e2db8265..ebd0bd287 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java @@ -13,17 +13,19 @@ import org.dromara.daxpay.core.exception.TradeStatusErrorException; import org.dromara.daxpay.core.param.allocation.transaction.AllocFinishParam; import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; import org.dromara.daxpay.core.param.allocation.transaction.QueryAllocOrderParam; +import org.dromara.daxpay.core.result.allocation.AllocationResult; import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; -import org.dromara.daxpay.core.result.allocation.order.AllocationResult; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocAndDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocAndDetail; import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.allocation.order.AllocationAssistService; +import org.dromara.daxpay.service.service.allocation.order.AllocOrderQueryService; +import org.dromara.daxpay.service.service.allocation.order.AllocOrderService; +import org.dromara.daxpay.service.service.assist.PaymentAssistService; import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; import org.dromara.daxpay.service.util.PaymentStrategyFactory; import org.springframework.stereotype.Service; @@ -51,10 +53,15 @@ public class AllocationService { private final AllocDetailManager allocOrderDetailManager; - private final AllocationAssistService allocationAssistService; private final LockTemplate lockTemplate; + private final PaymentAssistService paymentAssistService; + + private final AllocOrderQueryService allocOrderQueryService; + + private final AllocOrderService allocOrderService; + /** * 开启分账 多次请求只会分账一次 * 优先级 分账接收方列表 > 分账组编号 > 默认分账组 @@ -67,7 +74,7 @@ public class AllocationService { return this.retryAlloc(param, allocOrder); } else { // 首次分账 - PayOrder payOrder = allocationAssistService.getAndCheckPayOrder(param); + PayOrder payOrder = allocOrderQueryService.getAndCheckPayOrder(param); return this.allocation(param, payOrder); } } @@ -82,7 +89,7 @@ public class AllocationService { } try { // 构建分账订单相关信息 - AllocAndDetail orderAndDetail = allocationAssistService.checkAndCreateAlloc(param, payOrder); + AllocAndDetail orderAndDetail = allocOrderService.checkAndCreateAlloc(param, payOrder); // 检查是否需要进行分账 var order = orderAndDetail.transaction(); List details = orderAndDetail.details(); @@ -123,6 +130,19 @@ public class AllocationService { } } + /** + * 分账重试 + */ + public AllocationResult retryAlloc(Long id){ + var allocOrder = allocationOrderManager.findById(id).orElseThrow(() -> new DataNotExistException("分账单不存在")); + AllocationParam param = new AllocationParam(); + param.setNotifyUrl(allocOrder.getNotifyUrl()) + .setAttach(allocOrder.getAttach()) + .setReqTime(allocOrder.getReqTime()); + param.setClientIp(allocOrder.getClientIp()); + return retryAlloc(param, allocOrder); + } + /** * 重新分账 */ @@ -139,14 +159,14 @@ public class AllocationService { if (!list.contains(order.getStatus())){ throw new TradeStatusErrorException("分账单状态错误,无法重试"); } - List details = allocationAssistService.getDetails(order.getId()); + List details = allocOrderQueryService.getDetails(order.getId()); // 创建分账策略并初始化 var allocationStrategy = PaymentStrategyFactory.create(order.getChannel(),AbsAllocationStrategy.class); allocationStrategy.initParam(order, details); // 分账预处理 allocationStrategy.doBeforeHandler(); // 更新分账单信息 - allocationAssistService.updateOrder(param, order); + allocOrderService.updateOrder(param, order); try { // 重复分账处理 allocationStrategy.start(); @@ -168,6 +188,17 @@ public class AllocationService { } } + + /** + * 分账完结 + */ + public AllocationResult finish(Long id) { + AllocOrder allocOrder = allocationOrderManager.findById(id) + .orElseThrow(() -> new DataNotExistException("未查询到分账单信息")); + paymentAssistService.initMchApp(allocOrder.getAppId()); + return this.finish(allocOrder); + } + /** * 分账完结 */ @@ -191,7 +222,7 @@ public class AllocationService { if (!Arrays.asList(ALLOC_END.getCode(),FINISH_FAILED.getCode()).contains(allocOrder.getStatus())) { throw new TradeStatusErrorException("分账单状态错误"); } - List details = allocationAssistService.getDetails(allocOrder.getId()); + List details = allocOrderQueryService.getDetails(allocOrder.getId()); // 创建分账策略并初始化 AbsAllocationStrategy allocationStrategy = PaymentStrategyFactory.create(allocOrder.getChannel(),AbsAllocationStrategy.class); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java new file mode 100644 index 000000000..c4b8d61cf --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java @@ -0,0 +1,187 @@ +package org.dromara.daxpay.service.service.allocation; + +import cn.bootx.platform.core.exception.DataNotExistException; +import cn.bootx.platform.core.exception.RepetitiveOperationException; +import com.baomidou.lock.LockInfo; +import com.baomidou.lock.LockTemplate; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.core.enums.AllocDetailResultEnum; +import org.dromara.daxpay.core.enums.AllocationResultEnum; +import org.dromara.daxpay.core.enums.AllocationStatusEnum; +import org.dromara.daxpay.core.enums.TradeTypeEnum; +import org.dromara.daxpay.core.param.allocation.transaction.AllocSyncParam; +import org.dromara.daxpay.core.result.allocation.AllocSyncResult; +import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; +import org.dromara.daxpay.service.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; +import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; +import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.service.record.sync.TradeSyncRecordService; +import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; +import org.dromara.daxpay.service.util.PaymentStrategyFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +/** + * 对账同步 + * @author xxm + * @since 2024/5/23 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AllocationSyncService { + + private final AllocOrderManager allocationOrderManager; + + private final AllocDetailManager allocOrderDetailManager; + + private final TradeSyncRecordService paySyncRecordService; + + private final LockTemplate lockTemplate; + private final PaymentAssistService paymentAssistService; + + /** + * 分账同步 + */ + @Transactional(rollbackFor = Exception.class) + public void sync(Long id) { + AllocOrder allocOrder = allocationOrderManager.findById(id) + .orElseThrow(() -> new DataNotExistException("分账单不存在")); + // 如果类型为忽略, 不进行同步处理 + if (Objects.equals(allocOrder.getStatus(), AllocationStatusEnum.IGNORE.getCode())){ + return; + } + paymentAssistService.initMchApp(allocOrder.getAppId()); + // 调用同步逻辑 + this.sync(allocOrder); + } + + /** + * 分账同步 + */ + @Transactional(rollbackFor = Exception.class) + public AllocSyncResult sync(AllocSyncParam param) { + // 获取分账订单 + AllocOrder allocOrder = null; + if (Objects.nonNull(param.getAllocNo())){ + allocOrder = allocationOrderManager.findByAllocNo(param.getAllocNo(),param.getAppId()) + .orElseThrow(() -> new DataNotExistException("分账单不存在")); + } + if (Objects.isNull(allocOrder)){ + allocOrder = allocationOrderManager.findByAllocNo(param.getBizAllocNo(),param.getAppId()) + .orElseThrow(() -> new DataNotExistException("分账单不存在")); + } + // 如果类型为忽略, 不进行同步处理 + if (Objects.equals(allocOrder.getStatus(), AllocationStatusEnum.IGNORE.getCode())){ + return new AllocSyncResult(); + } + + // 调用同步逻辑 + this.sync(allocOrder); + return new AllocSyncResult(); + } + + /** + * 分账同步 + */ + @Transactional(rollbackFor = Exception.class) + public void sync(AllocOrder allocOrder){ + LockInfo lock = lockTemplate.lock("payment:allocation:" + allocOrder.getOrderId(),10000,200); + if (Objects.isNull(lock)){ + throw new RepetitiveOperationException("分账同步中,请勿重复操作"); + } + try { + List detailList = allocOrderDetailManager.findAllByOrderId(allocOrder.getId()); + // 获取分账策略 + var allocationStrategy = PaymentStrategyFactory.create(allocOrder.getChannel(),AbsAllocationStrategy.class); + allocationStrategy.initParam(allocOrder, detailList); + // 分账完结预处理 + allocationStrategy.doBeforeHandler(); + // 执行同步操作, 分账明细的状态变更会在这个里面 + AllocSyncResultBo allocSyncResultBo = allocationStrategy.doSync(); + // 保存分账同步记录 + this.saveRecord(allocOrder, allocSyncResultBo); + // 根据订单明细更新订单的状态和处理结果 + allocOrder.setErrorMsg(null).setErrorCode(null); + this.updateOrderStatus(allocOrder, detailList); + } finally { + lockTemplate.releaseLock(lock); + } + } + + /** + * 根据订单明细更新订单的状态和处理结果, 如果订单是分账结束或失败, 不更新状态 + * TODO 是否多次同步会产生多次变动, 注意处理多次推送通知的问题, 目前是 + */ + private void updateOrderStatus(AllocOrder allocOrder, List details){ + // 如果是分账结束或失败, 不更新状态 + String status = allocOrder.getStatus(); + + // 如果是分账结束或失败, 不进行对订单进行处理 + List list = Arrays.asList(AllocationStatusEnum.FINISH.getCode(), AllocationStatusEnum.FINISH_FAILED.getCode()); + if (!list.contains(status)){ + // 判断明细状态. 获取成功和失败的 + long successCount = details.stream() + .map(AllocDetail::getResult) + .filter(AllocDetailResultEnum.SUCCESS.getCode()::equals) + .count(); + long failCount = details.stream() + .map(AllocDetail::getResult) + .filter(AllocDetailResultEnum.FAIL.getCode()::equals) + .count(); + + // 成功和失败都为0 表示进行中 + if (successCount == 0 && failCount == 0){ + allocOrder.setStatus(AllocationStatusEnum.PROCESSING.getCode()) + .setResult(AllocationResultEnum.ALL_PENDING.getCode()); + } else { + if (failCount == details.size()){ + // 全部失败 + allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) + .setResult(AllocationResultEnum.ALL_FAILED.getCode()); + } else if (successCount == details.size()){ + // 全部成功 + allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) + .setResult(AllocationResultEnum.ALL_SUCCESS.getCode()); + } else { + // 部分成功 + allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) + .setResult(AllocationResultEnum.PART_SUCCESS.getCode()); + } + } + } + allocOrderDetailManager.updateAllById(details); + allocationOrderManager.updateById(allocOrder); + + // 如果状态为完成, 发送通知 + if (Objects.equals(AllocationStatusEnum.ALLOC_END.getCode(), allocOrder.getStatus())){ + // 发送通知 +// clientNoticeService.registerAllocNotice(allocOrder, details); + } + } + + + /** + * 保存同步记录 + */ + private void saveRecord(AllocOrder order, AllocSyncResultBo syncResult){ + TradeSyncRecord syncRecord = new TradeSyncRecord() + .setBizTradeNo(order.getBizAllocNo()) + .setTradeNo(order.getAllocNo()) + .setOutTradeNo(order.getOutAllocNo()) + .setTradeType(TradeTypeEnum.ALLOCATION.getCode()) + .setChannel(order.getChannel()) + .setSyncInfo(syncResult.getSyncInfo()) + .setClientIp(PaymentContextLocal.get().getClientInfo().getClientIp()); + paySyncRecordService.saveRecord(syncRecord); + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java index 3d465dbc6..3acdfbfee 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java @@ -6,16 +6,26 @@ import cn.bootx.platform.core.rest.param.PageParam; import cn.bootx.platform.core.rest.result.PageResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.core.enums.AllocDetailResultEnum; +import org.dromara.daxpay.core.enums.PayAllocStatusEnum; +import org.dromara.daxpay.core.exception.OperationUnsupportedException; +import org.dromara.daxpay.core.exception.TradeNotExistException; +import org.dromara.daxpay.core.exception.TradeStatusErrorException; +import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.param.order.allocation.AllocOrderQuery; import org.dromara.daxpay.service.result.allocation.order.AllocDetailVo; import org.dromara.daxpay.service.result.allocation.order.AllocOrderVo; +import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** * 分账订单查询服务类 @@ -30,6 +40,7 @@ public class AllocOrderQueryService { private final AllocDetailManager allocOrderDetailManager; private final AllocOrderManager allocationOrderManager; + private final PayOrderQueryService payOrderQueryService; /** * 分页查询 @@ -59,5 +70,33 @@ public class AllocOrderQueryService { return allocOrderDetailManager.findById(id).map(AllocDetail::toResult).orElseThrow(() -> new DataNotExistException("分账订单明细不存在")); } + /** + * 获取发起分账或完结的明细 + */ + public List getDetails(Long allocOrderId){ + List details = allocOrderDetailManager.findAllByOrderId(allocOrderId); + // 过滤掉忽略的条目 + return details.stream() + .filter(detail -> !Objects.equals(detail.getResult(), AllocDetailResultEnum.IGNORE.getCode())) + .collect(Collectors.toList()); + } + + /** + * 获取并检查支付订单 + */ + public PayOrder getAndCheckPayOrder(AllocationParam param) { + // 查询支付单 + PayOrder payOrder = payOrderQueryService.findByBizOrOrderNo(param.getOrderNo(), param.getBizOrderNo(), param.getAppId()) + .orElseThrow(() -> new TradeNotExistException("支付单不存在")); + // 判断订单是否可以分账 + if (!payOrder.getAllocation()){ + throw new OperationUnsupportedException("该订单不允许分账"); + } + // 判断分账状态 + if (Objects.equals(PayAllocStatusEnum.ALLOCATION.getCode(), payOrder.getAllocStatus())){ + throw new TradeStatusErrorException("该订单已分账完成"); + } + return payOrder; + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java index 4a191e583..48823dd73 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java @@ -2,6 +2,7 @@ package org.dromara.daxpay.service.service.allocation.order; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.BigDecimalUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -9,18 +10,22 @@ import org.dromara.daxpay.core.enums.AllocDetailResultEnum; import org.dromara.daxpay.core.enums.AllocationResultEnum; import org.dromara.daxpay.core.enums.AllocationStatusEnum; import org.dromara.daxpay.core.enums.PayAllocStatusEnum; -import org.dromara.daxpay.core.param.allocation.transaction.ReceiverParam; +import org.dromara.daxpay.core.exception.DataErrorException; import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; +import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam.ReceiverParam; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; -import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; +import org.dromara.daxpay.service.dao.allocation.receiver.AllocGroupManager; import org.dromara.daxpay.service.dao.allocation.receiver.AllocReceiverManager; import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroup; import org.dromara.daxpay.service.entity.allocation.transaction.AllocAndDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; +import org.dromara.daxpay.service.service.allocation.receiver.AllocGroupService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -45,6 +50,10 @@ public class AllocOrderService { private final AllocOrderManager transactionManager; + private final AllocGroupManager groupManager; + + private final AllocGroupService allocGroupService; + private final AllocDetailManager transactionDetailManager; private final PayOrderManager payOrderManager; @@ -181,5 +190,49 @@ public class AllocOrderService { transactionManager.save(allocOrder); return new AllocAndDetail(allocOrder,details); } + + /** + * 根据新传入的分账订单更新订单信息 + */ + @Transactional(rollbackFor = Exception.class) + public void updateOrder(AllocationParam allocationParam, AllocOrder orderExtra) { + // 扩展信息 + orderExtra.setClientIp(allocationParam.getClientIp()) + .setNotifyUrl(allocationParam.getNotifyUrl()) + .setAttach(allocationParam.getAttach()) + .setReqTime(allocationParam.getReqTime()); + transactionManager.updateById(orderExtra); + } + + + /** + * 检查并构建分账订单相关信息 + */ + @Transactional(rollbackFor = Exception.class) + public AllocAndDetail checkAndCreateAlloc(AllocationParam param, PayOrder payOrder){ + // 创建分账单和明细并保存, 同时更新支付订单状态 使用事务 + AllocAndDetail orderAndDetail; + // 判断是否传输了分账接收方列表 + if (CollUtil.isNotEmpty(param.getReceivers())) { + orderAndDetail = this.createAndUpdate(param, payOrder); + } else { + AllocGroup allocationGroup; + if (Objects.nonNull(param.getGroupNo())){ + // 指定分账组 + allocationGroup = groupManager.findByGroupNo(param.getGroupNo(),param.getAppId()).orElseThrow(() -> new DataErrorException("未查询到分账组")); + } else { + // 默认分账组 + allocationGroup = groupManager.findDefaultGroup(payOrder.getChannel(),param.getAppId()).orElseThrow(() -> new DataErrorException("未查询到默认分账组")); + } + // 判断通道类型是否一致 + if (!Objects.equals(allocationGroup.getChannel(), payOrder.getChannel())){ + throw new ValidationFailedException("分账接收方列表存在非本通道的数据"); + } + + var receiversByGroups = allocGroupService.findReceiversByGroups(allocationGroup.getId()); + orderAndDetail = this.createAndUpdate(param ,payOrder, receiversByGroups); + } + return orderAndDetail; + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocationAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocationAssistService.java deleted file mode 100644 index 98273ddee..000000000 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocationAssistService.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.dromara.daxpay.service.service.allocation.order; - -import cn.bootx.platform.core.exception.ValidationFailedException; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.enums.PayAllocStatusEnum; -import org.dromara.daxpay.core.exception.DataErrorException; -import org.dromara.daxpay.core.exception.OperationUnsupportedException; -import org.dromara.daxpay.core.exception.TradeNotExistException; -import org.dromara.daxpay.core.exception.TradeStatusErrorException; -import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; -import org.dromara.daxpay.service.dao.allocation.receiver.AllocGroupManager; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroup; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocAndDetail; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.allocation.receiver.AllocGroupService; -import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * 分账支撑方法 - * @author xxm - * @since 2024/5/22 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AllocationAssistService { - - private final AllocOrderManager transactionManager; - - private final PayOrderQueryService payOrderQueryService; - - private final AllocGroupManager groupManager; - - private final AllocGroupService allocationGroupService; - - private final AllocOrderService allocOrderService; - - private final AllocDetailManager allocOrderDetailManager; - - - /** - * 根据新传入的分账订单更新订单信息 - */ - @Transactional(rollbackFor = Exception.class) - public void updateOrder(AllocationParam allocationParam, AllocOrder orderExtra) { - // 扩展信息 - orderExtra.setClientIp(allocationParam.getClientIp()) - .setNotifyUrl(allocationParam.getNotifyUrl()) - .setAttach(allocationParam.getAttach()) - .setReqTime(allocationParam.getReqTime()); - transactionManager.updateById(orderExtra); - } - - /** - * 获取并检查支付订单 - */ - public PayOrder getAndCheckPayOrder(AllocationParam param) { - // 查询支付单 - PayOrder payOrder = payOrderQueryService.findByBizOrOrderNo(param.getOrderNo(), param.getBizOrderNo(), param.getAppId()) - .orElseThrow(() -> new TradeNotExistException("支付单不存在")); - // 判断订单是否可以分账 - if (!payOrder.getAllocation()){ - throw new OperationUnsupportedException("该订单不允许分账"); - } - // 判断分账状态 - if (Objects.equals(PayAllocStatusEnum.ALLOCATION.getCode(), payOrder.getAllocStatus())){ - throw new TradeStatusErrorException("该订单已分账完成"); - } - return payOrder; - } - - /** - * 构建分账订单相关信息 - */ - public AllocAndDetail checkAndCreateAlloc(AllocationParam param, PayOrder payOrder){ - // 创建分账单和明细并保存, 同时更新支付订单状态 使用事务 - AllocAndDetail orderAndDetail; - // 判断是否传输了分账接收方列表 - if (CollUtil.isNotEmpty(param.getReceivers())) { - orderAndDetail = allocOrderService.createAndUpdate(param, payOrder); - } else { - AllocGroup allocationGroup; - if (Objects.nonNull(param.getGroupNo())){ - // 指定分账组 - allocationGroup = groupManager.findByGroupNo(param.getGroupNo(),param.getAppId()).orElseThrow(() -> new DataErrorException("未查询到分账组")); - } else { - // 默认分账组 - allocationGroup = groupManager.findDefaultGroup(payOrder.getChannel(),param.getAppId()).orElseThrow(() -> new DataErrorException("未查询到默认分账组")); - } - // 判断通道类型是否一致 - if (!Objects.equals(allocationGroup.getChannel(), payOrder.getChannel())){ - throw new ValidationFailedException("分账接收方列表存在非本通道的数据"); - } - - var receiversByGroups = allocationGroupService.findReceiversByGroups(allocationGroup.getId()); - orderAndDetail = allocOrderService.createAndUpdate(param ,payOrder, receiversByGroups); - } - return orderAndDetail; - } - - /** - * 获取发起分账或完结的明细 - */ - public List getDetails(Long allocOrderId){ - List details = allocOrderDetailManager.findAllByOrderId(allocOrderId); - // 过滤掉忽略的条目 - return details.stream() - .filter(detail -> !Objects.equals(detail.getResult(), AllocDetailResultEnum.IGNORE.getCode())) - .collect(Collectors.toList()); - } -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java index 352455b7f..8a9d1a5fc 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java @@ -3,6 +3,7 @@ package org.dromara.daxpay.service.strategy; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; @@ -47,4 +48,10 @@ public abstract class AbsAllocationStrategy implements PaymentStrategy{ */ public abstract void finish(); + + /** + * 同步状态 + */ + public abstract AllocSyncResultBo doSync(); + } From d0bab54db579689711c6c292ebe29f2b44a0539d Mon Sep 17 00:00:00 2001 From: DaxPay Date: Mon, 16 Dec 2024 18:09:52 +0800 Subject: [PATCH 25/54] =?UTF-8?q?feat=20=E5=BE=AE=E4=BF=A1=E5=88=86?= =?UTF-8?q?=E8=B4=A6=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 17 ++++++--- .../allocation/AliPayAllocationService.java | 1 - .../WeChatPayAllocationV2Service.java | 27 ++++++++++++++ .../WeChatPayAllocationV3Service.java | 34 +++++++++++++---- .../strategy/WechatAllocationStrategy.java | 37 +++++++++++++++++-- .../entity/allocation/AllocConfig.java | 6 +++ .../param/allocation/AllocConfigParam.java | 9 +++++ .../result/allocation/AllocConfigResult.java | 8 ++++ 8 files changed, 122 insertions(+), 17 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index 03091d6d8..98a529e98 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -6,15 +6,20 @@ ## 3.0.0.bate3: 功能完善 - 优化: - [ ] 增加首页驾驶舱功能 -- [ ] 分账功能 +- [x] 分账界面功能 - [x] 分账接收方配置 - - [ ] 分账单管理 - - [ ] 分账接口开发 + - [x] 分账单管理 + - [x] 接口开发 开启/完结/用不 +- [ ] 分账接口开发 + - [x] 支付宝 + - [ ] 微信 +- [ ] 分账扩展能力 + - [ ] 自动分账 + - [ ] 自动完成 + - [ ] 自动同步状态 - [ ] 网关配套移动端开发 - [ ] 同步回调页 -- [ ] 分账接收方和分账组优化 - - [ ] 后台管理时, 编号自动生成 - - [ ] 显示数据 +- [x] 分账接收方和分账组优化, 后台管理时, 编号自动生成 - [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 - [x] 支付订单新增待支付状态 ## 3.0.0.beta2 收银台 diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java index dd87dd013..f9e2c6ef9 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java @@ -142,7 +142,6 @@ public class AliPayAllocationService { var detail = detailMap.get(receiver.getTransIn()); if (Objects.nonNull(detail)) { detail.setResult(this.getDetailResultEnum(receiver.getState()).getCode()); - detail.setErrorCode(receiver.getErrorCode()); detail.setErrorMsg(receiver.getErrorDesc()); // 如果是完成, 更新时间 if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java index 4cce6cb38..dac162dc6 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java @@ -2,8 +2,14 @@ package org.dromara.daxpay.channel.wechat.service.allocation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.springframework.stereotype.Service; +import java.util.List; + /** * 微信分账V2版本接口 * @author xxm @@ -13,4 +19,25 @@ import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class WeChatPayAllocationV2Service { + + /** + * 分账 + */ + public AllocStartResultBo start(AllocOrder order, List details, WechatPayConfig config) { + return null; + } + + /** + * 完结 + */ + public void finish(AllocOrder order, List details, WechatPayConfig config) { + + } + + /** + * 同步 + */ + public void sync(AllocOrder order, List details, WechatPayConfig config) { + + } } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java index b9a1bbb7f..6bbb6bb2a 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java @@ -1,5 +1,6 @@ package org.dromara.daxpay.channel.wechat.service.allocation; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingQueryV3Request; import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeV3Request; import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result; @@ -36,7 +37,7 @@ public class WeChatPayAllocationV3Service { private final WechatPayConfigService wechatPayConfigService; /** - * 发起分账 + * 发起分账 使用分账号作为请求号4 */ public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails, WechatPayConfig config){ @@ -44,9 +45,10 @@ public class WeChatPayAllocationV3Service { ProfitSharingService sharingService = wxPayService.getProfitSharingService(); ProfitSharingV3Request request = new ProfitSharingV3Request(); + request.setAppid(config.getWxAppId()); request.setOutOrderNo(allocOrder.getAllocNo()); request.setTransactionId(allocOrder.getOutOrderNo()); - request.setUnfreezeUnsplit(true); + request.setUnfreezeUnsplit(false); // 分账接收方信息 var receivers = orderDetails.stream() @@ -67,7 +69,6 @@ public class WeChatPayAllocationV3Service { request.setReceivers(receivers); try { ProfitSharingV3Result result = sharingService.profitSharingV3(request); - return new AllocStartResultBo().setOutAllocNo(result.getOrderId()); } catch (WxPayException e) { throw new OperationFailException("微信分账V3失败: "+e.getMessage()); @@ -75,22 +76,40 @@ public class WeChatPayAllocationV3Service { } /** - * 分账完结 + * 分账完结 使用ID作为请求号 */ - public void finish(AllocOrder allocOrder, List orderDetails, WechatPayConfig config){ + public void finish(AllocOrder allocOrder, List details, WechatPayConfig config){ WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); ProfitSharingService sharingService = wxPayService.getProfitSharingService(); var request = new ProfitSharingUnfreezeV3Request(); - request.setOutOrderNo(allocOrder.getAllocNo()); + request.setOutOrderNo(String.valueOf(allocOrder.getId())); request.setTransactionId(allocOrder.getOutOrderNo()); request.setDescription("分账完结"); try { - sharingService.profitSharingUnfreeze(request); + var result = sharingService.profitSharingUnfreeze(request); } catch (WxPayException e) { throw new OperationFailException("微信分账V3失败: "+e.getMessage()); } } + /** + * 同步 + */ + public void sync(AllocOrder allocOrder, List details, WechatPayConfig config){ + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + ProfitSharingQueryV3Request request = new ProfitSharingQueryV3Request(); + request.setOutOrderNo(allocOrder.getAllocNo()); + // 根据订单状态判断 + + request.setTransactionId(allocOrder.getOutOrderNo()); + try { + var result = sharingService.profitSharingQueryV3(request); + } catch (WxPayException e) { + throw new OperationFailException("微信分账订单查询V3失败: "+e.getMessage()); + } + } + /** * 获取分账接收方类型编码 */ @@ -103,4 +122,5 @@ public class WeChatPayAllocationV3Service { } throw new ConfigErrorException("分账接收方类型错误"); } + } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java index ebe433442..419a67f78 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java @@ -2,6 +2,11 @@ package org.dromara.daxpay.channel.wechat.strategy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.allocation.WeChatPayAllocationV2Service; +import org.dromara.daxpay.channel.wechat.service.allocation.WeChatPayAllocationV3Service; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; @@ -9,6 +14,8 @@ import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.Objects; + import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; /** @@ -21,7 +28,11 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Component @RequiredArgsConstructor public class WechatAllocationStrategy extends AbsAllocationStrategy { + private final WeChatPayAllocationV3Service weChatPayAllocationV3Service; + private final WeChatPayAllocationV2Service weChatPayAllocationV2Service; + private final WechatPayConfigService wechatPayConfigService; + private WechatPayConfig config; /** * 分账通道 @@ -31,20 +42,33 @@ public class WechatAllocationStrategy extends AbsAllocationStrategy { return ChannelEnum.WECHAT.getCode(); } + @Override + public void doBeforeHandler(){ + this.config = wechatPayConfigService.getAndCheckConfig(); + } + /** * 开始分账 */ @Override public AllocStartResultBo start() { - return null; + if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ + return weChatPayAllocationV3Service.start(getOrder(), getDetails(), this.config); + } else { + return weChatPayAllocationV2Service.start(getOrder(), getDetails(), this.config); + } } /** - * + * 完结 */ @Override public void finish() { - + if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ + weChatPayAllocationV3Service.finish(getOrder(), this.getDetails(), this.config); + } else { + weChatPayAllocationV2Service.finish(getOrder(), this.getDetails(), this.config); + } } /** @@ -52,6 +76,13 @@ public class WechatAllocationStrategy extends AbsAllocationStrategy { */ @Override public AllocSyncResultBo doSync() { + if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ + weChatPayAllocationV3Service.finish(getOrder(), this.getDetails(), this.config); + + weChatPayAllocationV3Service.sync(getOrder(), this.getDetails(), this.config); + } else { + weChatPayAllocationV2Service.sync(getOrder(), this.getDetails(), this.config); + } return null; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java index 6ed19b714..426a6a0e1 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java @@ -26,9 +26,15 @@ public class AllocConfig extends MchAppBaseEntity implements ToResult Date: Mon, 16 Dec 2024 22:48:32 +0800 Subject: [PATCH 26/54] =?UTF-8?q?feat(wechat):=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=88=86=E8=B4=A6=20V2=20=E5=92=8C=20V3=20?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3,=20=E4=BF=AE=E5=A4=8D=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=20v2=20=E6=8E=A5=E5=8F=A3=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=88=86=E8=B4=A6=E4=B8=8D=E7=94=9F=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/bootx/platform/core/util/JsonUtil.java | 5 +- .../allocation/AliPayAllocationService.java | 1 + .../wechat/enums/WechatAllocStatusEnum.java | 41 ++++++ .../WeChatPayAllocationV2Service.java | 133 +++++++++++++++++- .../WeChatPayAllocationV3Service.java | 66 +++++++-- .../service/pay/WechatPayV2Service.java | 3 +- .../strategy/WechatAllocationStrategy.java | 11 +- .../channel/wechat/util/WechatPayUtil.java | 4 +- .../allocation/transaction/AllocDetail.java | 3 + .../allocation/order/AllocDetailVo.java | 4 + 10 files changed, 239 insertions(+), 32 deletions(-) create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocStatusEnum.java diff --git a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/util/JsonUtil.java b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/util/JsonUtil.java index 37643acaa..da2a2341c 100644 --- a/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/util/JsonUtil.java +++ b/bootx-platform/bootx-platform-core/src/main/java/cn/bootx/platform/core/util/JsonUtil.java @@ -2,10 +2,7 @@ package cn.bootx.platform.core.util; import cn.hutool.core.date.DatePattern; import cn.hutool.core.lang.TypeReference; -import cn.hutool.json.JSON; -import cn.hutool.json.JSONConfig; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; +import cn.hutool.json.*; import lombok.experimental.UtilityClass; /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java index f9e2c6ef9..4c5255f03 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java @@ -143,6 +143,7 @@ public class AliPayAllocationService { if (Objects.nonNull(detail)) { detail.setResult(this.getDetailResultEnum(receiver.getState()).getCode()); detail.setErrorMsg(receiver.getErrorDesc()); + detail.setOutDetailId(receiver.getDetailId()); // 如果是完成, 更新时间 if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ LocalDateTime finishTime = LocalDateTimeUtil.of(receiver.getExecuteDt()); diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocStatusEnum.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocStatusEnum.java new file mode 100644 index 000000000..5489b70eb --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocStatusEnum.java @@ -0,0 +1,41 @@ +package org.dromara.daxpay.channel.wechat.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.daxpay.core.enums.AllocDetailResultEnum; +import org.dromara.daxpay.core.exception.ConfigNotExistException; + +import java.util.Arrays; +import java.util.Objects; + +/** + * + * @author xxm + * @since 2024/12/16 + */ +@Getter +@AllArgsConstructor +public enum WechatAllocStatusEnum { + + //处理中 + PENDING("PENDING", AllocDetailResultEnum.PENDING), + //分账完成 + SUCCESS("SUCCESS", AllocDetailResultEnum.SUCCESS), + //分账完成 + CLOSED("CLOSED", AllocDetailResultEnum.FAIL), + ; + + private final String code; + + private final AllocDetailResultEnum result; + + /** + * 根据编码获取枚举 + */ + public static WechatAllocStatusEnum findByCode(String code){ + return Arrays.stream(values()) + .filter(o -> Objects.equals(o.getCode(), code)) + .findFirst() + .orElseThrow(() -> new ConfigNotExistException("该微信分账状态不存在")); + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java index dac162dc6..fe8a27217 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java @@ -1,14 +1,41 @@ package org.dromara.daxpay.channel.wechat.service.allocation; +import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; +import cn.hutool.json.JSONUtil; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingQueryRequest; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingRequest; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeRequest; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; +import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingQueryResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.ProfitSharingService; +import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.AllocDetailResultEnum; +import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; +import org.dromara.daxpay.core.enums.AllocationStatusEnum; +import org.dromara.daxpay.core.exception.ConfigErrorException; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.List; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; +import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; /** * 微信分账V2版本接口 @@ -20,24 +47,120 @@ import java.util.List; @RequiredArgsConstructor public class WeChatPayAllocationV2Service { + private final WechatPayConfigService wechatPayConfigService; + /** * 分账 */ - public AllocStartResultBo start(AllocOrder order, List details, WechatPayConfig config) { - return null; + public AllocStartResultBo start(AllocOrder allocOrder, List details, WechatPayConfig config) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + + ProfitSharingRequest request = new ProfitSharingRequest(); + request.setAppid(config.getWxAppId()); + request.setOutOrderNo(allocOrder.getAllocNo()); + request.setTransactionId(allocOrder.getOutOrderNo()); + + // 分账接收方信息 + var receivers = details.stream() + .map(o -> { + AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType()); + String receiverType = this.getReceiverType(receiverTypeEnum); + var receiver = new ProfitSharingV3Request.Receiver(); + receiver.setType(receiverType); + receiver.setAmount(PayUtil.convertCentAmount(o.getAmount())); + receiver.setAccount(o.getReceiverAccount()); + receiver.setName(o.getReceiverName()); + receiver.setDescription("订单分账"); + return receiver; + }) + .toList(); + + request.setReceivers(JSONUtil.toJsonStr(receivers)); + try { + var result = sharingService.multiProfitSharing(request); + return new AllocStartResultBo().setOutAllocNo(result.getTransactionId()); + } catch (WxPayException e) { + throw new OperationFailException("微信分账V2失败: "+e.getMessage()); + } } /** * 完结 */ - public void finish(AllocOrder order, List details, WechatPayConfig config) { - + public void finish(AllocOrder allocOrder, WechatPayConfig config) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + var request = new ProfitSharingUnfreezeRequest(); + request.setOutOrderNo(String.valueOf(allocOrder.getId())); + request.setTransactionId(allocOrder.getOutOrderNo()); + request.setDescription("分账完结"); + try { + sharingService.profitSharingFinish(request); + } catch (WxPayException e) { + throw new OperationFailException("微信分账完结V2失败: "+e.getMessage()); + } } /** * 同步 */ - public void sync(AllocOrder order, List details, WechatPayConfig config) { + public AllocSyncResultBo sync(AllocOrder allocOrder, List details, WechatPayConfig config) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + ProfitSharingQueryRequest request = new ProfitSharingQueryRequest(); + // 根据订单状态判断 使用ID还是分账号 + request.setTransactionId(allocOrder.getOutOrderNo()); + if (Objects.equals(AllocationStatusEnum.PROCESSING.getCode(), allocOrder.getStatus())){ + request.setOutOrderNo(allocOrder.getAllocNo()); + } else { + request.setOutOrderNo(String.valueOf(allocOrder.getId())); + } + ProfitSharingQueryResult result; + try { + result = sharingService.profitSharingQuery(request); + } catch (WxPayException e) { + throw new OperationFailException("微信分账订单查询V2失败: "+e.getMessage()); + } + var detailMap = details.stream() + .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); + var royaltyDetailList = result.getReceivers(); + for (var receiver : royaltyDetailList) { + var detail = detailMap.get(receiver.getAccount()); + if (Objects.nonNull(detail)) { + detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode()); + detail.setErrorMsg(receiver.getFailReason()); + detail.setOutDetailId(receiver.getDetailId()); + // 如果是完成, 更新时间 + if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ + LocalDateTime finishTime = WechatPayUtil.parseV2(receiver.getFinishTime()); + detail.setFinishTime(finishTime) + .setErrorMsg(null) + .setErrorCode(null); + } + } + } + return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result)); + } + + /** + * 获取分账接收方类型编码 + */ + private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ + if (receiverTypeEnum == OPEN_ID){ + return "PERSONAL_OPENID"; + } + if (receiverTypeEnum == MERCHANT_NO){ + return "MERCHANT_ID"; + } + throw new ConfigErrorException("分账接收方类型错误"); + } + + /** + * 转换支付宝分账类型到系统中统一的状态 + */ + private AllocDetailResultEnum getDetailResultEnum (String result){ + return WechatAllocStatusEnum.findByCode(result).getResult(); } } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java index 6bbb6bb2a..5798e550c 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java @@ -1,6 +1,7 @@ package org.dromara.daxpay.channel.wechat.service.allocation; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingQueryV3Request; +import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; +import cn.hutool.json.JSONUtil; import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeV3Request; import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result; @@ -10,17 +11,26 @@ import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.AllocDetailResultEnum; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; +import org.dromara.daxpay.core.enums.AllocationStatusEnum; import org.dromara.daxpay.core.exception.ConfigErrorException; import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.List; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; @@ -37,10 +47,9 @@ public class WeChatPayAllocationV3Service { private final WechatPayConfigService wechatPayConfigService; /** - * 发起分账 使用分账号作为请求号4 + * 发起分账 使用分账号作为请求号 */ public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails, WechatPayConfig config){ - WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); ProfitSharingService sharingService = wxPayService.getProfitSharingService(); @@ -69,7 +78,7 @@ public class WeChatPayAllocationV3Service { request.setReceivers(receivers); try { ProfitSharingV3Result result = sharingService.profitSharingV3(request); - return new AllocStartResultBo().setOutAllocNo(result.getOrderId()); + return new AllocStartResultBo().setOutAllocNo(result.getTransactionId()); } catch (WxPayException e) { throw new OperationFailException("微信分账V3失败: "+e.getMessage()); } @@ -78,7 +87,7 @@ public class WeChatPayAllocationV3Service { /** * 分账完结 使用ID作为请求号 */ - public void finish(AllocOrder allocOrder, List details, WechatPayConfig config){ + public void finish(AllocOrder allocOrder, WechatPayConfig config){ WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); ProfitSharingService sharingService = wxPayService.getProfitSharingService(); var request = new ProfitSharingUnfreezeV3Request(); @@ -86,28 +95,51 @@ public class WeChatPayAllocationV3Service { request.setTransactionId(allocOrder.getOutOrderNo()); request.setDescription("分账完结"); try { - var result = sharingService.profitSharingUnfreeze(request); + sharingService.profitSharingUnfreeze(request); } catch (WxPayException e) { - throw new OperationFailException("微信分账V3失败: "+e.getMessage()); + throw new OperationFailException("微信分账完结V3失败: "+e.getMessage()); } } /** * 同步 */ - public void sync(AllocOrder allocOrder, List details, WechatPayConfig config){ + public AllocSyncResultBo sync(AllocOrder allocOrder, List details, WechatPayConfig config){ WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); ProfitSharingService sharingService = wxPayService.getProfitSharingService(); - ProfitSharingQueryV3Request request = new ProfitSharingQueryV3Request(); - request.setOutOrderNo(allocOrder.getAllocNo()); - // 根据订单状态判断 + // 根据订单状态判断 使用ID还是分账号 + String outOrderNo; + if (Objects.equals(AllocationStatusEnum.PROCESSING.getCode(), allocOrder.getStatus())){ + outOrderNo = allocOrder.getAllocNo(); + } else { + outOrderNo = String.valueOf(allocOrder.getId()); + } - request.setTransactionId(allocOrder.getOutOrderNo()); + ProfitSharingV3Result result; try { - var result = sharingService.profitSharingQueryV3(request); + result = sharingService.profitSharingQueryV3(outOrderNo,allocOrder.getOutOrderNo()); } catch (WxPayException e) { throw new OperationFailException("微信分账订单查询V3失败: "+e.getMessage()); } + var detailMap = details.stream() + .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); + var royaltyDetailList = result.getReceivers(); + for (var receiver : royaltyDetailList) { + var detail = detailMap.get(receiver.getAccount()); + if (Objects.nonNull(detail)) { + detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode()); + detail.setErrorMsg(receiver.getFailReason()); + detail.setOutDetailId(receiver.getDetailId()); + // 如果是完成, 更新时间 + if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ + LocalDateTime finishTime = WechatPayUtil.parseV3(receiver.getFinishTime()); + detail.setFinishTime(finishTime) + .setErrorMsg(null) + .setErrorCode(null); + } + } + } + return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result)); } /** @@ -123,4 +155,12 @@ public class WeChatPayAllocationV3Service { throw new ConfigErrorException("分账接收方类型错误"); } + /** + * 转换支付宝分账类型到系统中统一的状态 + */ + private AllocDetailResultEnum getDetailResultEnum (String result){ + return WechatAllocStatusEnum.findByCode(result).getResult(); + } + + } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV2Service.java index 4bf4e0b83..1cfa885b1 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV2Service.java @@ -165,7 +165,7 @@ public class WechatPayV2Service { request.setSpbillCreateIp(payOrder.getClientIp()); request.setDetail(payOrder.getDescription()); request.setBody(payOrder.getTitle()); - request.setProfitSharing(payOrder.getAutoAllocation()?"Y":"N"); + request.setProfitSharing(payOrder.getAllocation()?"Y":"N"); try { WxPayMicropayResult result = wxPayService.micropay(request); // 支付成功处理, 如果不成功会走异常流 @@ -232,6 +232,7 @@ public class WechatPayV2Service { request.setTotalFee(PayUtil.convertCentAmount(payOrder.getAmount())); request.setNotifyUrl(wechatPayConfigService.getPayNotifyUrl()); request.setSpbillCreateIp(payOrder.getClientIp()); + request.setProfitSharing(payOrder.getAllocation()?"Y":"N"); return request; } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java index 419a67f78..6b5ce3295 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java @@ -65,9 +65,9 @@ public class WechatAllocationStrategy extends AbsAllocationStrategy { @Override public void finish() { if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ - weChatPayAllocationV3Service.finish(getOrder(), this.getDetails(), this.config); + weChatPayAllocationV3Service.finish(getOrder(), this.config); } else { - weChatPayAllocationV2Service.finish(getOrder(), this.getDetails(), this.config); + weChatPayAllocationV2Service.finish(getOrder(), this.config); } } @@ -77,13 +77,10 @@ public class WechatAllocationStrategy extends AbsAllocationStrategy { @Override public AllocSyncResultBo doSync() { if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ - weChatPayAllocationV3Service.finish(getOrder(), this.getDetails(), this.config); - - weChatPayAllocationV3Service.sync(getOrder(), this.getDetails(), this.config); + return weChatPayAllocationV3Service.sync(getOrder(), this.getDetails(), this.config); } else { - weChatPayAllocationV2Service.sync(getOrder(), this.getDetails(), this.config); + return weChatPayAllocationV2Service.sync(getOrder(), this.getDetails(), this.config); } - return null; } } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/util/WechatPayUtil.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/util/WechatPayUtil.java index 32c729b8a..97ffb8156 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/util/WechatPayUtil.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/util/WechatPayUtil.java @@ -119,14 +119,14 @@ public class WechatPayUtil { } /** - * v3接口时间序列画 + * v2接口时间序列化 */ public LocalDateTime parseV2(String date) { return LocalDateTimeUtil.parse(date, DatePattern.PURE_DATETIME_PATTERN); } /** - * v3接口时间序列画 + * v3接口时间序列化 */ public LocalDateTime parseV3(String dateStr) { return LocalDateTimeUtil.parse(dateStr, "yyyy-MM-dd'T'HH:mm:ss+08:00"); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java index c85ac7cc9..01d053076 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java @@ -28,6 +28,9 @@ public class AllocDetail extends MchAppBaseEntity implements ToResult Date: Tue, 17 Dec 2024 11:14:08 +0800 Subject: [PATCH 27/54] =?UTF-8?q?ref=20=E5=8D=87=E7=BA=A7wxjava=E4=BE=9D?= =?UTF-8?q?=E8=B5=96,=20=E6=9B=BF=E6=8D=A2=E9=83=A8=E5=88=86=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/ChangeLog.md | 6 +- _doc/Task.md | 9 +- .../daxpay-single-wechat/pom.xml | 3 +- .../wechat/enums/WechatAllocReceiverEnum.java | 21 + .../clode/WxPayOrderReverseV3Request.java | 50 -- .../wechat/param/pay/WxPayCodepayRequest.java | 602 ------------------ .../WeChatPayAllocationV2Service.java | 5 +- .../WeChatPayAllocationV3Service.java | 5 +- .../close/WechatPayCloseV3Service.java | 25 +- .../service/pay/WechatPayV3Service.java | 22 +- 10 files changed, 48 insertions(+), 700 deletions(-) create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocReceiverEnum.java delete mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/clode/WxPayOrderReverseV3Request.java delete mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/pay/WxPayCodepayRequest.java diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index 2308272f3..1ae6bb6a4 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,7 +1,11 @@ # CHANGELOG ## [v3.0.0.beta3] 2024-12-05 - 新增: 增加支付宝分账功能 -- 优化: 优化分账 +- 新增: 支付宝分账功能 +- 新增: 分账发起和分账完结功能 +- 新增: 增加分账接收方配置功能 +- 新增: 分账同步功能 +- 优化: 调整分账接收者和分账组配置立即 - fix: 修复微信v2当面付发起失败问题 - fix sm3签名校验问题 - fix SDK参数和返回对象与接口不一致修改 diff --git a/_doc/Task.md b/_doc/Task.md index 98a529e98..c2ad46136 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -9,14 +9,15 @@ - [x] 分账界面功能 - [x] 分账接收方配置 - [x] 分账单管理 - - [x] 接口开发 开启/完结/用不 -- [ ] 分账接口开发 + - [x] 接口开发 开启/完结/同步 +- [x] 分账接口开发 - [x] 支付宝 - - [ ] 微信 + - [x] 微信 - [ ] 分账扩展能力 - [ ] 自动分账 - [ ] 自动完成 - [ ] 自动同步状态 + - [ ] 分账消息通知和回调 - [ ] 网关配套移动端开发 - [ ] 同步回调页 - [x] 分账接收方和分账组优化, 后台管理时, 编号自动生成 @@ -38,8 +39,6 @@ - [x] H5收银台 - [x] 跳转支付 - [x] 升级为聚合支付 - - [ ] ~~APP调起支付~~ - - [ ] ~~小程序支付~~ - [x] 聚合收银台 - [x] Jsapi调用 - [x] 跳转支付 diff --git a/daxpay-single-channel/daxpay-single-wechat/pom.xml b/daxpay-single-channel/daxpay-single-wechat/pom.xml index 00b935c0d..4fc87fda7 100644 --- a/daxpay-single-channel/daxpay-single-wechat/pom.xml +++ b/daxpay-single-channel/daxpay-single-wechat/pom.xml @@ -14,12 +14,11 @@ 微信支付通道实现 - 4.6.0 + 4.6.9.B 0.2.12 - com.github.binarywang diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocReceiverEnum.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocReceiverEnum.java new file mode 100644 index 000000000..6ddf1e7b0 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAllocReceiverEnum.java @@ -0,0 +1,21 @@ +package org.dromara.daxpay.channel.wechat.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 微信分账接收者类型 + * @author xxm + * @since 2024/12/17 + */ +@Getter +@AllArgsConstructor +public enum WechatAllocReceiverEnum { + + MERCHANT_ID("MERCHANT_ID", "商户号"), + PERSONAL_OPENID("PERSONAL_OPENID", "openId"), + ; + + private final String code; + private final String name; +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/clode/WxPayOrderReverseV3Request.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/clode/WxPayOrderReverseV3Request.java deleted file mode 100644 index 91369e989..000000000 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/clode/WxPayOrderReverseV3Request.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.dromara.daxpay.channel.wechat.param.clode; - -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serial; -import java.io.Serializable; - -/** - *
- *  V3撤销订单请求对象类
- * 
- * - * @author xxm - */ -@Data -@NoArgsConstructor -@Accessors(chain = true) -public class WxPayOrderReverseV3Request implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - /** - *
-     * 字段名:应用ID
-     * 变量名:appid
-     * 是否必填:是
-     * 类型:string[1,32]
-     * 描述:
-     *  由微信生成的应用ID,全局唯一。请求统一下单接口时请注意APPID的应用属性,例如公众号场景下,需使用应用属性为公众号的APPID
-     *  示例值:wxd678efh567hg6787
-     * 
- */ - @SerializedName(value = "appid") - protected String appid; - /** - *
-     * 字段名:直连商户号
-     * 变量名:mchid
-     * 是否必填:是
-     * 类型:string[1,32]
-     * 描述:
-     *  直连商户的商户号,由微信支付生成并下发。
-     *  示例值:1230000109
-     * 
- */ - @SerializedName(value = "mchid") - protected String mchid; -} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/pay/WxPayCodepayRequest.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/pay/WxPayCodepayRequest.java deleted file mode 100644 index 84cd2f7d6..000000000 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/pay/WxPayCodepayRequest.java +++ /dev/null @@ -1,602 +0,0 @@ -package org.dromara.daxpay.channel.wechat.param.pay; - -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - -/** - * 微信条码(付款码)支付参数 - * 参考接口地址: https://pay.weixin.qq.com/docs/merchant/apis/code-payment-v3/direct/code-pay.html - * @author xxm - * @since 2024/7/24 - */ -@Data -@NoArgsConstructor -@Accessors(chain = true) -public class WxPayCodepayRequest implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - /** - *
-     * 字段名:应用ID
-     * 变量名:appid
-     * 是否必填:是
-     * 类型:string[1,32]
-     * 描述:
-     *  由微信生成的应用ID,全局唯一。请求统一下单接口时请注意APPID的应用属性,例如公众号场景下,需使用应用属性为公众号的APPID
-     *  示例值:wxd678efh567hg6787
-     * 
- */ - @SerializedName(value = "appid") - protected String appid; - /** - *
-     * 字段名:直连商户号
-     * 变量名:mchid
-     * 是否必填:是
-     * 类型:string[1,32]
-     * 描述:
-     *  直连商户的商户号,由微信支付生成并下发。
-     *  示例值:1230000109
-     * 
- */ - @SerializedName(value = "mchid") - protected String mchid; - /** - *
-     * 字段名:商品描述
-     * 变量名:description
-     * 是否必填:是
-     * 类型:string[1,127]
-     * 描述:
-     *  商品描述
-     *  示例值:Image形象店-深圳腾大-QQ公仔
-     * 
- */ - @SerializedName(value = "description") - protected String description; - /** - *
-     * 字段名:商户订单号
-     * 变量名:out_trade_no
-     * 是否必填:是
-     * 类型:string[6,32]
-     * 描述:
-     *  商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
-     *  示例值:1217752501201407033233368018
-     * 
- */ - @SerializedName(value = "out_trade_no") - protected String outTradeNo; - - /** - *
-     * 字段名:微信支付返回的订单号
-     * 变量名:transaction_id
-     * 是否必填:是
-     * 类型:string(32)
-     * 描述:
-     *  微信分配的公众账号ID
-     *  示例值:1000320306201511078440737890
-     * 
- */ - @SerializedName(value = "transaction_id") - private String transactionId; - /** - *
-     * 字段名:附加数据
-     * 变量名:attach
-     * 是否必填:否
-     * 类型:string[1,128]
-     * 描述:
-     *  附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
-     *  示例值:自定义数据
-     * 
- */ - @SerializedName(value = "attach") - protected String attach; - - /** - *
-     * 字段名:订单优惠标记
-     * 变量名:goods_tag
-     * 是否必填:否
-     * 类型:string[1,256]
-     * 描述:
-     *  订单优惠标记
-     *  示例值:WXG
-     * 
- */ - @SerializedName(value = "goods_tag") - private String goodsTag; - /** - *
-     * 字段名:电子发票入口开放标识
-     * 变量名:support_fapiao
-     * 是否必填:否
-     * 类型:boolean
-     * 描述:传入true时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效。
-     * 
- */ - @SerializedName(value = "support_fapiao") - private Boolean supportFapiao; - /** - *
-     * 字段名:支付者
-     * 变量名:payer
-     * 是否必填:是
-     * 类型:object
-     * 描述:
-     *  支付者信息
-     * 
- */ - @SerializedName(value = "payer") - private Payer payer; - /** - *
-     * 字段名:订单金额
-     * 变量名:amount
-     * 是否必填:是
-     * 类型:object
-     * 描述:
-     *  订单金额信息
-     * 
- */ - @SerializedName(value = "amount") - private Amount amount; - /** - *
-     * 字段名:场景信息
-     * 变量名:scene_info
-     * 是否必填:否
-     * 类型:object
-     * 描述:
-     *  支付场景描述
-     * 
- */ - @SerializedName(value = "scene_info") - private SceneInfo sceneInfo; - - /** - *
-     * 字段名:优惠功能
-     * 变量名:promotion_detail
-     * 是否必填:否
-     * 类型:array
-     * 描述:
-     *  优惠功能,享受优惠时返回该字段。
-     * 
- */ - @SerializedName(value = "promotion_detail") - private List promotionDetails; - - /** - *
-     * 字段名:结算信息
-     * 变量名:settle_info
-     * 是否必填:否
-     * 类型:Object
-     * 描述:结算信息
-     * 
- */ - @SerializedName(value = "settle_info") - private SettleInfo settleInfo; - - - @Data - @NoArgsConstructor - public static class Amount implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - /** - *
-         * 字段名:总金额
-         * 变量名:total
-         * 是否必填:否
-         * 类型:int
-         * 描述:
-         *  订单总金额,单位为分。
-         *  示例值:100
-         * 
- */ - @SerializedName(value = "total") - private Integer total; - /** - *
-         * 字段名:用户支付金额
-         * 变量名:payer_total
-         * 是否必填:否
-         * 类型:int
-         * 描述:
-         *  用户支付金额,单位为分。
-         *  示例值:100
-         * 
- */ - @SerializedName(value = "payer_total") - private Integer payerTotal; - /** - *
-         * 字段名:货币类型
-         * 变量名:currency
-         * 是否必填:否
-         * 类型:string[1,16]
-         * 描述:
-         *  CNY:人民币,境内商户号仅支持人民币。
-         *  示例值:CNY
-         * 
- */ - @SerializedName(value = "currency") - private String currency; - /** - *
-         * 字段名:用户支付币种
-         * 变量名:payer_currency
-         * 是否必填:否
-         * 类型:string[1,16]
-         * 描述:
-         *  用户支付币种
-         *  示例值: CNY
-         * 
- */ - @SerializedName(value = "payer_currency") - private String payerCurrency; - } - - @Data - @NoArgsConstructor - public static class Payer implements Serializable { - @Serial - private static final long serialVersionUID = -1L; - /** - *
-         * 字段名:用户标识
-         * 变量名:auth_code
-         * 是否必填:是
-         * 类型:string[32]
-         * 描述:
-         *   付款码支付授权码,即用户打开微信钱包显示的码。
-         *  示例值:130061098828009406
-         * 
- */ - @SerializedName(value = "auth_code") - private String authCode; - } - - @Data - @NoArgsConstructor - public static class SceneInfo implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - /** - *
-         * 字段名:商户端设备 IP
-         * 变量名:device_ip
-         * 是否必填:是
-         * 类型:string[1,45]
-         * 描述:
-         *  用户的客户端IP,支持IPv4和IPv6两种格式的IP地址。
-         *  示例值:14.23.150.211
-         * 
- */ - @SerializedName(value = "device_ip") - private String deviceIp; - /** - *
-         * 字段名:商户端设备号
-         * 变量名:device_id
-         * 是否必填:否
-         * 类型:string[1,32]
-         * 描述:
-         *  商户端设备号(门店号或收银设备ID)。
-         *  示例值:013467007045764
-         * 
- */ - @SerializedName(value = "device_id") - private String deviceId; - /** - *
-         * 字段名:商户门店信息
-         * 变量名:store_info
-         * 是否必填:否
-         * 类型:object
-         * 描述:
-         *  商户门店信息
-         * 
- */ - @SerializedName(value = "store_info") - private StoreInfo storeInfo; - } - - /** - * 商户门店信息 - */ - @Data - @NoArgsConstructor - public static class StoreInfo implements Serializable { - @Serial - private static final long serialVersionUID = -1L; - /** - *
-         * 字段名:门店编号
-         * 变量名:id
-         * 是否必填:是
-         * 类型:string[1,32]
-         * 描述:
-         *  此参数与商家自定义编码(out_id)二选一必填。
-         *  微信支付线下场所ID,格式为纯数字。
-         *  基于合规要求与风险管理目的,线下条码支付时需传入用户实际付款的场景信息。
-         *  指引参见:https://kf.qq.com/faq/230817neeaem2308177ZFfqM.html。
-         *  示例值:0001
-         * 
- */ - @SerializedName(value = "id") - private String id; - /** - *
-         * 字段名:商家自定义编码
-         * 变量名:out_id
-         * 是否必填:否
-         * 类型:string[1,256]
-         * 描述:
-         *  此参数与门店(id)二选一必填。
-         * 商户系统的门店编码,支持大小写英文字母、数字,仅支持utf-8格式。
-         * 基于合规要求与风险管理目的,线下条码支付时需传入用户实际付款的场景信息。
-         *  示例值:A1111
-         * 
- */ - @SerializedName(value = "out_id") - private String outId; - } - - - @Data - @NoArgsConstructor - public static class SettleInfo implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - /** - *
-         * 字段名:是否指定分账
-         * 变量名:profit_sharing
-         * 是否必填:否
-         * 类型:boolean
-         * 描述:
-         *  是否指定分账
-         *  示例值:false
-         * 
- */ - @SerializedName(value = "profit_sharing") - private Boolean profitSharing; - } - - - /** - * 优惠功能 - */ - @Data - @NoArgsConstructor - public static class PromotionDetail implements Serializable { - /** - *
-         * 字段名:券ID
-         * 变量名:coupon_id
-         * 是否必填:是
-         * 类型:string[1,32]
-         * 描述:
-         *  券ID
-         *  示例值:109519
-         * 
- */ - @SerializedName(value = "coupon_id") - private String couponId; - /** - *
-         * 字段名:优惠名称
-         * 变量名:name
-         * 是否必填:否
-         * 类型:string[1,64]
-         * 描述:
-         *  优惠名称
-         *  示例值:单品惠-6
-         * 
- */ - @SerializedName(value = "name") - private String name; - /** - *
-         * 字段名:优惠范围
-         * 变量名:scope
-         * 是否必填:否
-         * 类型:string[1,32]
-         * 描述:
-         *  GLOBAL:全场代金券
-         *  SINGLE:单品优惠
-         *  示例值:GLOBAL
-         * 
- */ - @SerializedName(value = "scope") - private String scope; - /** - *
-         * 字段名:优惠类型
-         * 变量名:type
-         * 是否必填:否
-         * 类型:string[1,32]
-         * 描述:
-         *  CASH:充值
-         *  NOCASH:预充值
-         *  示例值:CASH
-         * 
- */ - @SerializedName(value = "type") - private String type; - /** - *
-         * 字段名:优惠券面额
-         * 变量名:amount
-         * 是否必填:是
-         * 类型:int
-         * 描述:
-         *  优惠券面额
-         *  示例值:100
-         * 
- */ - @SerializedName(value = "amount") - private Integer amount; - /** - *
-         * 字段名:活动ID
-         * 变量名:stock_id
-         * 是否必填:否
-         * 类型:string[1,32]
-         * 描述:
-         *  活动ID
-         *  示例值:931386
-         * 
- */ - @SerializedName(value = "stock_id") - private String stockId; - /** - *
-         * 字段名:微信出资
-         * 变量名:wechatpay_contribute
-         * 是否必填:否
-         * 类型:int
-         * 描述:
-         *  微信出资,单位为分
-         *  示例值:0
-         * 
- */ - @SerializedName(value = "wechatpay_contribute") - private Integer wechatpayContribute; - /** - *
-         * 字段名:商户出资
-         * 变量名:merchant_contribute
-         * 是否必填:否
-         * 类型:int
-         * 描述:
-         *  商户出资,单位为分
-         *  示例值:0
-         * 
- */ - @SerializedName(value = "merchant_contribute") - private Integer merchantContribute; - /** - *
-         * 字段名:其他出资
-         * 变量名:other_contribute
-         * 是否必填:否
-         * 类型:int
-         * 描述:
-         *  其他出资,单位为分
-         *  示例值:0
-         * 
- */ - @SerializedName(value = "other_contribute") - private Integer otherContribute; - /** - *
-         * 字段名:优惠币种
-         * 变量名:currency
-         * 是否必填:否
-         * 类型:string[1,16]
-         * 描述:
-         *  CNY:人民币,境内商户号仅支持人民币。
-         *  示例值:CNY
-         * 
- */ - @SerializedName(value = "currency") - private String currency; - /** - *
-         * 字段名:单品列表
-         * 变量名:goods_detail
-         * 是否必填:否
-         * 类型:array
-         * 描述:
-         *  单品列表信息
-         * 
- */ - @SerializedName(value = "goods_detail") - private List goodsDetails; - } - - @Data - @NoArgsConstructor - public static class GoodsDetail implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - /** - *
-         * 字段名:商品编码
-         * 变量名:goods_id
-         * 是否必填:是
-         * 类型:string[1,32]
-         * 描述:
-         *  商品编码
-         *  示例值:M1006
-         * 
- */ - @SerializedName(value = "goods_id") - private String goodsId; - /** - *
-         * 字段名:商品数量
-         * 变量名:quantity
-         * 是否必填:是
-         * 类型:int
-         * 描述:
-         *  用户购买的数量
-         *  示例值:1
-         * 
- */ - @SerializedName(value = "quantity") - private Integer quantity; - /** - *
-         * 字段名:商品单价
-         * 变量名:unit_price
-         * 是否必填:是
-         * 类型:int
-         * 描述:
-         *  商品单价,单位为分
-         *  示例值:100
-         * 
- */ - @SerializedName(value = "unit_price") - private Integer unitPrice; - /** - *
-         * 字段名:商品优惠金额
-         * 变量名:discount_amount
-         * 是否必填:是
-         * 类型:int
-         * 描述:
-         *  商品优惠金额
-         *  示例值:0
-         * 
- */ - @SerializedName(value = "discount_amount") - private Integer discountAmount; - /** - *
-         * 字段名:商品备注
-         * 变量名:goods_remark
-         * 是否必填:否
-         * 类型:string[1,128]
-         * 描述:
-         *  商品备注信息
-         *  示例值:商品备注信息
-         * 
- */ - @SerializedName(value = "goods_remark") - private String goodsRemark; - } -} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java index fe8a27217..b7bc8d904 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java @@ -13,6 +13,7 @@ import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum; import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; @@ -149,10 +150,10 @@ public class WeChatPayAllocationV2Service { */ private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ if (receiverTypeEnum == OPEN_ID){ - return "PERSONAL_OPENID"; + return WechatAllocReceiverEnum.PERSONAL_OPENID.getCode(); } if (receiverTypeEnum == MERCHANT_NO){ - return "MERCHANT_ID"; + return WechatAllocReceiverEnum.MERCHANT_ID.getCode(); } throw new ConfigErrorException("分账接收方类型错误"); } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java index 5798e550c..40f0402ff 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java @@ -11,6 +11,7 @@ import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum; import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; @@ -147,10 +148,10 @@ public class WeChatPayAllocationV3Service { */ private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ if (receiverTypeEnum == OPEN_ID){ - return "PERSONAL_OPENID"; + return WechatAllocReceiverEnum.PERSONAL_OPENID.getCode(); } if (receiverTypeEnum == MERCHANT_NO){ - return "MERCHANT_ID"; + return WechatAllocReceiverEnum.MERCHANT_ID.getCode(); } throw new ConfigErrorException("分账接收方类型错误"); } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPayCloseV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPayCloseV3Service.java index 03cb0ac26..fceeb6c8c 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPayCloseV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPayCloseV3Service.java @@ -1,17 +1,14 @@ package org.dromara.daxpay.channel.wechat.service.close; +import com.github.binarywang.wxpay.bean.request.WxPayOrderReverseV3Request; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.param.clode.WxPayOrderReverseV3Request; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import com.github.binarywang.wxpay.config.WxPayConfig; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** @@ -24,7 +21,6 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class WechatPayCloseV3Service { private final WechatPayConfigService wechatPayConfigService; - private static final Gson GSON = new GsonBuilder().create(); /** * 关闭支付, 微信对已经关闭的支付单也可以重复关闭 @@ -45,16 +41,9 @@ public class WechatPayCloseV3Service { public void cancel(PayOrder payOrder, WechatPayConfig config){ WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); try { - WxPayConfig wxPayConfig = wxPayService.getConfig(); - // 设置公共属性 WxPayOrderReverseV3Request request = new WxPayOrderReverseV3Request(); - request.setMchid(wxPayConfig.getMchId()); - request.setAppid(wxPayConfig.getAppId()); - - // 拼接参数请求路径并发送 - String url = String.format("%s/v3/pay/transactions/out-trade-no/%s/reverse", - wxPayService.getPayBaseUrl(), payOrder.getOrderNo()); - wxPayService.postV3(url, GSON.toJson(request)); + request.setOutTradeNo(payOrder.getOutOrderNo()); + wxPayService.reverseOrderV3(request); } catch (WxPayException e) { log.error("微信撤销支付V3失败", e); throw new TradeFailException("微信撤销支付V3失败: "+e.getMessage()); diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV3Service.java index 5f00cf75f..4a3f361a5 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV3Service.java @@ -3,22 +3,18 @@ package org.dromara.daxpay.channel.wechat.service.pay; import cn.bootx.platform.common.spring.exception.RetryableException; import cn.bootx.platform.core.util.JsonUtil; import cn.hutool.extra.spring.SpringUtil; +import com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest; import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; -import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.constant.WxPayConstants; import com.github.binarywang.wxpay.constant.WxPayErrorCode; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; -import org.dromara.daxpay.channel.wechat.param.pay.WxPayCodepayRequest; -import org.dromara.daxpay.channel.wechat.result.pay.WxPayCodepayResult; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; import org.dromara.daxpay.core.enums.PayMethodEnum; @@ -50,7 +46,6 @@ import java.util.Objects; public class WechatPayV3Service { private final WechatPayConfigService wechatPayConfigService; - private static final Gson GSON = new GsonBuilder().create(); private final PaySyncService paySyncService; /** @@ -196,16 +191,9 @@ public class WechatPayV3Service { */ private void barCodePay(PayOrder payOrder, String authCode, WechatPayConfig config, PayResultBo payResult) { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - try { WxPayCodepayRequest request = new WxPayCodepayRequest(); - // 设置公共属性 - WxPayConfig wxPayConfig = wxPayService.getConfig(); - request.setMchid(wxPayConfig.getMchId()) - .setAppid(wxPayConfig.getAppId()); - request.setDescription(payOrder.getTitle()); request.setOutTradeNo(payOrder.getOrderNo()); - // 金额 var amount = new WxPayCodepayRequest.Amount(); amount.setTotal(PayUtil.convertCentAmount(payOrder.getAmount())); @@ -229,11 +217,9 @@ public class WechatPayV3Service { settleInfo.setProfitSharing(true); request.setSettleInfo(settleInfo); } - // 拼接和发送请求 - String url = String.format("%s/v3/pay/transactions/codepay", wxPayService.getPayBaseUrl()); - String body = wxPayService.postV3(url, GSON.toJson(request)); - var result = GSON.fromJson(body, WxPayCodepayResult.class); - + try { + // 发送请求 + var result = wxPayService.codepay(request); // 支付成功处理, 如果不成功会走异常流 payResult.setComplete(true) .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime())) From c0ee1dd7f8c048ed0389b3f89c679a5d4563237d Mon Sep 17 00:00:00 2001 From: DaxPay Date: Tue, 17 Dec 2024 16:50:05 +0800 Subject: [PATCH 28/54] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=88=86?= =?UTF-8?q?=E8=B4=A6=E9=85=8D=E7=BD=AE=E6=9B=B4=E6=96=B0=E4=B8=8D=E7=94=9F?= =?UTF-8?q?=E6=95=88=E9=97=AE=E9=A2=98,=20=E4=BF=AE=E5=A4=8Dwxjava?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BD=BF=E7=94=A8base64=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E9=97=AE=E9=A2=98,=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=88=86=E8=B4=A6=E5=90=8C=E6=AD=A5=E6=9C=89?= =?UTF-8?q?=E7=A9=BA=E6=8C=87=E9=92=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 13 ++---- .../WeChatPayAllocationV2Service.java | 4 +- .../WeChatPayAllocationV3Service.java | 4 +- .../config/WechatPayConfigService.java | 8 ++-- .../service/pay/WechatPayV3Service.java | 46 +++++++++---------- ...roller.java => AllocConfigController.java} | 2 +- .../allocation/AllocConfigService.java | 2 +- 7 files changed, 41 insertions(+), 38 deletions(-) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/{AllocController.java => AllocConfigController.java} (98%) diff --git a/_doc/Task.md b/_doc/Task.md index c2ad46136..156581503 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,11 +1,14 @@ # 单商户 ## 3.0.1 功能优化 +- [ ] 网关配套移动端开发 + - [ ] 同步回调页 - [ ] 收银台功能优化 - [ ] 支持配置背景色和图标 - [ ] 定时同步任务频次不要太高, 预防产生过多的数据 +- [ ] 增加首页驾驶舱功能 +- [ ] 商户应用应该要有一个类似删除的功能, 实现停用冻结, 但不影响数据的关联 ## 3.0.0.bate3: 功能完善 - 优化: -- [ ] 增加首页驾驶舱功能 - [x] 分账界面功能 - [x] 分账接收方配置 - [x] 分账单管理 @@ -18,8 +21,6 @@ - [ ] 自动完成 - [ ] 自动同步状态 - [ ] 分账消息通知和回调 -- [ ] 网关配套移动端开发 - - [ ] 同步回调页 - [x] 分账接收方和分账组优化, 后台管理时, 编号自动生成 - [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 - [x] 支付订单新增待支付状态 @@ -47,7 +48,7 @@ - [x] 码牌不再使用应用号作为标识, 使用独立的编码 - [x] 码牌H5页面对接 - [ ] 分账配置/分账组/分账接收方合并为一个tabs页面 -## 3.0.0.beta2 收银台 +## 3.0.0.beta1 收银台 - [x] 收银台功能 - [x] 收银台配置 - [x] 分类配置 @@ -63,8 +64,6 @@ - [x] H5收银台 - [x] 跳转支付 - [x] 升级为聚合支付 - - [ ] ~~APP调起支付~~ - - [ ] ~~小程序支付~~ - [x] 聚合收银台 - [x] Jsapi调用 - [x] 跳转支付 @@ -80,5 +79,3 @@ ## 任务池 - [ ] 退款支持以撤销的方式进行退款 -- [ ] 商户应用增加启停用状态 -- [ ] 商户应用应该要有一个类似删除的功能, 实现停用冻结, 但不影响数据的关联 diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java index b7bc8d904..58b5db7de 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java @@ -30,8 +30,10 @@ import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; @@ -126,7 +128,7 @@ public class WeChatPayAllocationV2Service { } var detailMap = details.stream() .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); - var royaltyDetailList = result.getReceivers(); + var royaltyDetailList = Optional.ofNullable( result.getReceivers()).orElse(new ArrayList<>(0)); for (var receiver : royaltyDetailList) { var detail = detailMap.get(receiver.getAccount()); if (Objects.nonNull(detail)) { diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java index 40f0402ff..23d29be0c 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java @@ -28,8 +28,10 @@ import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; @@ -124,7 +126,7 @@ public class WeChatPayAllocationV3Service { } var detailMap = details.stream() .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); - var royaltyDetailList = result.getReceivers(); + var royaltyDetailList = Optional.ofNullable(result.getReceivers()).orElse(new ArrayList<>(0)); for (var receiver : royaltyDetailList) { var detail = detailMap.get(receiver.getAccount()); if (Objects.nonNull(detail)) { diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatPayConfigService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatPayConfigService.java index 52dee3d73..198dc9a65 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatPayConfigService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatPayConfigService.java @@ -2,6 +2,7 @@ package org.dromara.daxpay.channel.wechat.service.config; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.codec.Base64; import cn.hutool.core.util.StrUtil; import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.service.WxPayService; @@ -146,10 +147,11 @@ public class WechatPayConfigService { payConfig.setAppId(wechatPayConfig.getWxAppId()); payConfig.setMchKey(wechatPayConfig.getApiKeyV2()); payConfig.setApiV3Key(wechatPayConfig.getApiKeyV3()); - payConfig.setPrivateKeyString(wechatPayConfig.getPrivateKey()); - payConfig.setPrivateCertString(wechatPayConfig.getPrivateCert()); + // 注意不要使用base64的方式进行配置, 因为wxjava 是直接读取文本并不会进行解码 + payConfig.setPrivateKeyContent(Base64.decode(wechatPayConfig.getPrivateKey())); + payConfig.setPrivateCertContent(Base64.decode(wechatPayConfig.getPrivateCert())); payConfig.setCertSerialNo(wechatPayConfig.getCertSerialNo()); - payConfig.setKeyString(wechatPayConfig.getP12()); + payConfig.setKeyContent(Base64.decode(wechatPayConfig.getP12())); WxPayService wxPayService = new WxPayServiceImpl(); wxPayService.setConfig(payConfig); return wxPayService; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV3Service.java index 4a3f361a5..f2e6f32dc 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV3Service.java @@ -191,32 +191,32 @@ public class WechatPayV3Service { */ private void barCodePay(PayOrder payOrder, String authCode, WechatPayConfig config, PayResultBo payResult) { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); - WxPayCodepayRequest request = new WxPayCodepayRequest(); - request.setDescription(payOrder.getTitle()); - request.setOutTradeNo(payOrder.getOrderNo()); - // 金额 - var amount = new WxPayCodepayRequest.Amount(); - amount.setTotal(PayUtil.convertCentAmount(payOrder.getAmount())); - request.setAmount(amount); + WxPayCodepayRequest request = new WxPayCodepayRequest(); + request.setDescription(payOrder.getTitle()); + request.setOutTradeNo(payOrder.getOrderNo()); + // 金额 + var amount = new WxPayCodepayRequest.Amount(); + amount.setTotal(PayUtil.convertCentAmount(payOrder.getAmount())); + request.setAmount(amount); - // 场景信息 - var sceneInfo = new WxPayCodepayRequest.SceneInfo(); - var storeInfo = new WxPayCodepayRequest.StoreInfo(); - storeInfo.setOutId("1"); - sceneInfo.setStoreInfo(storeInfo); - request.setSceneInfo(sceneInfo); + // 场景信息 + var sceneInfo = new WxPayCodepayRequest.SceneInfo(); + var storeInfo = new WxPayCodepayRequest.StoreInfo(); + storeInfo.setOutId("1"); + sceneInfo.setStoreInfo(storeInfo); + request.setSceneInfo(sceneInfo); - // 条码参数 - var payer = new WxPayCodepayRequest.Payer(); - payer.setAuthCode(authCode); - request.setPayer(payer); + // 条码参数 + var payer = new WxPayCodepayRequest.Payer(); + payer.setAuthCode(authCode); + request.setPayer(payer); - // 分账参数 - if (payOrder.getAllocation()){ - var settleInfo = new WxPayCodepayRequest.SettleInfo(); - settleInfo.setProfitSharing(true); - request.setSettleInfo(settleInfo); - } + // 分账参数 + if (payOrder.getAllocation()){ + var settleInfo = new WxPayCodepayRequest.SettleInfo(); + settleInfo.setProfitSharing(true); + request.setSettleInfo(settleInfo); + } try { // 发送请求 var result = wxPayService.codepay(request); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocConfigController.java similarity index 98% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocController.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocConfigController.java index 1f9a155c5..dbec0267c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/allocation/AllocConfigController.java @@ -24,7 +24,7 @@ import org.springframework.web.bind.annotation.*; @RequestGroup(groupCode = "AllocConfig", groupName = "分账配置", moduleCode = "Alloc", moduleName = "分账管理" ) @RequestMapping("/allocation/config") @RequiredArgsConstructor -public class AllocController { +public class AllocConfigController { private final AllocConfigService allocConfigService; @RequestPath("保存") diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java index bc1bf7505..21d27f8df 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java @@ -43,7 +43,7 @@ public class AllocConfigService { public void update(AllocConfigParam param) { AllocConfig config = allocConfigManger.findById(param.getId()) .orElseThrow(() -> new DataNotExistException("分账配置不存在")); - BeanUtil.copyProperties(config, param, CopyOptions.create().ignoreNullValue()); + BeanUtil.copyProperties(param, config, CopyOptions.create().ignoreNullValue()); allocConfigManger.updateById(config); } From aa6505e5ae3b26dfadb11b6cbd2727c88f5fd074 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Tue, 17 Dec 2024 18:08:03 +0800 Subject: [PATCH 29/54] =?UTF-8?q?feat=20=E5=88=86=E8=B4=A6=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E9=80=9A=E7=9F=A5=E5=92=8C=E5=9B=9E=E8=B0=83,=20?= =?UTF-8?q?=E5=88=86=E8=B4=A6=E4=BA=8B=E4=BB=B6=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 2 +- .../config/WechatPayConfigService.java | 2 +- .../daxpay/service/code/DaxPayCode.java | 16 ++++++-- .../convert/allocation/AllocOrderConvert.java | 4 ++ .../service/enums/NotifyContentTypeEnum.java | 3 ++ .../service/event/AllocationEventService.java | 41 +++++++++++++++++++ .../service/event/TradeOrderEventService.java | 6 +-- .../service/allocation/AllocationService.java | 5 ++- .../allocation/AllocationSyncService.java | 12 +++--- .../checkout/CheckoutAssistService.java | 2 +- .../service/notice/MerchantNoticeService.java | 18 +++++++- .../callback/MerchantCallbackTaskService.java | 31 ++++++++++++++ .../notify/MerchantNotifyTaskService.java | 28 +++++++++++++ .../service/trade/pay/PayAssistService.java | 2 +- .../service/trade/refund/RefundService.java | 4 +- .../trade/transfer/TransferService.java | 2 +- .../task/AllocationSyncTaskService.java | 16 ++++++++ .../daxpay/service/task/ReconcileTask.java | 3 +- 18 files changed, 171 insertions(+), 26 deletions(-) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/AllocationEventService.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java diff --git a/_doc/Task.md b/_doc/Task.md index 156581503..4db35ad1f 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -20,7 +20,7 @@ - [ ] 自动分账 - [ ] 自动完成 - [ ] 自动同步状态 - - [ ] 分账消息通知和回调 + - [x] 分账消息通知和回调 - [x] 分账接收方和分账组优化, 后台管理时, 编号自动生成 - [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 - [x] 支付订单新增待支付状态 diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatPayConfigService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatPayConfigService.java index 198dc9a65..f7d5b0d7e 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatPayConfigService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatPayConfigService.java @@ -147,7 +147,7 @@ public class WechatPayConfigService { payConfig.setAppId(wechatPayConfig.getWxAppId()); payConfig.setMchKey(wechatPayConfig.getApiKeyV2()); payConfig.setApiV3Key(wechatPayConfig.getApiKeyV3()); - // 注意不要使用base64的方式进行配置, 因为wxjava 是直接读取文本并不会进行解码 + // 注意不要使用base64的方式进行配置, 因为wxjava 是直接读取文本并不会进行解码, 会导致证书异常 payConfig.setPrivateKeyContent(Base64.decode(wechatPayConfig.getPrivateKey())); payConfig.setPrivateCertContent(Base64.decode(wechatPayConfig.getPrivateCert())); payConfig.setCertSerialNo(wechatPayConfig.getCertSerialNo()); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/code/DaxPayCode.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/code/DaxPayCode.java index 559795595..f48f7baff 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/code/DaxPayCode.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/code/DaxPayCode.java @@ -17,14 +17,22 @@ public interface DaxPayCode { /** 商户回调通知 */ String MERCHANT_CALLBACK_SENDER = "CallbackSender"; - /** 支付任务超时 */ - String MERCHANT_PAY_TIMEOUT = "PayTimeout"; + /** 支付订单超时关闭 */ + String ORDER_PAY_TIMEOUT = "PayTimeout"; /** 退款任务同步 默认两分钟后查询 */ - String MERCHANT_REFUND_SYNC = "RefundSync"; + String ORDER_REFUND_SYNC = "RefundSync"; /** 转账任务同步 默认两分钟后查询 */ - String MERCHANT_TRANSFER_SYNC = "TransferSync"; + String ORDER_TRANSFER_SYNC = "TransferSync"; + /** 自动分账 */ + String ORDER_ALLOC_START = "AllocStart"; + + /** 分账同步 */ + String ORDER_ALLOC_SYNC = "AllocSync"; + + /** 分账完结 */ + String ORDER_ALLOC_FINISH = "AllocFinish"; } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java index 926ddf66e..0e6c33f42 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java @@ -9,6 +9,8 @@ import org.dromara.daxpay.service.result.allocation.order.AllocOrderVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; +import java.util.List; + /** * * @author xxm @@ -22,6 +24,8 @@ public interface AllocOrderConvert { AllocDetailResult toResult(AllocDetail in); + List toList(List in); + AllocOrderVo toVo(AllocOrder in); AllocDetailVo toVo(AllocDetail in); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/enums/NotifyContentTypeEnum.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/enums/NotifyContentTypeEnum.java index 10265ba5e..55d870f0f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/enums/NotifyContentTypeEnum.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/enums/NotifyContentTypeEnum.java @@ -21,6 +21,9 @@ public enum NotifyContentTypeEnum { /** 支付订单变动通知 */ TRANSFER("transfer", "转账订单变动通知"), + + /** 分账订单变动通知 */ + ALLOCATION("allocation", "分账订单变动通知"), ; private final String code; private final String name; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/AllocationEventService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/AllocationEventService.java new file mode 100644 index 000000000..3544edf0f --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/AllocationEventService.java @@ -0,0 +1,41 @@ +package org.dromara.daxpay.service.event; + +import cn.bootx.platform.starter.redis.delay.annotation.DelayEventListener; +import cn.bootx.platform.starter.redis.delay.annotation.DelayJobEvent; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.service.code.DaxPayCode; +import org.springframework.stereotype.Service; + +/** + * 分账事件 + * @author xxm + * @since 2024/12/17 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AllocationEventService { + + + /** + * 自动分账 参数为订单号 + */ + @DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_START) + public void start(DelayJobEvent event) { + log.info("分账开始,订单号:{}", event.getMessage()); + } + + /** + * 分账同步 + */ + @DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_SYNC) + public void sync(DelayJobEvent event) { + log.info("分账同步,订单号:{}", event.getMessage()); + } + + @DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_FINISH) + public void finish(DelayJobEvent event) { + log.info("分账完成,订单号:{}", event.getMessage()); + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java index 33882bd5c..c74c0bb9f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java @@ -44,7 +44,7 @@ public class TradeOrderEventService { /** * 接收订单超时事件, 发起同步 */ - @DelayEventListener(DaxPayCode.Event.MERCHANT_PAY_TIMEOUT) + @DelayEventListener(DaxPayCode.Event.ORDER_PAY_TIMEOUT) public void payExpired(DelayJobEvent event) { Optional orderOpt = payOrderManager.findById(event.getMessage()); if (orderOpt.isPresent()) { @@ -59,7 +59,7 @@ public class TradeOrderEventService { /** * 接收退款订单同步事件 */ - @DelayEventListener(DaxPayCode.Event.MERCHANT_REFUND_SYNC) + @DelayEventListener(DaxPayCode.Event.ORDER_REFUND_SYNC) public void refundDelaySync(DelayJobEvent event) { var orderOpt = refundOrderManager.findById(event.getMessage()); if (orderOpt.isPresent()) { @@ -76,7 +76,7 @@ public class TradeOrderEventService { /** * 接收转账订单超时事件 */ - @DelayEventListener(DaxPayCode.Event.MERCHANT_TRANSFER_SYNC) + @DelayEventListener(DaxPayCode.Event.ORDER_TRANSFER_SYNC) public void TransferDelaySync(DelayJobEvent event) { var orderOpt = transferOrderManager.findById(event.getMessage()); if (orderOpt.isPresent()) { diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java index ebd0bd287..3c66c7b77 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java @@ -26,6 +26,7 @@ import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.service.allocation.order.AllocOrderQueryService; import org.dromara.daxpay.service.service.allocation.order.AllocOrderService; import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.service.notice.MerchantNoticeService; import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; import org.dromara.daxpay.service.util.PaymentStrategyFactory; import org.springframework.stereotype.Service; @@ -61,6 +62,7 @@ public class AllocationService { private final AllocOrderQueryService allocOrderQueryService; private final AllocOrderService allocOrderService; + private final MerchantNoticeService merchantNoticeService; /** * 开启分账 多次请求只会分账一次 @@ -244,6 +246,7 @@ public class AllocationService { .setErrorMsg(e.getMessage()); } allocationOrderManager.updateById(allocOrder); + merchantNoticeService.registerAllocNotice(allocOrder, details); return new AllocationResult() .setAllocNo(allocOrder.getAllocNo()) .setBizAllocNo(allocOrder.getBizAllocNo()) @@ -266,6 +269,4 @@ public class AllocationService { result.setDetails(details); return result; } - - } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java index c4b8d61cf..53241a602 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java @@ -20,6 +20,7 @@ import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; import org.dromara.daxpay.service.service.assist.PaymentAssistService; +import org.dromara.daxpay.service.service.notice.MerchantNoticeService; import org.dromara.daxpay.service.service.record.sync.TradeSyncRecordService; import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; import org.dromara.daxpay.service.util.PaymentStrategyFactory; @@ -48,6 +49,7 @@ public class AllocationSyncService { private final LockTemplate lockTemplate; private final PaymentAssistService paymentAssistService; + private final MerchantNoticeService merchantNoticeService; /** * 分账同步 @@ -120,12 +122,10 @@ public class AllocationSyncService { /** * 根据订单明细更新订单的状态和处理结果, 如果订单是分账结束或失败, 不更新状态 - * TODO 是否多次同步会产生多次变动, 注意处理多次推送通知的问题, 目前是 */ private void updateOrderStatus(AllocOrder allocOrder, List details){ // 如果是分账结束或失败, 不更新状态 String status = allocOrder.getStatus(); - // 如果是分账结束或失败, 不进行对订单进行处理 List list = Arrays.asList(AllocationStatusEnum.FINISH.getCode(), AllocationStatusEnum.FINISH_FAILED.getCode()); if (!list.contains(status)){ @@ -162,10 +162,10 @@ public class AllocationSyncService { allocOrderDetailManager.updateAllById(details); allocationOrderManager.updateById(allocOrder); - // 如果状态为完成, 发送通知 - if (Objects.equals(AllocationStatusEnum.ALLOC_END.getCode(), allocOrder.getStatus())){ - // 发送通知 -// clientNoticeService.registerAllocNotice(allocOrder, details); + // 如果状态为分账完成, 发送通知 + if (Objects.equals(AllocationStatusEnum.FINISH.getCode(), allocOrder.getStatus())){ + // 注册通知 多次同步会产生多次变动, 注意处理多次推送通知的问题 + merchantNoticeService.registerAllocNotice(allocOrder, details); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java index 5b1a7e339..7f00179ec 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/checkout/CheckoutAssistService.java @@ -138,7 +138,7 @@ public class CheckoutAssistService { } payOrderManager.save(order); // 注册支付超时任务 - delayJobService.registerByTransaction(order.getId(), DaxPayCode.Event.MERCHANT_PAY_TIMEOUT, order.getExpiredTime()); + delayJobService.registerByTransaction(order.getId(), DaxPayCode.Event.ORDER_PAY_TIMEOUT, order.getExpiredTime()); return order; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeService.java index 47ab52a6b..20ea64f65 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeService.java @@ -1,15 +1,19 @@ package org.dromara.daxpay.service.service.notice; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; import org.dromara.daxpay.service.service.notice.callback.MerchantCallbackTaskService; import org.dromara.daxpay.service.service.notice.notify.MerchantNotifyTaskService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + /** * 客户通知服务 * @author xxm @@ -44,8 +48,18 @@ public class MerchantNoticeService { /** * 注册转账通知 */ + @Transactional(rollbackFor = Exception.class) public void registerTransferNotice(TransferOrder order) { merchantNotifyService.registerTransferNotice(order); merchantCallbackService.registerTransferNotice(order); } + + /** + * 注册分账通知 + */ + @Transactional(rollbackFor = Exception.class) + public void registerAllocNotice(AllocOrder order, List details) { + merchantNotifyService.registerAllocNotice(order,details); + merchantCallbackService.registerAllocNotice(order,details); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackTaskService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackTaskService.java index 27fecfb21..87f7cb2c1 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackTaskService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackTaskService.java @@ -3,11 +3,15 @@ package org.dromara.daxpay.service.service.notice.callback; import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.starter.redis.delay.service.DelayJobService; import org.dromara.daxpay.core.enums.TradeTypeEnum; +import org.dromara.daxpay.core.result.allocation.order.AllocDetailResult; import org.dromara.daxpay.service.code.DaxPayCode; +import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; import org.dromara.daxpay.service.convert.order.pay.PayOrderConvert; import org.dromara.daxpay.service.convert.order.refund.RefundOrderConvert; import org.dromara.daxpay.service.convert.order.transfer.TransferOrderConvert; import org.dromara.daxpay.service.dao.notice.callback.MerchantCallbackTaskManager; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackTask; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; @@ -17,6 +21,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.List; + /** * 商户回调消息服务类 * @author xxm @@ -100,4 +106,29 @@ public class MerchantCallbackTaskService { delayJobService.registerByTransaction(task.getId(), DaxPayCode.Event.MERCHANT_CALLBACK_SENDER, 0); log.info("注册转账通知"); } + + /** + * 注册分账通知 + */ + public void registerAllocNotice(AllocOrder order, List details) { + // 判断是否需要进行通知 + if (StrUtil.isBlank(order.getNotifyUrl())){ + log.info("分账订单无需通知,订单号:{}",order.getAllocNo()); + return; + } + var noticeResult = AllocOrderConvert.CONVERT.toResult(order); + List detailResults = AllocOrderConvert.CONVERT.toList(details); + noticeResult.setDetails(detailResults); + var task = new MerchantCallbackTask() + // 时间序列化进行了重写, 所以使用Jackson的序列化工具类 + .setContent(JacksonUtil.toJson(noticeResult)) + .setTradeType(TradeTypeEnum.ALLOCATION.getCode()) + .setUrl(order.getNotifyUrl()) + .setSendCount(0) + .setTradeId(order.getId()) + .setTradeNo(order.getAllocNo()); + taskManager.save(task); + delayJobService.registerByTransaction(task.getId(), DaxPayCode.Event.MERCHANT_CALLBACK_SENDER, 0); + log.info("注册分账通知"); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyTaskService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyTaskService.java index 5358c149c..bbe12877e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyTaskService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyTaskService.java @@ -3,13 +3,17 @@ package org.dromara.daxpay.service.service.notice.notify; import cn.bootx.platform.common.jackson.util.JacksonUtil; import cn.bootx.platform.starter.redis.delay.service.DelayJobService; import org.dromara.daxpay.core.enums.MerchantNotifyTypeEnum; +import org.dromara.daxpay.core.result.allocation.order.AllocDetailResult; import org.dromara.daxpay.service.code.DaxPayCode; import org.dromara.daxpay.service.common.context.MchAppLocal; import org.dromara.daxpay.service.common.local.PaymentContextLocal; +import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; import org.dromara.daxpay.service.convert.order.pay.PayOrderConvert; import org.dromara.daxpay.service.convert.order.refund.RefundOrderConvert; import org.dromara.daxpay.service.convert.order.transfer.TransferOrderConvert; import org.dromara.daxpay.service.dao.notice.notify.MerchantNotifyTaskManager; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyTask; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; @@ -21,6 +25,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Objects; /** @@ -102,6 +107,29 @@ public class MerchantNotifyTaskService { log.info("注册转账通知"); } + /** + * 注册分账通知 + */ + public void registerAllocNotice(AllocOrder order, List details) { + if (this.nonRegister(NotifyContentTypeEnum.ALLOCATION)){ + log.info("分账无需回调,订单号:{}",order.getAllocNo()); + return; + } + var noticeResult = AllocOrderConvert.CONVERT.toResult(order); + List detailResults = AllocOrderConvert.CONVERT.toList(details); + noticeResult.setDetails(detailResults); + var task = new MerchantNotifyTask() + // 时间序列化进行了重写, 所以使用Jackson的序列化工具类 + .setContent(JacksonUtil.toJson(noticeResult)) + .setNotifyType(NotifyContentTypeEnum.ALLOCATION.getCode()) + .setSendCount(0) + .setTradeId(order.getId()) + .setTradeNo(order.getAllocNo()); + taskManager.save(task); + delayJobService.registerByTransaction(task.getId(), DaxPayCode.Event.MERCHANT_NOTIFY_SENDER, 0); + log.info("注册分账通知"); + } + /** * 判断是否 不需要注册通知 * true 不需要 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayAssistService.java index 64656fb5d..b960f38f0 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayAssistService.java @@ -67,7 +67,7 @@ public class PayAssistService { } payOrderManager.save(order); // 注册支付超时任务 - delayJobService.registerByTransaction(order.getId(), DaxPayCode.Event.MERCHANT_PAY_TIMEOUT, order.getExpiredTime()); + delayJobService.registerByTransaction(order.getId(), DaxPayCode.Event.ORDER_PAY_TIMEOUT, order.getExpiredTime()); return order; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundService.java index fa43ee0e9..f8fff02e7 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundService.java @@ -159,7 +159,7 @@ public class RefundService { // 执行退款策略 refundResultBo = refundStrategy.doRefundHandler(); // 注册一个两分钟后执行的同步任务, 作为接不到回调任务的兜底 - delayJobService.registerByTransaction(refundOrder.getId(), DaxPayCode.Event.MERCHANT_PAY_TIMEOUT, 2*60*1000L); + delayJobService.registerByTransaction(refundOrder.getId(), DaxPayCode.Event.ORDER_PAY_TIMEOUT, 2*60*1000L); } catch (Exception e) { log.error("重新退款失败:", e); // 记录退款失败的记录 @@ -217,7 +217,7 @@ public class RefundService { merchantNoticeService.registerRefundNotice(refundOrder); } else { // 注册延时同步事件 - delayJobService.registerByTransaction(refundOrder.getId(), DaxPayCode.Event.MERCHANT_REFUND_SYNC, 2*60*1000L); + delayJobService.registerByTransaction(refundOrder.getId(), DaxPayCode.Event.ORDER_REFUND_SYNC, 2*60*1000L); } refundOrderManager.updateById(refundOrder); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferService.java index 09d25a813..2a2c35d15 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferService.java @@ -142,7 +142,7 @@ public class TransferService { tradeFlowRecordService.saveTransfer(order); } else { // 注册延时同步事件 - delayJobService.registerByTransaction(order.getId(), DaxPayCode.Event.MERCHANT_TRANSFER_SYNC, 2*60*1000L); + delayJobService.registerByTransaction(order.getId(), DaxPayCode.Event.ORDER_TRANSFER_SYNC, 2*60*1000L); } transferOrderManager.updateById(order); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java new file mode 100644 index 000000000..4d2b2bb4b --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java @@ -0,0 +1,16 @@ +package org.dromara.daxpay.service.task; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 分账同步任务 + * @author xxm + * @since 2024/12/17 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AllocationSyncTaskService { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/ReconcileTask.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/ReconcileTask.java index 7a1e0cbf9..21cbea4ad 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/ReconcileTask.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/ReconcileTask.java @@ -44,9 +44,8 @@ public class ReconcileTask { private final PaymentAssistService paymentAssistService; - /** - * 任务实现, 上午10.30执行 + * 对账任务实现, 上午10.30执行 */ @Scheduled(cron = "0 30 10 * * ?") public void reconcileTask() { From b5d10f1ead1d89cfe2e6eacb868b10d3693389e3 Mon Sep 17 00:00:00 2001 From: bootx Date: Tue, 17 Dec 2024 22:27:27 +0800 Subject: [PATCH 30/54] =?UTF-8?q?feat:=20=E8=87=AA=E5=8A=A8=E5=88=86?= =?UTF-8?q?=E8=B4=A6/=E8=87=AA=E5=8A=A8=E5=AE=8C=E7=BB=93/=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=90=8C=E6=AD=A5=E7=8A=B6=E6=80=81=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/ChangeLog.md | 22 ++++-- _doc/Task.md | 12 +-- .../WeChatPayAllocationV3Service.java | 4 +- .../unipay/UniAllocationController.java | 2 +- ...figManger.java => AllocConfigManager.java} | 2 +- .../entity/allocation/AllocConfig.java | 9 +++ .../service/event/AllocationEventService.java | 15 +++- .../service/event/TradeOrderEventService.java | 4 +- .../allocation/AllocConfigService.java | 14 ++-- .../service/allocation/AllocationService.java | 56 +++++++++++-- .../allocation/AllocationSyncService.java | 78 +++++++++++-------- .../service/order/pay/PayOrderService.java | 30 ++++++- .../service/trade/pay/PayCallbackService.java | 3 + .../service/service/trade/pay/PayService.java | 4 + .../trade/refund/RefundCallbackService.java | 1 - .../task/AllocationSyncTaskService.java | 5 ++ 16 files changed, 193 insertions(+), 68 deletions(-) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/{AllocConfigManger.java => AllocConfigManager.java} (90%) diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index 1ae6bb6a4..1b18b070c 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,14 +1,20 @@ # CHANGELOG -## [v3.0.0.beta3] 2024-12-05 -- 新增: 增加支付宝分账功能 -- 新增: 支付宝分账功能 -- 新增: 分账发起和分账完结功能 -- 新增: 增加分账接收方配置功能 +## [v3.0.0.beta3] 2024-12-22 +- 新增: 支持支付宝分账功能 +- 新增: 支持微信分账功能 +- 新增: 支持分账发起和分账完结功能 +- 新增: 支持分账接收方配置功能 +- 新增: 支持支付订单自动分账功能 +- 新增: 自动同步分账订单状态功能 +- 新增: 分账回调通知和分账消息通知功能 +- 新增: 自动完结分账订单功能 - 新增: 分账同步功能 -- 优化: 调整分账接收者和分账组配置立即 +- 优化: 升级wxjava4.6.9.B,并处理证书配置问题 +- 优化: 调整分账接收者和分账组配置逻辑 - fix: 修复微信v2当面付发起失败问题 -- fix sm3签名校验问题 -- fix SDK参数和返回对象与接口不一致修改 +- fix: 修复微信v2分账参数未设置问题 +- fix: sm3签名校验问题 +- fix: SDK参数和返回对象与接口不一致修改 ## [v3.0.0.beta2] 2024-12-05 - 新增: 增加PC收银台功能 diff --git a/_doc/Task.md b/_doc/Task.md index 4db35ad1f..bead40a2f 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -16,13 +16,12 @@ - [x] 分账接口开发 - [x] 支付宝 - [x] 微信 -- [ ] 分账扩展能力 - - [ ] 自动分账 - - [ ] 自动完成 - - [ ] 自动同步状态 +- [x] 分账扩展能力 + - [x] 自动分账 + - [x] 自动完结 + - [x] 自动同步状态 - [x] 分账消息通知和回调 - [x] 分账接收方和分账组优化, 后台管理时, 编号自动生成 -- [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 - [x] 支付订单新增待支付状态 ## 3.0.0.beta2 收银台 - [x] 收银台功能 @@ -47,7 +46,8 @@ - [x] 一个应用支持多码牌 - [x] 码牌不再使用应用号作为标识, 使用独立的编码 - [x] 码牌H5页面对接 -- [ ] 分账配置/分账组/分账接收方合并为一个tabs页面 +- [x] 分账配置/分账组/分账接收方合并为一个tabs页面 +- [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 ## 3.0.0.beta1 收银台 - [x] 收银台功能 - [x] 收银台配置 diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java index 23d29be0c..84f5bd7c5 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java @@ -17,7 +17,6 @@ import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; import org.dromara.daxpay.core.enums.AllocDetailResultEnum; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.enums.AllocationStatusEnum; import org.dromara.daxpay.core.exception.ConfigErrorException; import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.core.util.PayUtil; @@ -37,6 +36,7 @@ import java.util.stream.Collectors; import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; +import static org.dromara.daxpay.core.enums.AllocationStatusEnum.*; /** * 微信分账V3版本接口 @@ -112,7 +112,7 @@ public class WeChatPayAllocationV3Service { ProfitSharingService sharingService = wxPayService.getProfitSharingService(); // 根据订单状态判断 使用ID还是分账号 String outOrderNo; - if (Objects.equals(AllocationStatusEnum.PROCESSING.getCode(), allocOrder.getStatus())){ + if (List.of(PROCESSING.getCode(),ALLOC_FAILED.getCode(), ALLOC_END.getCode()).contains(allocOrder.getStatus())){ outOrderNo = allocOrder.getAllocNo(); } else { outOrderNo = String.valueOf(allocOrder.getId()); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java index 6f8a48887..024692e9a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java @@ -45,7 +45,7 @@ public class UniAllocationController { @Operation(summary = "发起分账接口") @PostMapping("/start") public DaxResult start(@RequestBody AllocationParam param){ - return DaxRes.ok(allocationService.allocation(param)); + return DaxRes.ok(allocationService.start(param)); } @Operation(summary = "分账完结接口") diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManger.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManager.java similarity index 90% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManger.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManager.java index 8eff1c12a..33a533a3a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManger.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManager.java @@ -17,7 +17,7 @@ import java.util.Optional; @Slf4j @Repository @RequiredArgsConstructor -public class AllocConfigManger extends BaseManager { +public class AllocConfigManager extends BaseManager { /** * 判断是都已经存在数据 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java index 426a6a0e1..f8ea29bf3 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/AllocConfig.java @@ -11,6 +11,7 @@ import org.dromara.daxpay.service.param.allocation.AllocConfigParam; import org.dromara.daxpay.service.result.allocation.AllocConfigResult; import java.math.BigDecimal; +import java.util.Objects; /** * 分账配置 @@ -36,6 +37,14 @@ public class AllocConfig extends MchAppBaseEntity implements ToResult event) { + payOrderService.autoAllocation(event.getMessage()); log.info("分账开始,订单号:{}", event.getMessage()); } @@ -31,11 +39,16 @@ public class AllocationEventService { */ @DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_SYNC) public void sync(DelayJobEvent event) { + syncService.sync(event.getMessage()); log.info("分账同步,订单号:{}", event.getMessage()); } + /** + * 分账完结 + */ @DelayEventListener(DaxPayCode.Event.ORDER_ALLOC_FINISH) public void finish(DelayJobEvent event) { - log.info("分账完成,订单号:{}", event.getMessage()); + allocationService.autoFinish(event.getMessage()); + log.info("分账完结,订单号:{}", event.getMessage()); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java index c74c0bb9f..0543200a3 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/event/TradeOrderEventService.java @@ -49,8 +49,8 @@ public class TradeOrderEventService { Optional orderOpt = payOrderManager.findById(event.getMessage()); if (orderOpt.isPresent()) { PayOrder payOrder = orderOpt.get(); - // 不是支付中不需要进行同步 - if (payOrder.getStatus().equals(PayStatusEnum.PROGRESS.getCode())|| payOrder.getStatus().equals(PayStatusEnum.TIMEOUT.getCode())) { + // 不是支付中和支付超时不需要进行同步 + if (payOrder.getStatus().equals(PayStatusEnum.PROGRESS.getCode()) || payOrder.getStatus().equals(PayStatusEnum.TIMEOUT.getCode())) { paymentAssistService.initMchApp(payOrder.getAppId()); paySyncService.syncPayOrder(payOrder); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java index 21d27f8df..192d89482 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java @@ -7,7 +7,7 @@ import cn.hutool.core.bean.copier.CopyOptions; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.service.convert.allocation.AllocConfigConvert; -import org.dromara.daxpay.service.dao.config.AllocConfigManger; +import org.dromara.daxpay.service.dao.config.AllocConfigManager; import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.dromara.daxpay.service.param.allocation.AllocConfigParam; import org.dromara.daxpay.service.result.allocation.AllocConfigResult; @@ -22,36 +22,36 @@ import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class AllocConfigService { - private final AllocConfigManger allocConfigManger; + private final AllocConfigManager allocConfigManager; /** * 新增 */ public void save(AllocConfigParam param) { // 判断是否已经存在 - if (allocConfigManger.existsByAppId(param.getAppId())){ + if (allocConfigManager.existsByAppId(param.getAppId())){ throw new RepetitiveOperationException("该应用已存在收银台配置"); } AllocConfig entity = AllocConfigConvert.CONVERT.toEntity(param); - allocConfigManger.save(entity); + allocConfigManager.save(entity); } /** * 修改 */ public void update(AllocConfigParam param) { - AllocConfig config = allocConfigManger.findById(param.getId()) + AllocConfig config = allocConfigManager.findById(param.getId()) .orElseThrow(() -> new DataNotExistException("分账配置不存在")); BeanUtil.copyProperties(param, config, CopyOptions.create().ignoreNullValue()); - allocConfigManger.updateById(config); + allocConfigManager.updateById(config); } /** * 根据AppId查询 */ public AllocConfigResult findByAppId(String appId) { - return allocConfigManger.findByAppId(appId).map(AllocConfig::toResult) + return allocConfigManager.findByAppId(appId).map(AllocConfig::toResult) .orElse(new AllocConfigResult().setAutoAlloc(false)); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java index 3c66c7b77..35629c88f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java @@ -2,12 +2,14 @@ package org.dromara.daxpay.service.service.allocation; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.exception.RepetitiveOperationException; +import cn.bootx.platform.starter.redis.delay.service.DelayJobService; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.AllocationResultEnum; import org.dromara.daxpay.core.enums.AllocationStatusEnum; +import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.exception.DataErrorException; import org.dromara.daxpay.core.exception.TradeStatusErrorException; import org.dromara.daxpay.core.param.allocation.transaction.AllocFinishParam; @@ -16,9 +18,12 @@ import org.dromara.daxpay.core.param.allocation.transaction.QueryAllocOrderParam import org.dromara.daxpay.core.result.allocation.AllocationResult; import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.code.DaxPayCode; import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; +import org.dromara.daxpay.service.dao.config.AllocConfigManager; +import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.dromara.daxpay.service.entity.allocation.transaction.AllocAndDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; @@ -35,6 +40,7 @@ import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.stream.Collectors; import static org.dromara.daxpay.core.enums.AllocationStatusEnum.ALLOC_END; @@ -54,7 +60,6 @@ public class AllocationService { private final AllocDetailManager allocOrderDetailManager; - private final LockTemplate lockTemplate; private final PaymentAssistService paymentAssistService; @@ -62,13 +67,18 @@ public class AllocationService { private final AllocOrderQueryService allocOrderQueryService; private final AllocOrderService allocOrderService; + private final MerchantNoticeService merchantNoticeService; + private final DelayJobService delayJobService; + + private final AllocConfigManager allocConfigManager; + /** * 开启分账 多次请求只会分账一次 * 优先级 分账接收方列表 > 分账组编号 > 默认分账组 */ - public AllocationResult allocation(AllocationParam param) { + public AllocationResult start(AllocationParam param) { // 判断是否已经有分账订单 var allocOrder = allocationOrderManager.findByBizAllocNo(param.getBizAllocNo(), param.getAppId()).orElse(null); if (Objects.nonNull(allocOrder)){ @@ -77,14 +87,14 @@ public class AllocationService { } else { // 首次分账 PayOrder payOrder = allocOrderQueryService.getAndCheckPayOrder(param); - return this.allocation(param, payOrder); + return this.start(param, payOrder); } } /** * 开启分账 优先级 分账接收方列表 > 分账组编号 > 默认分账组 */ - public AllocationResult allocation(AllocationParam param, PayOrder payOrder) { + public AllocationResult start(AllocationParam param, PayOrder payOrder) { LockInfo lock = lockTemplate.lock("payment:allocation:" + payOrder.getId(),10000,200); if (Objects.isNull(lock)){ throw new RepetitiveOperationException("分账发起处理中,请勿重复操作"); @@ -120,9 +130,10 @@ public class AllocationService { // 失败 order.setStatus(AllocationStatusEnum.ALLOC_FAILED.getCode()) .setErrorMsg(e.getMessage()); - // TODO 返回异常处理 } allocationOrderManager.updateById(order); + // 注册两分钟后的分账同步事件 + delayJobService.registerByTransaction(order.getId(), DaxPayCode.Event.ORDER_ALLOC_SYNC, 2*60*1000L); return new AllocationResult() .setAllocNo(order.getAllocNo()) .setBizAllocNo(order.getBizAllocNo()) @@ -132,6 +143,25 @@ public class AllocationService { } } + /** + * 注册自动分账事件 + */ + public void registerAutoAlloc(PayOrder payOrder) { + // 订单是否完成 + if (!Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())){ + return; + } + // 是否开启自动分账 + if (payOrder.getAllocation() && payOrder.getAutoAllocation()){ + AllocConfig allocConfig = allocConfigManager.findByAppId(payOrder.getAppId()).orElse(null); + if (Objects.nonNull(allocConfig)&&allocConfig.getAutoAlloc()){ + // 注册定时执行的分账完结任务, 如果未设置默认为一天后进行分账 + Integer delayTime = Optional.ofNullable(allocConfig.getDelayTime()).orElse(24*60); + delayJobService.registerByTransaction(payOrder.getId(), DaxPayCode.Event.ORDER_ALLOC_START, delayTime*60*1000L); + } + } + } + /** * 分账重试 */ @@ -190,6 +220,22 @@ public class AllocationService { } } + /** + * 自动分账完结 + */ + public void autoFinish(Long id) { + AllocOrder allocOrder = allocationOrderManager.findById(id).orElse(null); + if (Objects.isNull(allocOrder)){ + log.warn("分账完结自动处理失败,分账单不存在:{}", id); + return; + } + if (!Arrays.asList(ALLOC_END.getCode(),FINISH_FAILED.getCode()).contains(allocOrder.getStatus())) { + log.warn("忽略分账完结自动处理,分账单状态不正确:{}", allocOrder.getStatus()); + return; + } + paymentAssistService.initMchApp(allocOrder.getAppId()); + this.finish(allocOrder); + } /** * 分账完结 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java index 53241a602..5ddc223bf 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java @@ -2,6 +2,7 @@ package org.dromara.daxpay.service.service.allocation; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.exception.RepetitiveOperationException; +import cn.bootx.platform.starter.redis.delay.service.DelayJobService; import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import lombok.RequiredArgsConstructor; @@ -13,9 +14,12 @@ import org.dromara.daxpay.core.enums.TradeTypeEnum; import org.dromara.daxpay.core.param.allocation.transaction.AllocSyncParam; import org.dromara.daxpay.core.result.allocation.AllocSyncResult; import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; +import org.dromara.daxpay.service.code.DaxPayCode; import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; +import org.dromara.daxpay.service.dao.config.AllocConfigManager; +import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; @@ -50,6 +54,8 @@ public class AllocationSyncService { private final LockTemplate lockTemplate; private final PaymentAssistService paymentAssistService; private final MerchantNoticeService merchantNoticeService; + private final AllocConfigManager allocConfigManager; + private final DelayJobService delayJobService; /** * 分账同步 @@ -101,6 +107,7 @@ public class AllocationSyncService { if (Objects.isNull(lock)){ throw new RepetitiveOperationException("分账同步中,请勿重复操作"); } + String beforeStatus = allocOrder.getStatus(); try { List detailList = allocOrderDetailManager.findAllByOrderId(allocOrder.getId()); // 获取分账策略 @@ -114,7 +121,7 @@ public class AllocationSyncService { this.saveRecord(allocOrder, allocSyncResultBo); // 根据订单明细更新订单的状态和处理结果 allocOrder.setErrorMsg(null).setErrorCode(null); - this.updateOrderStatus(allocOrder, detailList); + this.updateOrderStatus(allocOrder, detailList,beforeStatus); } finally { lockTemplate.releaseLock(lock); } @@ -123,49 +130,58 @@ public class AllocationSyncService { /** * 根据订单明细更新订单的状态和处理结果, 如果订单是分账结束或失败, 不更新状态 */ - private void updateOrderStatus(AllocOrder allocOrder, List details){ + private void updateOrderStatus(AllocOrder allocOrder, List details, String beforeStatus){ // 如果是分账结束或失败, 不更新状态 String status = allocOrder.getStatus(); // 如果是分账结束或失败, 不进行对订单进行处理 List list = Arrays.asList(AllocationStatusEnum.FINISH.getCode(), AllocationStatusEnum.FINISH_FAILED.getCode()); - if (!list.contains(status)){ - // 判断明细状态. 获取成功和失败的 - long successCount = details.stream() - .map(AllocDetail::getResult) - .filter(AllocDetailResultEnum.SUCCESS.getCode()::equals) - .count(); - long failCount = details.stream() - .map(AllocDetail::getResult) - .filter(AllocDetailResultEnum.FAIL.getCode()::equals) - .count(); + if (list.contains(status)) { + return; + } + // 判断明细状态. 获取成功和失败的 + long successCount = details.stream() + .map(AllocDetail::getResult) + .filter(AllocDetailResultEnum.SUCCESS.getCode()::equals) + .count(); + long failCount = details.stream() + .map(AllocDetail::getResult) + .filter(AllocDetailResultEnum.FAIL.getCode()::equals) + .count(); - // 成功和失败都为0 表示进行中 - if (successCount == 0 && failCount == 0){ - allocOrder.setStatus(AllocationStatusEnum.PROCESSING.getCode()) - .setResult(AllocationResultEnum.ALL_PENDING.getCode()); + // 成功和失败都为0 表示进行中 + if (successCount == 0 && failCount == 0){ + allocOrder.setStatus(AllocationStatusEnum.PROCESSING.getCode()) + .setResult(AllocationResultEnum.ALL_PENDING.getCode()); + } else { + if (failCount == details.size()){ + // 全部失败 + allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) + .setResult(AllocationResultEnum.ALL_FAILED.getCode()); + } else if (successCount == details.size()){ + // 全部成功 + allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) + .setResult(AllocationResultEnum.ALL_SUCCESS.getCode()); } else { - if (failCount == details.size()){ - // 全部失败 - allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) - .setResult(AllocationResultEnum.ALL_FAILED.getCode()); - } else if (successCount == details.size()){ - // 全部成功 - allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) - .setResult(AllocationResultEnum.ALL_SUCCESS.getCode()); - } else { - // 部分成功 - allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) - .setResult(AllocationResultEnum.PART_SUCCESS.getCode()); - } + // 部分成功 + allocOrder.setStatus(AllocationStatusEnum.ALLOC_END.getCode()) + .setResult(AllocationResultEnum.PART_SUCCESS.getCode()); } } allocOrderDetailManager.updateAllById(details); allocationOrderManager.updateById(allocOrder); - // 如果状态为分账完成, 发送通知 - if (Objects.equals(AllocationStatusEnum.FINISH.getCode(), allocOrder.getStatus())){ + // 如果状态为分账处理完成, 且与类型发生了变动, 发送通知 + if (Objects.equals(AllocationStatusEnum.ALLOC_END.getCode(), allocOrder.getStatus()) + && !Objects.equals(beforeStatus, AllocationStatusEnum.ALLOC_END.getCode())){ // 注册通知 多次同步会产生多次变动, 注意处理多次推送通知的问题 merchantNoticeService.registerAllocNotice(allocOrder, details); + + // 是否开启自动完结 + AllocConfig allocConfig = allocConfigManager.findByAppId(allocOrder.getAppId()).orElse(null); + if (Objects.nonNull(allocConfig)&& allocConfig.getAutoFinish()){ + // 注册一分钟后的分账完结任务 + delayJobService.registerByTransaction(allocOrder.getId(), DaxPayCode.Event.ORDER_ALLOC_FINISH, 60 * 1000L); + } } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java index 4b941c3eb..1819ddf9c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java @@ -1,19 +1,23 @@ package org.dromara.daxpay.service.service.order.pay; import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; +import org.dromara.daxpay.service.dao.config.AllocConfigManager; import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; +import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.service.allocation.AllocationService; import org.dromara.daxpay.service.service.assist.PaymentAssistService; import org.dromara.daxpay.service.service.trade.pay.PayCloseService; import org.dromara.daxpay.service.service.trade.pay.PaySyncService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.Objects; + /** * 支付订单服务 * @author xxm @@ -24,12 +28,17 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class PayOrderService { private final PayOrderManager payOrderManager; + private final PaySyncService paySyncService; private final PaymentAssistService paymentAssistService; + private final PayCloseService payCloseService; + private final AllocationService allocationService; + private final AllocConfigManager allocConfigManager; + /** * 同步 */ @@ -69,7 +78,22 @@ public class PayOrderService { AllocationParam param = new AllocationParam() .setBizAllocNo("B"+TradeNoGenerateUtil.allocation()); param.setAppId(payOrder.getAppId()); - allocationService.allocation(param, payOrder); + allocationService.start(param, payOrder); + } + /** + * 自动分账 + */ + public void autoAllocation(Long id){ + PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在")); + // 是否开启自动完结 + AllocConfig allocConfig = allocConfigManager.findByAppId(payOrder.getAppId()).orElse(null); + if (Objects.nonNull(allocConfig)){ + paymentAssistService.initMchApp(payOrder.getAppId()); + AllocationParam param = new AllocationParam() + .setBizAllocNo("B"+TradeNoGenerateUtil.allocation()); + param.setAppId(payOrder.getAppId()); + allocationService.start(param, payOrder); + } } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCallbackService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCallbackService.java index 8c280f769..b39f87ef0 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCallbackService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayCallbackService.java @@ -7,6 +7,7 @@ import org.dromara.daxpay.service.common.context.CallbackLocal; import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.service.allocation.AllocationService; import org.dromara.daxpay.service.service.notice.MerchantNoticeService; import org.dromara.daxpay.service.service.order.pay.PayOrderQueryService; import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; @@ -39,6 +40,7 @@ public class PayCallbackService { private final TradeFlowRecordService tradeFlowRecordService; private final MerchantNoticeService merchantNoticeService; + private final AllocationService allocationService; /** * 支付统一回调处理 @@ -105,6 +107,7 @@ public class PayCallbackService { payOrderManager.updateById(payOrder); tradeFlowRecordService.savePay(payOrder); merchantNoticeService.registerPayNotice(payOrder); + allocationService.registerAutoAlloc(payOrder); } /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java index 052c2f15d..0a1d570be 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java @@ -8,6 +8,7 @@ import org.dromara.daxpay.core.result.trade.pay.PayResult; import org.dromara.daxpay.service.bo.trade.PayResultBo; import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.service.allocation.AllocationService; import org.dromara.daxpay.service.service.notice.MerchantNoticeService; import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; import org.dromara.daxpay.service.strategy.AbsPayStrategy; @@ -38,6 +39,7 @@ public class PayService { private final PayOrderManager payOrderManager; private final TradeFlowRecordService tradeFlowRecordService; private final MerchantNoticeService merchantNoticeService; + private final AllocationService allocationService; /** * 支付入口 @@ -145,6 +147,7 @@ public class PayService { if (Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())){ tradeFlowRecordService.savePay(payOrder); merchantNoticeService.registerPayNotice(payOrder); + allocationService.registerAutoAlloc(payOrder); } return payAssistService.buildResult(payOrder,result); } @@ -197,6 +200,7 @@ public class PayService { if (Objects.equals(payOrder.getStatus(), PayStatusEnum.SUCCESS.getCode())){ tradeFlowRecordService.savePay(payOrder); merchantNoticeService.registerPayNotice(payOrder); + allocationService.registerAutoAlloc(payOrder); } return payAssistService.buildResult(payOrder, payResultBo); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundCallbackService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundCallbackService.java index aca97eeed..13e57845a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundCallbackService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundCallbackService.java @@ -108,7 +108,6 @@ public class RefundCallbackService { // 更新订单和退款相关订单 payOrderManager.updateById(payOrder); refundOrderManager.updateById(refundOrder); - // 记录流水 tradeFlowRecordService.saveRefund(refundOrder); // 发送通知 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java index 4d2b2bb4b..c30792e2f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java @@ -13,4 +13,9 @@ import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class AllocationSyncTaskService { + + /** + * 分账同步 + */ + } From 0bfc0c6c979e464b157ae0fb45a17ab2ef8fb896 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Wed, 18 Dec 2024 14:23:33 +0800 Subject: [PATCH 31/54] =?UTF-8?q?feat=20=E5=88=86=E8=B4=A6SDK=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3,=20=E7=89=88=E6=9C=AC=E5=8F=B7?= =?UTF-8?q?=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 10 +- .../common-cache/pom.xml | 2 +- .../common-config/pom.xml | 2 +- .../common-exception-handler/pom.xml | 2 +- .../common-header-holder/pom.xml | 2 +- .../common-jackson/pom.xml | 2 +- .../bootx-platform-common/common-log/pom.xml | 2 +- .../common-mybatis-plus/pom.xml | 2 +- .../common-redis/pom.xml | 2 +- .../common-spring/pom.xml | 2 +- .../common-swagger/pom.xml | 2 +- bootx-platform/bootx-platform-common/pom.xml | 2 +- bootx-platform/bootx-platform-core/pom.xml | 2 +- bootx-platform/bootx-platform-service/pom.xml | 2 +- .../service-baseapi/pom.xml | 2 +- .../service-iam/pom.xml | 2 +- bootx-platform/bootx-platform-starter/pom.xml | 4 +- .../starter-audit-log/pom.xml | 2 +- .../starter-auth/pom.xml | 2 +- .../starter-delay-queue/pom.xml | 2 +- .../starter-file/pom.xml | 2 +- .../starter-quartz/pom.xml | 2 +- bootx-platform/pom.xml | 4 +- .../daxpay-single-alipay/pom.xml | 2 +- .../daxpay-single-union/pom.xml | 2 +- .../daxpay-single-wechat/pom.xml | 2 +- .../WechatPayCallbackController.java | 3 +- .../wechat/result/pay/WxPayCodepayResult.java | 644 ------------------ .../result/pay/WxPayOrderReverseV3Result.java | 54 -- daxpay-single-channel/pom.xml | 8 +- daxpay-single-sdk/pom.xml | 2 +- .../sdk/code/AllocDetailResultEnum.java | 25 + .../single/sdk/code/AllocationResultEnum.java | 24 + .../single/sdk/code/AllocationStatusEnum.java | 27 + .../model/allocation/AllocDetailModel.java | 65 ++ .../sdk/model/allocation/AllocOrderModel.java | 83 +++ .../sdk/model/allocation/AllocSyncModel.java | 28 + .../sdk/model/allocation/AllocationModel.java | 34 + .../{ => receiver}/AllocReceiverAddModel.java | 2 +- .../{ => receiver}/AllocReceiverModel.java | 2 +- .../AllocReceiverRemoveModel.java | 2 +- .../param/allocation/AllocFinishParam.java | 50 ++ .../sdk/param/allocation/AllocSyncParam.java | 51 ++ .../sdk/param/allocation/AllocationParam.java | 89 +++ .../allocation/QueryAllocOrderParam.java | 48 ++ .../{ => receiver}/AllocReceiverAddParam.java | 4 +- .../AllocReceiverRemoveParam.java | 4 +- .../QueryAllocReceiverParam.java | 4 +- .../test/allocation/AllocReceiverTest.java | 12 +- .../sdk/test/allocation/AllocationTest.java | 81 +++ .../sdk/test/trade/PayOrderSyncTest.java | 1 - daxpay-single-server/pom.xml | 6 +- daxpay-single/daxpay-single-core/pom.xml | 2 +- .../transaction/AllocationParam.java | 5 + .../result/allocation/AllocSyncResult.java | 16 + .../result/allocation/AllocationResult.java | 8 + .../allocation/order/AllocOrderResult.java | 3 +- daxpay-single/daxpay-single-service/pom.xml | 2 +- .../service/allocation/AllocationService.java | 12 +- .../allocation/AllocationSyncService.java | 2 +- .../allocation/order/AllocOrderService.java | 7 +- daxpay-single/daxpay-single-unisdk/pom.xml | 2 +- daxpay-single/pom.xml | 6 +- docker-compose.yml | 2 +- pom.xml | 2 +- 65 files changed, 716 insertions(+), 770 deletions(-) delete mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/pay/WxPayCodepayResult.java delete mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/pay/WxPayOrderReverseV3Result.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/AllocDetailResultEnum.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/AllocationResultEnum.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/AllocationStatusEnum.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocDetailModel.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocOrderModel.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocSyncModel.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocationModel.java rename daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/{ => receiver}/AllocReceiverAddModel.java (69%) rename daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/{ => receiver}/AllocReceiverModel.java (95%) rename daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/{ => receiver}/AllocReceiverRemoveModel.java (69%) create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocFinishParam.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocSyncParam.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocationParam.java create mode 100644 daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/QueryAllocOrderParam.java rename daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/{ => receiver}/AllocReceiverAddParam.java (91%) rename daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/{ => receiver}/AllocReceiverRemoveParam.java (86%) rename daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/{ => receiver}/QueryAllocReceiverParam.java (87%) create mode 100644 daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/allocation/AllocationTest.java diff --git a/_doc/Task.md b/_doc/Task.md index bead40a2f..52c2637cd 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -6,10 +6,12 @@ - [ ] 支持配置背景色和图标 - [ ] 定时同步任务频次不要太高, 预防产生过多的数据 - [ ] 增加首页驾驶舱功能 -- [ ] 商户应用应该要有一个类似删除的功能, 实现停用冻结, 但不影响数据的关联 -## 3.0.0.bate3: 功能完善 -- 优化: -- [x] 分账界面功能 +- [ ] 商户应用要有类似删除的功能, 实现停用冻结, 但不影响数据的关联 +- [ ] 同步接口优化, 返回同步完的数据 +## 3.0.0.bate3: 分账 +- [x] SDK接口 + - [x] 分账相关接口: 分账,完结,同步,查询 +- [x] 分账界面功能优化 - [x] 分账接收方配置 - [x] 分账单管理 - [x] 接口开发 开启/完结/同步 diff --git a/bootx-platform/bootx-platform-common/common-cache/pom.xml b/bootx-platform/bootx-platform-common/common-cache/pom.xml index 5e18c29cd..95dbc8ea3 100644 --- a/bootx-platform/bootx-platform-common/common-cache/pom.xml +++ b/bootx-platform/bootx-platform-common/common-cache/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta2 + 3.0.0.beta3 common-cache diff --git a/bootx-platform/bootx-platform-common/common-config/pom.xml b/bootx-platform/bootx-platform-common/common-config/pom.xml index 687ff96fb..b3935d3a2 100644 --- a/bootx-platform/bootx-platform-common/common-config/pom.xml +++ b/bootx-platform/bootx-platform-common/common-config/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta2 + 3.0.0.beta3 common-config diff --git a/bootx-platform/bootx-platform-common/common-exception-handler/pom.xml b/bootx-platform/bootx-platform-common/common-exception-handler/pom.xml index 176633a8e..5814ce483 100644 --- a/bootx-platform/bootx-platform-common/common-exception-handler/pom.xml +++ b/bootx-platform/bootx-platform-common/common-exception-handler/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta2 + 3.0.0.beta3 common-exception-handler diff --git a/bootx-platform/bootx-platform-common/common-header-holder/pom.xml b/bootx-platform/bootx-platform-common/common-header-holder/pom.xml index fc1327e4c..765bc5b42 100644 --- a/bootx-platform/bootx-platform-common/common-header-holder/pom.xml +++ b/bootx-platform/bootx-platform-common/common-header-holder/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta2 + 3.0.0.beta3 common-header-holder diff --git a/bootx-platform/bootx-platform-common/common-jackson/pom.xml b/bootx-platform/bootx-platform-common/common-jackson/pom.xml index 1558dcc9c..a6d5e2f71 100644 --- a/bootx-platform/bootx-platform-common/common-jackson/pom.xml +++ b/bootx-platform/bootx-platform-common/common-jackson/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta2 + 3.0.0.beta3 common-jackson diff --git a/bootx-platform/bootx-platform-common/common-log/pom.xml b/bootx-platform/bootx-platform-common/common-log/pom.xml index aeedc3bdf..7305d591d 100644 --- a/bootx-platform/bootx-platform-common/common-log/pom.xml +++ b/bootx-platform/bootx-platform-common/common-log/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta2 + 3.0.0.beta3 common-log diff --git a/bootx-platform/bootx-platform-common/common-mybatis-plus/pom.xml b/bootx-platform/bootx-platform-common/common-mybatis-plus/pom.xml index b35359b11..6b7e1ba22 100644 --- a/bootx-platform/bootx-platform-common/common-mybatis-plus/pom.xml +++ b/bootx-platform/bootx-platform-common/common-mybatis-plus/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta2 + 3.0.0.beta3 common-mybatis-plus diff --git a/bootx-platform/bootx-platform-common/common-redis/pom.xml b/bootx-platform/bootx-platform-common/common-redis/pom.xml index ac495790a..0099c8081 100644 --- a/bootx-platform/bootx-platform-common/common-redis/pom.xml +++ b/bootx-platform/bootx-platform-common/common-redis/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta2 + 3.0.0.beta3 common-redis diff --git a/bootx-platform/bootx-platform-common/common-spring/pom.xml b/bootx-platform/bootx-platform-common/common-spring/pom.xml index 08eacbc6b..96cad5573 100644 --- a/bootx-platform/bootx-platform-common/common-spring/pom.xml +++ b/bootx-platform/bootx-platform-common/common-spring/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta2 + 3.0.0.beta3 common-spring diff --git a/bootx-platform/bootx-platform-common/common-swagger/pom.xml b/bootx-platform/bootx-platform-common/common-swagger/pom.xml index d6d59a6bc..c09077eee 100644 --- a/bootx-platform/bootx-platform-common/common-swagger/pom.xml +++ b/bootx-platform/bootx-platform-common/common-swagger/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-common - 3.0.0.beta2 + 3.0.0.beta3 common-swagger diff --git a/bootx-platform/bootx-platform-common/pom.xml b/bootx-platform/bootx-platform-common/pom.xml index 69c3ad5df..d79ec292c 100644 --- a/bootx-platform/bootx-platform-common/pom.xml +++ b/bootx-platform/bootx-platform-common/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta2 + 3.0.0.beta3 4.0.0 diff --git a/bootx-platform/bootx-platform-core/pom.xml b/bootx-platform/bootx-platform-core/pom.xml index adf36d887..6edfd7282 100644 --- a/bootx-platform/bootx-platform-core/pom.xml +++ b/bootx-platform/bootx-platform-core/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta2 + 3.0.0.beta3 4.0.0 diff --git a/bootx-platform/bootx-platform-service/pom.xml b/bootx-platform/bootx-platform-service/pom.xml index ab7d1af6f..df58d2ad1 100644 --- a/bootx-platform/bootx-platform-service/pom.xml +++ b/bootx-platform/bootx-platform-service/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta2 + 3.0.0.beta3 service-baseapi diff --git a/bootx-platform/bootx-platform-service/service-baseapi/pom.xml b/bootx-platform/bootx-platform-service/service-baseapi/pom.xml index 0db50969d..60c5070e4 100644 --- a/bootx-platform/bootx-platform-service/service-baseapi/pom.xml +++ b/bootx-platform/bootx-platform-service/service-baseapi/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-service - 3.0.0.beta2 + 3.0.0.beta3 service-baseapi diff --git a/bootx-platform/bootx-platform-service/service-iam/pom.xml b/bootx-platform/bootx-platform-service/service-iam/pom.xml index 84a6af32f..26cddf2a3 100644 --- a/bootx-platform/bootx-platform-service/service-iam/pom.xml +++ b/bootx-platform/bootx-platform-service/service-iam/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-service - 3.0.0.beta2 + 3.0.0.beta3 service-iam diff --git a/bootx-platform/bootx-platform-starter/pom.xml b/bootx-platform/bootx-platform-starter/pom.xml index 9d4530b3f..71b921042 100644 --- a/bootx-platform/bootx-platform-starter/pom.xml +++ b/bootx-platform/bootx-platform-starter/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta2 + 3.0.0.beta3 starter-auth @@ -25,7 +25,7 @@ cn.bootx.platform bootx-platform-core - 3.0.0.beta2 + 3.0.0.beta3 diff --git a/bootx-platform/bootx-platform-starter/starter-audit-log/pom.xml b/bootx-platform/bootx-platform-starter/starter-audit-log/pom.xml index bf0df5e7a..528953bfe 100644 --- a/bootx-platform/bootx-platform-starter/starter-audit-log/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-audit-log/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta2 + 3.0.0.beta3 starter-audit-log diff --git a/bootx-platform/bootx-platform-starter/starter-auth/pom.xml b/bootx-platform/bootx-platform-starter/starter-auth/pom.xml index c34ce6c8a..f802cc698 100644 --- a/bootx-platform/bootx-platform-starter/starter-auth/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-auth/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta2 + 3.0.0.beta3 starter-auth diff --git a/bootx-platform/bootx-platform-starter/starter-delay-queue/pom.xml b/bootx-platform/bootx-platform-starter/starter-delay-queue/pom.xml index 95eebe203..0a1c1149d 100644 --- a/bootx-platform/bootx-platform-starter/starter-delay-queue/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-delay-queue/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta2 + 3.0.0.beta3 starter-delay-queue diff --git a/bootx-platform/bootx-platform-starter/starter-file/pom.xml b/bootx-platform/bootx-platform-starter/starter-file/pom.xml index 3fbb2c034..a1d0f8b59 100644 --- a/bootx-platform/bootx-platform-starter/starter-file/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-file/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta2 + 3.0.0.beta3 starter-file diff --git a/bootx-platform/bootx-platform-starter/starter-quartz/pom.xml b/bootx-platform/bootx-platform-starter/starter-quartz/pom.xml index 84aa2944c..4cb6517ed 100644 --- a/bootx-platform/bootx-platform-starter/starter-quartz/pom.xml +++ b/bootx-platform/bootx-platform-starter/starter-quartz/pom.xml @@ -6,7 +6,7 @@ cn.bootx.platform bootx-platform-starter - 3.0.0.beta2 + 3.0.0.beta3 starter-quartz diff --git a/bootx-platform/pom.xml b/bootx-platform/pom.xml index 290c33ab7..7ab5f245c 100644 --- a/bootx-platform/pom.xml +++ b/bootx-platform/pom.xml @@ -13,7 +13,7 @@ cn.bootx.platform bootx-platform - 3.0.0.beta2 + 3.0.0.beta3 pom 基础脚手架服务 @@ -25,7 +25,7 @@ - 3.0.0.beta2 + 3.0.0.beta3 2.5.0 5.8.31 diff --git a/daxpay-single-channel/daxpay-single-alipay/pom.xml b/daxpay-single-channel/daxpay-single-alipay/pom.xml index 112d96e84..a797f6308 100644 --- a/daxpay-single-channel/daxpay-single-alipay/pom.xml +++ b/daxpay-single-channel/daxpay-single-alipay/pom.xml @@ -7,7 +7,7 @@ org.dromara.daxpay daxpay-single-channel - 3.0.0.beta2 + 3.0.0.beta3 daxpay-single-alipay diff --git a/daxpay-single-channel/daxpay-single-union/pom.xml b/daxpay-single-channel/daxpay-single-union/pom.xml index 7cd349ab7..365965320 100644 --- a/daxpay-single-channel/daxpay-single-union/pom.xml +++ b/daxpay-single-channel/daxpay-single-union/pom.xml @@ -7,7 +7,7 @@ org.dromara.daxpay daxpay-single-channel - 3.0.0.beta2 + 3.0.0.beta3 daxpay-single-union diff --git a/daxpay-single-channel/daxpay-single-wechat/pom.xml b/daxpay-single-channel/daxpay-single-wechat/pom.xml index 4fc87fda7..5063ccc6a 100644 --- a/daxpay-single-channel/daxpay-single-wechat/pom.xml +++ b/daxpay-single-channel/daxpay-single-wechat/pom.xml @@ -7,7 +7,7 @@ org.dromara.daxpay daxpay-single-channel - 3.0.0.beta2 + 3.0.0.beta3 daxpay-single-wechat diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/WechatPayCallbackController.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/WechatPayCallbackController.java index 729c8a309..137f4fa81 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/WechatPayCallbackController.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/WechatPayCallbackController.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** - * + * 微信回调通知控制器 * @author xxm * @since 2024/7/29 */ @@ -44,7 +44,6 @@ public class WechatPayCallbackController { return payCallbackService.payHandle(request); } - @Operation(summary = "微信退款回调") @PostMapping("/refund") public String wechatRefundNotify(@PathVariable("AppId") String appId,HttpServletRequest request) { diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/pay/WxPayCodepayResult.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/pay/WxPayCodepayResult.java deleted file mode 100644 index cfcae4c58..000000000 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/pay/WxPayCodepayResult.java +++ /dev/null @@ -1,644 +0,0 @@ -package org.dromara.daxpay.channel.wechat.result.pay; - -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serial; -import java.io.Serializable; -import java.util.List; - -/** - * 微信V3付款码返回结果 - * @author xxm - * @since 2024/7/24 - */ -@Data -@Accessors(chain = true) -public class WxPayCodepayResult implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - /** - *
-     * 字段名:应用ID
-     * 变量名:appid
-     * 是否必填:是
-     * 类型:string[1,32]
-     * 描述:
-     *  由微信生成的应用ID,全局唯一。请求统一下单接口时请注意APPID的应用属性,例如公众号场景下,需使用应用属性为公众号的APPID
-     *  示例值:wxd678efh567hg6787
-     * 
- */ - @SerializedName(value = "appid") - protected String appid; - /** - *
-     * 字段名:直连商户号
-     * 变量名:mchid
-     * 是否必填:是
-     * 类型:string[1,32]
-     * 描述:
-     *  直连商户的商户号,由微信支付生成并下发。
-     *  示例值:1230000109
-     * 
- */ - @SerializedName(value = "mchid") - protected String mchid; - /** - *
-     * 字段名:商户订单号
-     * 变量名:out_trade_no
-     * 是否必填:是
-     * 类型:string[6,32]
-     * 描述:
-     *  商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
-     *  示例值:1217752501201407033233368018
-     * 
- */ - @SerializedName(value = "out_trade_no") - protected String outTradeNo; - - /** - *
-     * 字段名:微信支付返回的订单号
-     * 变量名:transaction_id
-     * 是否必填:是
-     * 类型:string(32)
-     * 描述:
-     *  微信分配的公众账号ID
-     *  示例值:1000320306201511078440737890
-     * 
- */ - @SerializedName(value = "transaction_id") - private String transactionId; - /** - *
-     * 字段名:交易类型
-     * 变量名:trade_type
-     * 是否必填:是
-     * 类型:string[1,16]
-     * 描述:
-     *  枚举值:
-     *  NATIVE:扫码支付
-     *  JSAPI:公众号支付
-     *  APP:APP支付
-     *  MWEB:H5支付
-     *  示例值: JSAPI
-     * 
- */ - @SerializedName(value = "trade_type") - private String tradeType; - /** - *
-     * 字段名:付款银行
-     * 变量名:bank_type
-     * 是否必填:否
-     * 类型:string(16)
-     * 描述:
-     *  银行类型,采用字符串类型的银行标识。
-     *  示例值:CMC
-     * 
- */ - @SerializedName(value = "bank_type") - private String bankType; - /** - *
-     * 字段名:支付完成时间
-     * 变量名:success_time
-     * 是否必填:否
-     * 类型:string(64)
-     * 描述:支付完成时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
-     * 示例值:2018-06-08T10:34:56+08:00
-     * 
- */ - @SerializedName(value = "success_time") - private String successTime; - /** - *
-     * 字段名:交易状态
-     * 变量名:trade_state
-     * 是否必填:是
-     * 类型:string[1,32]
-     * 描述:
-     *  交易状态,枚举值:
-     *  SUCCESS:支付成功
-     *  REFUND:转入退款
-     *  NOTPAY:未支付
-     *  REVOKED:已撤销(付款码支付)
-     *  USERPAYING:用户支付中(付款码支付)
-     *  PAYERROR:支付失败(其他原因,如银行返回失败)
-     *  示例值:SUCCESS
-     * 
- */ - @SerializedName(value = "trade_state") - private String tradeState; - /** - *
-     * 字段名:交易状态描述
-     * 变量名:trade_state_desc
-     * 是否必填:是
-     * 类型:string(256)
-     * 描述:交易状态描述
-     * 示例值:支付失败,请重新下单支付
-     * 
- */ - @SerializedName(value = "trade_state_desc") - private String tradeStateDesc; - /** - *
-     * 字段名:附加数据
-     * 变量名:attach
-     * 是否必填:否
-     * 类型:string[1,128]
-     * 描述:
-     *  附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
-     *  示例值:自定义数据
-     * 
- */ - @SerializedName(value = "attach") - protected String attach; - - /** - *
-     * 字段名:订单优惠标记
-     * 变量名:goods_tag
-     * 是否必填:否
-     * 类型:string[1,256]
-     * 描述:
-     *  订单优惠标记
-     *  示例值:WXG
-     * 
- */ - @SerializedName(value = "goods_tag") - private String goodsTag; - /** - *
-     * 字段名:电子发票入口开放标识
-     * 变量名:support_fapiao
-     * 是否必填:否
-     * 类型:boolean
-     * 描述:传入true时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效。
-     * 
- */ - @SerializedName(value = "support_fapiao") - private Boolean supportFapiao; - /** - *
-     * 字段名:支付者
-     * 变量名:payer
-     * 是否必填:是
-     * 类型:object
-     * 描述:
-     *  支付者信息
-     * 
- */ - @SerializedName(value = "payer") - private Payer payer; - /** - *
-     * 字段名:订单金额
-     * 变量名:amount
-     * 是否必填:是
-     * 类型:object
-     * 描述:
-     *  订单金额信息
-     * 
- */ - @SerializedName(value = "amount") - private Amount amount; - /** - *
-     * 字段名:场景信息
-     * 变量名:scene_info
-     * 是否必填:否
-     * 类型:object
-     * 描述:
-     *  支付场景描述
-     * 
- */ - @SerializedName(value = "scene_info") - private SceneInfo sceneInfo; - - /** - *
-     * 字段名:优惠功能
-     * 变量名:promotion_detail
-     * 是否必填:否
-     * 类型:array
-     * 描述:
-     *  优惠功能,享受优惠时返回该字段。
-     * 
- */ - @SerializedName(value = "promotion_detail") - private List promotionDetails; - - @Data - @NoArgsConstructor - public static class Amount implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - /** - *
-         * 字段名:总金额
-         * 变量名:total
-         * 是否必填:否
-         * 类型:int
-         * 描述:
-         *  订单总金额,单位为分。
-         *  示例值:100
-         * 
- */ - @SerializedName(value = "total") - private Integer total; - /** - *
-         * 字段名:用户支付金额
-         * 变量名:payer_total
-         * 是否必填:否
-         * 类型:int
-         * 描述:
-         *  用户支付金额,单位为分。
-         *  示例值:100
-         * 
- */ - @SerializedName(value = "payer_total") - private Integer payerTotal; - /** - *
-         * 字段名:货币类型
-         * 变量名:currency
-         * 是否必填:否
-         * 类型:string[1,16]
-         * 描述:
-         *  CNY:人民币,境内商户号仅支持人民币。
-         *  示例值:CNY
-         * 
- */ - @SerializedName(value = "currency") - private String currency; - /** - *
-         * 字段名:用户支付币种
-         * 变量名:payer_currency
-         * 是否必填:否
-         * 类型:string[1,16]
-         * 描述:
-         *  用户支付币种
-         *  示例值: CNY
-         * 
- */ - @SerializedName(value = "payer_currency") - private String payerCurrency; - } - - @Data - @NoArgsConstructor - public static class Payer implements Serializable { - @Serial - private static final long serialVersionUID = -1L; - /** - *
-         * 字段名:用户标识
-         * 变量名:auth_code
-         * 是否必填:是
-         * 类型:string[32]
-         * 描述:
-         *   付款码支付授权码,即用户打开微信钱包显示的码。
-         *  示例值:130061098828009406
-         * 
- */ - @SerializedName(value = "auth_code") - private String authCode; - } - - @Data - @NoArgsConstructor - public static class SceneInfo implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - /** - *
-         * 字段名:商户端设备 IP
-         * 变量名:device_ip
-         * 是否必填:是
-         * 类型:string[1,45]
-         * 描述:
-         *  用户的客户端IP,支持IPv4和IPv6两种格式的IP地址。
-         *  示例值:14.23.150.211
-         * 
- */ - @SerializedName(value = "device_ip") - private String deviceIp; - /** - *
-         * 字段名:商户端设备号
-         * 变量名:device_id
-         * 是否必填:否
-         * 类型:string[1,32]
-         * 描述:
-         *  商户端设备号(门店号或收银设备ID)。
-         *  示例值:013467007045764
-         * 
- */ - @SerializedName(value = "device_id") - private String deviceId; - /** - *
-         * 字段名:商户门店信息
-         * 变量名:store_info
-         * 是否必填:否
-         * 类型:object
-         * 描述:
-         *  商户门店信息
-         * 
- */ - @SerializedName(value = "store_info") - private StoreInfo storeInfo; - } - - /** - * 商户门店信息 - */ - @Data - @NoArgsConstructor - public static class StoreInfo implements Serializable { - @Serial - private static final long serialVersionUID = -1L; - /** - *
-         * 字段名:门店编号
-         * 变量名:id
-         * 是否必填:是
-         * 类型:string[1,32]
-         * 描述:
-         *  此参数与商家自定义编码(out_id)二选一必填。
-         *  微信支付线下场所ID,格式为纯数字。
-         *  基于合规要求与风险管理目的,线下条码支付时需传入用户实际付款的场景信息。
-         *  指引参见:https://kf.qq.com/faq/230817neeaem2308177ZFfqM.html。
-         *  示例值:0001
-         * 
- */ - @SerializedName(value = "id") - private String id; - /** - *
-         * 字段名:商家自定义编码
-         * 变量名:out_id
-         * 是否必填:否
-         * 类型:string[1,256]
-         * 描述:
-         *  此参数与门店(id)二选一必填。
-         * 商户系统的门店编码,支持大小写英文字母、数字,仅支持utf-8格式。
-         * 基于合规要求与风险管理目的,线下条码支付时需传入用户实际付款的场景信息。
-         *  示例值:A1111
-         * 
- */ - @SerializedName(value = "out_id") - private String outId; - } - - - @Data - @NoArgsConstructor - public static class SettleInfo implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - /** - *
-         * 字段名:是否指定分账
-         * 变量名:profit_sharing
-         * 是否必填:否
-         * 类型:boolean
-         * 描述:
-         *  是否指定分账
-         *  示例值:false
-         * 
- */ - @SerializedName(value = "profit_sharing") - private Boolean profitSharing; - } - - - @Data - @NoArgsConstructor - public static class PromotionDetail implements Serializable { - /** - *
-         * 字段名:券ID
-         * 变量名:coupon_id
-         * 是否必填:是
-         * 类型:string[1,32]
-         * 描述:
-         *  券ID
-         *  示例值:109519
-         * 
- */ - @SerializedName(value = "coupon_id") - private String couponId; - /** - *
-         * 字段名:优惠名称
-         * 变量名:name
-         * 是否必填:否
-         * 类型:string[1,64]
-         * 描述:
-         *  优惠名称
-         *  示例值:单品惠-6
-         * 
- */ - @SerializedName(value = "name") - private String name; - /** - *
-         * 字段名:优惠范围
-         * 变量名:scope
-         * 是否必填:否
-         * 类型:string[1,32]
-         * 描述:
-         *  GLOBAL:全场代金券
-         *  SINGLE:单品优惠
-         *  示例值:GLOBAL
-         * 
- */ - @SerializedName(value = "scope") - private String scope; - /** - *
-         * 字段名:优惠类型
-         * 变量名:type
-         * 是否必填:否
-         * 类型:string[1,32]
-         * 描述:
-         *  CASH:充值
-         *  NOCASH:预充值
-         *  示例值:CASH
-         * 
- */ - @SerializedName(value = "type") - private String type; - /** - *
-         * 字段名:优惠券面额
-         * 变量名:amount
-         * 是否必填:是
-         * 类型:int
-         * 描述:
-         *  优惠券面额
-         *  示例值:100
-         * 
- */ - @SerializedName(value = "amount") - private Integer amount; - /** - *
-         * 字段名:活动ID
-         * 变量名:stock_id
-         * 是否必填:否
-         * 类型:string[1,32]
-         * 描述:
-         *  活动ID
-         *  示例值:931386
-         * 
- */ - @SerializedName(value = "stock_id") - private String stockId; - /** - *
-         * 字段名:微信出资
-         * 变量名:wechatpay_contribute
-         * 是否必填:否
-         * 类型:int
-         * 描述:
-         *  微信出资,单位为分
-         *  示例值:0
-         * 
- */ - @SerializedName(value = "wechatpay_contribute") - private Integer wechatpayContribute; - /** - *
-         * 字段名:商户出资
-         * 变量名:merchant_contribute
-         * 是否必填:否
-         * 类型:int
-         * 描述:
-         *  商户出资,单位为分
-         *  示例值:0
-         * 
- */ - @SerializedName(value = "merchant_contribute") - private Integer merchantContribute; - /** - *
-         * 字段名:其他出资
-         * 变量名:other_contribute
-         * 是否必填:否
-         * 类型:int
-         * 描述:
-         *  其他出资,单位为分
-         *  示例值:0
-         * 
- */ - @SerializedName(value = "other_contribute") - private Integer otherContribute; - /** - *
-         * 字段名:优惠币种
-         * 变量名:currency
-         * 是否必填:否
-         * 类型:string[1,16]
-         * 描述:
-         *  CNY:人民币,境内商户号仅支持人民币。
-         *  示例值:CNY
-         * 
- */ - @SerializedName(value = "currency") - private String currency; - /** - *
-         * 字段名:单品列表
-         * 变量名:goods_detail
-         * 是否必填:否
-         * 类型:array
-         * 描述:
-         *  单品列表信息
-         * 
- */ - @SerializedName(value = "goods_detail") - private List goodsDetails; - } - - @Data - @NoArgsConstructor - public static class GoodsDetail implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - /** - *
-         * 字段名:商品编码
-         * 变量名:goods_id
-         * 是否必填:是
-         * 类型:string[1,32]
-         * 描述:
-         *  商品编码
-         *  示例值:M1006
-         * 
- */ - @SerializedName(value = "goods_id") - private String goodsId; - /** - *
-         * 字段名:商品数量
-         * 变量名:quantity
-         * 是否必填:是
-         * 类型:int
-         * 描述:
-         *  用户购买的数量
-         *  示例值:1
-         * 
- */ - @SerializedName(value = "quantity") - private Integer quantity; - /** - *
-         * 字段名:商品单价
-         * 变量名:unit_price
-         * 是否必填:是
-         * 类型:int
-         * 描述:
-         *  商品单价,单位为分
-         *  示例值:100
-         * 
- */ - @SerializedName(value = "unit_price") - private Integer unitPrice; - /** - *
-         * 字段名:商品优惠金额
-         * 变量名:discount_amount
-         * 是否必填:是
-         * 类型:int
-         * 描述:
-         *  商品优惠金额
-         *  示例值:0
-         * 
- */ - @SerializedName(value = "discount_amount") - private Integer discountAmount; - /** - *
-         * 字段名:商品备注
-         * 变量名:goods_remark
-         * 是否必填:否
-         * 类型:string[1,128]
-         * 描述:
-         *  商品备注信息
-         *  示例值:商品备注信息
-         * 
- */ - @SerializedName(value = "goods_remark") - private String goodsRemark; - } -} - diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/pay/WxPayOrderReverseV3Result.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/pay/WxPayOrderReverseV3Result.java deleted file mode 100644 index d495e6a70..000000000 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/pay/WxPayOrderReverseV3Result.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.dromara.daxpay.channel.wechat.result.pay; - -import com.google.gson.annotations.SerializedName; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 微信V3撤销支付订单返回结果 - * @author xxm - * @since 2024/7/24 - */ -@Data -@Accessors(chain = true) -public class WxPayOrderReverseV3Result { - /** - *
-     * 字段名:应用ID
-     * 变量名:appid
-     * 是否必填:是
-     * 类型:string[1,32]
-     * 描述:
-     *  由微信生成的应用ID,全局唯一。请求统一下单接口时请注意APPID的应用属性,例如公众号场景下,需使用应用属性为公众号的APPID
-     *  示例值:wxd678efh567hg6787
-     * 
- */ - @SerializedName(value = "appid") - protected String appid; - /** - *
-     * 字段名:直连商户号
-     * 变量名:mchid
-     * 是否必填:是
-     * 类型:string[1,32]
-     * 描述:
-     *  直连商户的商户号,由微信支付生成并下发。
-     *  示例值:1230000109
-     * 
- */ - @SerializedName(value = "mchid") - protected String mchid; - /** - *
-     * 字段名:商户订单号
-     * 变量名:out_trade_no
-     * 是否必填:是
-     * 类型:string[6,32]
-     * 描述:
-     *  商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
-     *  示例值:1217752501201407033233368018
-     * 
- */ - @SerializedName(value = "out_trade_no") - protected String outTradeNo; -} diff --git a/daxpay-single-channel/pom.xml b/daxpay-single-channel/pom.xml index 118257669..458dc4d1a 100644 --- a/daxpay-single-channel/pom.xml +++ b/daxpay-single-channel/pom.xml @@ -13,7 +13,7 @@ org.dromara.daxpay daxpay-single-channel - 3.0.0.beta2 + 3.0.0.beta3 pom 单商户支付通道功能实现 @@ -35,8 +35,8 @@ 1.4.8 4.5.0 - 3.0.0.beta2 - 3.0.0.beta2 + 3.0.0.beta3 + 3.0.0.beta3
@@ -67,7 +67,7 @@ org.dromara.daxpay daxpay-single-service - 3.0.0.beta2 + 3.0.0.beta3 diff --git a/daxpay-single-sdk/pom.xml b/daxpay-single-sdk/pom.xml index cda821337..75c547071 100644 --- a/daxpay-single-sdk/pom.xml +++ b/daxpay-single-sdk/pom.xml @@ -5,7 +5,7 @@ 4.0.0 org.dromara.daxpay daxpay-single-sdk - 3.0.0.beta1 + 3.0.0.beta3 jar diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/AllocDetailResultEnum.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/AllocDetailResultEnum.java new file mode 100644 index 000000000..a1eccf35b --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/AllocDetailResultEnum.java @@ -0,0 +1,25 @@ +package org.dromara.daxpay.single.sdk.code; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 分账明细处理结果 + * 字典: alloc_detail_result + * @author xxm + * @since 2024/4/16 + */ +@Getter +@AllArgsConstructor +public enum AllocDetailResultEnum { + + PENDING("pending", "待分账"), + SUCCESS("success", "分账成功"), + FAIL("fail", "分账失败"), + /** 金额为0时不进行分账 */ + IGNORE("ignore", "忽略分账"), + ; + + private final String code; + private final String name; +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/AllocationResultEnum.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/AllocationResultEnum.java new file mode 100644 index 000000000..d6efb4948 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/AllocationResultEnum.java @@ -0,0 +1,24 @@ +package org.dromara.daxpay.single.sdk.code; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 分账订单处理结果 + * 字典: allocation_result + * @author xxm + * @since 2024/4/16 + */ +@Getter +@AllArgsConstructor +public enum AllocationResultEnum { + + ALL_PENDING("all_pending", "处理中"), + ALL_SUCCESS("all_success", "全部成功"), + PART_SUCCESS("part_success", "部分成功"), + ALL_FAILED("all_failed", "全部失败"), + ; + + private final String code; + private final String name; +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/AllocationStatusEnum.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/AllocationStatusEnum.java new file mode 100644 index 000000000..9cfc73739 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/code/AllocationStatusEnum.java @@ -0,0 +1,27 @@ +package org.dromara.daxpay.single.sdk.code; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 分账状态枚举 + * 字典 allocation_status + * @author xxm + * @since 2024/4/7 + */ +@Getter +@AllArgsConstructor +public enum AllocationStatusEnum { + + PROCESSING("processing", "分账处理中"), + ALLOC_END("alloc_end", "分账处理完成"), + ALLOC_FAILED("alloc_failed", "分账失败"), + FINISH("finish", "分账完结"), + FINISH_FAILED("finish_failed", "完结失败"), + IGNORE("ignore", "忽略"), + ; + + final String code; + final String name; + +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocDetailModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocDetailModel.java new file mode 100644 index 000000000..ca1156c80 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocDetailModel.java @@ -0,0 +1,65 @@ +package org.dromara.daxpay.single.sdk.model.allocation; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.code.AllocDetailResultEnum; +import org.dromara.daxpay.single.sdk.code.AllocReceiverTypeEnum; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 分账订单明细 + * @author xxm + * @since 2024/5/21 + */ +@Data +@Accessors(chain = true) +public class AllocDetailModel { + + @Schema(description = "分账接收方编号") + private String receiverNo; + + /** 分账金额 */ + @Schema(description = "分账金额") + private BigDecimal amount; + + /** 分账比例 */ + @Schema(description = "分账比例(百分之多少)") + private BigDecimal rate; + + /** + * 分账接收方类型 + * @see AllocReceiverTypeEnum + */ + @Schema(description = "分账接收方类型") + private String receiverType; + + /** 接收方账号 */ + @Schema(description = "接收方账号") + private String receiverAccount; + + /** 接收方姓名 */ + @Schema(description = "接收方姓名") + private String receiverName; + + /** + * 分账结果 + * @see AllocDetailResultEnum + */ + @Schema(description = "分账结果") + private String result; + + /** 错误代码 */ + @Schema(description = "错误代码") + private String errorCode; + + /** 错误原因 */ + @Schema(description = "错误原因") + private String errorMsg; + + /** 分账完成时间 */ + @Schema(description = "分账完成时间") + private LocalDateTime finishTime; +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocOrderModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocOrderModel.java new file mode 100644 index 000000000..8c20560da --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocOrderModel.java @@ -0,0 +1,83 @@ +package org.dromara.daxpay.single.sdk.model.allocation; + +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.code.AllocationResultEnum; +import org.dromara.daxpay.single.sdk.code.AllocationStatusEnum; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 分账订单 + * @author xxm + * @since 2024/5/21 + */ +@Data +@Accessors(chain = true) +public class AllocOrderModel { + + /** 分账单号 */ + private String allocNo; + + /** 商户分账单号 */ + private String bizAllocNo; + + /** 通道分账号 */ + private String outAllocNo; + + /** 支付订单号 */ + private String orderNo; + + /** 商户支付订单号 */ + private String bizOrderNo; + + /** 通道支付订单号 */ + private String outOrderNo; + + /** 分账标题 */ + private String title; + + /** 所属通道 */ + private String channel; + + /** + * 总分账金额 + */ + private BigDecimal amount; + + /** + * 分账描述 + */ + private String description; + + /** + * 状态 + * @see AllocationStatusEnum + */ + private String status; + + /** + * 处理结果 + * @see AllocationResultEnum + */ + private String result; + + /** + * 错误码 + */ + private String errorCode; + + /** + * 错误信息 + */ + private String errorMsg; + + /** 分账订单完成时间 */ + private LocalDateTime finishTime; + + /** 分账明细 */ + private List details; + +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocSyncModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocSyncModel.java new file mode 100644 index 000000000..c222c73c2 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocSyncModel.java @@ -0,0 +1,28 @@ +package org.dromara.daxpay.single.sdk.model.allocation; + +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.code.AllocationResultEnum; +import org.dromara.daxpay.single.sdk.code.AllocationStatusEnum; + +/** + * 分账同步结果返回类 + * @author xxm + * @since 2024/5/20 + */ +@Data +@Accessors(chain = true) +public class AllocSyncModel { + + /** + * 分账状态 + * @see AllocationStatusEnum + */ + private String status; + + /** + * 分账结果 + * @see AllocationResultEnum + */ + private String result; +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocationModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocationModel.java new file mode 100644 index 000000000..dc9108829 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocationModel.java @@ -0,0 +1,34 @@ +package org.dromara.daxpay.single.sdk.model.allocation; + +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.code.AllocationResultEnum; +import org.dromara.daxpay.single.sdk.code.AllocationStatusEnum; + +/** + * 分账结果 + * @author xxm + * @since 2024/12/18 + */ +@Data +@Accessors(chain = true) +public class AllocationModel { + + /** 分账订单号 */ + private String allocNo; + + /** 商户分账订单号 */ + private String bizAllocNo; + + /** + * 分账状态 + * @see AllocationStatusEnum + */ + private String status; + + /** + * 分账结果 + * @see AllocationResultEnum + */ + private String result; +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocReceiverAddModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/receiver/AllocReceiverAddModel.java similarity index 69% rename from daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocReceiverAddModel.java rename to daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/receiver/AllocReceiverAddModel.java index cd0a1d7d2..1ada7faea 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocReceiverAddModel.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/receiver/AllocReceiverAddModel.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.single.sdk.model.allocation; +package org.dromara.daxpay.single.sdk.model.allocation.receiver; import lombok.Data; diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocReceiverModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/receiver/AllocReceiverModel.java similarity index 95% rename from daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocReceiverModel.java rename to daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/receiver/AllocReceiverModel.java index d09fa0f3d..ac26abc55 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocReceiverModel.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/receiver/AllocReceiverModel.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.single.sdk.model.allocation; +package org.dromara.daxpay.single.sdk.model.allocation.receiver; import org.dromara.daxpay.single.sdk.code.AllocReceiverTypeEnum; import org.dromara.daxpay.single.sdk.code.AllocRelationTypeEnum; diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocReceiverRemoveModel.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/receiver/AllocReceiverRemoveModel.java similarity index 69% rename from daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocReceiverRemoveModel.java rename to daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/receiver/AllocReceiverRemoveModel.java index eed66b9c5..1060bc1b4 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/AllocReceiverRemoveModel.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/model/allocation/receiver/AllocReceiverRemoveModel.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.single.sdk.model.allocation; +package org.dromara.daxpay.single.sdk.model.allocation.receiver; import lombok.Data; diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocFinishParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocFinishParam.java new file mode 100644 index 000000000..606ff0f71 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocFinishParam.java @@ -0,0 +1,50 @@ +package org.dromara.daxpay.single.sdk.param.allocation; + +import cn.hutool.core.lang.TypeReference; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.model.allocation.AllocationModel; +import org.dromara.daxpay.single.sdk.net.DaxPayRequest; +import org.dromara.daxpay.single.sdk.response.DaxPayResult; +import org.dromara.daxpay.single.sdk.util.JsonUtil; + +/** + * 分账完结参数 + * @author xxm + * @since 2024/12/18 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class AllocFinishParam extends DaxPayRequest { + + + @Schema(description = "商户分账单号") + private String bizAllocNo; + + @Schema(description = "分账单号") + private String allocNo; + + /** + * 方法请求路径 + * + * @return 请求路径 + */ + @Override + public String path() { + return "/unipay/alloc/finish"; + } + + /** + * 将请求返回结果反序列化为实体类 + * + * @param json json字符串 + * @return 反序列后的对象 + */ + @Override + public DaxPayResult toModel(String json) { + return JsonUtil.toBean(json, new TypeReference>() {}); + } +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocSyncParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocSyncParam.java new file mode 100644 index 000000000..be7071b61 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocSyncParam.java @@ -0,0 +1,51 @@ +package org.dromara.daxpay.single.sdk.param.allocation; + +import cn.hutool.core.lang.TypeReference; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.daxpay.single.sdk.model.allocation.AllocSyncModel; +import org.dromara.daxpay.single.sdk.net.DaxPayRequest; +import org.dromara.daxpay.single.sdk.response.DaxPayResult; +import org.dromara.daxpay.single.sdk.util.JsonUtil; + +/** + * 分账同步请求参数 + * @author xxm + * @since 2024/4/12 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Schema(title = "分账同步请求参数") +public class AllocSyncParam extends DaxPayRequest { + + @Schema(description = "分账号") + @Size(max = 32, message = "分账号不可超过32位") + private String allocNo; + + @Schema(description = "商户分账号") + @Size(max = 100, message = "商户分账号不可超过100位") + private String bizAllocNo; + + /** + * 方法请求路径 + * + * @return 请求路径 + */ + @Override + public String path() { + return "/unipay/alloc/sync"; + } + + /** + * 将请求返回结果反序列化为实体类 + * + * @param json json字符串 + * @return 反序列后的对象 + */ + @Override + public DaxPayResult toModel(String json) { + return JsonUtil.toBean(json, new TypeReference>() {}); + } +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocationParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocationParam.java new file mode 100644 index 000000000..793e0e108 --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocationParam.java @@ -0,0 +1,89 @@ +package org.dromara.daxpay.single.sdk.param.allocation; + +import cn.hutool.core.lang.TypeReference; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.dromara.daxpay.single.sdk.model.allocation.AllocationModel; +import org.dromara.daxpay.single.sdk.net.DaxPayRequest; +import org.dromara.daxpay.single.sdk.response.DaxPayResult; +import org.dromara.daxpay.single.sdk.util.JsonUtil; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 分账参数 + * @author xxm + * @since 2024/12/18 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class AllocationParam extends DaxPayRequest { + + /** 商户分账单号 */ + private String bizAllocNo; + + /** 支付订单号 */ + private String orderNo; + + /** 商户支付订单号 */ + private String bizOrderNo; + + /** 分账标题 */ + private String title; + + /** 分账描述 */ + private String description; + + /** + * 优先级 分账接收方列表 > 分账组编号 > 默认分账组 + */ + private String groupNo; + + /** 分账接收方列表 */ + private List receivers; + + /** 回调通知地址 */ + private String notifyUrl; + + /** 商户扩展参数,回调时会原样返回 */ + private String attach; + + + /** + * 分账接收方列表 + */ + @Data + @Accessors(chain = true) + public static class ReceiverParam { + + /** 分账接收方编号 */ + private String receiverNo; + + /** 分账金额 */ + private BigDecimal amount; + } + + /** + * 方法请求路径 + * + * @return 请求路径 + */ + @Override + public String path() { + return "/unipay/alloc/start"; + } + + /** + * 将请求返回结果反序列化为实体类 + * + * @param json json字符串 + * @return 反序列后的对象 + */ + @Override + public DaxPayResult toModel(String json) { + return JsonUtil.toBean(json, new TypeReference>() {}); + } +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/QueryAllocOrderParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/QueryAllocOrderParam.java new file mode 100644 index 000000000..eaa1c00ee --- /dev/null +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/QueryAllocOrderParam.java @@ -0,0 +1,48 @@ +package org.dromara.daxpay.single.sdk.param.allocation; + +import cn.hutool.core.lang.TypeReference; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.daxpay.single.sdk.model.allocation.AllocOrderModel; +import org.dromara.daxpay.single.sdk.net.DaxPayRequest; +import org.dromara.daxpay.single.sdk.response.DaxPayResult; +import org.dromara.daxpay.single.sdk.util.JsonUtil; + +/** + * 分账订单查询参数 + * @author xxm + * @since 2024/4/7 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Schema(title = "支付订单查询参数") +public class QueryAllocOrderParam extends DaxPayRequest { + + @Schema(description = "分账单号") + private String allocNo; + + @Schema(description = "商户分账单号") + private String bizAllocNo; + + /** + * 方法请求路径 + * + * @return 请求路径 + */ + @Override + public String path() { + return "/unipay/alloc/query"; + } + + /** + * 将请求返回结果反序列化为实体类 + * + * @param json json字符串 + * @return 反序列后的对象 + */ + @Override + public DaxPayResult toModel(String json) { + return JsonUtil.toBean(json, new TypeReference>() {}); + } +} diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocReceiverAddParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/receiver/AllocReceiverAddParam.java similarity index 91% rename from daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocReceiverAddParam.java rename to daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/receiver/AllocReceiverAddParam.java index b4aeb0488..9e020eaa0 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocReceiverAddParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/receiver/AllocReceiverAddParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.single.sdk.param.allocation; +package org.dromara.daxpay.single.sdk.param.allocation.receiver; import cn.hutool.core.lang.TypeReference; import lombok.Data; @@ -7,7 +7,7 @@ import lombok.experimental.Accessors; import org.dromara.daxpay.single.sdk.code.AllocReceiverTypeEnum; import org.dromara.daxpay.single.sdk.code.AllocRelationTypeEnum; import org.dromara.daxpay.single.sdk.code.ChannelEnum; -import org.dromara.daxpay.single.sdk.model.allocation.AllocReceiverAddModel; +import org.dromara.daxpay.single.sdk.model.allocation.receiver.AllocReceiverAddModel; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; import org.dromara.daxpay.single.sdk.util.JsonUtil; diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocReceiverRemoveParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/receiver/AllocReceiverRemoveParam.java similarity index 86% rename from daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocReceiverRemoveParam.java rename to daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/receiver/AllocReceiverRemoveParam.java index f5a5f5f43..12167e0cc 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/AllocReceiverRemoveParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/receiver/AllocReceiverRemoveParam.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.single.sdk.param.allocation; +package org.dromara.daxpay.single.sdk.param.allocation.receiver; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; -import org.dromara.daxpay.single.sdk.model.allocation.AllocReceiverRemoveModel; +import org.dromara.daxpay.single.sdk.model.allocation.receiver.AllocReceiverRemoveModel; import org.dromara.daxpay.single.sdk.util.JsonUtil; import cn.hutool.core.lang.TypeReference; import lombok.Data; diff --git a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/QueryAllocReceiverParam.java b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/receiver/QueryAllocReceiverParam.java similarity index 87% rename from daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/QueryAllocReceiverParam.java rename to daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/receiver/QueryAllocReceiverParam.java index 03351b921..116380718 100644 --- a/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/QueryAllocReceiverParam.java +++ b/daxpay-single-sdk/src/main/java/org/dromara/daxpay/single/sdk/param/allocation/receiver/QueryAllocReceiverParam.java @@ -1,10 +1,10 @@ -package org.dromara.daxpay.single.sdk.param.allocation; +package org.dromara.daxpay.single.sdk.param.allocation.receiver; import cn.hutool.core.lang.TypeReference; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; -import org.dromara.daxpay.single.sdk.model.allocation.AllocReceiverModel; +import org.dromara.daxpay.single.sdk.model.allocation.receiver.AllocReceiverModel; import org.dromara.daxpay.single.sdk.net.DaxPayRequest; import org.dromara.daxpay.single.sdk.response.DaxPayResult; import org.dromara.daxpay.single.sdk.util.JsonUtil; diff --git a/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/allocation/AllocReceiverTest.java b/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/allocation/AllocReceiverTest.java index f2f8899ba..20767b29c 100644 --- a/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/allocation/AllocReceiverTest.java +++ b/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/allocation/AllocReceiverTest.java @@ -4,14 +4,14 @@ import org.dromara.daxpay.single.sdk.code.AllocReceiverTypeEnum; import org.dromara.daxpay.single.sdk.code.AllocRelationTypeEnum; import org.dromara.daxpay.single.sdk.code.ChannelEnum; import org.dromara.daxpay.single.sdk.code.SignTypeEnum; -import org.dromara.daxpay.single.sdk.model.allocation.AllocReceiverAddModel; -import org.dromara.daxpay.single.sdk.model.allocation.AllocReceiverModel; -import org.dromara.daxpay.single.sdk.model.allocation.AllocReceiverRemoveModel; +import org.dromara.daxpay.single.sdk.model.allocation.receiver.AllocReceiverAddModel; +import org.dromara.daxpay.single.sdk.model.allocation.receiver.AllocReceiverModel; +import org.dromara.daxpay.single.sdk.model.allocation.receiver.AllocReceiverRemoveModel; import org.dromara.daxpay.single.sdk.net.DaxPayConfig; import org.dromara.daxpay.single.sdk.net.DaxPayKit; -import org.dromara.daxpay.single.sdk.param.allocation.AllocReceiverAddParam; -import org.dromara.daxpay.single.sdk.param.allocation.AllocReceiverRemoveParam; -import org.dromara.daxpay.single.sdk.param.allocation.QueryAllocReceiverParam; +import org.dromara.daxpay.single.sdk.param.allocation.receiver.AllocReceiverAddParam; +import org.dromara.daxpay.single.sdk.param.allocation.receiver.AllocReceiverRemoveParam; +import org.dromara.daxpay.single.sdk.param.allocation.receiver.QueryAllocReceiverParam; import org.dromara.daxpay.single.sdk.response.DaxPayResult; import org.dromara.daxpay.single.sdk.util.JsonUtil; import org.dromara.daxpay.single.sdk.util.PaySignUtil; diff --git a/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/allocation/AllocationTest.java b/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/allocation/AllocationTest.java new file mode 100644 index 000000000..4c2c7ee52 --- /dev/null +++ b/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/allocation/AllocationTest.java @@ -0,0 +1,81 @@ +package org.dromara.daxpay.single.sdk.test.allocation; + +import lombok.var; +import org.dromara.daxpay.single.sdk.code.SignTypeEnum; +import org.dromara.daxpay.single.sdk.net.DaxPayConfig; +import org.dromara.daxpay.single.sdk.net.DaxPayKit; +import org.dromara.daxpay.single.sdk.param.allocation.AllocFinishParam; +import org.dromara.daxpay.single.sdk.param.allocation.AllocSyncParam; +import org.dromara.daxpay.single.sdk.param.allocation.AllocationParam; +import org.dromara.daxpay.single.sdk.param.allocation.QueryAllocOrderParam; +import org.dromara.daxpay.single.sdk.util.JsonUtil; +import org.junit.Before; +import org.junit.Test; + +/** + * 分账测试类 + * @author xxm + * @since 2024/12/18 + */ +public class AllocationTest { + @Before + public void init() { + // 初始化支付配置 + DaxPayConfig config = DaxPayConfig.builder() + .serviceUrl("http://127.0.0.1:9999") + .signSecret("123456") + .appId("M8207639754663343") + .signType(SignTypeEnum.HMAC_SHA256) + .build(); + DaxPayKit.initConfig(config); + } + + /** + * 分账发起接口 + */ + @Test + public void start() { + // 请求参数 + AllocationParam param = new AllocationParam(); + param.setBizAllocNo("SDK_"+ System.currentTimeMillis()); + param.setOrderNo("123"); + var execute = DaxPayKit.execute(param); + System.out.println(JsonUtil.toJsonStr(execute)); + } + + /** + * 分账完结接口 + */ + @Test + public void finish() { + // 请求参数 + var param = new AllocFinishParam(); + param.setAllocNo("DEVA2024121721431860000035"); + var execute = DaxPayKit.execute(param); + System.out.println(JsonUtil.toJsonStr(execute)); + } + + /** + * 分账查询接口 + */ + @Test + public void query() { + // 请求参数 + var param = new QueryAllocOrderParam(); + param.setAllocNo("DEVA2024121721431860000035"); + var execute = DaxPayKit.execute(param); + System.out.println(JsonUtil.toJsonStr(execute)); + } + + /** + * 分账同步接口 + */ + @Test + public void sync() { + // 请求参数 + var param = new AllocSyncParam(); + param.setAllocNo("DEVA2024121721431860000035"); + var execute = DaxPayKit.execute(param); + System.out.println(JsonUtil.toJsonStr(execute)); + } +} diff --git a/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/trade/PayOrderSyncTest.java b/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/trade/PayOrderSyncTest.java index e705b316e..dec610fff 100644 --- a/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/trade/PayOrderSyncTest.java +++ b/daxpay-single-sdk/src/test/java/org/dromara/daxpay/single/sdk/test/trade/PayOrderSyncTest.java @@ -40,7 +40,6 @@ public class PayOrderSyncTest { param.setBizOrderNo("SDK_1715341621498"); DaxPayResult execute = DaxPayKit.execute(param); System.out.println(JsonUtil.toJsonStr(execute)); - } } diff --git a/daxpay-single-server/pom.xml b/daxpay-single-server/pom.xml index 1bf407ab6..4d9f92e93 100644 --- a/daxpay-single-server/pom.xml +++ b/daxpay-single-server/pom.xml @@ -13,7 +13,7 @@ org.dromara.daxpay daxpay-single-server jar - 3.0.0.beta2 + 3.0.0.beta3 daxpay服务端 @@ -29,8 +29,8 @@ 4.5.0 8.5.2 - 3.0.0.beta2 - 3.0.0.beta2 + 3.0.0.beta3 + 3.0.0.beta3 diff --git a/daxpay-single/daxpay-single-core/pom.xml b/daxpay-single/daxpay-single-core/pom.xml index 19bf07b83..eb50a9a43 100644 --- a/daxpay-single/daxpay-single-core/pom.xml +++ b/daxpay-single/daxpay-single-core/pom.xml @@ -6,7 +6,7 @@ org.dromara.daxpay daxpay-single - 3.0.0.beta2 + 3.0.0.beta3 daxpay-single-core diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocationParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocationParam.java index b2c9afeb4..fab32baa5 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocationParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocationParam.java @@ -40,6 +40,11 @@ public class AllocationParam extends PaymentCommonParam { @Schema(description = "商户支付订单号") private String bizOrderNo; + /** 分账标题 */ + @Size(max = 100, message = "分账描述不可超过100位") + @Schema(description = "分账标题") + private String title; + /** 分账描述 */ @Size(max = 150, message = "分账描述不可超过150位") @Schema(description = "分账描述") diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocSyncResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocSyncResult.java index 5d4d102af..bf9cda875 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocSyncResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocSyncResult.java @@ -3,6 +3,8 @@ package org.dromara.daxpay.core.result.allocation; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; +import org.dromara.daxpay.core.enums.AllocationResultEnum; +import org.dromara.daxpay.core.enums.AllocationStatusEnum; /** * 分账同步接口返回类 @@ -13,4 +15,18 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @Schema(title = "分账同步接口") public class AllocSyncResult { + + /** + * 分账状态 + * @see AllocationStatusEnum + */ + @Schema(description = "分账状态") + private String status; + + /** + * 分账结果 + * @see AllocationResultEnum + */ + @Schema(description = "分账结果") + private String result; } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocationResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocationResult.java index 80a8f3901..33cfa28d3 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocationResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/AllocationResult.java @@ -3,6 +3,7 @@ package org.dromara.daxpay.core.result.allocation; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; +import org.dromara.daxpay.core.enums.AllocationResultEnum; import org.dromara.daxpay.core.enums.AllocationStatusEnum; /** @@ -28,4 +29,11 @@ public class AllocationResult { */ @Schema(description = "分账状态") private String status; + + /** + * 分账结果 + * @see AllocationResultEnum + */ + @Schema(description = "分账结果") + private String result; } diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocOrderResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocOrderResult.java index 0e3642e96..4bc75abdc 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocOrderResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/allocation/order/AllocOrderResult.java @@ -7,6 +7,7 @@ import org.dromara.daxpay.core.enums.AllocationResultEnum; import org.dromara.daxpay.core.enums.AllocationStatusEnum; import org.dromara.daxpay.core.enums.ChannelEnum; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @@ -63,7 +64,7 @@ public class AllocOrderResult { * 总分账金额 */ @Schema(description = "总分账金额") - private Integer amount; + private BigDecimal amount; /** * 分账描述 diff --git a/daxpay-single/daxpay-single-service/pom.xml b/daxpay-single/daxpay-single-service/pom.xml index 59621c238..25a96ab3a 100644 --- a/daxpay-single/daxpay-single-service/pom.xml +++ b/daxpay-single/daxpay-single-service/pom.xml @@ -6,7 +6,7 @@ org.dromara.daxpay daxpay-single - 3.0.0.beta2 + 3.0.0.beta3 daxpay-single-service diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java index 35629c88f..54f0d1af6 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java @@ -110,7 +110,8 @@ public class AllocationService { return new AllocationResult() .setAllocNo(order.getAllocNo()) .setBizAllocNo(order.getBizAllocNo()) - .setStatus(order.getStatus()); + .setStatus(order.getStatus()) + .setResult(order.getResult()); } // 创建分账策略并初始化 var allocationStrategy = PaymentStrategyFactory.create(payOrder.getChannel(),AbsAllocationStrategy.class); @@ -137,7 +138,8 @@ public class AllocationService { return new AllocationResult() .setAllocNo(order.getAllocNo()) .setBizAllocNo(order.getBizAllocNo()) - .setStatus(order.getStatus()); + .setStatus(order.getStatus()) + .setResult(order.getResult()); } finally { lockTemplate.releaseLock(lock); } @@ -214,7 +216,8 @@ public class AllocationService { return new AllocationResult() .setAllocNo(order.getAllocNo()) .setBizAllocNo(order.getBizAllocNo()) - .setStatus(order.getStatus()); + .setStatus(order.getStatus()) + .setResult(order.getResult()); } finally { lockTemplate.releaseLock(lock); } @@ -296,7 +299,8 @@ public class AllocationService { return new AllocationResult() .setAllocNo(allocOrder.getAllocNo()) .setBizAllocNo(allocOrder.getBizAllocNo()) - .setStatus(allocOrder.getStatus()); + .setStatus(allocOrder.getStatus()) + .setResult(allocOrder.getResult()); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java index 5ddc223bf..dcd26e06c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java @@ -95,7 +95,7 @@ public class AllocationSyncService { // 调用同步逻辑 this.sync(allocOrder); - return new AllocSyncResult(); + return new AllocSyncResult().setResult(allocOrder.getResult()).setStatus(allocOrder.getStatus()); } /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java index 48823dd73..44035138e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java @@ -4,6 +4,7 @@ import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.BigDecimalUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.AllocDetailResultEnum; @@ -163,10 +164,10 @@ public class AllocOrderService { .setOrderNo(payOrder.getOrderNo()) .setBizOrderNo(payOrder.getBizOrderNo()) .setOutOrderNo(payOrder.getOutOrderNo()) - .setTitle(payOrder.getTitle()) .setAllocNo(TradeNoGenerateUtil.allocation()) .setBizAllocNo(param.getBizAllocNo()) .setChannel(payOrder.getChannel()) + .setTitle(param.getTitle()) .setDescription(param.getDescription()) .setStatus(AllocationStatusEnum.PROCESSING.getCode()) .setResult(AllocationResultEnum.ALL_PENDING.getCode()) @@ -174,6 +175,10 @@ public class AllocOrderService { .setNotifyUrl(param.getNotifyUrl()) .setAttach(param.getAttach()) .setClientIp(param.getClientIp()); + // 订单标题为空, 则使用支付订单标题 + if (StrUtil.isBlank(allocOrder.getTitle())){ + allocOrder.setTitle(payOrder.getTitle()); + } // 如果分账订单金额为0, 设置为忽略状态 if (BigDecimalUtil.isEqual(sumAmount, BigDecimal.ZERO)) { allocOrder.setStatus(AllocationStatusEnum.IGNORE.getCode()) diff --git a/daxpay-single/daxpay-single-unisdk/pom.xml b/daxpay-single/daxpay-single-unisdk/pom.xml index 2623bc750..edfb333eb 100644 --- a/daxpay-single/daxpay-single-unisdk/pom.xml +++ b/daxpay-single/daxpay-single-unisdk/pom.xml @@ -6,7 +6,7 @@ org.dromara.daxpay daxpay-single - 3.0.0.beta2 + 3.0.0.beta3 daxpay-single-unisdk diff --git a/daxpay-single/pom.xml b/daxpay-single/pom.xml index 7589b6f11..6d081f12e 100644 --- a/daxpay-single/pom.xml +++ b/daxpay-single/pom.xml @@ -13,7 +13,7 @@ org.dromara.daxpay daxpay-single - 3.0.0.beta2 + 3.0.0.beta3 pom 单商户支付核心功能实现 @@ -33,8 +33,8 @@ 0.2.0 8.5.2 - 3.0.0.beta2 - 3.0.0.beta2 + 3.0.0.beta3 + 3.0.0.beta3 diff --git a/docker-compose.yml b/docker-compose.yml index 0b06b78bb..a1d18dc34 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3' services: daxpay-single: - image: daxpay/daxpay-single:3.0.0.beta2 + image: daxpay/daxpay-single:3.0.0.beta3 restart: always # window上不支持host网络模式, 需要更改为 bridge 网络模式, 然后走端口映射 network_mode: host diff --git a/pom.xml b/pom.xml index 7b1b17a46..b5230dc0b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.dromara.daxpay daxpay - 3.0.0.beta2 + 3.0.0.beta3 pom dax-pay-single From 2a0508e452037d42b90dc72bab0ae5e6f8a25ad6 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Wed, 18 Dec 2024 15:54:12 +0800 Subject: [PATCH 32/54] =?UTF-8?q?build=20sql=E8=84=9A=E6=9C=AC=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=92=8C=E6=B7=BB=E5=8A=A0=E7=94=9F=E4=BA=A7=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config/mysql/dax-pay-single.sql | 148 ++++--- _config/postgresql/dax-pay-single.sql | 393 ++++++++---------- daxpay-single-sdk/pom.xml | 2 +- .../src/main/resources/application-prod.yml | 85 ++++ 4 files changed, 345 insertions(+), 283 deletions(-) create mode 100644 daxpay-single-server/src/main/resources/application-prod.yml diff --git a/_config/mysql/dax-pay-single.sql b/_config/mysql/dax-pay-single.sql index 150ab3638..cfb61648b 100644 --- a/_config/mysql/dax-pay-single.sql +++ b/_config/mysql/dax-pay-single.sql @@ -67,6 +67,9 @@ INSERT INTO `base_dict` VALUES (1843536733108006912, '分账关系类型', '支 INSERT INTO `base_dict` VALUES (1862094405423972352, '收银台聚合支付类型', '支付', 'checkout_aggregate', '', 1811365615815487488, '2024-11-28 19:21:17', 1811365615815487488, '2024-11-28 19:22:05', 1, 1, 0); INSERT INTO `base_dict` VALUES (1862784043394342912, '收银台支付调起方式', '支付', 'checkout_call_type', '', 1811365615815487488, '2024-11-30 17:01:39', 1811365615815487488, '2024-11-30 17:01:39', 0, 1, 0); INSERT INTO `base_dict` VALUES (1864134865629839360, '收银台类型', '支付', 'checkout_type', '', 1811365615815487488, '2024-12-04 10:29:21', 1811365615815487488, '2024-12-04 10:29:21', 0, 1, 0); +INSERT INTO `base_dict` VALUES (1866464725509451776, '分账订单处理结果', '支付', 'allocation_result', '', 1811365615815487488, '2024-12-10 20:47:22', 1811365615815487488, '2024-12-10 20:47:23', 0, 1, 0); +INSERT INTO `base_dict` VALUES (1866464929205825536, '分账状态', '支付', 'allocation_status', '', 1811365615815487488, '2024-12-10 20:48:11', 1811365615815487488, '2024-12-10 20:48:11', 0, 1, 0); +INSERT INTO `base_dict` VALUES (1866861372363571200, '分账明细处理结果', '支付', 'alloc_detail_result', '', 1811365615815487488, '2024-12-11 23:03:30', 1811365615815487488, '2024-12-11 23:03:31', 0, 1, 0); -- ---------------------------- -- Table structure for base_dict_item @@ -210,6 +213,22 @@ INSERT INTO `base_dict_item` VALUES (1864134981908529152, 1864134865629839360, ' INSERT INTO `base_dict_item` VALUES (1864135083783979008, 1864134865629839360, 'checkout_type', 'aggregate', '聚合支付', 4, 1, '', 1811365615815487488, '2024-12-04 10:30:13', 1811365615815487488, '2024-12-04 10:30:13', 0, 0); INSERT INTO `base_dict_item` VALUES (1864140869360779264, 1862784043394342912, 'checkout_call_type', 'jsapi', 'JSAPI', 7, 1, '', 1811365615815487488, '2024-12-04 10:53:12', 1811365615815487488, '2024-12-04 10:53:12', 0, 0); INSERT INTO `base_dict_item` VALUES (1864182908966182912, 1824050661785407488, 'pay_status', 'wait', '待支付', 0, 1, '', 1811365615815487488, '2024-12-04 13:40:15', 1811365615815487488, '2024-12-04 13:40:15', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866464774637334528, 1866464725509451776, 'allocation_result', 'all_pending', '处理中', 1, 1, '', 1811365615815487488, '2024-12-10 20:47:34', 1811365615815487488, '2024-12-10 20:47:34', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866464805046038528, 1866464725509451776, 'allocation_result', 'all_success', '全部成功', 2, 1, '', 1811365615815487488, '2024-12-10 20:47:41', 1811365615815487488, '2024-12-10 20:47:41', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866464833135292416, 1866464725509451776, 'allocation_result', 'part_success', '部分成功', 3, 1, '', 1811365615815487488, '2024-12-10 20:47:48', 1811365615815487488, '2024-12-10 20:47:48', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866464863468498944, 1866464725509451776, 'allocation_result', 'all_failed', '全部失败', 4, 1, '', 1811365615815487488, '2024-12-10 20:47:55', 1811365615815487488, '2024-12-10 20:47:55', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866464981567516672, 1866464929205825536, 'allocation_status', 'processing', '分账处理中', 0, 1, '', 1811365615815487488, '2024-12-10 20:48:24', 1811365615815487488, '2024-12-10 20:48:24', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866465026735976448, 1866464929205825536, 'allocation_status', 'alloc_end', '分账处理完成', 1, 1, '', 1811365615815487488, '2024-12-10 20:48:34', 1811365615815487488, '2024-12-10 20:48:34', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866465071711498240, 1866464929205825536, 'allocation_status', 'alloc_failed', '分账失败', 2, 1, '', 1811365615815487488, '2024-12-10 20:48:45', 1811365615815487488, '2024-12-10 20:49:06', 1, 0); +INSERT INTO `base_dict_item` VALUES (1866465123091722240, 1866464929205825536, 'allocation_status', 'finish', '分账完结', 3, 1, '', 1811365615815487488, '2024-12-10 20:48:57', 1811365615815487488, '2024-12-10 20:48:57', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866465201684590592, 1866861458925617152, 'allocation_status', 'finish_failed', '完结失败', 4, 1, '', 1811365615815487488, '2024-12-10 20:49:16', 1811365615815487488, '2024-12-10 20:49:16', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866465239626264576, 1866464929205825536, 'allocation_status', 'ignore', '忽略', 55, 1, '', 1811365615815487488, '2024-12-10 20:49:25', 1811365615815487488, '2024-12-10 20:49:25', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866861458925617152, 1866861372363571200, 'alloc_detail_result', 'pending', '待分账', 1, 1, '', 1811365615815487488, '2024-12-11 23:03:51', 1811365615815487488, '2024-12-11 23:03:51', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866861495659331584, 1866861372363571200, 'alloc_detail_result', 'success', '分账成功', 2, 1, '', 1811365615815487488, '2024-12-11 23:04:00', 1811365615815487488, '2024-12-11 23:04:00', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866861545068232704, 1866861372363571200, 'alloc_detail_result', 'fail', '分账失败', 3, 1, '', 1811365615815487488, '2024-12-11 23:04:12', 1811365615815487488, '2024-12-11 23:04:12', 0, 0); +INSERT INTO `base_dict_item` VALUES (1866861581097304064, 1866861372363571200, 'alloc_detail_result', 'ignore', '忽略分账', 4, 1, '', 1811365615815487488, '2024-12-11 23:04:20', 1811365615815487488, '2024-12-11 23:04:20', 0, 0); +INSERT INTO `base_dict_item` VALUES (1868487333327204352, 1824791500966486016, 'trade_type', 'allocation', '分账', 4, 1, '', 1811365615815487488, '2024-12-16 10:44:30', 1811365615815487488, '2024-12-16 21:01:29', 1, 0); +INSERT INTO `base_dict_item` VALUES (1868946985244528640, 1823969170598400000, 'notify_content_type', 'allocation', '分账订单变动通知', 4, 1, '', 1811365615815487488, '2024-12-17 17:10:59', 1811365615815487488, '2024-12-17 17:10:59', 0, 0); -- ---------------------------- -- Table structure for base_param @@ -339,7 +358,6 @@ INSERT INTO `iam_perm_menu` VALUES (1812113823376666624, 1811365615815487488, '2 INSERT INTO `iam_perm_menu` VALUES (1812114224679284736, 1811365615815487488, '2024-07-13 21:17:53', 1811365615815487488, '2024-07-13 21:18:01', 1, 0, NULL, 'dax-pay', '订单管理', 'PayOrder', 'ant-design:wallet-outlined', 0, 0, 'Layout', '/pay/order', '', 0, 1, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812114347454951424, 1811365615815487488, '2024-07-13 21:18:23', 1811365615815487488, '2024-07-24 18:53:39', 2, 0, NULL, 'dax-pay', '交易记录', 'PayRecord', 'ant-design:container-outlined', 0, 0, 'Layout', '/pay/record', '', 0, 1, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812114603047448576, 1811365615815487488, '2024-07-13 21:19:23', 1811365615815487488, '2024-07-24 19:28:09', 1, 0, NULL, 'dax-pay', '商户通知', 'PayNotic', 'ant-design:notification-twotone', 0, 0, 'Layout', '/pay/notice', '', 0, 1, 1, 0, 0, NULL); -INSERT INTO `iam_perm_menu` VALUES (1812114725651148800, 1811365615815487488, '2024-07-13 21:19:53', 1811365615815487488, '2024-10-07 17:29:39', 2, 0, NULL, 'dax-pay', '分账管理', 'Allocation', 'ant-design:sliders-twotone', 0, 0, 'Layout', '/pay/allocation', '', 0, 1, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812114959231938560, 1811365615815487488, '2024-07-13 21:20:48', 1811365615815487488, '2024-07-13 21:20:48', 0, 0, NULL, 'dax-pay', '对账管理', 'Reconcile', 'ant-design:arrows-alt-outlined', 0, 0, 'Layout', '/pay/reconcile', '', 0, 1, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812115119471128576, 1811365615815487488, '2024-07-13 21:21:27', 1811365615815487488, '2024-09-18 11:40:28', 3, 0, NULL, 'dax-pay', '演示模块', 'Demo', 'ant-design:appstore-twotone', 0, 0, 'Layout', '/pay/demo', '', 0, 1, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1812115247342874624, 1811365615815487488, '2024-07-13 21:21:57', 1811365615815487488, '2024-07-13 21:25:06', 4, 0, NULL, 'dax-pay', '关于', '', 'ant-design:info-circle-outlined', 0, 0, 'Layout', '/about', '/about/index', 0, 1, 1, 0, 0, NULL); @@ -365,9 +383,7 @@ INSERT INTO `iam_perm_menu` VALUES (1820468413097746432, 1811365615815487488, '2 INSERT INTO `iam_perm_menu` VALUES (1822975425229004800, 1811365615815487488, '2024-08-12 20:36:25', 1811365615815487488, '2024-08-12 20:36:25', 0, 0, 1810864706127790080, 'dax-pay', '文件存储', '', '', 0, 0, 'Layout', '/system/file', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1822975777026252800, 1811365615815487488, '2024-08-12 20:37:49', 1811365615815487488, '2024-08-12 20:37:49', 0, 0, 1822975425229004800, 'dax-pay', '存储平台', 'FilePlatformList', '', 0, 0, '/baseapi/file/platform/FilePlatformList', '/system/file/platform', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1822975970266226688, 1811365615815487488, '2024-08-12 20:38:35', 1811365615815487488, '2024-08-12 20:38:35', 0, 0, 1822975425229004800, 'dax-pay', '文件管理', 'FileUploadList', '', 0, 0, '/baseapi/file/upload/FileUploadList', '/system/file/info', '', 0, 0, 1, 0, 0, NULL); -INSERT INTO `iam_perm_menu` VALUES (1824779660136001536, 1811365615815487488, '2024-08-17 20:05:48', 1811365615815487488, '2024-10-08 19:21:44', 5, 0, 1812114725651148800, 'dax-pay', '接收方', 'AllocationReceiverList', '', 1, 0, '/daxpay/common/allocation/receiver/AllocationReceiverList', '/pay/allocation/receiver', '', 0, 0, 1, 0, 0, NULL); -INSERT INTO `iam_perm_menu` VALUES (1824779695900831744, 1811365615815487488, '2024-08-17 20:05:57', 1811365615815487488, '2024-10-08 19:21:38', 2, 0, 1812114725651148800, 'dax-pay', '分账组管理', 'AllocationGroupList', '', 1, 0, '/daxpay/common/allocation/group/AllocationGroupList', '/pay/allocation/group', '', 0, 0, 1, 0, 0, NULL); -INSERT INTO `iam_perm_menu` VALUES (1824779750208679936, 1811365615815487488, '2024-08-17 20:06:10', 1811365615815487488, '2024-11-18 14:39:23', 3, 0, 1812114725651148800, 'dax-pay', '分账单', 'AllocTransactionList', '', 0, 0, '/daxpay/common/allocation/transaction/AllocTransactionList', '/pay/reconcile/order', '', 0, 0, 1, 0, 0, NULL); +INSERT INTO `iam_perm_menu` VALUES (1824779750208679936, 1811365615815487488, '2024-08-17 20:06:10', 1811365615815487488, '2024-12-18 15:39:30', 4, 0, 1812114224679284736, 'dax-pay', '分账单', 'AllocTransactionList', '', 0, 0, '/daxpay/common/allocation/transaction/AllocTransactionList', '/pay/reconcile/order', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1824779945365450752, 1811365615815487488, '2024-08-17 20:06:56', 1811365615815487488, '2024-08-27 19:11:51', 2, 0, 1812114347454951424, 'dax-pay', '同步记录', 'TradeSyncRecordList', '', 0, 0, '/daxpay/common/record/sync/TradeSyncRecordList', '/pay/record/sync', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1836248839544733696, 1811365615815487488, '2024-09-18 11:40:14', 1811365615815487488, '2024-09-25 14:46:38', 1, 0, 1812115119471128576, 'dax-pay', '交易调试', 'DevelopTrade', '', 0, 0, '/daxpay/common/develop/trade/DevelopTrade', '/pay/demo/develop', '', 0, 0, 1, 0, 0, NULL); INSERT INTO `iam_perm_menu` VALUES (1837381440350912512, 1811365615815487488, '2024-09-21 14:40:47', 1811365615815487488, '2024-09-21 14:40:47', 0, 0, 1810910433264762880, 'dax-pay', '延时队列', 'DelayQuery', '', 0, 0, '/baseapi/delay/DelayQuery', '/system/config/delay', '', 0, 0, 1, 0, 0, NULL); @@ -537,6 +553,30 @@ CREATE TABLE `iam_user_role` ( -- Records of iam_user_role -- ---------------------------- +-- ---------------------------- +-- Table structure for pay_alloc_config +-- ---------------------------- +DROP TABLE IF EXISTS `pay_alloc_config`; +CREATE TABLE `pay_alloc_config` ( + `id` bigint NOT NULL COMMENT '主键', + `creator` bigint NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint NULL DEFAULT NULL COMMENT '最后修改ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int NOT NULL COMMENT '版本号', + `deleted` tinyint(1) NOT NULL COMMENT '删除标志', + `app_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '应用号', + `auto_alloc` tinyint(1) NULL DEFAULT NULL COMMENT '开启自动分账', + `min_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '分账起始额', + `delay_time` datetime NULL DEFAULT NULL COMMENT '分账延迟时长(分钟)', + `auto_finish` tinyint(1) NULL DEFAULT NULL COMMENT '自动完结', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '分账配置参数' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of pay_alloc_config +-- ---------------------------- + -- ---------------------------- -- Table structure for pay_alloc_detail -- ---------------------------- @@ -545,9 +585,9 @@ CREATE TABLE `pay_alloc_detail` ( `id` bigint NOT NULL COMMENT '主键', `allocation_id` bigint NOT NULL COMMENT '分账订单ID', `receiver_id` bigint NOT NULL COMMENT '接收者ID', - `receiver_no` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分账接收方编号', - `rate` int NOT NULL COMMENT '分账比例(万分之多少)', - `amount` int NOT NULL COMMENT '分账金额', + `receiver_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分账接收方编号', + `rate` decimal(12, 2) NOT NULL COMMENT '分账比例(万分之多少)', + `amount` decimal(12, 2) NOT NULL COMMENT '分账金额', `receiver_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分账接收方类型', `receiver_account` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '接收方账号', `receiver_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '接收方姓名', @@ -562,6 +602,7 @@ CREATE TABLE `pay_alloc_detail` ( `version` int NOT NULL COMMENT '乐观锁', `deleted` tinyint(1) NOT NULL COMMENT '删除标志', `app_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '应用号', + `out_detail_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '外部明细ID', PRIMARY KEY (`id`) USING BTREE, INDEX `allocation_id`(`allocation_id` ASC) USING BTREE COMMENT '分账订单ID索引' ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '分账订单明细' ROW_FORMAT = DYNAMIC; @@ -576,7 +617,7 @@ CREATE TABLE `pay_alloc_detail` ( DROP TABLE IF EXISTS `pay_alloc_group`; CREATE TABLE `pay_alloc_group` ( `id` bigint NOT NULL COMMENT '主键', - `group_no` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分账组编码', + `group_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分账组编码', `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称', `channel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '通道', `default_group` tinyint(1) NULL DEFAULT NULL COMMENT '默认分账组', @@ -620,37 +661,10 @@ CREATE TABLE `pay_alloc_group_receiver` ( -- ---------------------------- -- ---------------------------- --- Table structure for pay_alloc_receiver +-- Table structure for pay_alloc_order -- ---------------------------- -DROP TABLE IF EXISTS `pay_alloc_receiver`; -CREATE TABLE `pay_alloc_receiver` ( - `id` bigint NOT NULL COMMENT '主键', - `receiver_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分账接收方编号', - `channel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '所属通道', - `receiver_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分账接收方类型', - `receiver_account` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '接收方账号', - `receiver_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '接收方姓名', - `relation_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分账关系类型', - `relation_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '关系名称', - `creator` bigint NULL DEFAULT NULL COMMENT '创建者ID', - `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', - `last_modifier` bigint NULL DEFAULT NULL COMMENT '最后修改ID', - `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', - `version` int NOT NULL COMMENT '版本号', - `deleted` tinyint(1) NOT NULL COMMENT '删除标志', - `app_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '应用号', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '分账接收方' ROW_FORMAT = DYNAMIC; - --- ---------------------------- --- Records of pay_alloc_receiver --- ---------------------------- - --- ---------------------------- --- Table structure for pay_alloc_transaction --- ---------------------------- -DROP TABLE IF EXISTS `pay_alloc_transaction`; -CREATE TABLE `pay_alloc_transaction` ( +DROP TABLE IF EXISTS `pay_alloc_order`; +CREATE TABLE `pay_alloc_order` ( `id` bigint NOT NULL COMMENT '主键', `alloc_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分账单号', `biz_alloc_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '商户分账单号', @@ -661,7 +675,7 @@ CREATE TABLE `pay_alloc_transaction` ( `out_order_no` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '通道支付订单号', `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '支付标题', `channel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '所属通道', - `amount` int NOT NULL COMMENT '总分账金额', + `amount` decimal(12, 2) NOT NULL COMMENT '总分账金额', `description` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分账描述', `status` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态', `result` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '处理结果', @@ -690,7 +704,35 @@ CREATE TABLE `pay_alloc_transaction` ( ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '分账订单' ROW_FORMAT = DYNAMIC; -- ---------------------------- --- Records of pay_alloc_transaction +-- Records of pay_alloc_order +-- ---------------------------- + +-- ---------------------------- +-- Table structure for pay_alloc_receiver +-- ---------------------------- +DROP TABLE IF EXISTS `pay_alloc_receiver`; +CREATE TABLE `pay_alloc_receiver` ( + `id` bigint NOT NULL COMMENT '主键', + `receiver_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分账接收方编号', + `channel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '所属通道', + `receiver_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分账接收方类型', + `receiver_account` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '接收方账号', + `receiver_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '接收方姓名', + `relation_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分账关系类型', + `relation_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '关系名称', + `creator` bigint NULL DEFAULT NULL COMMENT '创建者ID', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `last_modifier` bigint NULL DEFAULT NULL COMMENT '最后修改ID', + `last_modified_time` datetime NULL DEFAULT NULL COMMENT '最后修改时间', + `version` int NOT NULL COMMENT '版本号', + `deleted` tinyint(1) NOT NULL COMMENT '删除标志', + `app_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '应用号', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '分账接收方' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of pay_alloc_receiver -- ---------------------------- -- ---------------------------- @@ -705,7 +747,7 @@ CREATE TABLE `pay_api_const` ( `enable` tinyint(1) NULL DEFAULT NULL COMMENT '是否启用', `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支付接口常量' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支付接口常量' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of pay_api_const @@ -730,7 +772,7 @@ CREATE TABLE `pay_cashier_code_config` ( `enable` tinyint(1) NOT NULL COMMENT '是否启用', `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银码牌配置' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银码牌配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of pay_cashier_code_config @@ -756,7 +798,7 @@ CREATE TABLE `pay_cashier_code_type_config` ( `allocation` tinyint(1) NOT NULL COMMENT '是否开启分账', `auto_allocation` tinyint(1) NOT NULL COMMENT '自动分账', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '各类型码牌配置' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '各类型码牌配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of pay_cashier_code_type_config @@ -849,7 +891,7 @@ CREATE TABLE `pay_checkout_aggregate_config` ( `pay_method` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付方式', `auto_launch` tinyint(1) NULL DEFAULT NULL COMMENT '自动拉起支付', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银台聚合支付配置' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银台聚合支付配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of pay_checkout_aggregate_config @@ -872,7 +914,7 @@ CREATE TABLE `pay_checkout_config` ( `aggregate_show` tinyint(1) NULL DEFAULT NULL COMMENT 'PC收银台是否同时显示聚合收银码', `h5_auto_upgrade` tinyint(1) NULL DEFAULT NULL COMMENT 'h5收银台自动升级聚合支付', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银台配置' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银台配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of pay_checkout_config @@ -896,7 +938,7 @@ CREATE TABLE `pay_checkout_group_config` ( `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标', `sort_no` double(8, 2) NULL DEFAULT NULL COMMENT '排序', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银台类目配置' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银台类目配置' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of pay_checkout_group_config @@ -923,7 +965,7 @@ CREATE TABLE `pay_checkout_item_config` ( `sort_no` double(8, 2) NULL DEFAULT NULL COMMENT '排序', `call_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '调用方式', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银台配置项' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '收银台配置项' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of pay_checkout_item_config @@ -1067,13 +1109,17 @@ CREATE TABLE `pay_merchant_notify_const` ( `code` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '通道编码', `name` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '通道名称', `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '描述', - `enable` tinyint(1) NULL DEFAULT NULL COMMENT '是否启用', + `enable` tinyint(1) NOT NULL COMMENT '是否启用', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商户订阅通知类型' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of pay_merchant_notify_const -- ---------------------------- +INSERT INTO `pay_merchant_notify_const` VALUES (10000, 'pay', '支付订单变动通知', '支付订单变动通知', 1); +INSERT INTO `pay_merchant_notify_const` VALUES (20000, 'refund', '退款订单变动通知', '退款订单变动通知', 1); +INSERT INTO `pay_merchant_notify_const` VALUES (30000, 'transfer', '转账订单变动通知', '转账订单变动通知', 1); +INSERT INTO `pay_merchant_notify_const` VALUES (40000, 'allocation', '分账订单变动通知', '分账订单变动通知', 1); -- ---------------------------- -- Table structure for pay_merchant_notify_record @@ -1219,7 +1265,7 @@ CREATE TABLE `pay_platform_config` ( -- ---------------------------- -- Records of pay_platform_config -- ---------------------------- -INSERT INTO `pay_platform_config` VALUES (1, 1, '2024-09-20 10:54:44', 1811365615815487488, '2024-12-04 09:27:23', 14, 0, 'https://pay.daxpay.com/server', 'https://pay.daxpay.com/h5', 'http://pay.daxpay.com/web'); +INSERT INTO `pay_platform_config` VALUES (1, 1, '2024-09-20 10:54:44', 1811365615815487488, '2024-12-04 09:27:23', 14, 0, 'https://pay1.bootx.cn/server', 'https://pay1.bootx.cn/h5', 'http://pay1.bootx.cn/web'); -- ---------------------------- -- Table structure for pay_reconcile_discrepancy @@ -1532,8 +1578,8 @@ CREATE TABLE `starter_file_platform` ( -- ---------------------------- -- Records of starter_file_platform -- ---------------------------- -INSERT INTO `starter_file_platform` VALUES (1000, 'local', '本地存储', 'http://127.0.0.1:9999/storage', 1, 1811365615815487488, '2024-08-13 12:32:37', 1811365615815487488, '2024-10-06 17:17:39', 0); -INSERT INTO `starter_file_platform` VALUES (2000, 'minio', 'minio存储', 'http://127.0.0.1:9002/daxpay', 0, 1811365615815487488, '2024-08-13 12:32:40', 1811365615815487488, '2024-10-06 17:17:39', 3); +INSERT INTO `starter_file_platform` VALUES (1000, 'local', '本地存储', 'http://127.0.0.1:9999', 0, 1811365615815487488, '2024-08-13 12:32:37', 1811365615815487488, '2024-10-06 17:17:39', 0); +INSERT INTO `starter_file_platform` VALUES (2000, 'minio', 'minio存储', 'http://127.0.0.1:9002/daxpay', 1, 1811365615815487488, '2024-08-13 12:32:40', 1811365615815487488, '2024-10-06 17:17:39', 3); -- ---------------------------- -- Table structure for starter_file_upload_info diff --git a/_config/postgresql/dax-pay-single.sql b/_config/postgresql/dax-pay-single.sql index 129b7d669..a58f8130d 100644 --- a/_config/postgresql/dax-pay-single.sql +++ b/_config/postgresql/dax-pay-single.sql @@ -80,6 +80,9 @@ INSERT INTO "public"."base_dict" VALUES (1840650057641713664, '码牌类型', ' INSERT INTO "public"."base_dict" VALUES (1862094405423972352, '收银台聚合支付类型', '支付', 'checkout_aggregate', '', 1811365615815487488, '2024-11-28 19:21:17', 1811365615815487488, '2024-11-28 19:22:05', 1, 't', 'f'); INSERT INTO "public"."base_dict" VALUES (1862784043394342912, '收银台支付调起方式', '支付', 'checkout_call_type', '', 1811365615815487488, '2024-11-30 17:01:39', 1811365615815487488, '2024-11-30 17:01:39', 0, 't', 'f'); INSERT INTO "public"."base_dict" VALUES (1864134865629839360, '收银台类型', '支付', 'checkout_type', '', 1811365615815487488, '2024-12-04 10:29:21', 1811365615815487488, '2024-12-04 10:29:21', 0, 't', 'f'); +INSERT INTO "public"."base_dict" VALUES (1866464725509451776, '分账订单处理结果', '支付', 'allocation_result', '', 1811365615815487488, '2024-12-10 20:47:22.458399', 1811365615815487488, '2024-12-10 20:47:22.512079', 0, 't', 'f'); +INSERT INTO "public"."base_dict" VALUES (1866464929205825536, '分账状态', '', 'allocation_status', '', 1811365615815487488, '2024-12-10 20:48:11.021238', 1811365615815487488, '2024-12-10 20:48:11.071674', 0, 't', 'f'); +INSERT INTO "public"."base_dict" VALUES (1866861372363571200, '分账明细处理结果', '支付', 'alloc_detail_result', '', 1811365615815487488, '2024-12-11 23:03:30.437127', 1811365615815487488, '2024-12-11 23:03:30.629127', 0, 't', 'f'); -- ---------------------------- -- Table structure for base_dict_item @@ -238,6 +241,22 @@ INSERT INTO "public"."base_dict_item" VALUES (1864134981908529152, 1864134865629 INSERT INTO "public"."base_dict_item" VALUES (1864135083783979008, 1864134865629839360, 'checkout_type', 'aggregate', '聚合支付', 4, 't', '', 1811365615815487488, '2024-12-04 10:30:13', 1811365615815487488, '2024-12-04 10:30:13', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1864140869360779264, 1862784043394342912, 'checkout_call_type', 'jsapi', 'JSAPI', 7, 't', '', 1811365615815487488, '2024-12-04 10:53:12', 1811365615815487488, '2024-12-04 10:53:12', 0, 'f'); INSERT INTO "public"."base_dict_item" VALUES (1864182908966182912, 1824050661785407488, 'pay_status', 'wait', '待支付', 0, 't', '', 1811365615815487488, '2024-12-04 13:40:15', 1811365615815487488, '2024-12-04 13:40:15', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866464774637334528, 1866464725509451776, 'allocation_result', 'all_pending', '处理中', 1, 't', '', 1811365615815487488, '2024-12-10 20:47:34.169368', 1811365615815487488, '2024-12-10 20:47:34.218803', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866464805046038528, 1866464725509451776, 'allocation_result', 'all_success', '全部成功', 2, 't', '', 1811365615815487488, '2024-12-10 20:47:41.420831', 1811365615815487488, '2024-12-10 20:47:41.470313', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866464833135292416, 1866464725509451776, 'allocation_result', 'part_success', '部分成功', 3, 't', '', 1811365615815487488, '2024-12-10 20:47:48.116111', 1811365615815487488, '2024-12-10 20:47:48.166469', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866464863468498944, 1866464725509451776, 'allocation_result', 'all_failed', '全部失败', 4, 't', '', 1811365615815487488, '2024-12-10 20:47:55.348417', 1811365615815487488, '2024-12-10 20:47:55.398755', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866464981567516672, 1866464929205825536, 'allocation_status', 'processing', '分账处理中', 0, 't', '', 1811365615815487488, '2024-12-10 20:48:23.505353', 1811365615815487488, '2024-12-10 20:48:23.556234', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866465026735976448, 1866464929205825536, 'allocation_status', 'alloc_end', '分账处理完成', 1, 't', '', 1811365615815487488, '2024-12-10 20:48:34.274079', 1811365615815487488, '2024-12-10 20:48:34.325865', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866465201684590592, 1866464929205825536, 'allocation_status', 'finish_failed', '完结失败', 4, 't', '', 1811365615815487488, '2024-12-10 20:49:15.985582', 1811365615815487488, '2024-12-10 20:49:16.037116', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866465123091722240, 1866464929205825536, 'allocation_status', 'finish', '分账完结', 3, 't', '', 1811365615815487488, '2024-12-10 20:48:57.247403', 1811365615815487488, '2024-12-10 20:48:57.299907', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866465071711498240, 1866464929205825536, 'allocation_status', 'alloc_failed', '分账失败', 2, 't', '', 1811365615815487488, '2024-12-10 20:48:44.997816', 1811365615815487488, '2024-12-10 20:49:06.16083', 1, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866465239626264576, 1866464929205825536, 'allocation_status', 'ignore', '忽略', 55, 't', '', 1811365615815487488, '2024-12-10 20:49:25.031927', 1811365615815487488, '2024-12-10 20:49:25.082125', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866861458925617152, 1866861372363571200, 'alloc_detail_result', 'pending', '待分账', 1, 't', '', 1811365615815487488, '2024-12-11 23:03:51.073647', 1811365615815487488, '2024-12-11 23:03:51.127245', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866861495659331584, 1866861372363571200, 'alloc_detail_result', 'success', '分账成功', 2, 't', '', 1811365615815487488, '2024-12-11 23:03:59.831758', 1811365615815487488, '2024-12-11 23:03:59.873336', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866861545068232704, 1866861372363571200, 'alloc_detail_result', 'fail', '分账失败', 3, 't', '', 1811365615815487488, '2024-12-11 23:04:11.611702', 1811365615815487488, '2024-12-11 23:04:11.656702', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1866861581097304064, 1866861372363571200, 'alloc_detail_result', 'ignore', '忽略分账', 4, 't', '', 1811365615815487488, '2024-12-11 23:04:20.201202', 1811365615815487488, '2024-12-11 23:04:20.243202', 0, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1868487333327204352, 1824791500966486016, 'trade_type', 'allocation', '分账', 4, 't', '', 1811365615815487488, '2024-12-16 10:44:29.738737', 1811365615815487488, '2024-12-16 21:01:28.961731', 1, 'f'); +INSERT INTO "public"."base_dict_item" VALUES (1868946985244528640, 1823969170598400000, 'notify_content_type', 'allocation', '分账订单变动通知', 4, 't', '', 1811365615815487488, '2024-12-17 17:10:59.295517', 1811365615815487488, '2024-12-17 17:10:59.352198', 0, 'f'); -- ---------------------------- -- Table structure for base_param @@ -431,7 +450,6 @@ INSERT INTO "public"."iam_perm_menu" VALUES (1812114959231938560, 18113656158154 INSERT INTO "public"."iam_perm_menu" VALUES (1812115247342874624, 1811365615815487488, '2024-07-13 21:21:57.096469', 1811365615815487488, '2024-07-13 21:25:06.069746', 4, 'f', NULL, 'dax-pay', '关于', '', 'ant-design:info-circle-outlined', 'f', 'f', 'Layout', '/about', '/about/index', 0, 't', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1812113823376666624, 1811365615815487488, '2024-07-13 21:16:17.597391', 1811365615815487488, '2024-07-13 21:27:13.912267', 2, 'f', NULL, 'dax-pay', '支付配置', 'PayConfig', 'ant-design:property-safety-twotone', 'f', 'f', 'Layout', '/pay/config', '', 0, 't', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1812116972585938944, 1811365615815487488, '2024-07-13 21:28:48.426928', 1811365615815487488, '2024-07-13 21:28:48.429631', 0, 'f', 1812113823376666624, 'dax-pay', '商户管理', '', '', 'f', 'f', 'Layout', '/pay/config/merchant', '', 0, 'f', 't', 'f', 'f', NULL); -INSERT INTO "public"."iam_perm_menu" VALUES (1812114725651148800, 1811365615815487488, '2024-07-13 21:19:52.715548', 1811365615815487488, '2024-10-07 17:29:38.645989', 2, 'f', NULL, 'dax-pay', '分账管理', 'Allocation', 'ant-design:sliders-twotone', 'f', 'f', 'Layout', '/pay/allocation', '', 0, 't', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1812116779807338496, 1811365615815487488, '2024-07-13 21:28:02.464593', 1811365615815487488, '2024-07-17 14:13:02.263915', 1, 'f', 1812113823376666624, 'dax-pay', '基础数据', '', '', 'f', 'f', 'Layout', '/pay/config/base', '', -2, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1812114347454951424, 1811365615815487488, '2024-07-13 21:18:22.547038', 1811365615815487488, '2024-07-24 18:53:38.947244', 2, 'f', NULL, 'dax-pay', '交易记录', 'PayRecord', 'ant-design:container-outlined', 'f', 'f', 'Layout', '/pay/record', '', 0, 't', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1812114603047448576, 1811365615815487488, '2024-07-13 21:19:23.484406', 1811365615815487488, '2024-07-24 19:28:09.132339', 1, 'f', NULL, 'dax-pay', '商户通知', 'PayNotic', 'ant-design:notification-twotone', 'f', 'f', 'Layout', '/pay/notice', '', 0, 't', 't', 'f', 'f', NULL); @@ -451,7 +469,6 @@ INSERT INTO "public"."iam_perm_menu" VALUES (1822975425229004800, 18113656158154 INSERT INTO "public"."iam_perm_menu" VALUES (1813456708833087488, 1811365615815487488, '2024-07-17 14:12:26.440633', 1811365615815487488, '2024-09-20 11:05:46.469139', 4, 'f', 1812113823376666624, 'dax-pay', '基础配置', '', '', 'f', 'f', 'Layout', '/pay/config/basic', '', -1, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1822975777026252800, 1811365615815487488, '2024-08-12 20:37:49.152472', 1811365615815487488, '2024-08-12 20:37:49.154031', 0, 'f', 1822975425229004800, 'dax-pay', '存储平台', 'FilePlatformList', '', 'f', 'f', '/baseapi/file/platform/FilePlatformList', '/system/file/platform', '', 0, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1822975970266226688, 1811365615815487488, '2024-08-12 20:38:35.224183', 1811365615815487488, '2024-08-12 20:38:35.226288', 0, 'f', 1822975425229004800, 'dax-pay', '文件管理', 'FileUploadList', '', 'f', 'f', '/baseapi/file/upload/FileUploadList', '/system/file/info', '', 0, 'f', 't', 'f', 'f', NULL); -INSERT INTO "public"."iam_perm_menu" VALUES (1824779750208679936, 1811365615815487488, '2024-08-17 20:06:09.875297', 1811365615815487488, '2024-10-08 19:25:43.362002', 2, 'f', 1812114725651148800, 'dax-pay', '分账单', '', '', 'f', 'f', '', '/pay/reconcile/order', '', 0, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1812118306328473600, 1811365615815487488, '2024-07-13 21:34:06.415311', 1811365615815487488, '2024-08-27 16:13:34.678515', 4, 'f', 1812116779807338496, 'dax-pay', '支付通道', 'ChannelConstList', '', 'f', 'f', '/daxpay/common/constant/channel/ChannelConstList', '/pay/config/base/channel', '', 0, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1816064593371066368, 1811365615815487488, '2024-07-24 18:55:14.565671', 1811365615815487488, '2024-08-27 19:11:47.317719', 4, 'f', 1812114347454951424, 'dax-pay', '关闭记录(支付)', 'PayCloseRecordList', '', 'f', 'f', '/daxpay/common/record/close/PayCloseRecordList', '/pay/record/close', '', 0, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1824779945365450752, 1811365615815487488, '2024-08-17 20:06:56.404481', 1811365615815487488, '2024-08-27 19:11:51.292144', 2, 'f', 1812114347454951424, 'dax-pay', '同步记录', 'TradeSyncRecordList', '', 'f', 'f', '/daxpay/common/record/sync/TradeSyncRecordList', '/pay/record/sync', '', 0, 'f', 't', 'f', 'f', NULL); @@ -462,8 +479,7 @@ INSERT INTO "public"."iam_perm_menu" VALUES (1812115119471128576, 18113656158154 INSERT INTO "public"."iam_perm_menu" VALUES (1837381440350912512, 1811365615815487488, '2024-09-21 14:40:46.934676', 1811365615815487488, '2024-09-21 14:40:46.934676', 0, 'f', 1810910433264762880, 'dax-pay', '延时队列', 'DelayQuery', '', 'f', 'f', '/baseapi/delay/DelayQuery', '/system/config/delay', '', 0, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1836248839544733696, 1811365615815487488, '2024-09-18 11:40:13.861746', 1811365615815487488, '2024-09-25 14:46:38.017375', 1, 'f', 1812115119471128576, 'dax-pay', '交易调试', 'DevelopTrade', '', 'f', 'f', '/daxpay/common/develop/trade/DevelopTrade', '/pay/demo/develop', '', 0, 'f', 't', 'f', 'f', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (1838832057238274048, 1811365615815487488, '2024-09-25 14:45:00.952476', 1811365615815487488, '2024-09-25 14:46:49.48474', 1, 'f', 1812115119471128576, 'dax-pay', '认证调试', 'ChannelAuth', '', 'f', 'f', '/daxpay/common/develop/auth/ChannelAuth', '/pay/demo/channelAuth', '', 0, 'f', 't', 'f', 'f', NULL); -INSERT INTO "public"."iam_perm_menu" VALUES (1824779695900831744, 1811365615815487488, '2024-08-17 20:05:56.927619', 1811365615815487488, '2024-10-08 19:21:37.604842', 2, 'f', 1812114725651148800, 'dax-pay', '分账组管理', 'AllocationGroupList', '', 't', 'f', '/daxpay/common/allocation/group/AllocationGroupList', '/pay/allocation/group', '', 0, 'f', 't', 'f', 'f', NULL); -INSERT INTO "public"."iam_perm_menu" VALUES (1824779660136001536, 1811365615815487488, '2024-08-17 20:05:48.400494', 1811365615815487488, '2024-10-08 19:21:44.305611', 5, 'f', 1812114725651148800, 'dax-pay', '接收方', 'AllocationReceiverList', '', 't', 'f', '/daxpay/common/allocation/receiver/AllocationReceiverList', '/pay/allocation/receiver', '', 0, 'f', 't', 'f', 'f', NULL); +INSERT INTO "public"."iam_perm_menu" VALUES (1824779750208679936, 1811365615815487488, '2024-08-17 20:06:09.875297', 1811365615815487488, '2024-12-16 10:22:59.343388', 7, 'f', 1812114224679284736, 'dax-pay', '分账订单', 'AllocOrderList', '', 'f', 'f', '/daxpay/common/allocation/order/AllocOrderList', '/pay/order/allocation', '', 0, 'f', 't', 'f', 'f', NULL); -- ---------------------------- -- Table structure for iam_perm_path @@ -704,6 +720,43 @@ COMMENT ON TABLE "public"."iam_user_role" IS '用户角色关联关系'; -- Records of iam_user_role -- ---------------------------- +-- ---------------------------- +-- Table structure for pay_alloc_config +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_alloc_config"; +CREATE TABLE "public"."pay_alloc_config" ( + "id" int8 NOT NULL, + "creator" int8, + "create_time" timestamp(6), + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL, + "app_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "min_amount" numeric(10,2), + "auto_alloc" bool, + "deleted" bool NOT NULL, + "delay_time" int8, + "auto_finish" bool +) +; +COMMENT ON COLUMN "public"."pay_alloc_config"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_alloc_config"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_alloc_config"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_alloc_config"."last_modifier" IS '最后修改ID'; +COMMENT ON COLUMN "public"."pay_alloc_config"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_alloc_config"."version" IS '版本号'; +COMMENT ON COLUMN "public"."pay_alloc_config"."app_id" IS '应用号'; +COMMENT ON COLUMN "public"."pay_alloc_config"."min_amount" IS '分账起始额'; +COMMENT ON COLUMN "public"."pay_alloc_config"."auto_alloc" IS '开启自动分账'; +COMMENT ON COLUMN "public"."pay_alloc_config"."deleted" IS '删除标志'; +COMMENT ON COLUMN "public"."pay_alloc_config"."delay_time" IS '分账延迟时长(分钟)'; +COMMENT ON COLUMN "public"."pay_alloc_config"."auto_finish" IS '自动完结'; +COMMENT ON TABLE "public"."pay_alloc_config" IS '分账配置参数'; + +-- ---------------------------- +-- Records of pay_alloc_config +-- ---------------------------- + -- ---------------------------- -- Table structure for pay_alloc_detail -- ---------------------------- @@ -712,9 +765,9 @@ CREATE TABLE "public"."pay_alloc_detail" ( "id" int8 NOT NULL, "allocation_id" int8 NOT NULL, "receiver_id" int8 NOT NULL, - "receiver_no" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, - "rate" int4 NOT NULL, - "amount" int4 NOT NULL, + "receiver_no" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "rate" numeric(8,2) NOT NULL, + "amount" numeric(10,2) NOT NULL, "receiver_type" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, "receiver_account" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, "receiver_name" varchar(100) COLLATE "pg_catalog"."default", @@ -728,14 +781,15 @@ CREATE TABLE "public"."pay_alloc_detail" ( "last_modified_time" timestamp(6), "version" int4 NOT NULL, "deleted" bool NOT NULL, - "app_id" varchar(32) COLLATE "pg_catalog"."default" + "app_id" varchar(32) COLLATE "pg_catalog"."default", + "out_detail_id" varchar(64) COLLATE "pg_catalog"."default" ) ; COMMENT ON COLUMN "public"."pay_alloc_detail"."id" IS '主键'; COMMENT ON COLUMN "public"."pay_alloc_detail"."allocation_id" IS '分账订单ID'; COMMENT ON COLUMN "public"."pay_alloc_detail"."receiver_id" IS '接收者ID'; COMMENT ON COLUMN "public"."pay_alloc_detail"."receiver_no" IS '分账接收方编号'; -COMMENT ON COLUMN "public"."pay_alloc_detail"."rate" IS '分账比例(万分之多少)'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."rate" IS '分账比例(百分之多少)'; COMMENT ON COLUMN "public"."pay_alloc_detail"."amount" IS '分账金额'; COMMENT ON COLUMN "public"."pay_alloc_detail"."receiver_type" IS '分账接收方类型'; COMMENT ON COLUMN "public"."pay_alloc_detail"."receiver_account" IS '接收方账号'; @@ -751,6 +805,7 @@ COMMENT ON COLUMN "public"."pay_alloc_detail"."last_modified_time" IS '最后修 COMMENT ON COLUMN "public"."pay_alloc_detail"."version" IS '乐观锁'; COMMENT ON COLUMN "public"."pay_alloc_detail"."deleted" IS '删除标志'; COMMENT ON COLUMN "public"."pay_alloc_detail"."app_id" IS '应用号'; +COMMENT ON COLUMN "public"."pay_alloc_detail"."out_detail_id" IS '外部关联明细'; COMMENT ON TABLE "public"."pay_alloc_detail" IS '分账订单明细'; -- ---------------------------- @@ -763,7 +818,7 @@ COMMENT ON TABLE "public"."pay_alloc_detail" IS '分账订单明细'; DROP TABLE IF EXISTS "public"."pay_alloc_group"; CREATE TABLE "public"."pay_alloc_group" ( "id" int8 NOT NULL, - "group_no" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, + "group_no" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, "name" varchar(50) COLLATE "pg_catalog"."default", "channel" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, "default_group" bool, @@ -834,53 +889,10 @@ COMMENT ON TABLE "public"."pay_alloc_group_receiver" IS '分账接收组关系'; -- ---------------------------- -- ---------------------------- --- Table structure for pay_alloc_receiver +-- Table structure for pay_alloc_order -- ---------------------------- -DROP TABLE IF EXISTS "public"."pay_alloc_receiver"; -CREATE TABLE "public"."pay_alloc_receiver" ( - "id" int8 NOT NULL, - "receiver_no" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, - "channel" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, - "receiver_type" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, - "receiver_account" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, - "receiver_name" varchar(100) COLLATE "pg_catalog"."default", - "relation_type" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, - "relation_name" varchar(50) COLLATE "pg_catalog"."default", - "creator" int8, - "create_time" timestamp(6), - "last_modifier" int8, - "last_modified_time" timestamp(6), - "version" int4 NOT NULL, - "app_id" varchar(32) COLLATE "pg_catalog"."default", - "deleted" bool NOT NULL -) -; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."id" IS '主键'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."receiver_no" IS '分账接收方编号'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."channel" IS '所属通道'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."receiver_type" IS '分账接收方类型'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."receiver_account" IS '接收方账号'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."receiver_name" IS '接收方姓名'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."relation_type" IS '分账关系类型'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."relation_name" IS '关系名称'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."creator" IS '创建者ID'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."create_time" IS '创建时间'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."last_modifier" IS '最后修改ID'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."last_modified_time" IS '最后修改时间'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."version" IS '版本号'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."app_id" IS '应用号'; -COMMENT ON COLUMN "public"."pay_alloc_receiver"."deleted" IS '删除标志'; -COMMENT ON TABLE "public"."pay_alloc_receiver" IS '分账接收方'; - --- ---------------------------- --- Records of pay_alloc_receiver --- ---------------------------- - --- ---------------------------- --- Table structure for pay_alloc_transaction --- ---------------------------- -DROP TABLE IF EXISTS "public"."pay_alloc_transaction"; -CREATE TABLE "public"."pay_alloc_transaction" ( +DROP TABLE IF EXISTS "public"."pay_alloc_order"; +CREATE TABLE "public"."pay_alloc_order" ( "id" int8 NOT NULL, "alloc_no" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, "biz_alloc_no" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, @@ -891,7 +903,7 @@ CREATE TABLE "public"."pay_alloc_transaction" ( "out_order_no" varchar(150) COLLATE "pg_catalog"."default" NOT NULL, "title" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, "channel" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, - "amount" int4 NOT NULL, + "amount" numeric(10,2) NOT NULL, "description" varchar(150) COLLATE "pg_catalog"."default", "status" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, "result" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, @@ -911,38 +923,83 @@ CREATE TABLE "public"."pay_alloc_transaction" ( "app_id" varchar(32) COLLATE "pg_catalog"."default" ) ; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."id" IS '主键'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."alloc_no" IS '分账单号'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."biz_alloc_no" IS '商户分账单号'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."out_alloc_no" IS '通道分账号'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."order_id" IS '支付订单ID'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."order_no" IS '支付订单号'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."biz_order_no" IS '商户支付订单号'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."out_order_no" IS '通道支付订单号'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."title" IS '支付标题'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."channel" IS '所属通道'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."amount" IS '总分账金额'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."description" IS '分账描述'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."status" IS '状态'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."result" IS '处理结果'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."finish_time" IS '分账完成时间'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."notify_url" IS '异步通知地址'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."attach" IS '商户扩展参数'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."req_time" IS '请求时间,传输时间戳'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."client_ip" IS '支付终端ip'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."error_code" IS '错误码'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."error_msg" IS '错误信息'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."creator" IS '创建者ID'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."create_time" IS '创建时间'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."last_modifier" IS '最后修者ID'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."last_modified_time" IS '最后修改时间'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."version" IS '乐观锁'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."deleted" IS '删除标志'; -COMMENT ON COLUMN "public"."pay_alloc_transaction"."app_id" IS '应用号'; -COMMENT ON TABLE "public"."pay_alloc_transaction" IS '分账订单'; +COMMENT ON COLUMN "public"."pay_alloc_order"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_alloc_order"."alloc_no" IS '分账单号'; +COMMENT ON COLUMN "public"."pay_alloc_order"."biz_alloc_no" IS '商户分账单号'; +COMMENT ON COLUMN "public"."pay_alloc_order"."out_alloc_no" IS '通道分账号'; +COMMENT ON COLUMN "public"."pay_alloc_order"."order_id" IS '支付订单ID'; +COMMENT ON COLUMN "public"."pay_alloc_order"."order_no" IS '支付订单号'; +COMMENT ON COLUMN "public"."pay_alloc_order"."biz_order_no" IS '商户支付订单号'; +COMMENT ON COLUMN "public"."pay_alloc_order"."out_order_no" IS '通道支付订单号'; +COMMENT ON COLUMN "public"."pay_alloc_order"."title" IS '支付标题'; +COMMENT ON COLUMN "public"."pay_alloc_order"."channel" IS '所属通道'; +COMMENT ON COLUMN "public"."pay_alloc_order"."amount" IS '总分账金额'; +COMMENT ON COLUMN "public"."pay_alloc_order"."description" IS '分账描述'; +COMMENT ON COLUMN "public"."pay_alloc_order"."status" IS '状态'; +COMMENT ON COLUMN "public"."pay_alloc_order"."result" IS '处理结果'; +COMMENT ON COLUMN "public"."pay_alloc_order"."finish_time" IS '分账完成时间'; +COMMENT ON COLUMN "public"."pay_alloc_order"."notify_url" IS '异步通知地址'; +COMMENT ON COLUMN "public"."pay_alloc_order"."attach" IS '商户扩展参数'; +COMMENT ON COLUMN "public"."pay_alloc_order"."req_time" IS '请求时间,传输时间戳'; +COMMENT ON COLUMN "public"."pay_alloc_order"."client_ip" IS '支付终端ip'; +COMMENT ON COLUMN "public"."pay_alloc_order"."error_code" IS '错误码'; +COMMENT ON COLUMN "public"."pay_alloc_order"."error_msg" IS '错误信息'; +COMMENT ON COLUMN "public"."pay_alloc_order"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_alloc_order"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_alloc_order"."last_modifier" IS '最后修者ID'; +COMMENT ON COLUMN "public"."pay_alloc_order"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_alloc_order"."version" IS '乐观锁'; +COMMENT ON COLUMN "public"."pay_alloc_order"."deleted" IS '删除标志'; +COMMENT ON COLUMN "public"."pay_alloc_order"."app_id" IS '应用号'; +COMMENT ON TABLE "public"."pay_alloc_order" IS '分账订单'; -- ---------------------------- --- Records of pay_alloc_transaction +-- Records of pay_alloc_order +-- ---------------------------- + +-- ---------------------------- +-- Table structure for pay_alloc_receiver +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_alloc_receiver"; +CREATE TABLE "public"."pay_alloc_receiver" ( + "id" int8 NOT NULL, + "receiver_no" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "channel" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, + "receiver_type" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, + "receiver_account" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "receiver_name" varchar(100) COLLATE "pg_catalog"."default", + "relation_type" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, + "relation_name" varchar(50) COLLATE "pg_catalog"."default", + "creator" int8, + "create_time" timestamp(6), + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL, + "app_id" varchar(32) COLLATE "pg_catalog"."default", + "deleted" bool NOT NULL, + "name" varchar(50) COLLATE "pg_catalog"."default" +) +; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."receiver_no" IS '分账接收方编号'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."channel" IS '所属通道'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."receiver_type" IS '分账接收方类型'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."receiver_account" IS '接收方账号'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."receiver_name" IS '接收方姓名'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."relation_type" IS '分账关系类型'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."relation_name" IS '关系名称'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."last_modifier" IS '最后修改ID'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."version" IS '版本号'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."app_id" IS '应用号'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."deleted" IS '删除标志'; +COMMENT ON COLUMN "public"."pay_alloc_receiver"."name" IS '名称'; +COMMENT ON TABLE "public"."pay_alloc_receiver" IS '分账接收方'; + +-- ---------------------------- +-- Records of pay_alloc_receiver -- ---------------------------- -- ---------------------------- @@ -1526,8 +1583,9 @@ COMMENT ON TABLE "public"."pay_merchant_notify_const" IS '商户订阅通知类 -- Records of pay_merchant_notify_const -- ---------------------------- INSERT INTO "public"."pay_merchant_notify_const" VALUES (10000, 'pay', '支付订单变动通知', '支付订单变动通知', 't'); -INSERT INTO "public"."pay_merchant_notify_const" VALUES (20000, 'refund', '退款订单变动通知', '退款订单变动通知', 't'); INSERT INTO "public"."pay_merchant_notify_const" VALUES (30000, 'transfer', '转账订单变动通知', '转账订单变动通知', 't'); +INSERT INTO "public"."pay_merchant_notify_const" VALUES (40000, 'allocation', '分账订单变动通知', '分账订单变动通知', 't'); +INSERT INTO "public"."pay_merchant_notify_const" VALUES (20000, 'refund', '退款订单变动通知', '退款订单变动通知', 't'); -- ---------------------------- -- Table structure for pay_merchant_notify_record @@ -1750,7 +1808,7 @@ COMMENT ON TABLE "public"."pay_platform_config" IS '管理平台配置'; -- ---------------------------- -- Records of pay_platform_config -- ---------------------------- -INSERT INTO "public"."pay_platform_config" VALUES (1, 1, '2024-09-20 10:54:44', 1811365615815487488, '2024-10-08 17:24:12.679758', 13, 'f', 'https://pay.daxpay.com', 'https://pay.daxpay.com/h5', 'http://pay.daxpay.com'); +INSERT INTO "public"."pay_platform_config" VALUES (1, 1, '2024-09-20 10:54:44', 1811365615815487488, '2024-12-10 19:05:26.524338', 16, 'f', 'https://pay1.bootx.cn/server', 'https://pay1.bootx.cn/h5', 'https://pay1.bootx.cn/web'); -- ---------------------------- -- Table structure for pay_reconcile_discrepancy @@ -2304,138 +2362,6 @@ COMMENT ON TABLE "public"."starter_file_upload_info" IS '文件记录表'; -- ---------------------------- -- Records of starter_file_upload_info -- ---------------------------- -INSERT INTO "public"."starter_file_upload_info" VALUES (1821097013954715648, '/file/66b32c610d41ab408c70e774.png', 216374, '66b32c610d41ab408c70e774.png', '微信截图_20240514205633.png', '/file/', '', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-07 08:12:17.079'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822969544408014848, 'file/66b9fc4fa1fa0bba28d38189.png', 321611, '66b9fc4fa1fa0bba28d38189.png', '微信截图_20240514202144.png', 'file/', '', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:13:03.035'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822969908121280512, 'file/aaa/66b9fca5a1fa0bba28d3818a.png', 321611, '66b9fca5a1fa0bba28d3818a.png', '微信截图_20240514202144.png', 'file/', 'aaa/', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:14:29.892'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822971444570333184, 'file/2024/08/1266b9fe14a1fa0bba28d3818b.png', 321611, '66b9fe14a1fa0bba28d3818b.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:36.211'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822971456683483136, 'file/2024/08/1266b9fe17a1fa0bba28d3818c.png', 321611, '66b9fe17a1fa0bba28d3818c.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:39.098'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822971459174899712, 'file/2024/08/1266b9fe17a1fa0bba28d3818d.png', 321611, '66b9fe17a1fa0bba28d3818d.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:39.693'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822971462438068224, 'file/2024/08/1266b9fe18a1fa0bba28d3818e.png', 321611, '66b9fe18a1fa0bba28d3818e.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:40.471'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822971464799461376, 'file/2024/08/1266b9fe19a1fa0bba28d3818f.png', 321611, '66b9fe19a1fa0bba28d3818f.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:41.034'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822971465835454464, 'file/2024/08/1266b9fe19a1fa0bba28d38190.png', 321611, '66b9fe19a1fa0bba28d38190.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:41.28'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822971466686898176, 'file/2024/08/1266b9fe19a1fa0bba28d38191.png', 321611, '66b9fe19a1fa0bba28d38191.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:41.484'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822971467467038720, 'file/2024/08/1266b9fe19a1fa0bba28d38192.png', 321611, '66b9fe19a1fa0bba28d38192.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:20:41.671'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822971667761831936, 'file/2024/08/1266b9fe49a1fa0bba28d38193.png', 321611, '66b9fe49a1fa0bba28d38193.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:21:29.424'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822971796644405248, 'file/2024/08/1266b9fe68a1fa0bba28d38194.png', 321611, '66b9fe68a1fa0bba28d38194.png', '微信截图_20240514202144.png', 'file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:22:00.149'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1822976328996659200, '/file/2024/08/1266ba02a0a1faf26c0c033991.png', 216374, '66ba02a0a1faf26c0c033991.png', '微信截图_20240514205633.png', '/file/', '2024/08/12', 'png', 'image/png', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-12 12:40:00.707'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1823203227169546240, '/file//2024/08/13/66bad5f061236ef74fc35d2f.png', 822076, '66bad5f061236ef74fc35d2f.png', '微信截图_20240514202014.png', '/file/', '/2024/08/13/', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-13 03:41:36.828'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1823204644156456960, '/file/2024/08/13/66bad7426123c55acd645891.png', 209410, '66bad7426123c55acd645891.png', 'QQ图片20240531181517.png', '/file/', '2024/08/13/', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-13 03:47:14.767'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1823210440613294080, '/file/2024/08/13/66badca8612381f3dab8b659.sql', 484222, '66badca8612381f3dab8b659.sql', 'dax-pay.sql', '/file/', '2024/08/13/', 'sql', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-13 04:10:16.775'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1824779093602971648, '/file/2024/08/17/66c09194fb5fa7f335dbd1e7.jpg', 107464, '66c09194fb5fa7f335dbd1e7.jpg', '微信图片_20220522132928.jpg', '/file/', '2024/08/17/', 'jpg', 'image/jpeg', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-17 12:03:32.838'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825718211879563264, '/file/66c3fc341f35f424dba37510.csv', 775, '66c3fc341f35f424dba37510.csv', '交易对账单-支付宝-20240818.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 02:15:16.078'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825718295480430592, '/file/66c3fc481f35f424dba37511.csv', 775, '66c3fc481f35f424dba37511.csv', '交易对账单-支付宝-20240818.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 02:15:36.48'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825720111223992320, '/file/66c3fdf91f35f424dba37512.csv', 775, '66c3fdf91f35f424dba37512.csv', '交易对账单-支付宝-20240818.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 02:22:49.392'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825753217356218368, '/file/2024/08/20/66c41cce1f352f391eadba3e.xlsx', 9614, '66c41cce1f352f391eadba3e.xlsx', '消息订阅.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 04:34:22.055'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825753283894657024, '/file/2024/08/20/66c41cde1f352f391eadba3f.xlsx', 9614, '66c41cde1f352f391eadba3f.xlsx', '消息订阅.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 04:34:38.355'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825793692494667776, '/file/2024/08/20/66c442801f35438ca96741b3.xlsx', 9627, '66c442801f35438ca96741b3.xlsx', '消息订阅.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 07:15:12.039'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825795353548103680, '/file/2024/08/20/66c4440c1f35438ca96741b4.png', 56704, '66c4440c1f35438ca96741b4.png', 'DD94AFCB-E1EA-403a-A5BB-606CF977034C.png', '/file/', '2024/08/20/', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 07:21:48.536'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825795565142351872, '/file/2024/08/20/66c4443e1f35438ca96741b5.png', 56704, '66c4443e1f35438ca96741b5.png', 'DD94AFCB-E1EA-403a-A5BB-606CF977034C.png', '/file/', '2024/08/20/', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 07:22:38.992'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825795861373460480, '/file/2024/08/20/66c444851f35438ca96741b6.png', 56704, '66c444851f35438ca96741b6.png', 'DD94AFCB-E1EA-403a-A5BB-606CF977034C.png', '/file/', '2024/08/20/', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 07:23:49.53'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825796076641959936, '/file/2024/08/20/66c444b21f35453b8057d0fb.png', 56704, '66c444b21f35453b8057d0fb.png', 'DD94AFCB-E1EA-403a-A5BB-606CF977034C.png', '/file/', '2024/08/20/', 'png', 'image/png', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 07:24:18.784'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825799359162990592, '/file/2024/08/20/66c447c71f35453b8057d0fc.xlsx', 9614, '66c447c71f35453b8057d0fc.xlsx', '消息订阅.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 15:37:43.593469'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825799570165841920, '/file/66c447f91f35453b8057d0fd.csv', 775, '66c447f91f35453b8057d0fd.csv', '交易对账单-支付宝-20240816.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 15:38:33.899827'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825799577078054912, '/file/2024/08/20/66c447fb1f35453b8057d0fe.xlsx', 9614, '66c447fb1f35453b8057d0fe.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 15:38:35.546999'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825799590139117568, '/file/66c447fe1f35453b8057d0ff.csv', 1189, '66c447fe1f35453b8057d0ff.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 15:38:38.662392'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825799613258121216, '/file/2024/08/20/66c448041f35453b8057d100.xlsx', 9614, '66c448041f35453b8057d100.xlsx', '消息订阅.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 15:38:44.173717'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825808183974379520, '/file/2024/08/20/66c44ffc1f35fa1c978ea54c.xlsx', 9613, '66c44ffc1f35fa1c978ea54c.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 16:12:47.587103'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825808183991156736, '/file/2024/08/20/66c44ffc1f35fa1c978ea54d.xlsx', 9612, '66c44ffc1f35fa1c978ea54d.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 16:12:47.588101'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825808257634746368, '/file/2024/08/20/66c450111f35fa1c978ea54e.xlsx', 9613, '66c450111f35fa1c978ea54e.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 16:13:05.154672'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826528037253439488, '/file/66c6ee69c76387d97684a0d3.csv', 4873, '66c6ee69c76387d97684a0d3.csv', '交易对账单-微信-20240821.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 15:53:13.985807'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825808277838708736, '/file/2024/08/20/66c450151f35fa1c978ea54f.xlsx', 9613, '66c450151f35fa1c978ea54f.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 16:13:09.971531'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825813275939119104, '/file/66c454bd1f35808c73fcb4f9.csv', 775, '66c454bd1f35808c73fcb4f9.csv', '交易对账单-支付宝-20240816.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 16:33:01.603346'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825816007903223808, '/file/66c457481f35808c73fcb4fa.csv', 1189, '66c457481f35808c73fcb4fa.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 16:43:52.960613'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825820562539880448, '/file/66c45b861f35808c73fcb4fb.csv', 1189, '66c45b861f35808c73fcb4fb.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:01:58.872311'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825820967122440192, '/file/66c45be61f3570ed83b5deda.csv', 1189, '66c45be61f3570ed83b5deda.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:03:35.323328'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825821293732888576, '/file/66c45c341f35156de355269c.csv', 1189, '66c45c341f35156de355269c.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:04:53.19356'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825821723045068800, '/file/66c45c9b1f35156de355269d.csv', 1189, '66c45c9b1f35156de355269d.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:06:35.557476'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825821752279367680, '/file/2024/08/20/66c45ca21f35156de355269e.xlsx', 9786, '66c45ca21f35156de355269e.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:06:42.527505'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825830633537777664, '/file/2024/08/20/66c464e71f35b610eeff97b1.xlsx', 9795, '66c464e71f35b610eeff97b1.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:41:59.981496'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825831496863911936, '/file/66c465b51f3576080962d6c3.csv', 1189, '66c465b51f3576080962d6c3.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:45:25.809379'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825834316396695552, '/file/2024/08/20/66c468551f3576080962d6c4.xlsx', 9796, '66c468551f3576080962d6c4.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:56:38.046761'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825834800268382208, '/file/2024/08/20/66c468c91f3576080962d6c5.xlsx', 9796, '66c468c91f3576080962d6c5.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 17:58:33.411027'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825835210064465920, '/file/2024/08/20/66c4692a1f3576080962d6c6.xlsx', 9795, '66c4692a1f3576080962d6c6.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:00:11.113848'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825843546990252032, '/file/66c470ee1f3576080962d6c7.csv', 1189, '66c470ee1f3576080962d6c7.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:33:18.791522'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825844129692323840, '/file/2024/08/20/66c471791f3576080962d6c8.xlsx', 9811, '66c471791f3576080962d6c8.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:35:37.719031'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825844629024182272, '/file/66c471f01f35aed981cc6a59.csv', 1189, '66c471f01f35aed981cc6a59.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:37:36.758077'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825844842937880576, '/file/2024/08/20/66c472231f35aed981cc6a5a.xlsx', 9819, '66c472231f35aed981cc6a5a.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:38:27.770051'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825847210479955968, '/file/66c474571f357b60c1a2b78a.csv', 1189, '66c474571f357b60c1a2b78a.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:47:52.223284'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1825847359704903680, '/file/2024/08/20/66c4747b1f357b60c1a2b78b.xlsx', 9840, '66c4747b1f357b60c1a2b78b.xlsx', '测试对账.xlsx', '/file/', '2024/08/20/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-20 18:48:27.813444'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826097618230136832, '/file/66c55d8d0d41b292dd16e301.csv', 1189, '66c55d8d0d41b292dd16e301.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 11:22:54.093713'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826097630125182976, '/file/2024/08/21/66c55d900d41b292dd16e302.xlsx', 9823, '66c55d900d41b292dd16e302.xlsx', '测试对账.xlsx', '/file/', '2024/08/21/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 11:22:56.932144'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826104071162494976, '/file/66c563900d413c77079c09f3.csv', 1189, '66c563900d413c77079c09f3.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 11:48:32.583252'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826104244588576768, '/file/2024/08/21/66c563b90d413c77079c09f4.xlsx', 9823, '66c563b90d413c77079c09f4.xlsx', '外部交易明细.xlsx', '/file/', '2024/08/21/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 11:49:13.942925'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826108050550398976, '/file/66c567440d41d39e503adbf7.csv', 1189, '66c567440d41d39e503adbf7.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 12:04:21.352012'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826108060998410240, '/file/2024/08/21/66c567470d41d39e503adbf8.xlsx', 9823, '66c567470d41d39e503adbf8.xlsx', '外部交易明细.xlsx', '/file/', '2024/08/21/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 12:04:23.846222'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826144377513820160, '/file/66c589190d41534805a9a0c5.csv', 1189, '66c589190d41534805a9a0c5.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 14:28:42.375373'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826144389043961856, '/file/2024/08/21/66c5891d0d41534805a9a0c6.xlsx', 9819, '66c5891d0d41534805a9a0c6.xlsx', '测试对账.xlsx', '/file/', '2024/08/21/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-21 14:28:45.126552'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826454887404781568, '/file/66c6aa49c763a99769caae79.xlsx', 2564, '66c6aa49c763a99769caae79.xlsx', '交易对账单-微信-20240820.xlsx', '/file/', '', 'xlsx', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:02:33.686962'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826454907948482560, '/file/2024/08/22/66c6aa4ec763a99769caae7a.xlsx', 9620, '66c6aa4ec763a99769caae7a.xlsx', '测试对账.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:02:38.603264'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826455432215511040, '/file/66c6aacbc763a99769caae7b.xlsx', 2564, '66c6aacbc763a99769caae7b.xlsx', '交易对账单-微信-20240820.xlsx', '/file/', '', 'xlsx', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:04:43.594394'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826455601317265408, '/file/66c6aaf3c763a99769caae7c.xlsx', 4873, '66c6aaf3c763a99769caae7c.xlsx', '交易对账单-微信-20240821.xlsx', '/file/', '', 'xlsx', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:05:23.911901'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826455623035371520, '/file/2024/08/22/66c6aaf8c763a99769caae7d.xlsx', 9619, '66c6aaf8c763a99769caae7d.xlsx', '测试对账.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:05:29.093238'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826455963705131008, '/file/66c6ab4ac763a99769caae7e.xlsx', 2564, '66c6ab4ac763a99769caae7e.xlsx', '交易对账单-微信-20240820.xlsx', '/file/', '', 'xlsx', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:06:50.312192'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826456479956758528, '/file/66c6abc4c7633375f8725b9b.xlsx', 4873, '66c6abc4c7633375f8725b9b.xlsx', '交易对账单-微信-20240821.xlsx', '/file/', '', 'xlsx', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:08:53.391935'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826456537934622720, '/file/2024/08/22/66c6abd3c7633375f8725b9c.xlsx', 10486, '66c6abd3c7633375f8725b9c.xlsx', '测试对账.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 11:09:07.222795'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826528050088009728, '/file/2024/08/22/66c6ee6dc76387d97684a0d4.xlsx', 10587, '66c6ee6dc76387d97684a0d4.xlsx', '订阅消息.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 15:53:17.048532'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826532233684037632, '/file/66c6f252c76353f70eacf1de.csv', 4873, '66c6f252c76353f70eacf1de.csv', '交易对账单-微信-20240821.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 16:09:54.492768'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826532244555673600, '/file/2024/08/22/66c6f254c76353f70eacf1df.xlsx', 10587, '66c6f254c76353f70eacf1df.xlsx', '外部交易明细.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 16:09:57.086142'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826534025192910848, '/file/66c6f3fdc76353f70eacf1e0.csv', 4873, '66c6f3fdc76353f70eacf1e0.csv', '交易对账单-微信-20240821.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 16:17:01.624309'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826534549581574144, '/file/66c6f47ac76353f70eacf1e1.csv', 4873, '66c6f47ac76353f70eacf1e1.csv', '交易对账单-微信-20240821.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 16:19:06.648517'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826535790386720768, '/file/66c6f5a2c76353f70eacf1e2.csv', 4873, '66c6f5a2c76353f70eacf1e2.csv', '交易对账单-微信-20240821.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 16:24:02.478931'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826535798624333824, '/file/2024/08/22/66c6f5a4c76353f70eacf1e3.xlsx', 10599, '66c6f5a4c76353f70eacf1e3.xlsx', '测试对账.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 16:24:04.442922'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826547489412079616, '/file/66c70087c763e807cbf7de4c.csv', 641, '66c70087c763e807cbf7de4c.csv', '交易对账单-支付宝-20240821.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 17:10:31.742535'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826547501512646656, '/file/2024/08/22/66c7008ac763e807cbf7de4d.xlsx', 9769, '66c7008ac763e807cbf7de4d.xlsx', '外部交易明细.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 17:10:34.629401'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826548693462540288, '/file/66c701a6c763e807cbf7de4e.csv', 4873, '66c701a6c763e807cbf7de4e.csv', '交易对账单-微信-20240821.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 17:15:18.81236'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826548700915818496, '/file/2024/08/22/66c701a8c763e807cbf7de4f.xlsx', 10859, '66c701a8c763e807cbf7de4f.xlsx', '测试对账.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 17:15:20.589063'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826550241479413760, '/file/66c70317c763d39942d0f55c.csv', 1189, '66c70317c763d39942d0f55c.csv', '交易对账单-支付宝-20240819.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 17:21:27.886652'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1826550253630312448, '/file/2024/08/22/66c7031ac763d39942d0f55d.xlsx', 9951, '66c7031ac763d39942d0f55d.xlsx', '测试对账.xlsx', '/file/', '2024/08/22/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-22 17:21:30.785225'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1829092824449552384, '/file/66d0430e2725ea0e6dd63e99.csv', 975, '66d0430e2725ea0e6dd63e99.csv', '交易对账单-支付宝-20240825.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-29 17:44:46.899974'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1829092838819237888, '/file/2024/08/29/66d043122725ea0e6dd63e9a.xlsx', 9879, '66d043122725ea0e6dd63e9a.xlsx', '分账单.xlsx', '/file/', '2024/08/29/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-29 17:44:50.332586'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1829376511166722048, '/file/66d14b42e537e3f57615df0e.csv', 773, '66d14b42e537e3f57615df0e.csv', '交易对账单-支付宝-20240829.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-08-30 12:32:03.082505'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830432967571877888, '/file/66d523299b65f788a54f4345.csv', 588, '66d523299b65f788a54f4345.csv', '交易对账单-支付宝-20240901.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:01.924318'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830432971883622400, '/file/2024/09/02/66d5232a9b65f788a54f4346.xlsx', 9725, '66d5232a9b65f788a54f4346.xlsx', '【2024-09-01】 - 测试应用2 - 支付宝(直连商户).xlsx', '/file/', '2024/09/02/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:02.953727'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830432978368016384, '/file/66d5232c9b65f788a54f4347.csv', 1152, '66d5232c9b65f788a54f4347.csv', '交易对账单-微信-20240901.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:04.500493'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830432979357872128, '/file/2024/09/02/66d5232c9b65f788a54f4348.xlsx', 9964, '66d5232c9b65f788a54f4348.xlsx', '【2024-09-01】 - 正式测试环境 - 微信支付(直连商户).xlsx', '/file/', '2024/09/02/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:04.736091'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830432980876210176, '/file/66d5232d9b65f788a54f4349.csv', 588, '66d5232d9b65f788a54f4349.csv', '交易对账单-支付宝-20240901.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:05.097887'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830432981224337408, '/file/2024/09/02/66d5232d9b65f788a54f434a.xlsx', 9725, '66d5232d9b65f788a54f434a.xlsx', '【2024-09-01】 - 正式测试环境 - 支付宝(直连商户).xlsx', '/file/', '2024/09/02/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:05.180424'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830432989017354240, '/file/66d5232f9b65f788a54f434b.csv', 773, '66d5232f9b65f788a54f434b.csv', '交易对账单-支付宝-20240901.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:07.0389'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830432989638111232, '/file/2024/09/02/66d5232f9b65f788a54f434c.xlsx', 9726, '66d5232f9b65f788a54f434c.xlsx', '【2024-09-01】 - 秘钥测试账户(支付宝沙箱) - 支付宝(直连商户).xlsx', '/file/', '2024/09/02/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-02 10:30:07.187076'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830795357480173568, '/file/66d674a91f358abb94988653.csv', 775, '66d674a91f358abb94988653.csv', '交易对账单-支付宝-20240902.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:02.410984'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830795361926135808, '/file/2024/09/03/66d674ab1f358abb94988654.xlsx', 10927, '66d674ab1f358abb94988654.xlsx', '【2024-09-02】 - 测试应用2 - 支付宝(直连商户).xlsx', '/file/', '2024/09/03/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:03.47317'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830795369018703872, '/file/66d674ad1f358abb94988655.csv', 1148, '66d674ad1f358abb94988655.csv', '交易对账单-微信-20240902.csv', '/file/', '', 'csv', 'text/plain', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:05.163827'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830795369673015296, '/file/2024/09/03/66d674ad1f358abb94988656.xlsx', 9965, '66d674ad1f358abb94988656.xlsx', '【2024-09-02】 - 正式测试环境 - 微信支付(直连商户).xlsx', '/file/', '2024/09/03/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:05.320186'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830795372088934400, '/file/66d674ad1f358abb94988657.csv', 775, '66d674ad1f358abb94988657.csv', '交易对账单-支付宝-20240902.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:05.896053'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830795373271728128, '/file/2024/09/03/66d674ae1f358abb94988658.xlsx', 10926, '66d674ae1f358abb94988658.xlsx', '【2024-09-02】 - 正式测试环境 - 支付宝(直连商户).xlsx', '/file/', '2024/09/03/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:06.178188'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830795379219251200, '/file/66d674af1f358abb94988659.csv', 773, '66d674af1f358abb94988659.csv', '交易对账单-支付宝-20240902.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:07.596269'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1830795379978420224, '/file/2024/09/03/66d674af1f358abb9498865a.xlsx', 10927, '66d674af1f358abb9498865a.xlsx', '【2024-09-02】 - 秘钥测试账户(支付宝沙箱) - 支付宝(直连商户).xlsx', '/file/', '2024/09/03/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-03 10:30:07.777158'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1831233989211004928, '/file/66d80d2b0d4141300044fc44.csv', 775, '66d80d2b0d4141300044fc44.csv', '交易对账单-支付宝-20240903.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 15:33:00.365017'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1831233993724076032, '/file/2024/09/04/66d80d2d0d4141300044fc45.xlsx', 9726, '66d80d2d0d4141300044fc45.xlsx', '【2024-09-03】-M1723635576766-M7934041241299655-支付宝(直连商户).xlsx', '/file/', '2024/09/04/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 15:33:01.443352'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1831234003706519552, '/file/66d80d2f0d4141300044fc46.csv', 775, '66d80d2f0d4141300044fc46.csv', '交易对账单-支付宝-20240903.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 15:33:03.822384'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1831234004142727168, '/file/2024/09/04/66d80d2f0d4141300044fc47.xlsx', 9726, '66d80d2f0d4141300044fc47.xlsx', '【2024-09-03】-M1723635576766-M8207639754663343-支付宝(直连商户).xlsx', '/file/', '2024/09/04/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 15:33:03.926613'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1831234013055623168, '/file/66d80d320d4141300044fc48.csv', 773, '66d80d320d4141300044fc48.csv', '交易对账单-支付宝-20240903.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 15:33:06.051702'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1831234013588299776, '/file/2024/09/04/66d80d320d4141300044fc49.xlsx', 9726, '66d80d320d4141300044fc49.xlsx', '【2024-09-03】-M1723635576766-M8088873888246277-支付宝(直连商户).xlsx', '/file/', '2024/09/04/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 15:33:06.179445'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1831245328214020096, '/file/66d817bb0d4118c2cf4a8e72.csv', 773, '66d817bb0d4118c2cf4a8e72.csv', '交易对账单-支付宝-20240903.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 16:18:03.788286'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1831245352838778880, '/file/2024/09/04/66d817c10d4118c2cf4a8e73.xlsx', 9726, '66d817c10d4118c2cf4a8e73.xlsx', '【2024-09-03】-M1723635576766-M7189826551600486-支付宝(直连商户).xlsx', '/file/', '2024/09/04/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-04 16:18:09.666814'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1838767893975228416, '/file/66f375aac76333160bc4e4ca.csv', 773, '66f375aac76333160bc4e4ca.csv', '交易对账单-支付宝-20240924.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:03.234173'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1838767897783656448, '/file/2024/09/25/66f375acc76333160bc4e4cb.xlsx', 9725, '66f375acc76333160bc4e4cb.xlsx', '【2024-09-24】M1723635576766-M7189826551600486-支付宝(直连商户).xlsx', '/file/', '2024/09/25/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:04.143105'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1838767901315260416, '/file/66f375acc76333160bc4e4cc.csv', 588, '66f375acc76333160bc4e4cc.csv', '交易对账单-支付宝-20240924.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:04.986'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1838767901684359168, '/file/2024/09/25/66f375adc76333160bc4e4cd.xlsx', 9725, '66f375adc76333160bc4e4cd.xlsx', '【2024-09-24】M1723635576766-M7934041241299655-支付宝(直连商户).xlsx', '/file/', '2024/09/25/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:05.074329'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1838767906600083456, '/file/66f375aec76333160bc4e4ce.csv', 588, '66f375aec76333160bc4e4ce.csv', '交易对账单-支付宝-20240924.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:06.246034'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1838767907405389824, '/file/2024/09/25/66f375aec76333160bc4e4cf.xlsx', 9726, '66f375aec76333160bc4e4cf.xlsx', '【2024-09-24】M1723635576766-M8207639754663343-支付宝(直连商户).xlsx', '/file/', '2024/09/25/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:06.438419'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1838767913310969856, '/file/66f375afc76333160bc4e4d0.csv', 773, '66f375afc76333160bc4e4d0.csv', '交易对账单-支付宝-20240924.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:07.845724'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1838767913768148992, '/file/2024/09/25/66f375afc76333160bc4e4d1.xlsx', 9726, '66f375afc76333160bc4e4d1.xlsx', '【2024-09-24】M1723635576766-M8088873888246277-支付宝(直连商户).xlsx', '/file/', '2024/09/25/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-25 10:30:07.955428'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1839130282750988288, '/file/66f4c72ba2e5db5ec8f6d8c4.csv', 773, '66f4c72ba2e5db5ec8f6d8c4.csv', '交易对账单-支付宝-20240925.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:03.451004'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1839130286337118208, '/file/2024/09/26/66f4c72ca2e5db5ec8f6d8c5.xlsx', 9726, '66f4c72ca2e5db5ec8f6d8c5.xlsx', '【2024-09-25】M1723635576766-M7189826551600486-支付宝(直连商户).xlsx', '/file/', '2024/09/26/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:04.308822'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1839130289847750656, '/file/66f4c72da2e5db5ec8f6d8c6.csv', 588, '66f4c72da2e5db5ec8f6d8c6.csv', '交易对账单-支付宝-20240925.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:05.144483'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1839130290191683584, '/file/2024/09/26/66f4c72da2e5db5ec8f6d8c7.xlsx', 9725, '66f4c72da2e5db5ec8f6d8c7.xlsx', '【2024-09-25】M1723635576766-M7934041241299655-支付宝(直连商户).xlsx', '/file/', '2024/09/26/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:05.22687'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1839130295765913600, '/file/66f4c72ea2e5db5ec8f6d8c8.csv', 588, '66f4c72ea2e5db5ec8f6d8c8.csv', '交易对账单-支付宝-20240925.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:06.55616'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1839130296114040832, '/file/2024/09/26/66f4c72ea2e5db5ec8f6d8c9.xlsx', 9725, '66f4c72ea2e5db5ec8f6d8c9.xlsx', '【2024-09-25】M1723635576766-M8207639754663343-支付宝(直连商户).xlsx', '/file/', '2024/09/26/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:06.639039'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1839130304922079232, '/file/66f4c730a2e5db5ec8f6d8ca.csv', 773, '66f4c730a2e5db5ec8f6d8ca.csv', '交易对账单-支付宝-20240925.csv', '/file/', '', 'csv', 'application/octet-stream', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:08.739167'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1839130305433784320, '/file/2024/09/26/66f4c730a2e5db5ec8f6d8cb.xlsx', 9725, '66f4c730a2e5db5ec8f6d8cb.xlsx', '【2024-09-25】M1723635576766-M8088873888246277-支付宝(直连商户).xlsx', '/file/', '2024/09/26/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'minio', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-09-26 10:30:08.861025'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1845026949664677888, '/file/670a3ade27257f956fb37432.csv', 1218, '670a3ade27257f956fb37432.csv', '交易对账单-云闪付-20241008.csv', '/file/', '', 'csv', 'text/plain', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-10-12 17:01:18.398618'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1845026982594158592, '/file/2024/10/12/670a3ae627257f956fb37433.xlsx', 9929, '670a3ae627257f956fb37433.xlsx', '订阅通知.xlsx', '/file/', '2024/10/12/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-10-12 17:01:26.251311'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1845027095811006464, '/file/670a3b0127257f956fb37434.csv', 588, '670a3b0127257f956fb37434.csv', '交易对账单-支付宝-20241007.csv', '/file/', '', 'csv', 'application/octet-stream', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-10-12 17:01:53.243283'); -INSERT INTO "public"."starter_file_upload_info" VALUES (1845027103906013184, '/file/2024/10/12/670a3b0327257f956fb37435.xlsx', 9725, '670a3b0327257f956fb37435.xlsx', '订阅通知.xlsx', '/file/', '2024/10/12/', 'xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'local', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-10-12 17:01:55.174477'); -- ---------------------------- -- Primary Key structure for table base_dict @@ -2502,6 +2428,11 @@ ALTER TABLE "public"."iam_user_info" ADD CONSTRAINT "iam_user_info_pkey" PRIMARY -- ---------------------------- ALTER TABLE "public"."iam_user_role" ADD CONSTRAINT "iam_user_role_pkey" PRIMARY KEY ("id"); +-- ---------------------------- +-- Primary Key structure for table pay_alloc_config +-- ---------------------------- +ALTER TABLE "public"."pay_alloc_config" ADD CONSTRAINT "pay_alloc_config_pkey" PRIMARY KEY ("id"); + -- ---------------------------- -- Indexes structure for table pay_alloc_detail -- ---------------------------- @@ -2526,30 +2457,30 @@ ALTER TABLE "public"."pay_alloc_group" ADD CONSTRAINT "pay_allocation_group_pkey ALTER TABLE "public"."pay_alloc_group_receiver" ADD CONSTRAINT "pay_allocation_group_receiver_pkey" PRIMARY KEY ("id"); -- ---------------------------- --- Primary Key structure for table pay_alloc_receiver +-- Indexes structure for table pay_alloc_order -- ---------------------------- -ALTER TABLE "public"."pay_alloc_receiver" ADD CONSTRAINT "pay_alloc_receiver_pkey" PRIMARY KEY ("id"); - --- ---------------------------- --- Indexes structure for table pay_alloc_transaction --- ---------------------------- -CREATE INDEX "alloc_no" ON "public"."pay_alloc_transaction" USING btree ( +CREATE INDEX "alloc_no" ON "public"."pay_alloc_order" USING btree ( "alloc_no" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST ); COMMENT ON INDEX "public"."alloc_no" IS '分账单号索引'; -CREATE INDEX "biz_alloc_no" ON "public"."pay_alloc_transaction" USING btree ( +CREATE INDEX "biz_alloc_no" ON "public"."pay_alloc_order" USING btree ( "biz_alloc_no" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST ); COMMENT ON INDEX "public"."biz_alloc_no" IS '商户分账单号索引'; -CREATE INDEX "order_id" ON "public"."pay_alloc_transaction" USING btree ( +CREATE INDEX "order_id" ON "public"."pay_alloc_order" USING btree ( "order_id" "pg_catalog"."int8_ops" ASC NULLS LAST ); COMMENT ON INDEX "public"."order_id" IS '支付订单ID索引'; -CREATE INDEX "out_alloc_no" ON "public"."pay_alloc_transaction" USING btree ( +CREATE INDEX "out_alloc_no" ON "public"."pay_alloc_order" USING btree ( "out_alloc_no" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST ); COMMENT ON INDEX "public"."out_alloc_no" IS '通道分账号索引'; +-- ---------------------------- +-- Primary Key structure for table pay_alloc_receiver +-- ---------------------------- +ALTER TABLE "public"."pay_alloc_receiver" ADD CONSTRAINT "pay_alloc_receiver_pkey" PRIMARY KEY ("id"); + -- ---------------------------- -- Primary Key structure for table pay_api_const -- ---------------------------- diff --git a/daxpay-single-sdk/pom.xml b/daxpay-single-sdk/pom.xml index 75c547071..e6b90274c 100644 --- a/daxpay-single-sdk/pom.xml +++ b/daxpay-single-sdk/pom.xml @@ -10,7 +10,7 @@ daxpay-single-sdk - daxpay-multi-sdk 是 daxpay单商户版的JavaSDK,用于业务系统快速接入到支付网关中 + daxpay-single-sdk 是 daxpay单商户版的JavaSDK,用于业务系统快速接入到支付网关中 https://github.com/dromara/dax-pay diff --git a/daxpay-single-server/src/main/resources/application-prod.yml b/daxpay-single-server/src/main/resources/application-prod.yml new file mode 100644 index 000000000..53405d7f9 --- /dev/null +++ b/daxpay-single-server/src/main/resources/application-prod.yml @@ -0,0 +1,85 @@ +spring: + datasource: + dynamic: + primary: master + datasource: + master: + # Postgresql连接 + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://postgresql:5432/dax-pay-single?serverTimezone=Asia/Shanghai&autoReconnect=true&reWriteBatchedInserts=true + username: bootx + password: bootx123 + # MySQL连接 + # driver-class-name: com.mysql.cj.jdbc.Driver + # url: jdbc:mysql://mysql:3306/dax-pay-single?serverTimezone=GMT%2B8&characterEncoding=utf8&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + # username: root + # password: bootx123 + hikari: + keepalive-time: 300000 + data: + redis: + host: redis + port: 6379 + database: 5 + password: bootx123 + lettuce: + pool: + max-wait: 1000ms +# 接口文档配置 +knife4j: + # 开启接口文档增强特性 + enable: true + # 是否为生产环境, 为true关闭swagger接口 + production: true +# 基础脚手架配置 +bootx-platform: + starter: + auth: + # 是否启用超级管理员登录 + enable-admin: false + # 用户管理列表中是否显示超级管理员 + admin-in-list: false + ignore-urls: + - '/actuator/**' + - '/token/**' + - '/ws/**' + - '/v3/api-docs/**' + - '/doc.html' + - '/swagger-resources/**' + - '/webjars/**' + - '/storage/**' + - '/web/**' + - '/h5/**' + - '/css/**' + - '/error' + - '/favicon.ico' + audit-log: + ip2region: + # 默认使用索引模式 + search-type: vector_index + # 文件存储地址 + file-path: /data/ip2region/ip2region.xdb +dax-pay: + # 推荐只使用字母和数字, 特殊符号会导致部分通道出问题 + env: DAX + machine-no: 70 +dromara: + # 注意, 不要设置 domain 访问路径, 自行进行拼接访问路径, 来保证可迁移性 + x-file-storage: + default-platform: local + # 使用Nginx映射到存储路径 + # 实际存储地址为 storage-path(存储路径) + base-path(基础路径) + 自动生成的路径(年月日) + 文件名 + local-plus: + - platform: local + enable-storage: true + base-path: /file/ # 基基础存储路径 前缀和结尾都必须为 / + storage-path: /data/files/ # 存储路径, 结尾必须为 / + # 例如 minio地址 http://127.0.0.1:9002 桶名称 daxpay, 拼接后的地址为 http://127.0.0.1:9002/daxpay/ + minio: + - platform: minio + enable-storage: true + access-key: yDAArSoyQAligC2IGf7C + secret-key: vDgpt5R4kR2UCapMzx32Rb6qZegok21dRsU6XJ1j + end-point: http://127.0.0.1:9002 # minio访问地址 + bucket-name: daxpay # 存储桶名称 + base-path: /file/ # 基础存储路径 前缀和结尾都必须为 / From 040540ba9992eab541757d3e90ce28b2036926c5 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Wed, 18 Dec 2024 16:11:39 +0800 Subject: [PATCH 33/54] =?UTF-8?q?build=20sql=E8=84=9A=E6=9C=AC=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=92=8C=E6=B7=BB=E5=8A=A0=E7=94=9F=E4=BA=A7=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config/mysql/dax-pay-single.sql | 2 +- _config/postgresql/dax-pay-single.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_config/mysql/dax-pay-single.sql b/_config/mysql/dax-pay-single.sql index cfb61648b..d611d3672 100644 --- a/_config/mysql/dax-pay-single.sql +++ b/_config/mysql/dax-pay-single.sql @@ -1265,7 +1265,7 @@ CREATE TABLE `pay_platform_config` ( -- ---------------------------- -- Records of pay_platform_config -- ---------------------------- -INSERT INTO `pay_platform_config` VALUES (1, 1, '2024-09-20 10:54:44', 1811365615815487488, '2024-12-04 09:27:23', 14, 0, 'https://pay1.bootx.cn/server', 'https://pay1.bootx.cn/h5', 'http://pay1.bootx.cn/web'); +INSERT INTO `pay_platform_config` VALUES (1, 1, '2024-09-20 10:54:44', 1811365615815487488, '2024-12-04 09:27:23', 14, 0, 'https://127.0.0.1/server', 'https://127.0.0.1/h5', 'http://127.0.0.1/web'); -- ---------------------------- -- Table structure for pay_reconcile_discrepancy diff --git a/_config/postgresql/dax-pay-single.sql b/_config/postgresql/dax-pay-single.sql index a58f8130d..7f3776965 100644 --- a/_config/postgresql/dax-pay-single.sql +++ b/_config/postgresql/dax-pay-single.sql @@ -1808,7 +1808,7 @@ COMMENT ON TABLE "public"."pay_platform_config" IS '管理平台配置'; -- ---------------------------- -- Records of pay_platform_config -- ---------------------------- -INSERT INTO "public"."pay_platform_config" VALUES (1, 1, '2024-09-20 10:54:44', 1811365615815487488, '2024-12-10 19:05:26.524338', 16, 'f', 'https://pay1.bootx.cn/server', 'https://pay1.bootx.cn/h5', 'https://pay1.bootx.cn/web'); +INSERT INTO "public"."pay_platform_config" VALUES (1, 1, '2024-09-20 10:54:44', 1811365615815487488, '2024-12-10 19:05:26.524338', 16, 'f', 'https://127.0.0.1/server', 'https://127.0.0.1/h5', 'https://127.0.0.1/web'); -- ---------------------------- -- Table structure for pay_reconcile_discrepancy From fbd045cd217eb8852fbfe9774e2639a9f46fcedc Mon Sep 17 00:00:00 2001 From: DaxPay Date: Thu, 19 Dec 2024 11:05:13 +0800 Subject: [PATCH 34/54] =?UTF-8?q?fix:=20=E5=BE=AE=E4=BF=A1V2=E9=80=80?= =?UTF-8?q?=E6=AC=BE=E5=9B=9E=E8=B0=83=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../callback/WechatRefundCallbackService.java | 6 +++++- .../refund/WechatRefundSyncV2Service.java | 19 +++++++++++-------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java index 0de569328..c62385ba4 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java @@ -1,5 +1,7 @@ package org.dromara.daxpay.channel.wechat.service.callback; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; @@ -28,6 +30,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.Map; import java.util.Objects; @@ -143,7 +146,8 @@ public class WechatRefundCallbackService { callbackInfo.setAmount(PayUtil.conversionAmount(result.getRefundFee())); String timeEnd = result.getSuccessTime(); if (StrUtil.isNotBlank(timeEnd)){ - callbackInfo.setFinishTime(WechatPayUtil.parseV2(timeEnd)); + LocalDateTime finishTime = LocalDateTimeUtil.parse(timeEnd, DatePattern.NORM_DATETIME_PATTERN); + callbackInfo.setFinishTime(finishTime); } } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatRefundSyncV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatRefundSyncV2Service.java index ba743586b..0711855e2 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatRefundSyncV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatRefundSyncV2Service.java @@ -1,21 +1,23 @@ package org.dromara.daxpay.channel.wechat.service.sync.refund; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.enums.RefundStatusEnum; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; -import org.dromara.daxpay.service.entity.order.refund.RefundOrder; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryRequest; import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.RefundStatusEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.entity.order.refund.RefundOrder; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.Objects; /** @@ -51,8 +53,9 @@ public class WechatRefundSyncV2Service { var record = result.getRefundRecords().getFirst(); // 退款状态 - 成功 if (Objects.equals(RefundStatus.SUCCESS, record.getRefundStatus())){ + LocalDateTime finishTime = LocalDateTimeUtil.parse(record.getRefundSuccessTime(), DatePattern.NORM_DATETIME_PATTERN); syncResult.setRefundStatus(RefundStatusEnum.SUCCESS) - .setFinishTime(WechatPayUtil.parseV2(record.getRefundSuccessTime())); + .setFinishTime(finishTime); } // 退款状态 - 退款关闭 if (Objects.equals(RefundStatus.REFUND_CLOSE, record.getRefundStatus())){ From 8150ecf778ded87e5427c401c4a44318cfe071cb Mon Sep 17 00:00:00 2001 From: DaxPay Date: Thu, 19 Dec 2024 11:42:41 +0800 Subject: [PATCH 35/54] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=88=86=E8=B4=A6=E6=B2=A1=E6=9C=89=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=88=86=E8=B4=A6=E7=BB=84=E6=97=B6=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../receiver/AllocGroupManager.java | 3 ++- .../allocation/order/AllocOrderService.java | 6 +++-- .../service/order/pay/PayOrderService.java | 24 ++++++++++++------- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupManager.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupManager.java index b46b41523..c5b08b55c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/receiver/AllocGroupManager.java @@ -36,10 +36,11 @@ public class AllocGroupManager extends BaseManager /** * 根据分账组编号查询 */ - public Optional findByGroupNo(String groupNo, String appId) { + public Optional findByGroupNo(String channel, String groupNo, String appId) { return this.lambdaQuery() .eq(AllocGroup::getGroupNo,groupNo) .eq(AllocGroup::getAppId,appId) + .eq(AllocGroup::getChannel,channel) .oneOpt(); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java index 44035138e..e424db9cb 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java @@ -224,10 +224,12 @@ public class AllocOrderService { AllocGroup allocationGroup; if (Objects.nonNull(param.getGroupNo())){ // 指定分账组 - allocationGroup = groupManager.findByGroupNo(param.getGroupNo(),param.getAppId()).orElseThrow(() -> new DataErrorException("未查询到分账组")); + allocationGroup = groupManager.findByGroupNo(payOrder.getChannel(), param.getGroupNo(),param.getAppId()) + .orElseThrow(() -> new DataErrorException("未查询到分账组")); } else { // 默认分账组 - allocationGroup = groupManager.findDefaultGroup(payOrder.getChannel(),param.getAppId()).orElseThrow(() -> new DataErrorException("未查询到默认分账组")); + allocationGroup = groupManager.findDefaultGroup(payOrder.getChannel(),param.getAppId()) + .orElseThrow(() -> new DataErrorException("未查询到默认分账组")); } // 判断通道类型是否一致 if (!Objects.equals(allocationGroup.getChannel(), payOrder.getChannel())){ diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java index 1819ddf9c..5d7944150 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java @@ -3,6 +3,7 @@ package org.dromara.daxpay.service.service.order.pay; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.core.exception.DataErrorException; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; @@ -85,15 +86,20 @@ public class PayOrderService { * 自动分账 */ public void autoAllocation(Long id){ - PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在")); - // 是否开启自动完结 - AllocConfig allocConfig = allocConfigManager.findByAppId(payOrder.getAppId()).orElse(null); - if (Objects.nonNull(allocConfig)){ - paymentAssistService.initMchApp(payOrder.getAppId()); - AllocationParam param = new AllocationParam() - .setBizAllocNo("B"+TradeNoGenerateUtil.allocation()); - param.setAppId(payOrder.getAppId()); - allocationService.start(param, payOrder); + try { + PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在")); + // 是否开启自动完结 + AllocConfig allocConfig = allocConfigManager.findByAppId(payOrder.getAppId()).orElse(null); + if (Objects.nonNull(allocConfig)){ + paymentAssistService.initMchApp(payOrder.getAppId()); + AllocationParam param = new AllocationParam() + .setBizAllocNo("B"+TradeNoGenerateUtil.allocation()); + param.setAppId(payOrder.getAppId()); + allocationService.start(param, payOrder); + } + } catch (DataErrorException e) { + // 如果没有默认分账组, 会触发分账失败, 并不需要额外处理 + log.warn("自动分账失败", e); } } } From 05a79959deaa4507560dab20b60e536012dfef7f Mon Sep 17 00:00:00 2001 From: DaxPay Date: Thu, 19 Dec 2024 19:25:32 +0800 Subject: [PATCH 36/54] =?UTF-8?q?style=20=E5=88=86=E8=B4=A6=E5=8C=85?= =?UTF-8?q?=E5=90=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 3 +-- .../allocation/AliPayAllocationService.java | 4 ++-- .../allocation/WeChatPayAllocationV2Service.java | 4 ++-- .../allocation/WeChatPayAllocationV3Service.java | 4 ++-- .../{transaction => order}/AllocFinishParam.java | 2 +- .../{transaction => order}/AllocSyncParam.java | 2 +- .../{transaction => order}/AllocationParam.java | 2 +- .../QueryAllocOrderParam.java | 2 +- .../unipay/UniAllocationController.java | 8 ++++---- .../convert/allocation/AllocOrderConvert.java | 4 ++-- .../AllocDetailManager.java | 4 ++-- .../AllocDetailMapper.java | 4 ++-- .../AllocOrderManager.java | 4 ++-- .../{transaction => order}/AllocOrderMapper.java | 4 ++-- .../{transaction => order}/AllocAndDetail.java | 2 +- .../{transaction => order}/AllocDetail.java | 2 +- .../{transaction => order}/AllocOrder.java | 2 +- .../service/allocation/AllocationService.java | 16 ++++++++-------- .../allocation/AllocationSyncService.java | 10 +++++----- .../allocation/order/AllocOrderQueryService.java | 10 +++++----- .../allocation/order/AllocOrderService.java | 14 +++++++------- .../service/notice/MerchantNoticeService.java | 4 ++-- .../callback/MerchantCallbackTaskService.java | 4 ++-- .../notice/notify/MerchantNotifyTaskService.java | 4 ++-- .../service/order/pay/PayOrderService.java | 2 +- .../service/strategy/AbsAllocationStrategy.java | 4 ++-- 26 files changed, 62 insertions(+), 63 deletions(-) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/{transaction => order}/AllocFinishParam.java (89%) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/{transaction => order}/AllocSyncParam.java (91%) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/{transaction => order}/AllocationParam.java (97%) rename daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/{transaction => order}/QueryAllocOrderParam.java (89%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/{transaction => order}/AllocDetailManager.java (79%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/{transaction => order}/AllocDetailMapper.java (61%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/{transaction => order}/AllocOrderManager.java (92%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/{transaction => order}/AllocOrderMapper.java (61%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/{transaction => order}/AllocAndDetail.java (73%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/{transaction => order}/AllocDetail.java (96%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/{transaction => order}/AllocOrder.java (97%) diff --git a/_doc/Task.md b/_doc/Task.md index 52c2637cd..43666ea06 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -14,8 +14,7 @@ - [x] 分账界面功能优化 - [x] 分账接收方配置 - [x] 分账单管理 - - [x] 接口开发 开启/完结/同步 -- [x] 分账接口开发 +- [x] 分账接口开发 开启/完结/同步 - [x] 支付宝 - [x] 微信 - [x] 分账扩展能力 diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java index 4c5255f03..d0e5d1369 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java @@ -22,8 +22,8 @@ import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.springframework.stereotype.Service; import java.time.LocalDateTime; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java index 58b5db7de..5d4f6c3e2 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java @@ -25,8 +25,8 @@ import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.springframework.stereotype.Service; import java.time.LocalDateTime; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java index 84f5bd7c5..c713491a8 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java @@ -22,8 +22,8 @@ import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.springframework.stereotype.Service; import java.time.LocalDateTime; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocFinishParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocFinishParam.java similarity index 89% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocFinishParam.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocFinishParam.java index c6ce985e1..85537491a 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocFinishParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocFinishParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.core.param.allocation.transaction; +package org.dromara.daxpay.core.param.allocation.order; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocSyncParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocSyncParam.java similarity index 91% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocSyncParam.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocSyncParam.java index 8b83a0fcb..59ca04285 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocSyncParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocSyncParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.core.param.allocation.transaction; +package org.dromara.daxpay.core.param.allocation.order; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Size; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocationParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocationParam.java similarity index 97% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocationParam.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocationParam.java index fab32baa5..dc7efad41 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/AllocationParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/AllocationParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.core.param.allocation.transaction; +package org.dromara.daxpay.core.param.allocation.order; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/QueryAllocOrderParam.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/QueryAllocOrderParam.java similarity index 89% rename from daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/QueryAllocOrderParam.java rename to daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/QueryAllocOrderParam.java index 0934b643a..73baf1928 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/transaction/QueryAllocOrderParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/param/allocation/order/QueryAllocOrderParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.core.param.allocation.transaction; +package org.dromara.daxpay.core.param.allocation.order; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java index 024692e9a..0bf6434a3 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/UniAllocationController.java @@ -7,10 +7,10 @@ import lombok.RequiredArgsConstructor; import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverAddParam; import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverQueryParam; import org.dromara.daxpay.core.param.allocation.receiver.AllocReceiverRemoveParam; -import org.dromara.daxpay.core.param.allocation.transaction.AllocFinishParam; -import org.dromara.daxpay.core.param.allocation.transaction.AllocSyncParam; -import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; -import org.dromara.daxpay.core.param.allocation.transaction.QueryAllocOrderParam; +import org.dromara.daxpay.core.param.allocation.order.AllocFinishParam; +import org.dromara.daxpay.core.param.allocation.order.AllocSyncParam; +import org.dromara.daxpay.core.param.allocation.order.AllocationParam; +import org.dromara.daxpay.core.param.allocation.order.QueryAllocOrderParam; import org.dromara.daxpay.core.result.DaxResult; import org.dromara.daxpay.core.result.allocation.AllocSyncResult; import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java index 0e6c33f42..fd11d12b4 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/convert/allocation/AllocOrderConvert.java @@ -2,8 +2,8 @@ package org.dromara.daxpay.service.convert.allocation; import org.dromara.daxpay.core.result.allocation.order.AllocDetailResult; import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.dromara.daxpay.service.result.allocation.order.AllocDetailVo; import org.dromara.daxpay.service.result.allocation.order.AllocOrderVo; import org.mapstruct.Mapper; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocDetailManager.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailManager.java similarity index 79% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocDetailManager.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailManager.java index dbe41338f..a50441795 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocDetailManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailManager.java @@ -1,9 +1,9 @@ -package org.dromara.daxpay.service.dao.allocation.transaction; +package org.dromara.daxpay.service.dao.allocation.order; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; import org.springframework.stereotype.Repository; import java.util.List; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocDetailMapper.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailMapper.java similarity index 61% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocDetailMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailMapper.java index 881f97381..e242ef032 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocDetailMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocDetailMapper.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.dao.allocation.transaction; +package org.dromara.daxpay.service.dao.allocation.order; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; /** * diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocOrderManager.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderManager.java similarity index 92% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocOrderManager.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderManager.java index 94e1a3089..56b34ab4e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocOrderManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderManager.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.dao.allocation.transaction; +package org.dromara.daxpay.service.dao.allocation.order; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import cn.bootx.platform.common.mybatisplus.query.generator.QueryGenerator; @@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.service.common.entity.MchAppBaseEntity; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.dromara.daxpay.service.param.order.allocation.AllocOrderQuery; import org.springframework.stereotype.Repository; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocOrderMapper.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderMapper.java similarity index 61% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocOrderMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderMapper.java index 714b5a540..1a5983956 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/transaction/AllocOrderMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/order/AllocOrderMapper.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.service.dao.allocation.transaction; +package org.dromara.daxpay.service.dao.allocation.order; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; /** * diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocAndDetail.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocAndDetail.java similarity index 73% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocAndDetail.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocAndDetail.java index 964ae2689..987bf0469 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocAndDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocAndDetail.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.entity.allocation.transaction; +package org.dromara.daxpay.service.entity.allocation.order; import java.util.List; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocDetail.java similarity index 96% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocDetail.java index 01d053076..bed7fdf3c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocDetail.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocDetail.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.entity.allocation.transaction; +package org.dromara.daxpay.service.entity.allocation.order; import cn.bootx.platform.common.mybatisplus.function.ToResult; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocOrder.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocOrder.java similarity index 97% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocOrder.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocOrder.java index 97d3c46b7..843e5584a 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/transaction/AllocOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/allocation/order/AllocOrder.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.entity.allocation.transaction; +package org.dromara.daxpay.service.entity.allocation.order; import cn.bootx.platform.common.mybatisplus.function.ToResult; import com.baomidou.mybatisplus.annotation.FieldStrategy; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java index 54f0d1af6..c59db697d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java @@ -12,21 +12,21 @@ import org.dromara.daxpay.core.enums.AllocationStatusEnum; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.exception.DataErrorException; import org.dromara.daxpay.core.exception.TradeStatusErrorException; -import org.dromara.daxpay.core.param.allocation.transaction.AllocFinishParam; -import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; -import org.dromara.daxpay.core.param.allocation.transaction.QueryAllocOrderParam; +import org.dromara.daxpay.core.param.allocation.order.AllocFinishParam; +import org.dromara.daxpay.core.param.allocation.order.AllocationParam; +import org.dromara.daxpay.core.param.allocation.order.QueryAllocOrderParam; import org.dromara.daxpay.core.result.allocation.AllocationResult; import org.dromara.daxpay.core.result.allocation.order.AllocOrderResult; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; import org.dromara.daxpay.service.code.DaxPayCode; import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; +import org.dromara.daxpay.service.dao.allocation.order.AllocDetailManager; +import org.dromara.daxpay.service.dao.allocation.order.AllocOrderManager; import org.dromara.daxpay.service.dao.config.AllocConfigManager; import org.dromara.daxpay.service.entity.allocation.AllocConfig; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocAndDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocAndDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.service.allocation.order.AllocOrderQueryService; import org.dromara.daxpay.service.service.allocation.order.AllocOrderService; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java index dcd26e06c..96c568f13 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java @@ -11,17 +11,17 @@ import org.dromara.daxpay.core.enums.AllocDetailResultEnum; import org.dromara.daxpay.core.enums.AllocationResultEnum; import org.dromara.daxpay.core.enums.AllocationStatusEnum; import org.dromara.daxpay.core.enums.TradeTypeEnum; -import org.dromara.daxpay.core.param.allocation.transaction.AllocSyncParam; +import org.dromara.daxpay.core.param.allocation.order.AllocSyncParam; import org.dromara.daxpay.core.result.allocation.AllocSyncResult; import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; import org.dromara.daxpay.service.code.DaxPayCode; import org.dromara.daxpay.service.common.local.PaymentContextLocal; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; +import org.dromara.daxpay.service.dao.allocation.order.AllocDetailManager; +import org.dromara.daxpay.service.dao.allocation.order.AllocOrderManager; import org.dromara.daxpay.service.dao.config.AllocConfigManager; import org.dromara.daxpay.service.entity.allocation.AllocConfig; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.dromara.daxpay.service.entity.record.sync.TradeSyncRecord; import org.dromara.daxpay.service.service.assist.PaymentAssistService; import org.dromara.daxpay.service.service.notice.MerchantNoticeService; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java index 3acdfbfee..1bb6ffe5c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderQueryService.java @@ -11,11 +11,11 @@ import org.dromara.daxpay.core.enums.PayAllocStatusEnum; import org.dromara.daxpay.core.exception.OperationUnsupportedException; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.exception.TradeStatusErrorException; -import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.core.param.allocation.order.AllocationParam; +import org.dromara.daxpay.service.dao.allocation.order.AllocDetailManager; +import org.dromara.daxpay.service.dao.allocation.order.AllocOrderManager; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.param.order.allocation.AllocOrderQuery; import org.dromara.daxpay.service.result.allocation.order.AllocDetailVo; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java index e424db9cb..83d750479 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/order/AllocOrderService.java @@ -12,18 +12,18 @@ import org.dromara.daxpay.core.enums.AllocationResultEnum; import org.dromara.daxpay.core.enums.AllocationStatusEnum; import org.dromara.daxpay.core.enums.PayAllocStatusEnum; import org.dromara.daxpay.core.exception.DataErrorException; -import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; -import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam.ReceiverParam; +import org.dromara.daxpay.core.param.allocation.order.AllocationParam; +import org.dromara.daxpay.core.param.allocation.order.AllocationParam.ReceiverParam; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; import org.dromara.daxpay.service.dao.allocation.receiver.AllocGroupManager; import org.dromara.daxpay.service.dao.allocation.receiver.AllocReceiverManager; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocDetailManager; -import org.dromara.daxpay.service.dao.allocation.transaction.AllocOrderManager; +import org.dromara.daxpay.service.dao.allocation.order.AllocDetailManager; +import org.dromara.daxpay.service.dao.allocation.order.AllocOrderManager; import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; import org.dromara.daxpay.service.entity.allocation.receiver.AllocGroup; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocAndDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocAndDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.result.allocation.receiver.AllocGroupReceiverVo; import org.dromara.daxpay.service.service.allocation.receiver.AllocGroupService; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeService.java index 20ea64f65..961fe55f9 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/MerchantNoticeService.java @@ -2,8 +2,8 @@ package org.dromara.daxpay.service.service.notice; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackTaskService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackTaskService.java index 87f7cb2c1..2c35cfe69 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackTaskService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/callback/MerchantCallbackTaskService.java @@ -10,8 +10,8 @@ import org.dromara.daxpay.service.convert.order.pay.PayOrderConvert; import org.dromara.daxpay.service.convert.order.refund.RefundOrderConvert; import org.dromara.daxpay.service.convert.order.transfer.TransferOrderConvert; import org.dromara.daxpay.service.dao.notice.callback.MerchantCallbackTaskManager; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.dromara.daxpay.service.entity.notice.callback.MerchantCallbackTask; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyTaskService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyTaskService.java index bbe12877e..8fff7f2ac 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyTaskService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/notice/notify/MerchantNotifyTaskService.java @@ -12,8 +12,8 @@ import org.dromara.daxpay.service.convert.order.pay.PayOrderConvert; import org.dromara.daxpay.service.convert.order.refund.RefundOrderConvert; import org.dromara.daxpay.service.convert.order.transfer.TransferOrderConvert; import org.dromara.daxpay.service.dao.notice.notify.MerchantNotifyTaskManager; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.dromara.daxpay.service.entity.notice.notify.MerchantNotifyTask; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java index 5d7944150..0dc494890 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java @@ -5,7 +5,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.exception.DataErrorException; import org.dromara.daxpay.core.exception.TradeNotExistException; -import org.dromara.daxpay.core.param.allocation.transaction.AllocationParam; +import org.dromara.daxpay.core.param.allocation.order.AllocationParam; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; import org.dromara.daxpay.service.dao.config.AllocConfigManager; import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java index 8a9d1a5fc..700c07add 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/strategy/AbsAllocationStrategy.java @@ -5,8 +5,8 @@ import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.transaction.AllocOrder; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import java.util.List; From 87a431c316a45a58bb24fecb48d0b70d191e2378 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Thu, 19 Dec 2024 20:28:51 +0800 Subject: [PATCH 37/54] =?UTF-8?q?style=20=E5=88=86=E8=B4=A6=E5=8C=85?= =?UTF-8?q?=E5=90=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 5 ++++- .../dao/{config => allocation}/AllocConfigManager.java | 2 +- .../dao/{config => allocation}/AllocConfigMapper.java | 2 +- .../service/result/allocation/receiver/AllocReceiverVo.java | 1 - .../service/service/allocation/AllocConfigService.java | 2 +- .../daxpay/service/service/allocation/AllocationService.java | 2 +- .../service/service/allocation/AllocationSyncService.java | 2 +- .../daxpay/service/service/order/pay/PayOrderService.java | 2 +- 8 files changed, 10 insertions(+), 8 deletions(-) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/{config => allocation}/AllocConfigManager.java (94%) rename daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/{config => allocation}/AllocConfigMapper.java (84%) diff --git a/_doc/Task.md b/_doc/Task.md index 43666ea06..ad2333b7d 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -1,5 +1,5 @@ # 单商户 -## 3.0.1 功能优化 +## 3.0.0.bate4 功能优化和服务商支付 - [ ] 网关配套移动端开发 - [ ] 同步回调页 - [ ] 收银台功能优化 @@ -8,6 +8,9 @@ - [ ] 增加首页驾驶舱功能 - [ ] 商户应用要有类似删除的功能, 实现停用冻结, 但不影响数据的关联 - [ ] 同步接口优化, 返回同步完的数据 +- [ ] 服务商支付支持 + - [ ] 支付宝 + - [ ] 微信 ## 3.0.0.bate3: 分账 - [x] SDK接口 - [x] 分账相关接口: 分账,完结,同步,查询 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManager.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigManager.java similarity index 94% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManager.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigManager.java index 33a533a3a..c44cdd290 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigManager.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.dao.config; +package org.dromara.daxpay.service.dao.allocation; import cn.bootx.platform.common.mybatisplus.impl.BaseManager; import lombok.RequiredArgsConstructor; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigMapper.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigMapper.java similarity index 84% rename from daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigMapper.java rename to daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigMapper.java index fb60cdf3b..f79673af9 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/AllocConfigMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/allocation/AllocConfigMapper.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.service.dao.config; +package org.dromara.daxpay.service.dao.allocation; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java index 25790e919..04158e32d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/result/allocation/receiver/AllocReceiverVo.java @@ -38,7 +38,6 @@ public class AllocReceiverVo extends MchAppResult { @Schema(description = "分账接收方类型") private String receiverType; - @Schema(description = "接收方账号") @SensitiveInfo private String receiverAccount; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java index 192d89482..1b0e12e2b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocConfigService.java @@ -7,7 +7,7 @@ import cn.hutool.core.bean.copier.CopyOptions; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.service.convert.allocation.AllocConfigConvert; -import org.dromara.daxpay.service.dao.config.AllocConfigManager; +import org.dromara.daxpay.service.dao.allocation.AllocConfigManager; import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.dromara.daxpay.service.param.allocation.AllocConfigParam; import org.dromara.daxpay.service.result.allocation.AllocConfigResult; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java index c59db697d..70b46c5af 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationService.java @@ -22,7 +22,7 @@ import org.dromara.daxpay.service.code.DaxPayCode; import org.dromara.daxpay.service.convert.allocation.AllocOrderConvert; import org.dromara.daxpay.service.dao.allocation.order.AllocDetailManager; import org.dromara.daxpay.service.dao.allocation.order.AllocOrderManager; -import org.dromara.daxpay.service.dao.config.AllocConfigManager; +import org.dromara.daxpay.service.dao.allocation.AllocConfigManager; import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.dromara.daxpay.service.entity.allocation.order.AllocAndDetail; import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java index 96c568f13..219d02be6 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/allocation/AllocationSyncService.java @@ -18,7 +18,7 @@ import org.dromara.daxpay.service.code.DaxPayCode; import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.dao.allocation.order.AllocDetailManager; import org.dromara.daxpay.service.dao.allocation.order.AllocOrderManager; -import org.dromara.daxpay.service.dao.config.AllocConfigManager; +import org.dromara.daxpay.service.dao.allocation.AllocConfigManager; import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java index 0dc494890..c0baee63c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java @@ -7,7 +7,7 @@ import org.dromara.daxpay.core.exception.DataErrorException; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.param.allocation.order.AllocationParam; import org.dromara.daxpay.core.util.TradeNoGenerateUtil; -import org.dromara.daxpay.service.dao.config.AllocConfigManager; +import org.dromara.daxpay.service.dao.allocation.AllocConfigManager; import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; import org.dromara.daxpay.service.entity.allocation.AllocConfig; import org.dromara.daxpay.service.entity.order.pay.PayOrder; From 261777a59df213fbf8b2dd739ec0f311b1236e84 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Fri, 20 Dec 2024 09:56:56 +0800 Subject: [PATCH 38/54] =?UTF-8?q?fix=20=E8=AE=A2=E5=8D=95=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E6=88=90=E5=8A=9F=E9=87=8D=E5=A4=8D=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/daxpay/service/service/trade/pay/PayService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java index 0a1d570be..044d104e3 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java @@ -139,7 +139,6 @@ public class PayService { .setStatus(PayStatusEnum.SUCCESS.getCode()) .setPayTime(result.getFinishTime()); } - payOrderManager.updateById(payOrder); payOrder.setErrorCode(null); payOrder.setErrorMsg(null); payOrderManager.updateById(payOrder); From 0d3b7bf8725dba942f880a6b0600e60febb97faf Mon Sep 17 00:00:00 2001 From: DaxPay Date: Fri, 20 Dec 2024 09:58:10 +0800 Subject: [PATCH 39/54] =?UTF-8?q?fix=20=E8=AE=A2=E5=8D=95=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E6=88=90=E5=8A=9F=E9=87=8D=E5=A4=8D=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/daxpay/service/service/trade/pay/PayService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java index 044d104e3..ba87bd3af 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PayService.java @@ -190,7 +190,6 @@ public class PayService { .setStatus(PayStatusEnum.SUCCESS.getCode()) .setPayTime(payResultBo.getFinishTime()); } - payOrderManager.updateById(payOrder); // 扩展记录更新 payOrder.setErrorMsg(null); payOrder.setErrorCode(null); From 9830930717f1c7adb446b3b8074ef0e3557f387e Mon Sep 17 00:00:00 2001 From: DaxPay Date: Fri, 20 Dec 2024 18:02:29 +0800 Subject: [PATCH 40/54] =?UTF-8?q?style=20=E4=BB=A3=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../allocation/{receiver => }/AliPayAllocReceiverService.java | 3 +-- .../alipay/service/transfer/AliPayTransferService.java | 1 - .../channel/alipay/strategy/AliPayAllocReceiverStrategy.java | 2 +- .../daxpay/service/service/order/pay/PayOrderService.java | 2 +- .../daxpay/service/service/trade/pay/PaySyncService.java | 1 - .../daxpay/service/task/AllocationSyncTaskService.java | 4 ---- 6 files changed, 3 insertions(+), 10 deletions(-) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/{receiver => }/AliPayAllocReceiverService.java (97%) diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/receiver/AliPayAllocReceiverService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocReceiverService.java similarity index 97% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/receiver/AliPayAllocReceiverService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocReceiverService.java index 7f8edcecf..cac0905c9 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/receiver/AliPayAllocReceiverService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocReceiverService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.alipay.service.allocation.receiver; +package org.dromara.daxpay.channel.alipay.service.allocation; import cn.hutool.core.util.StrUtil; import com.alipay.api.AlipayResponse; @@ -88,7 +88,6 @@ public class AliPayAllocReceiverService { AlipayTradeRoyaltyRelationUnbindRequest request = new AlipayTradeRoyaltyRelationUnbindRequest(); request.setBizModel(model); AlipayTradeRoyaltyRelationUnbindResponse response = aliPayConfigService.execute(request); - System.out.println(response); // 如果出现分账方不存在也视为成功 if (Objects.equals(response.getSubCode(), AliPayCode.USER_NOT_EXIST)) { return; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/transfer/AliPayTransferService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/transfer/AliPayTransferService.java index ca6def28f..e67ab6644 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/transfer/AliPayTransferService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/transfer/AliPayTransferService.java @@ -45,7 +45,6 @@ public class AliPayTransferService { AlipayFundAccountQueryRequest request = new AlipayFundAccountQueryRequest(); request.setBizModel(model); AlipayFundAccountQueryResponse response = aliPayConfigService.execute(request); - System.out.println(response); } /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAllocReceiverStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAllocReceiverStrategy.java index 94cb31542..dcfa7795f 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAllocReceiverStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAllocReceiverStrategy.java @@ -3,7 +3,7 @@ package org.dromara.daxpay.channel.alipay.strategy; import cn.bootx.platform.core.exception.ValidationFailedException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.alipay.service.allocation.receiver.AliPayAllocReceiverService; +import org.dromara.daxpay.channel.alipay.service.allocation.AliPayAllocReceiverService; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.strategy.AbsAllocReceiverStrategy; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java index c0baee63c..b0310aeb7 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/order/pay/PayOrderService.java @@ -85,7 +85,7 @@ public class PayOrderService { /** * 自动分账 */ - public void autoAllocation(Long id){ + public void autoAllocation(@NotNull(message = "支付订单id不能为空") Long id){ try { PayOrder payOrder = payOrderManager.findById(id).orElseThrow(() -> new TradeNotExistException("支付订单不存在")); // 是否开启自动完结 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PaySyncService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PaySyncService.java index 37628469e..33827a861 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PaySyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PaySyncService.java @@ -72,7 +72,6 @@ public class PaySyncService { if (Objects.equals(payOrder.getStatus(), WAIT.getCode())){ throw new TradeStatusErrorException("订单未开始支付, 请重新确认支付状态"); } - // 加锁 LockInfo lock = lockTemplate.lock("sync:pay" + payOrder.getId(),10000,200); if (Objects.isNull(lock)){ diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java index c30792e2f..6cb089899 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/task/AllocationSyncTaskService.java @@ -14,8 +14,4 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class AllocationSyncTaskService { - /** - * 分账同步 - */ - } From 861f27ff0ccfbd566eaf9ae27ef21abcbc0899ed Mon Sep 17 00:00:00 2001 From: bootx Date: Fri, 20 Dec 2024 23:20:52 +0800 Subject: [PATCH 41/54] =?UTF-8?q?refactor(alipay):=20=E5=B0=86=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9D=E9=80=9A=E9=81=93=E6=A0=87=E8=AF=86=E4=BB=8E?= =?UTF-8?q?=20ALI=20=E4=BF=AE=E6=94=B9=E4=B8=BA=20ALIPAY?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 1 + .../daxpay/channel/alipay/entity/config/AliPayConfig.java | 2 +- .../channel/alipay/service/callback/AliPayCallbackService.java | 2 +- .../channel/alipay/service/config/AliPayConfigService.java | 2 +- .../alipay/service/notice/AliPayTransferNoticeService.java | 2 +- .../daxpay/channel/alipay/strategy/AliAllocationStrategy.java | 2 +- .../channel/alipay/strategy/AliPayAllocReceiverStrategy.java | 2 +- .../daxpay/channel/alipay/strategy/AliPayAuthStrategy.java | 2 +- .../channel/alipay/strategy/AliPayCashierCodeStrategy.java | 2 +- .../daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java | 2 +- .../daxpay/channel/alipay/strategy/AliPayCloseStrategy.java | 2 +- .../daxpay/channel/alipay/strategy/AliPayReconcileStrategy.java | 2 +- .../daxpay/channel/alipay/strategy/AliPayRefundStrategy.java | 2 +- .../dromara/daxpay/channel/alipay/strategy/AliPayStrategy.java | 2 +- .../daxpay/channel/alipay/strategy/AliPaySyncOrderStrategy.java | 2 +- .../channel/alipay/strategy/AliPaySyncRefundStrategy.java | 2 +- .../channel/alipay/strategy/AliPaySyncTransferStrategy.java | 2 +- .../daxpay/channel/alipay/strategy/AliPayTransferStrategy.java | 2 +- .../main/java/org/dromara/daxpay/core/enums/ChannelEnum.java | 2 +- 19 files changed, 19 insertions(+), 18 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index ad2333b7d..eb6b5d2be 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -11,6 +11,7 @@ - [ ] 服务商支付支持 - [ ] 支付宝 - [ ] 微信 +- [ ] 微信增加公钥证书方式 ## 3.0.0.bate3: 分账 - [x] SDK接口 - [x] 分账相关接口: 分账,完结,同步,查询 diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java index 49547766c..fdea1e66f 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java @@ -77,7 +77,7 @@ public class AliPayConfig implements ToResult { channelConfig.setOutAppId(this.getAliAppId()); channelConfig.setAppId(this.getAppId()); channelConfig.setEnable(this.getEnable()); - channelConfig.setChannel(ChannelEnum.ALI.getCode()); + channelConfig.setChannel(ChannelEnum.ALIPAY.getCode()); AliPayConfig copy = AliPayConfigConvert.CONVERT.copy(this); // 清空不需要序列化的字段 copy.setId(null).setAppId(null).setEnable(null).setAliAppId(null).setAppId(null); diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/AliPayCallbackService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/AliPayCallbackService.java index e1662c18e..faa98e5e6 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/AliPayCallbackService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/AliPayCallbackService.java @@ -86,7 +86,7 @@ public class AliPayCallbackService { CallbackLocal callback = PaymentContextLocal.get().getCallbackInfo(); callback.setCallbackData(callbackParam); // 通道和回调类型 - callback.setChannel(ChannelEnum.ALI.getCode()); + callback.setChannel(ChannelEnum.ALIPAY.getCode()); String refundFee = callbackParam.get(ResponseParams.REFUND_FEE); // 如果有退款金额,说明是退款回调 if (StrUtil.isNotBlank(refundFee)){ diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AliPayConfigService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AliPayConfigService.java index 4ff28398f..9b1398087 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AliPayConfigService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AliPayConfigService.java @@ -119,7 +119,7 @@ public class AliPayConfigService { */ public AliPayConfig getAliPayConfig(){ MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - ChannelConfig channelConfig = channelConfigCacheService.get(mchAppInfo.getAppId(), ChannelEnum.ALI.getCode()); + ChannelConfig channelConfig = channelConfigCacheService.get(mchAppInfo.getAppId(), ChannelEnum.ALIPAY.getCode()); return AliPayConfig.convertConfig(channelConfig); } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AliPayTransferNoticeService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AliPayTransferNoticeService.java index 6d9f9a1ca..2c444eacd 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AliPayTransferNoticeService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AliPayTransferNoticeService.java @@ -51,7 +51,7 @@ public class AliPayTransferNoticeService { public String callback(Map map) { CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); callbackInfo.setRawData(JsonUtil.toJsonStr(map)) - .setChannel(ChannelEnum.ALI.getCode()) + .setChannel(ChannelEnum.ALIPAY.getCode()) .setCallbackType(TradeTypeEnum.TRANSFER); // 通过 biz_content 获取值 diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java index 34b9fbdbf..79f47871a 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java @@ -26,7 +26,7 @@ public class AliAllocationStrategy extends AbsAllocationStrategy { */ @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAllocReceiverStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAllocReceiverStrategy.java index dcfa7795f..746a45d65 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAllocReceiverStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAllocReceiverStrategy.java @@ -32,7 +32,7 @@ public class AliPayAllocReceiverStrategy extends AbsAllocReceiverStrategy { */ @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } @Override diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAuthStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAuthStrategy.java index 9195ddb0e..f424276fa 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAuthStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAuthStrategy.java @@ -29,7 +29,7 @@ public class AliPayAuthStrategy extends AbsChannelAuthStrategy { */ @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierCodeStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierCodeStrategy.java index 03442a3f1..f960b62c9 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierCodeStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierCodeStrategy.java @@ -21,6 +21,6 @@ public class AliPayCashierCodeStrategy extends AbsCashierCodeStrategy { */ @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java index 66c9ca9e5..e239aa90a 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java @@ -24,7 +24,7 @@ public class AliPayCheckoutStrategy extends AbsCheckoutStrategy { */ @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCloseStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCloseStrategy.java index f467c0be1..c961fa763 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCloseStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCloseStrategy.java @@ -27,7 +27,7 @@ public class AliPayCloseStrategy extends AbsPayCloseStrategy { @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayReconcileStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayReconcileStrategy.java index 32b0bed27..04469df5b 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayReconcileStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayReconcileStrategy.java @@ -37,7 +37,7 @@ public class AliPayReconcileStrategy extends AbsReconcileStrategy { */ @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayRefundStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayRefundStrategy.java index 2b04f8fa7..467ef4216 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayRefundStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayRefundStrategy.java @@ -28,7 +28,7 @@ public class AliPayRefundStrategy extends AbsRefundStrategy { */ @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayStrategy.java index 4466c6971..b28b7b0f5 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayStrategy.java @@ -31,7 +31,7 @@ public class AliPayStrategy extends AbsPayStrategy { @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncOrderStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncOrderStrategy.java index 8e0171fd5..d0c8918e6 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncOrderStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncOrderStrategy.java @@ -27,7 +27,7 @@ public class AliPaySyncOrderStrategy extends AbsSyncPayOrderStrategy { */ @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncRefundStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncRefundStrategy.java index 2dc190aab..67044e718 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncRefundStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncRefundStrategy.java @@ -33,7 +33,7 @@ public class AliPaySyncRefundStrategy extends AbsSyncRefundOrderStrategy { */ @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncTransferStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncTransferStrategy.java index 525ba9882..8765f0742 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncTransferStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncTransferStrategy.java @@ -29,7 +29,7 @@ public class AliPaySyncTransferStrategy extends AbsSyncTransferOrderStrategy { */ @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayTransferStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayTransferStrategy.java index 724645a81..e2270b252 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayTransferStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayTransferStrategy.java @@ -34,7 +34,7 @@ public class AliPayTransferStrategy extends AbsTransferStrategy { */ @Override public String getChannel() { - return ChannelEnum.ALI.getCode(); + return ChannelEnum.ALIPAY.getCode(); } @Override diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/ChannelEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/ChannelEnum.java index 04933d9ee..f6759b2e9 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/ChannelEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/ChannelEnum.java @@ -15,7 +15,7 @@ import lombok.RequiredArgsConstructor; public enum ChannelEnum { /** 支付宝 - 直连商户 */ - ALI("ali_pay"), + ALIPAY("ali_pay"), /** 微信支付 */ WECHAT("wechat_pay"), /** 云闪付 */ From 3fcfdf025cc401357f9b97a31f93a10a22400d02 Mon Sep 17 00:00:00 2001 From: bootx Date: Sun, 22 Dec 2024 21:11:00 +0800 Subject: [PATCH 42/54] =?UTF-8?q?doc:=20=E4=BB=BB=E5=8A=A1=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++----- _doc/ChangeLog.md | 2 ++ _doc/Task.md | 2 ++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index fe0a8b81a..3f7876202 100644 --- a/README.md +++ b/README.md @@ -33,10 +33,10 @@ ## 📃 文档和源码地址 ### 文档地址 -在 [DaxPay文档站](https://doc.daxpay.cn/) 下的支付网关(DaxPay)模块下可以进行查阅相关文档,具体链接地址如下: -[快速指南](https://doc.daxpay.cn/single/guides/overview/项目介绍.html)、 -[支付对接](https://doc.daxpay.cn/single/gateway/overview/接口清单.html)、 -[操作手册](https://doc.daxpay.cn/single/admin/config/平台配置.html) +在 [DaxPay文档站](https://daxpay.dromara.org/) 下的支付网关(DaxPay)模块下可以进行查阅相关文档,具体链接地址如下: +[快速指南](https://daxpay.dromara.org/single/guides/overview/项目介绍.html)、 +[支付对接](https://daxpay.dromara.org/single/gateway/overview/接口清单.html)、 +[操作手册](https://daxpay.dromara.org/single/admin/config/平台配置.html) ### 项目地址 @@ -71,7 +71,7 @@ 不会对原业务系统的架构产生影响。如果是Java项目,可以使用SDK简化接入流程, 其他语言可以参照中的说明使用HTTP接口方式接入。 ### Java客户端SDK -> SDK版本号与支付网关的版本保持一致,如果需要使用,请在pom.xml中添加如下依赖。SDK使用方式参考[SDK使用说明](https://doc.daxpay.cn/single/gateway/overview/SDK使用说明.html)。 +> SDK版本号与支付网关的版本保持一致,如果需要使用,请在pom.xml中添加如下依赖。SDK使用方式参考[SDK使用说明](https://daxpay.dromara.org/single/gateway/overview/SDK使用说明.html)。 ```xml diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index 1b18b070c..3062003a7 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,4 +1,6 @@ # CHANGELOG +## [v3.0.0.beta4] 2025-01-10 + ## [v3.0.0.beta3] 2024-12-22 - 新增: 支持支付宝分账功能 - 新增: 支持微信分账功能 diff --git a/_doc/Task.md b/_doc/Task.md index eb6b5d2be..6f1ecfc73 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -12,6 +12,8 @@ - [ ] 支付宝 - [ ] 微信 - [ ] 微信增加公钥证书方式 +- [ ] 分账重试 +- [ ] 对各种交易增加新的异常处理, 防止同步失败后无限进行同步 ## 3.0.0.bate3: 分账 - [x] SDK接口 - [x] 分账相关接口: 分账,完结,同步,查询 From a5c72b8578e2b36bc407983d907b94e7b3d72f72 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Mon, 23 Dec 2024 19:33:46 +0800 Subject: [PATCH 43/54] =?UTF-8?q?fix=20=E5=BE=AE=E4=BF=A1=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=90=8C=E6=AD=A5V3=E6=8E=A5=E5=8F=A3=E9=87=91?= =?UTF-8?q?=E9=A2=9D=E7=A9=BA=E6=8C=87=E9=92=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../channel/wechat/service/sync/pay/WeChatPaySyncV3Service.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WeChatPaySyncV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WeChatPaySyncV3Service.java index 3e1747ac5..d1940467f 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WeChatPaySyncV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WeChatPaySyncV3Service.java @@ -42,7 +42,7 @@ public class WeChatPaySyncV3Service { // 获取支付金额 var payerTotal = Optional.ofNullable(result.getAmount()) - .map(WxPayOrderQueryV3Result.Amount::getPayerTotal) + .map(WxPayOrderQueryV3Result.Amount::getTotal) .map(PayUtil::conversionAmount) .orElse(null); From fb1014d907ca5463605a5fc3c1fbd36c5e454fe7 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Tue, 24 Dec 2024 18:52:09 +0800 Subject: [PATCH 44/54] =?UTF-8?q?feat=20=E6=94=AF=E4=BB=98=E5=AE=9D?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=95=86=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 5 +- ...il.java => AlipayReconcileBillDetail.java} | 2 +- ...tal.java => AlipayReconcileBillTotal.java} | 2 +- .../code/{AliPayCode.java => AlipayCode.java} | 2 +- ...ler.java => AlipayCallbackController.java} | 19 ++- ...oller.java => AlipayConfigController.java} | 14 +-- ...va => AlipayNoticeReceiverController.java} | 20 +-- ....java => AlipayRedirectUrlController.java} | 15 ++- .../convert/config/AliPayConfigConvert.java | 23 ---- .../convert/config/AlipayConfigConvert.java | 23 ++++ .../entity/{config => }/AliPayConfig.java | 30 +++-- ...onfigParam.java => AlipayConfigParam.java} | 12 +- .../{AliPayParam.java => AlipayParam.java} | 2 +- ...figResult.java => AlipayConfigResult.java} | 13 +- ...ult.java => AlipayOrderChangedResult.java} | 2 +- .../AliPayAllocReceiverService.java | 20 +-- .../allocation/AliPayAllocationService.java | 43 +++---- .../callback/AliPayCallbackService.java | 43 ++++--- .../service/close/AliPayCloseService.java | 49 ++++---- ...gService.java => AlipayConfigService.java} | 84 ++++++------- ...uthService.java => AlipayAuthService.java} | 35 +++--- ....java => AlipayNoticeReceiverService.java} | 12 +- ....java => AlipayTransferNoticeService.java} | 24 ++-- .../alipay/service/pay/AliPayService.java | 116 +++++++++++------- ...rvice.java => AlipayReconcileService.java} | 53 ++++---- ...ice.java => AlipayRedirectUrlService.java} | 15 +-- ...dService.java => AlipayRefundService.java} | 23 ++-- ...vice.java => AlipayRefundSyncService.java} | 30 +++-- ...yncService.java => AlipaySyncService.java} | 28 +++-- ...ce.java => AlipayTransferSyncService.java} | 25 ++-- ...ervice.java => AlipayTransferService.java} | 22 ++-- .../strategy/AliPayCashierCodeStrategy.java | 26 ---- .../strategy/isv/AlipayIsvAuthStrategy.java | 56 +++++++++ .../isv/AlipayIsvCheckoutStrategy.java | 38 ++++++ .../strategy/isv/AlipayIsvCloseStrategy.java | 54 ++++++++ .../strategy/isv/AlipayIsvPayStrategy.java | 73 +++++++++++ .../isv/AlipayIsvReconcileStrategy.java | 64 ++++++++++ .../strategy/isv/AlipayIsvRefundStrategy.java | 46 +++++++ .../isv/AlipayIsvSyncOrderStrategy.java | 45 +++++++ .../isv/AlipayIsvSyncRefundStrategy.java | 66 ++++++++++ .../AliPayCheckoutStrategy.java | 2 +- .../{ => merchant}/AliPayStrategy.java | 21 ++-- .../AliPaySyncTransferStrategy.java | 14 ++- .../AlipayAllocReceiverStrategy.java} | 15 ++- .../AlipayAllocationStrategy.java} | 21 ++-- .../AlipayAuthStrategy.java} | 18 ++- .../AlipayCloseStrategy.java} | 12 +- .../AlipayReconcileStrategy.java} | 14 ++- .../AlipayRefundStrategy.java} | 14 ++- .../AlipaySyncOrderStrategy.java} | 16 ++- .../AlipaySyncRefundStrategy.java} | 17 ++- .../AlipayTransferStrategy.java} | 21 ++-- .../WeChatPayAllocationV2Service.java | 4 +- .../daxpay/core/enums/ChannelEnum.java | 4 + 54 files changed, 1013 insertions(+), 454 deletions(-) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/{AliReconcileBillDetail.java => AlipayReconcileBillDetail.java} (97%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/{AliReconcileBillTotal.java => AlipayReconcileBillTotal.java} (95%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/code/{AliPayCode.java => AlipayCode.java} (99%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/{AliPayCallbackController.java => AlipayCallbackController.java} (60%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/{AliPayConfigController.java => AlipayConfigController.java} (75%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/{AliPayNoticeReceiverController.java => AlipayNoticeReceiverController.java} (61%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/{AliPayRedirectUrlController.java => AlipayRedirectUrlController.java} (67%) delete mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AliPayConfigConvert.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AlipayConfigConvert.java rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/{config => }/AliPayConfig.java (76%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/{AliPayConfigParam.java => AlipayConfigParam.java} (86%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/{AliPayParam.java => AlipayParam.java} (97%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/{AliPayConfigResult.java => AlipayConfigResult.java} (86%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/notice/{AliPayOrderChangedResult.java => AlipayOrderChangedResult.java} (99%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/{AliPayConfigService.java => AlipayConfigService.java} (73%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/extra/{AliPayAuthService.java => AlipayAuthService.java} (75%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/{AliPayNoticeReceiverService.java => AlipayNoticeReceiverService.java} (76%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/{AliPayTransferNoticeService.java => AlipayTransferNoticeService.java} (86%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/reconcile/{AliPayReconcileService.java => AlipayReconcileService.java} (85%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/redirect/{AliPayRedirectUrlService.java => AlipayRedirectUrlService.java} (82%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/refund/{AliPayRefundService.java => AlipayRefundService.java} (79%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/{AliPayRefundSyncService.java => AlipayRefundSyncService.java} (74%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/{AliPaySyncService.java => AlipaySyncService.java} (78%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/{AliPayTransferSyncService.java => AlipayTransferSyncService.java} (76%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/transfer/{AliPayTransferService.java => AlipayTransferService.java} (88%) delete mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierCodeStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvAuthStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvCheckoutStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvCloseStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvPayStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvReconcileStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvRefundStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvSyncOrderStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvSyncRefundStrategy.java rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{ => merchant}/AliPayCheckoutStrategy.java (93%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{ => merchant}/AliPayStrategy.java (72%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{ => merchant}/AliPaySyncTransferStrategy.java (63%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{AliPayAllocReceiverStrategy.java => merchant/AlipayAllocReceiverStrategy.java} (72%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{AliAllocationStrategy.java => merchant/AlipayAllocationStrategy.java} (62%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{AliPayAuthStrategy.java => merchant/AlipayAuthStrategy.java} (61%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{AliPayCloseStrategy.java => merchant/AlipayCloseStrategy.java} (79%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{AliPayReconcileStrategy.java => merchant/AlipayReconcileStrategy.java} (74%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{AliPayRefundStrategy.java => merchant/AlipayRefundStrategy.java} (57%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{AliPaySyncOrderStrategy.java => merchant/AlipaySyncOrderStrategy.java} (57%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{AliPaySyncRefundStrategy.java => merchant/AlipaySyncRefundStrategy.java} (71%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/{AliPayTransferStrategy.java => merchant/AlipayTransferStrategy.java} (72%) diff --git a/_doc/Task.md b/_doc/Task.md index 6f1ecfc73..629fb540c 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -4,16 +4,15 @@ - [ ] 同步回调页 - [ ] 收银台功能优化 - [ ] 支持配置背景色和图标 -- [ ] 定时同步任务频次不要太高, 预防产生过多的数据 +- [ ] 对各种交易增加新的同步失败异常处理, 防止同步失败后无限进行同步 - [ ] 增加首页驾驶舱功能 - [ ] 商户应用要有类似删除的功能, 实现停用冻结, 但不影响数据的关联 - [ ] 同步接口优化, 返回同步完的数据 - [ ] 服务商支付支持 - - [ ] 支付宝 + - [x] 支付宝 - [ ] 微信 - [ ] 微信增加公钥证书方式 - [ ] 分账重试 -- [ ] 对各种交易增加新的异常处理, 防止同步失败后无限进行同步 ## 3.0.0.bate3: 分账 - [x] SDK接口 - [x] 分账相关接口: 分账,完结,同步,查询 diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AliReconcileBillDetail.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AlipayReconcileBillDetail.java similarity index 97% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AliReconcileBillDetail.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AlipayReconcileBillDetail.java index 570bf8bfb..6b87a5f72 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AliReconcileBillDetail.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AlipayReconcileBillDetail.java @@ -12,7 +12,7 @@ import lombok.EqualsAndHashCode; */ @EqualsAndHashCode(callSuper = true) @Data -public class AliReconcileBillDetail extends MpIdEntity { +public class AlipayReconcileBillDetail extends MpIdEntity { @Alias("支付宝交易号") private String tradeNo; @Alias("商户订单号") diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AliReconcileBillTotal.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AlipayReconcileBillTotal.java similarity index 95% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AliReconcileBillTotal.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AlipayReconcileBillTotal.java index f80a37c07..4bd376918 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AliReconcileBillTotal.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AlipayReconcileBillTotal.java @@ -14,7 +14,7 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = true) @Data @TableName("pay_alipay_reconcile_bill_total") -public class AliReconcileBillTotal extends MpIdEntity { +public class AlipayReconcileBillTotal extends MpIdEntity { @Alias("门店编号") private String storeId; @Alias("门店名称") diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/code/AliPayCode.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/code/AlipayCode.java similarity index 99% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/code/AliPayCode.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/code/AlipayCode.java index d1bc4de3a..79ca9b717 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/code/AliPayCode.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/code/AlipayCode.java @@ -6,7 +6,7 @@ package org.dromara.daxpay.channel.alipay.code; * @author xxm * @since 2021/2/27 */ -public interface AliPayCode { +public interface AlipayCode { /** * 支付网管地址 diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayCallbackController.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AlipayCallbackController.java similarity index 60% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayCallbackController.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AlipayCallbackController.java index 1a2c6101c..b4cd13103 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayCallbackController.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AlipayCallbackController.java @@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.channel.alipay.service.callback.AliPayCallbackService; +import org.dromara.daxpay.channel.alipay.service.callback.AlipayCallbackService; import org.dromara.daxpay.service.service.assist.PaymentAssistService; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -23,15 +23,22 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/unipay/callback/{AppId}") @RequiredArgsConstructor -public class AliPayCallbackController { +public class AlipayCallbackController { private final PaymentAssistService paymentAssistService; - private final AliPayCallbackService payCallbackService; + private final AlipayCallbackService payCallbackService; - @Operation(summary = "支付宝回调") + + @Operation(summary = "支付宝回调(普通商户)") @PostMapping("/alipay") - public String aliPayNotify( @PathVariable("AppId") String appId, HttpServletRequest request) { + public String aliPayNotify(@PathVariable("AppId") String appId, HttpServletRequest request) { paymentAssistService.initMchApp(appId); - return payCallbackService.callbackHandle(request); + return payCallbackService.callbackHandle(request,false); + } + @Operation(summary = "支付宝回调(特约商户)") + @PostMapping("/alipay/isv") + public String aliPayIsvNotify(@PathVariable("AppId") String appId, HttpServletRequest request) { + paymentAssistService.initMchApp(appId); + return payCallbackService.callbackHandle(request, true); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayConfigController.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AlipayConfigController.java similarity index 75% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayConfigController.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AlipayConfigController.java index 8c29fc29d..1b4f5d5ea 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayConfigController.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AlipayConfigController.java @@ -8,9 +8,9 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.channel.alipay.param.config.AliPayConfigParam; -import org.dromara.daxpay.channel.alipay.result.config.AliPayConfigResult; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.channel.alipay.param.config.AlipayConfigParam; +import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -25,20 +25,20 @@ import org.springframework.web.bind.annotation.*; @RequestMapping("/alipay/config") @RequiredArgsConstructor @RequestGroup(groupCode = "AlipayConfig", groupName = "支付宝配置", moduleCode = "alipay", moduleName = "支付宝通道") -public class AliPayConfigController { - private final AliPayConfigService alipayConfigService; +public class AlipayConfigController { + private final AlipayConfigService alipayConfigService; @RequestPath("获取配置") @Operation(summary = "获取配置") @GetMapping("/findById") - public Result findById(@NotNull(message = "ID不可为空") Long id) { + public Result findById(@NotNull(message = "ID不可为空") Long id) { return Res.ok(alipayConfigService.findById(id)); } @RequestPath("新增或更新") @Operation(summary = "新增或更新") @PostMapping("/saveOrUpdate") - public Result saveOrUpdate(@RequestBody AliPayConfigParam param) { + public Result saveOrUpdate(@RequestBody AlipayConfigParam param) { alipayConfigService.saveOrUpdate(param); return Res.ok(); } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayNoticeReceiverController.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AlipayNoticeReceiverController.java similarity index 61% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayNoticeReceiverController.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AlipayNoticeReceiverController.java index 000402701..db159771f 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayNoticeReceiverController.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AlipayNoticeReceiverController.java @@ -1,12 +1,12 @@ package org.dromara.daxpay.channel.alipay.controller; import cn.bootx.platform.core.annotation.IgnoreAuth; -import org.dromara.daxpay.channel.alipay.service.notice.AliPayNoticeReceiverService; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; +import org.dromara.daxpay.channel.alipay.service.notice.AlipayNoticeReceiverService; +import org.dromara.daxpay.service.service.assist.PaymentAssistService; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -22,16 +22,22 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/unipay/notice/{AppId}") @RequiredArgsConstructor -public class AliPayNoticeReceiverController { +public class AlipayNoticeReceiverController { - private final AliPayNoticeReceiverService aliPayNoticeReceiverService; + private final AlipayNoticeReceiverService aliPayNoticeReceiverService; private final PaymentAssistService paymentAssistService; - @Operation(summary = "支付宝消息通知") + @Operation(summary = "支付宝消息通知(普通商户)") @PostMapping("/alipay") - public String aliPayNotice(@PathVariable("AppId") String appId, HttpServletRequest request) { + public String aliPay(@PathVariable("AppId") String appId, HttpServletRequest request) { paymentAssistService.initMchApp(appId); - return aliPayNoticeReceiverService.noticeReceiver(request); + return aliPayNoticeReceiverService.noticeReceiver(request,false); + } + @Operation(summary = "支付宝消息通知(特约商户)") + @PostMapping("/alipay/isv") + public String aliPayIsv(@PathVariable("AppId") String appId, HttpServletRequest request) { + paymentAssistService.initMchApp(appId); + return aliPayNoticeReceiverService.noticeReceiver(request,true); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayRedirectUrlController.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AlipayRedirectUrlController.java similarity index 67% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayRedirectUrlController.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AlipayRedirectUrlController.java index e587cfd38..4e58e39a6 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AliPayRedirectUrlController.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/controller/AlipayRedirectUrlController.java @@ -1,7 +1,7 @@ package org.dromara.daxpay.channel.alipay.controller; import cn.bootx.platform.core.annotation.IgnoreAuth; -import org.dromara.daxpay.channel.alipay.service.redirect.AliPayRedirectUrlService; +import org.dromara.daxpay.channel.alipay.service.redirect.AlipayRedirectUrlService; import org.dromara.daxpay.service.service.assist.PaymentAssistService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -23,15 +23,22 @@ import org.springframework.web.servlet.ModelAndView; @RestController @RequestMapping("/unipay/return/{AppId}") @RequiredArgsConstructor -public class AliPayRedirectUrlController { - private final AliPayRedirectUrlService redirectUrlService; +public class AlipayRedirectUrlController { + private final AlipayRedirectUrlService redirectUrlService; private final PaymentAssistService paymentAssistService; @Operation(summary = "支付宝同步跳转通知") @GetMapping("/alipay") public ModelAndView alipay(@PathVariable("AppId") String appId, HttpServletRequest request){ paymentAssistService.initMchApp(appId); - String redirect = redirectUrlService.redirect(request); + String redirect = redirectUrlService.redirect(request,false); + return new ModelAndView("redirect:"+redirect); + } + @Operation(summary = "支付宝同步跳转通知") + @GetMapping("/alipay/isv") + public ModelAndView alipayIsv(@PathVariable("AppId") String appId, HttpServletRequest request){ + paymentAssistService.initMchApp(appId); + String redirect = redirectUrlService.redirect(request, true); return new ModelAndView("redirect:"+redirect); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AliPayConfigConvert.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AliPayConfigConvert.java deleted file mode 100644 index 1393554e6..000000000 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AliPayConfigConvert.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.dromara.daxpay.channel.alipay.convert.config; - -import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; -import org.dromara.daxpay.channel.alipay.param.config.AliPayConfigParam; -import org.dromara.daxpay.channel.alipay.result.config.AliPayConfigResult; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * - * @author xxm - * @since 2024/6/25 - */ -@Mapper -public interface AliPayConfigConvert { - AliPayConfigConvert CONVERT = Mappers.getMapper(AliPayConfigConvert.class); - - AliPayConfigResult toResult(AliPayConfig in); - - AliPayConfig copy(AliPayConfig in); - - AliPayConfig toEntity(AliPayConfigParam in); -} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AlipayConfigConvert.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AlipayConfigConvert.java new file mode 100644 index 000000000..9d9187de2 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AlipayConfigConvert.java @@ -0,0 +1,23 @@ +package org.dromara.daxpay.channel.alipay.convert.config; + +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.param.config.AlipayConfigParam; +import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * + * @author xxm + * @since 2024/6/25 + */ +@Mapper +public interface AlipayConfigConvert { + AlipayConfigConvert CONVERT = Mappers.getMapper(AlipayConfigConvert.class); + + AlipayConfigResult toResult(AliPayConfig in); + + AliPayConfig copy(AliPayConfig in); + + AliPayConfig toEntity(AlipayConfigParam in); +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/AliPayConfig.java similarity index 76% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/AliPayConfig.java index fdea1e66f..a491e19b8 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/config/AliPayConfig.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/AliPayConfig.java @@ -1,10 +1,9 @@ -package org.dromara.daxpay.channel.alipay.entity.config; +package org.dromara.daxpay.channel.alipay.entity; import cn.bootx.platform.common.mybatisplus.function.ToResult; import cn.bootx.platform.core.util.JsonUtil; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.convert.config.AliPayConfigConvert; -import org.dromara.daxpay.channel.alipay.result.config.AliPayConfigResult; +import org.dromara.daxpay.channel.alipay.convert.config.AlipayConfigConvert; +import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.entity.config.ChannelConfig; import lombok.Data; @@ -13,20 +12,25 @@ import lombok.experimental.Accessors; import java.math.BigDecimal; /** - * 支付宝配置 + * 支付宝配置(防止与sdk中类重名, P大写) * @author xxm * @since 2024/6/25 */ @Data @Accessors(chain = true) -public class AliPayConfig implements ToResult { - +public class AliPayConfig implements ToResult { /** 主键 */ private Long id; + /** 是否为ISV商户(特约商户) */ + private boolean isv; + /** 支付宝商户appId */ private String aliAppId; + /** 支付宝特约商户Token */ + private String appAuthToken; + /** 是否启用 */ private Boolean enable; @@ -77,10 +81,10 @@ public class AliPayConfig implements ToResult { channelConfig.setOutAppId(this.getAliAppId()); channelConfig.setAppId(this.getAppId()); channelConfig.setEnable(this.getEnable()); - channelConfig.setChannel(ChannelEnum.ALIPAY.getCode()); - AliPayConfig copy = AliPayConfigConvert.CONVERT.copy(this); + channelConfig.setChannel(this.isv?ChannelEnum.ALIPAY_ISV.getCode():ChannelEnum.ALIPAY.getCode()); + AliPayConfig copy = AlipayConfigConvert.CONVERT.copy(this); // 清空不需要序列化的字段 - copy.setId(null).setAppId(null).setEnable(null).setAliAppId(null).setAppId(null); + copy.setId(null).setAppId(null).setEnable(null).setAliAppId(null); String jsonStr = JsonUtil.toJsonStr(copy); channelConfig.setExt(jsonStr); return channelConfig; @@ -91,15 +95,15 @@ public class AliPayConfig implements ToResult { */ public static AliPayConfig convertConfig(ChannelConfig channelConfig) { AliPayConfig config = JsonUtil.toBean(channelConfig.getExt(), AliPayConfig.class); - config.setId(channelConfig.getId()) .setAliAppId(channelConfig.getOutAppId()) + .setAppId(channelConfig.getAppId()) .setEnable(channelConfig.isEnable()); return config; } @Override - public AliPayConfigResult toResult() { - return AliPayConfigConvert.CONVERT.toResult(this); + public AlipayConfigResult toResult() { + return AlipayConfigConvert.CONVERT.toResult(this); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AliPayConfigParam.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayConfigParam.java similarity index 86% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AliPayConfigParam.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayConfigParam.java index 5a175d573..7c170006c 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AliPayConfigParam.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/config/AlipayConfigParam.java @@ -1,6 +1,5 @@ package org.dromara.daxpay.channel.alipay.param.config; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import lombok.Data; @@ -16,12 +15,19 @@ import java.math.BigDecimal; @Data @Accessors(chain = true) @Schema(title = "支付宝配置参数") -public class AliPayConfigParam { +public class AlipayConfigParam { /** 主键 */ @Schema(description = "主键") private Long id; + /** 是否为ISV商户(特约商户) */ + @Schema(description = "是否为ISV商户(特约商户)") + private boolean isv; + + /** 支付宝特约商户Token */ + @Schema(description = "支付宝特约商户Token") + private String appAuthToken; /** 支付宝商户appId */ @NotBlank(message = "支付宝AppId不可为空") @@ -40,7 +46,7 @@ public class AliPayConfigParam { /** * 认证类型 证书/公钥 - * @see AliPayCode.AuthType + * @see org.dromara.daxpay.channel.alipay.code.AlipayCode.AuthType */ @Schema(description = "认证类型") @NotBlank(message = "认证类型不可为空") diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AliPayParam.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java similarity index 97% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AliPayParam.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java index 671c42e19..1f6c1c250 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AliPayParam.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/pay/AlipayParam.java @@ -10,7 +10,7 @@ import lombok.Data; */ @Data @Schema(title = "支付宝支付参数") -public class AliPayParam { +public class AlipayParam { /** * 授权码(主动扫描用户的付款码) */ diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AliPayConfigResult.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java similarity index 86% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AliPayConfigResult.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java index 4622c9407..c0063faaf 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AliPayConfigResult.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/config/AlipayConfigResult.java @@ -1,7 +1,6 @@ package org.dromara.daxpay.channel.alipay.result.config; import cn.bootx.platform.common.jackson.sensitive.SensitiveInfo; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; @@ -16,7 +15,7 @@ import java.math.BigDecimal; @Data @Accessors(chain = true) @Schema(title = "支付宝配置") -public class AliPayConfigResult { +public class AlipayConfigResult { /** 主键 */ @Schema(description = "主键") @@ -34,9 +33,13 @@ public class AliPayConfigResult { @Schema(description = "支付限额") private BigDecimal limitAmount; + /** 支付宝特约商户Token */ + @Schema(description = "支付宝特约商户Token") + private String appAuthToken; + /** * 认证类型 证书/公钥 - * @see AliPayCode#AUTH_TYPE_KEY + * @see org.dromara.daxpay.channel.alipay.code.AlipayCode.AuthType */ @Schema(description = "认证类型") private String authType; @@ -80,6 +83,10 @@ public class AliPayConfigResult { @Schema(description = "是否沙箱环境") private boolean sandbox; + /** 商户号 */ + @Schema(description = "商户号") + private String mchNo; + /** 商户AppId */ @Schema(description = "商户AppId") private String appId; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/notice/AliPayOrderChangedResult.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/notice/AlipayOrderChangedResult.java similarity index 99% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/notice/AliPayOrderChangedResult.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/notice/AlipayOrderChangedResult.java index 2cffa433c..aa281b05f 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/notice/AliPayOrderChangedResult.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/notice/AlipayOrderChangedResult.java @@ -11,7 +11,7 @@ import lombok.experimental.Accessors; */ @Data @Accessors(chain = true) -public class AliPayOrderChangedResult { +public class AlipayOrderChangedResult { /** * 必选string(64) diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocReceiverService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocReceiverService.java index cac0905c9..4765ec23d 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocReceiverService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocReceiverService.java @@ -12,8 +12,9 @@ import com.alipay.api.response.AlipayTradeRoyaltyRelationUnbindResponse; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.channel.alipay.code.AlipayCode; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; import org.dromara.daxpay.core.exception.ConfigErrorException; import org.dromara.daxpay.core.exception.TradeStatusErrorException; @@ -27,7 +28,6 @@ import java.util.Objects; import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.*; - /** * 支付宝分账 * @author xxm @@ -37,7 +37,7 @@ import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.*; @Service @RequiredArgsConstructor public class AliPayAllocReceiverService { - private final AliPayConfigService aliPayConfigService; + private final AlipayConfigService aliPayConfigService; /** * 校验 @@ -52,7 +52,7 @@ public class AliPayAllocReceiverService { * 绑定关系 */ @SneakyThrows - public void bind(AllocReceiver allocReceiver){ + public void bind(AllocReceiver allocReceiver, AliPayConfig aliPayConfig){ AlipayTradeRoyaltyRelationBindModel model = new AlipayTradeRoyaltyRelationBindModel(); RoyaltyEntity entity = new RoyaltyEntity(); @@ -67,7 +67,7 @@ public class AliPayAllocReceiverService { AlipayTradeRoyaltyRelationBindRequest request = new AlipayTradeRoyaltyRelationBindRequest(); model.setOutRequestNo(String.valueOf(allocReceiver.getId())); request.setBizModel(model); - AlipayTradeRoyaltyRelationBindResponse response = aliPayConfigService.execute(request); + AlipayTradeRoyaltyRelationBindResponse response = aliPayConfigService.execute(request,aliPayConfig); this.verifyErrorMsg(response); } @@ -75,7 +75,7 @@ public class AliPayAllocReceiverService { * 解绑关系 */ @SneakyThrows - public void unbind(AllocReceiver allocReceiver){ + public void unbind(AllocReceiver allocReceiver, AliPayConfig aliPayConfig){ AlipayTradeRoyaltyRelationUnbindModel model = new AlipayTradeRoyaltyRelationUnbindModel(); model.setOutRequestNo(String.valueOf(allocReceiver.getId())); @@ -87,9 +87,9 @@ public class AliPayAllocReceiverService { model.setReceiverList(Collections.singletonList(entity)); AlipayTradeRoyaltyRelationUnbindRequest request = new AlipayTradeRoyaltyRelationUnbindRequest(); request.setBizModel(model); - AlipayTradeRoyaltyRelationUnbindResponse response = aliPayConfigService.execute(request); + AlipayTradeRoyaltyRelationUnbindResponse response = aliPayConfigService.execute(request,aliPayConfig); // 如果出现分账方不存在也视为成功 - if (Objects.equals(response.getSubCode(), AliPayCode.USER_NOT_EXIST)) { + if (Objects.equals(response.getSubCode(), AlipayCode.USER_NOT_EXIST)) { return; } this.verifyErrorMsg(response); @@ -99,7 +99,7 @@ public class AliPayAllocReceiverService { * 验证错误信息 */ private void verifyErrorMsg(AlipayResponse alipayResponse) { - if (!Objects.equals(alipayResponse.getCode(), AliPayCode.ResponseCode.SUCCESS)) { + if (!Objects.equals(alipayResponse.getCode(), AlipayCode.ResponseCode.SUCCESS)) { String errorMsg = alipayResponse.getSubMsg(); if (StrUtil.isBlank(errorMsg)) { errorMsg = alipayResponse.getMsg(); diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java index d0e5d1369..ed2888445 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java @@ -2,6 +2,17 @@ package org.dromara.daxpay.channel.alipay.service.allocation; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; +import org.dromara.daxpay.channel.alipay.code.AlipayCode; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.core.enums.AllocDetailResultEnum; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; @@ -14,16 +25,6 @@ import com.alipay.api.response.AlipayTradeOrderSettleQueryResponse; import com.alipay.api.response.AlipayTradeOrderSettleResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; -import org.dromara.daxpay.core.enums.AllocDetailResultEnum; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; -import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; -import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; -import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -43,17 +44,17 @@ import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class AliPayAllocationService { - private final AliPayConfigService aliPayConfigService; + private final AlipayConfigService aliPayConfigService; /** * 发起分账 */ - public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails){ + public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails, AliPayConfig aliPayConfig){ // 分账主体参数 AlipayTradeOrderSettleModel model = new AlipayTradeOrderSettleModel(); model.setOutRequestNo(allocOrder.getAllocNo()); model.setTradeNo(allocOrder.getOutOrderNo()); - model.setRoyaltyMode(AliPayCode.ALLOC_ASYNC); + model.setRoyaltyMode(AlipayCode.ALLOC_ASYNC); // 分账子参数 根据Id排序 orderDetails.sort(Comparator.comparing(MpIdEntity::getId)); @@ -70,7 +71,7 @@ public class AliPayAllocationService { request.setBizModel(model); AlipayTradeOrderSettleResponse response; try { - response = aliPayConfigService.execute(request); + response = aliPayConfigService.execute(request,aliPayConfig); this.verifyErrorMsg(response); } catch (AlipayApiException e) { log.error("网关返回分账失败: {}", e.getMessage()); @@ -84,12 +85,12 @@ public class AliPayAllocationService { /** * 分账完结 */ - public void finish(AllocOrder allocOrder, List orderDetails){ + public void finish(AllocOrder allocOrder, List orderDetails, AliPayConfig aliPayConfig){ // 分账主体参数 AlipayTradeOrderSettleModel model = new AlipayTradeOrderSettleModel(); model.setOutRequestNo(allocOrder.getAllocNo()); model.setTradeNo(allocOrder.getOutOrderNo()); - model.setRoyaltyMode(AliPayCode.ALLOC_ASYNC); + model.setRoyaltyMode(AlipayCode.ALLOC_ASYNC); // 分账完结参数 SettleExtendParams extendParams = new SettleExtendParams(); extendParams.setRoyaltyFinish(Boolean.TRUE.toString()); @@ -110,7 +111,7 @@ public class AliPayAllocationService { request.setBizModel(model); AlipayTradeOrderSettleResponse response = null; try { - response = aliPayConfigService.execute(request); + response = aliPayConfigService.execute(request,aliPayConfig); } catch (AlipayApiException e) { log.error("网关返回分账失败: {}", e.getMessage()); throw new TradeFailException(e.getMessage()); @@ -121,7 +122,7 @@ public class AliPayAllocationService { /** * 分账状态同步 */ - public AllocSyncResultBo sync(AllocOrder allocOrder, List allocOrderDetails){ + public AllocSyncResultBo sync(AllocOrder allocOrder, List allocOrderDetails, AliPayConfig aliPayConfig){ AlipayTradeOrderSettleQueryModel model = new AlipayTradeOrderSettleQueryModel(); model.setOutRequestNo(allocOrder.getAllocNo()); model.setTradeNo(allocOrder.getOutOrderNo()); @@ -129,7 +130,7 @@ public class AliPayAllocationService { request.setBizModel(model); AlipayTradeOrderSettleQueryResponse response; try { - response = aliPayConfigService.execute(request); + response = aliPayConfigService.execute(request,aliPayConfig); } catch (AlipayApiException e) { throw new OperationFailException(e.getMessage()); } @@ -175,11 +176,11 @@ public class AliPayAllocationService { */ private AllocDetailResultEnum getDetailResultEnum (String result){ // 进行中 - if(Objects.equals(AliPayCode.ALLOC_PROCESSING, result)){ + if(Objects.equals(AlipayCode.ALLOC_PROCESSING, result)){ return AllocDetailResultEnum.PENDING; } // 成功 - if(Objects.equals(AliPayCode.ALLOC_SUCCESS, result)){ + if(Objects.equals(AlipayCode.ALLOC_SUCCESS, result)){ return AllocDetailResultEnum.SUCCESS; } // 失败 diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/AliPayCallbackService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/AliPayCallbackService.java index faa98e5e6..fe9ddface 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/AliPayCallbackService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/AliPayCallbackService.java @@ -1,6 +1,14 @@ package org.dromara.daxpay.channel.alipay.service.callback; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.StrUtil; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.alipay.code.AlipayCode.PayStatus; +import org.dromara.daxpay.channel.alipay.code.AlipayCode.ResponseParams; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.CallbackStatusEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.PayStatusEnum; @@ -11,12 +19,6 @@ import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService; import org.dromara.daxpay.service.service.trade.pay.PayCallbackService; import org.dromara.daxpay.service.service.trade.refund.RefundCallbackService; -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.LocalDateTimeUtil; -import cn.hutool.core.util.StrUtil; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -24,8 +26,6 @@ import java.time.LocalDateTime; import java.util.Map; import java.util.Objects; -import static org.dromara.daxpay.channel.alipay.code.AliPayCode.*; - /** * 支付宝回调服务 * @@ -35,9 +35,9 @@ import static org.dromara.daxpay.channel.alipay.code.AliPayCode.*; @Slf4j @Service @RequiredArgsConstructor -public class AliPayCallbackService { +public class AlipayCallbackService { - private final AliPayConfigService aliPayConfigService; + private final AlipayConfigService aliPayConfigService; private final PayCallbackService payCallbackService; private final TradeCallbackRecordService tradeCallbackRecordService; private final RefundCallbackService refundCallbackService; @@ -45,14 +45,14 @@ public class AliPayCallbackService { /** * 回调处理 */ - public String callbackHandle(HttpServletRequest request) { + public String callbackHandle(HttpServletRequest request, boolean isv) { Map callbackParam = PayUtil.toMap(request); // 判断为支付还是退款 - TradeTypeEnum tradeTypeEnum = this.resolveAndGetType(callbackParam); + TradeTypeEnum tradeTypeEnum = this.resolveAndGetType(callbackParam,isv); if (tradeTypeEnum == TradeTypeEnum.PAY){ // 支付回调处理 - if (this.payHandler(callbackParam)){ + if (this.payHandler(callbackParam,isv)){ // 执行回调业务处理 payCallbackService.payCallback(); // 保存记录 @@ -65,7 +65,7 @@ public class AliPayCallbackService { } } else { // 解析数据 - if (this.refundHandle(callbackParam)){ + if (this.refundHandle(callbackParam,isv)){ // 执行退款回调处理 refundCallbackService.refundCallback(); // 保存记录 @@ -82,11 +82,11 @@ public class AliPayCallbackService { /** * 解析回调内容并返回类型 */ - public TradeTypeEnum resolveAndGetType(Map callbackParam){ + public TradeTypeEnum resolveAndGetType(Map callbackParam, boolean isv){ CallbackLocal callback = PaymentContextLocal.get().getCallbackInfo(); callback.setCallbackData(callbackParam); // 通道和回调类型 - callback.setChannel(ChannelEnum.ALIPAY.getCode()); + callback.setChannel(isv? ChannelEnum.ALIPAY_ISV.getCode():ChannelEnum.ALIPAY.getCode()); String refundFee = callbackParam.get(ResponseParams.REFUND_FEE); // 如果有退款金额,说明是退款回调 if (StrUtil.isNotBlank(refundFee)){ @@ -102,15 +102,14 @@ public class AliPayCallbackService { /** * 支付回调处理, 解析数据 */ - public boolean payHandler(Map callbackParam) { + public boolean payHandler(Map callbackParam, boolean isv) { CallbackLocal callback = PaymentContextLocal.get().getCallbackInfo(); - if (!aliPayConfigService.verifyNotify(callbackParam)) { + if (!aliPayConfigService.verifyNotify(callbackParam,isv)) { log.error("支付宝回调报文验签失败"); callback.setCallbackStatus(CallbackStatusEnum.FAIL).setCallbackErrorMsg("支付宝回调报文验签失败"); return false; } - // 网关订单号 callback.setOutTradeNo(callbackParam.get(ResponseParams.TRADE_NO)); // 支付订单ID @@ -136,10 +135,10 @@ public class AliPayCallbackService { /** * 退款回调处理 */ - public boolean refundHandle(Map callbackParam ) { + public boolean refundHandle(Map callbackParam, boolean isv) { CallbackLocal callback = PaymentContextLocal.get().getCallbackInfo(); // 验签 - if (!aliPayConfigService.verifyNotify(callbackParam)) { + if (!aliPayConfigService.verifyNotify(callbackParam, isv)) { log.error("支付宝回调报文验签失败"); callback.setCallbackStatus(CallbackStatusEnum.FAIL).setCallbackErrorMsg("支付宝回调报文验签失败"); return false; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/close/AliPayCloseService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/close/AliPayCloseService.java index f794eae36..e717111c3 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/close/AliPayCloseService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/close/AliPayCloseService.java @@ -1,15 +1,16 @@ package org.dromara.daxpay.channel.alipay.service.close; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; -import org.dromara.daxpay.channel.alipay.service.sync.AliPaySyncService; +import org.dromara.daxpay.channel.alipay.code.AlipayCode; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.sync.AlipaySyncService; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.core.exception.TradeStatusErrorException; import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayConstants; import com.alipay.api.domain.AlipayTradeCancelModel; import com.alipay.api.domain.AlipayTradeCloseModel; import com.alipay.api.request.AlipayTradeCancelRequest; @@ -32,8 +33,8 @@ import java.util.Objects; @Service @RequiredArgsConstructor public class AliPayCloseService { - private final AliPayConfigService aliPayConfigService; - private final AliPaySyncService aliPaySyncService; + private final AlipayConfigService aliPayConfigService; + private final AlipaySyncService aliPaySyncService; /** * 关闭支付 此处使用交易关闭接口 @@ -43,22 +44,26 @@ public class AliPayCloseService { * 2. 如果返回"当前交易状态不支持此操作", 同步网关支付状态, 判断网关是否已经被关闭 * */ - public void close(PayOrder payOrder, AliPayConfig config) { + public void close(PayOrder payOrder, AliPayConfig aliPayConfig) { AlipayTradeCloseModel model = new AlipayTradeCloseModel(); model.setOutTradeNo(payOrder.getOrderNo()); AlipayTradeCloseRequest request = new AlipayTradeCloseRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } request.setBizModel(model); try { - AlipayTradeCloseResponse response = aliPayConfigService.execute(request); - if (!Objects.equals(AliPayCode.ResponseCode.SUCCESS, response.getCode())) { + AlipayTradeCloseResponse response = aliPayConfigService.execute(request,aliPayConfig); + if (!response.isSuccess()) { // 如果返回"当前交易状态不支持此操作", 查询网关支付状态, 判断网关是否已经被关闭 - if (Objects.equals(response.getSubCode(),AliPayCode.ResponseCode.ACQ_TRADE_STATUS_ERROR)){ - if (this.syncStatus(payOrder, config)){ + if (Objects.equals(response.getSubCode(), AlipayCode.ResponseCode.ACQ_TRADE_STATUS_ERROR)){ + if (this.syncStatus(payOrder, aliPayConfig)){ return; } } // 返回"交易不存在"视同关闭成功 - if (Objects.equals(response.getSubCode(),AliPayCode.ResponseCode.ACQ_TRADE_NOT_EXIST)){ + if (Objects.equals(response.getSubCode(), AlipayCode.ResponseCode.ACQ_TRADE_NOT_EXIST)){ return; } log.error("网关返回关闭失败: {}", response.getSubMsg()); @@ -74,28 +79,30 @@ public class AliPayCloseService { * 可以视为一个特殊的接口, 需要专门签约这个接口的权限 * */ - public void cancel(PayOrder payOrder, AliPayConfig config) { + public void cancel(PayOrder payOrder, AliPayConfig aliPayConfig) { AlipayTradeCancelModel model = new AlipayTradeCancelModel(); model.setOutTradeNo(payOrder.getOrderNo()); AlipayTradeCancelRequest request = new AlipayTradeCancelRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } request.setBizModel(model); try { - AlipayTradeCancelResponse response = aliPayConfigService.execute(request); - if (!Objects.equals(AliPayCode.ResponseCode.SUCCESS, response.getCode())) { - if (!Objects.equals(AliPayCode.ResponseCode.SUCCESS, response.getCode())) { + AlipayTradeCancelResponse response = aliPayConfigService.execute(request,aliPayConfig); + if (!response.isSuccess()) { // 如果返回"当前交易状态不支持此操作", 查询网关支付状态, 判断网关是否已经被关闭 - if (Objects.equals(response.getSubCode(),AliPayCode.ResponseCode.ACQ_TRADE_STATUS_ERROR)){ - if (this.syncStatus(payOrder, config)){ + if (Objects.equals(response.getSubCode(), AlipayCode.ResponseCode.ACQ_TRADE_STATUS_ERROR)){ + if (this.syncStatus(payOrder, aliPayConfig)){ return; } } // 返回"交易不存在"视同关闭成功 - if (Objects.equals(response.getSubCode(),AliPayCode.ResponseCode.ACQ_TRADE_NOT_EXIST)){ + if (Objects.equals(response.getSubCode(), AlipayCode.ResponseCode.ACQ_TRADE_NOT_EXIST)){ return; } log.error("网关返回关闭失败: {}", response.getSubMsg()); throw new OperationFailException(response.getSubMsg()); - } } } catch (AlipayApiException e) { log.error("关闭订单失败:", e); @@ -108,7 +115,7 @@ public class AliPayCloseService { * 关闭失败后, 获取支付网关的状态, 如果是关闭返回true, 其他情况抛出异常 */ private boolean syncStatus(PayOrder payOrder, AliPayConfig config){ - PaySyncResultBo gatewaySyncResult = aliPaySyncService.syncPayStatus(payOrder); + PaySyncResultBo gatewaySyncResult = aliPaySyncService.syncPayStatus(payOrder,config); // 已经关闭 if (Objects.equals(gatewaySyncResult.getPayStatus(), PayStatusEnum.CLOSE)){ return true; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AliPayConfigService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AlipayConfigService.java similarity index 73% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AliPayConfigService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AlipayConfigService.java index 9b1398087..376af1fc2 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AliPayConfigService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AlipayConfigService.java @@ -11,11 +11,11 @@ import com.alipay.api.internal.util.AlipaySignature; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.convert.config.AliPayConfigConvert; -import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; -import org.dromara.daxpay.channel.alipay.param.config.AliPayConfigParam; -import org.dromara.daxpay.channel.alipay.result.config.AliPayConfigResult; +import org.dromara.daxpay.channel.alipay.code.AlipayCode; +import org.dromara.daxpay.channel.alipay.convert.config.AlipayConfigConvert; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.param.config.AlipayConfigParam; +import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.exception.ChannelNotEnableException; import org.dromara.daxpay.core.exception.ConfigNotEnableException; @@ -24,6 +24,7 @@ import org.dromara.daxpay.service.common.cache.ChannelConfigCacheService; import org.dromara.daxpay.service.common.context.MchAppLocal; import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.dao.config.ChannelConfigManager; +import org.dromara.daxpay.service.dao.merchant.MchAppManager; import org.dromara.daxpay.service.entity.config.ChannelConfig; import org.dromara.daxpay.service.service.config.PlatformConfigService; import org.springframework.stereotype.Service; @@ -40,26 +41,28 @@ import java.util.Objects; @Slf4j @Service @RequiredArgsConstructor -public class AliPayConfigService { +public class AlipayConfigService { private final ChannelConfigManager channelConfigManager; private final ChannelConfigCacheService channelConfigCacheService; private final PlatformConfigService platformConfigService; + private final MchAppManager mchAppManager; /** * 查询 */ - public AliPayConfigResult findById(Long id) { + public AlipayConfigResult findById(Long id) { return channelConfigManager.findById(id) .map(AliPayConfig::convertConfig) .map(AliPayConfig::toResult) - .orElseThrow(() -> new ConfigNotEnableException("支付宝配置不存在")); + .orElseThrow(() -> new ConfigNotEnableException("支付宝商户配置不存在")); } + /** - * 新增或更新 + * 新增或更新商户信息 */ @Transactional(rollbackFor = Exception.class) - public void saveOrUpdate(AliPayConfigParam param){ + public void saveOrUpdate(AlipayConfigParam param){ if (param.getId() == null){ this.save(param); } else { @@ -68,13 +71,13 @@ public class AliPayConfigService { } /** - * 添加 + * 添加商户信息 */ - public void save(AliPayConfigParam param) { - AliPayConfig entity = AliPayConfigConvert.CONVERT.toEntity(param); + public void save(AlipayConfigParam param) { + var entity = AlipayConfigConvert.CONVERT.toEntity(param); ChannelConfig channelConfig = entity.toChannelConfig(); - // 判断商户应用下是否存在该配置 - if (channelConfigManager.existsByAppIdAndChannel(channelConfig.getAppId(), channelConfig.getChannel())){ + // 判断商户和应用下是否存在该配置 + if (channelConfigManager.existsByAppIdAndChannel(param.getAppId(), channelConfig.getChannel())){ throw new DataErrorException("该应用下已存在支付宝配置, 请勿重新添加"); } channelConfigManager.save(channelConfig); @@ -83,7 +86,7 @@ public class AliPayConfigService { /** * 更新 */ - public void update(AliPayConfigParam param){ + public void update(AlipayConfigParam param){ ChannelConfig channelConfig = channelConfigManager.findById(param.getId()) .orElseThrow(() -> new ConfigNotEnableException("支付宝配置不存在")); // 通道配置 --转换--> 支付宝配置 ----> 从更新参数赋值 --转换--> 通道配置 ----> 保存更新 @@ -96,52 +99,47 @@ public class AliPayConfigService { channelConfigManager.updateById(channelConfig); } + /** * 获取异步通知地址 */ - public String getNotifyUrl() { + public String getNotifyUrl(boolean isv) { + String url = isv?"{}/unipay/callback/{}/alipay/isv":"{}/unipay/callback/{}/alipay"; var mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); var platformInfo = platformConfigService.getConfig(); - return StrUtil.format("{}/unipay/callback/{}/alipay",platformInfo.getGatewayServiceUrl(), mchAppInfo.getAppId()); + return StrUtil.format(url,platformInfo.getGatewayServiceUrl(), mchAppInfo.getAppId()); } /** * 获取同步通知地址 */ - public String getReturnUrl() { + public String getReturnUrl(boolean isv) { + String url = isv?"{}/unipay/return/{}/alipay/isv":"{}/unipay/return/{}/alipay"; MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); var platformInfo = platformConfigService.getConfig(); - return StrUtil.format("{}/unipay/return/{}/alipay",platformInfo.getGatewayServiceUrl(), mchAppInfo.getAppId()); + return StrUtil.format(url,platformInfo.getGatewayServiceUrl(), mchAppInfo.getAppId()); } /** * 获取支付宝支付配置 */ - public AliPayConfig getAliPayConfig(){ + public AliPayConfig getAliPayConfig(boolean isv){ MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - ChannelConfig channelConfig = channelConfigCacheService.get(mchAppInfo.getAppId(), ChannelEnum.ALIPAY.getCode()); + ChannelConfig channelConfig = channelConfigCacheService.get(mchAppInfo.getAppId(), isv?ChannelEnum.ALIPAY_ISV.getCode():ChannelEnum.ALIPAY.getCode()); return AliPayConfig.convertConfig(channelConfig); } /** * 获取并检查支付配置 */ - public AliPayConfig getAndCheckConfig() { - var payConfig = this.getAliPayConfig(); + public AliPayConfig getAndCheckConfig(boolean isv) { + var payConfig = this.getAliPayConfig(isv); if (!payConfig.getEnable()){ throw new ChannelNotEnableException("支付宝支付通道未启用"); } return payConfig; } - /** - * 获取支付宝SDK的配置 - */ - public AlipayClient getAlipayClient(){ - AliPayConfig aliPayConfig = this.getAndCheckConfig(); - return this.getAlipayClient(aliPayConfig); - } - /** * 获取支付宝SDK的配置 */ @@ -153,7 +151,7 @@ public class AliPayConfigService { config.setCharset("UTF-8"); config.setSignType(aliPayConfig.getSignType()); // 证书 - if (Objects.equals(aliPayConfig.getAuthType(), AliPayCode.AuthType.AUTH_TYPE_CART)){ + if (Objects.equals(aliPayConfig.getAuthType(), AlipayCode.AuthType.AUTH_TYPE_CART)){ config.setPrivateKey(aliPayConfig.getPrivateKey()); config.setAppCertContent(aliPayConfig.getAppCert()); config.setRootCertContent(aliPayConfig.getAlipayRootCert()); @@ -165,18 +163,17 @@ public class AliPayConfigService { } // 沙箱 if (aliPayConfig.isSandbox()){ - config.setServerUrl(AliPayCode.ServerUrl.SANDBOX); + config.setServerUrl(AlipayCode.ServerUrl.SANDBOX); } else { - config.setServerUrl(AliPayCode.ServerUrl.PRODUCTION); + config.setServerUrl(AlipayCode.ServerUrl.PRODUCTION); } - return new DefaultAlipayClient(config); } /** * 校验消息通知 */ - public boolean verifyNotify(Map params) { + public boolean verifyNotify(Map params, boolean isv) { String callReq = JsonUtil.toJsonStr(params); log.info("支付宝消息通知报文: {}", callReq); String appId = params.get("app_id"); @@ -184,14 +181,14 @@ public class AliPayConfigService { log.error("支付宝消息通知报文appId为空"); return false; } - AliPayConfig alipayConfig = this.getAliPayConfig(); + AliPayConfig alipayConfig = this.getAliPayConfig(isv); if (Objects.isNull(alipayConfig)) { log.error("支付宝支付配置不存在"); return false; } // 根据认证类型使用证书或公钥验签 try { - if (Objects.equals(alipayConfig.getAuthType(), AliPayCode.AuthType.AUTH_TYPE_KEY)) { + if (Objects.equals(alipayConfig.getAuthType(), AlipayCode.AuthType.AUTH_TYPE_KEY)) { return AlipaySignature.verifyV1(params, alipayConfig.getAlipayPublicKey(), CharsetUtil.UTF_8, AlipayConstants.SIGN_TYPE_RSA2); } else { @@ -203,17 +200,16 @@ public class AliPayConfigService { } } + /** * 接口调用 */ - public T execute(AlipayRequest request) throws AlipayApiException { - AliPayConfig aliPayConfig = this.getAliPayConfig(); + public T execute(AlipayRequest request, AliPayConfig aliPayConfig) throws AlipayApiException { AlipayClient alipayClient = this.getAlipayClient(aliPayConfig); - if (Objects.equals(aliPayConfig.getAuthType(), AliPayCode.AuthType.AUTH_TYPE_CART)){ - return this.getAlipayClient().certificateExecute(request); + if (Objects.equals(aliPayConfig.getAuthType(), AlipayCode.AuthType.AUTH_TYPE_CART)){ + return alipayClient.certificateExecute(request); } else { return alipayClient.execute(request); } } - } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/extra/AliPayAuthService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/extra/AlipayAuthService.java similarity index 75% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/extra/AliPayAuthService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/extra/AlipayAuthService.java index e35de6bc5..ba4dbd853 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/extra/AliPayAuthService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/extra/AlipayAuthService.java @@ -1,21 +1,19 @@ package org.dromara.daxpay.channel.alipay.service.extra; import cn.bootx.platform.core.exception.BizException; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; -import com.alipay.api.AlipayClient; -import com.alipay.api.request.AlipaySystemOauthTokenRequest; -import com.alipay.api.response.AlipaySystemOauthTokenResponse; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; import org.dromara.daxpay.core.result.assist.AuthResult; import org.dromara.daxpay.core.result.assist.AuthUrlResult; import org.dromara.daxpay.service.entity.config.PlatformConfig; import org.dromara.daxpay.service.service.config.PlatformConfigService; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.alipay.api.request.AlipaySystemOauthTokenRequest; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** @@ -26,9 +24,9 @@ import org.springframework.stereotype.Service; @Slf4j @Service @RequiredArgsConstructor -public class AliPayAuthService { +public class AlipayAuthService { - private final AliPayConfigService aliPayConfigService; + private final AlipayConfigService aliPayConfigService; private final PlatformConfigService platformsConfigService; @@ -37,19 +35,17 @@ public class AliPayAuthService { * 1. 如果手动传输授权回调地址, 不进行处理 * 2. 如果未手动传输授权回调地址, 使用系统默认的授权页地址, 返回授权页地址和用于查询的标识码 */ - public AuthUrlResult generateAuthUrl(GenerateAuthUrlParam param) { + public AuthUrlResult generateAuthUrl(GenerateAuthUrlParam param, AliPayConfig aliPayConfig) { // 如果手动传输, 直接返回空, 因为支付宝OpenId方式不用通过回调获取 if (StrUtil.isAllNotBlank(param.getAuthRedirectUrl())){ return new AuthUrlResult(); } else { PlatformConfig platformConfig = platformsConfigService.getConfig(); - AliPayConfig aliPayConfig = aliPayConfigService.getAndCheckConfig(); String queryCode = RandomUtil.randomString(10); - // 授权地址 - String serverUrl = platformConfig.getGatewayMobileUrl(); + String serverUrl = platformConfig.getGatewayMobileUrl(); String authUrl = StrUtil.format("{}/auth/alipay/{}/{}/{}/{}", - serverUrl, param.getAppId(),param.getChannel(),queryCode,aliPayConfig.getAliAppId()); + serverUrl, param.getAppId(), param.getChannel(), queryCode, aliPayConfig.getAliAppId()); return new AuthUrlResult().setAuthUrl(authUrl).setQueryCode(queryCode); } @@ -59,16 +55,15 @@ public class AliPayAuthService { * 获取OpenId或者userid用户标识 */ @SneakyThrows - public AuthResult getOpenIdOrUserId(String authCode) { + public AuthResult getOpenIdOrUserId(String authCode, AliPayConfig aliPayConfig) { // 初始化SDK - AlipayClient alipayClient = aliPayConfigService.getAlipayClient(); // 构造请求参数以调用接口 AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); // 设置授权码 request.setCode(authCode); // 设置授权方式 request.setGrantType("authorization_code"); - AlipaySystemOauthTokenResponse response = alipayClient.execute(request); + var response = aliPayConfigService.execute(request,aliPayConfig); if (!response.isSuccess()) { log.warn("获取支付宝OpenId失败,原因:{}", response.getSubMsg()); throw new BizException("获取支付宝OpenId失败"); diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AliPayNoticeReceiverService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AlipayNoticeReceiverService.java similarity index 76% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AliPayNoticeReceiverService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AlipayNoticeReceiverService.java index 1cd74db28..dca339e21 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AliPayNoticeReceiverService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AlipayNoticeReceiverService.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.channel.alipay.service.notice; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.util.PayUtil; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; @@ -17,19 +17,19 @@ import java.util.Map; @Slf4j @Service @RequiredArgsConstructor -public class AliPayNoticeReceiverService { +public class AlipayNoticeReceiverService { - private final AliPayConfigService aliPayConfigService; + private final AlipayConfigService aliPayConfigService; - private final AliPayTransferNoticeService aliPayTransferNoticeService; + private final AlipayTransferNoticeService aliPayTransferNoticeService; /** * 通知消息处理 */ - public String noticeReceiver(HttpServletRequest request) { + public String noticeReceiver(HttpServletRequest request, boolean isv) { Map map = PayUtil.toMap(request); // 首先进行验签 - if (!aliPayConfigService.verifyNotify(map)){ + if (!aliPayConfigService.verifyNotify(map,isv)){ log.error("支付宝消息通知验签失败"); return "fail"; } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AliPayTransferNoticeService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AlipayTransferNoticeService.java similarity index 86% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AliPayTransferNoticeService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AlipayTransferNoticeService.java index 2c444eacd..5108513e2 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AliPayTransferNoticeService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/notice/AlipayTransferNoticeService.java @@ -1,8 +1,11 @@ package org.dromara.daxpay.channel.alipay.service.notice; import cn.bootx.platform.core.util.JsonUtil; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.result.notice.AliPayOrderChangedResult; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.alipay.code.AlipayCode; +import org.dromara.daxpay.channel.alipay.result.notice.AlipayOrderChangedResult; import org.dromara.daxpay.core.enums.CallbackStatusEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.TradeTypeEnum; @@ -11,9 +14,6 @@ import org.dromara.daxpay.service.common.context.CallbackLocal; import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService; import org.dromara.daxpay.service.service.trade.transfer.TransferCallbackService; -import cn.hutool.core.bean.BeanUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; @@ -28,7 +28,7 @@ import java.util.Objects; @Slf4j @Service @RequiredArgsConstructor -public class AliPayTransferNoticeService { +public class AlipayTransferNoticeService { private final TransferCallbackService transferCallbackService; private final TradeCallbackRecordService tradeCallbackRecordService; @@ -57,7 +57,7 @@ public class AliPayTransferNoticeService { // 通过 biz_content 获取值 try { String bizContent = map.get("biz_content"); - var response = JsonUtil.toBean(bizContent, AliPayOrderChangedResult.class); + var response = JsonUtil.toBean(bizContent, AlipayOrderChangedResult.class); callbackInfo.setCallbackData(BeanUtil.beanToMap(response)); this.resolveData(response); return "success"; @@ -71,7 +71,7 @@ public class AliPayTransferNoticeService { /** * 解析数据 */ - public void resolveData(AliPayOrderChangedResult response) { + public void resolveData(AlipayOrderChangedResult response) { CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); // 设置网关订单号 @@ -79,19 +79,19 @@ public class AliPayTransferNoticeService { String status = response.getStatus(); // SUCCESS:转账成功; - if (Objects.equals(status, AliPayCode.TransferStatus.SUCCESS)){ + if (Objects.equals(status, AlipayCode.TransferStatus.SUCCESS)){ callbackInfo.setTradeStatus(TransferStatusEnum.SUCCESS.getCode()); } // WAIT_PAY:等待支付;DEALING:处理中(适用于"单笔转账到银行卡") - if (List.of(AliPayCode.TransferStatus.DEALING, AliPayCode.TransferStatus.WAIT_PAY).contains(status)){ + if (List.of(AlipayCode.TransferStatus.DEALING, AlipayCode.TransferStatus.WAIT_PAY).contains(status)){ callbackInfo.setTradeStatus(TransferStatusEnum.PROGRESS.getCode()); } // FAIL:失败(适用于"单笔转账到银行卡"); - if (Objects.equals(AliPayCode.TransferStatus.FAIL, status)){ + if (Objects.equals(AlipayCode.TransferStatus.FAIL, status)){ callbackInfo.setTradeStatus(TransferStatusEnum.FAIL.getCode()).setTradeErrorMsg(response.getSubOrderFailReason()); } // REFUND:退票(适用于"单笔转账到银行卡"); CLOSED:订单超时关闭; - if (List.of(AliPayCode.TransferStatus.CLOSED, AliPayCode.TransferStatus.REFUND).contains(status)){ + if (List.of(AlipayCode.TransferStatus.CLOSED, AlipayCode.TransferStatus.REFUND).contains(status)){ callbackInfo.setTradeStatus(TransferStatusEnum.CLOSE.getCode()).setTradeErrorMsg(response.getSubOrderFailReason()); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/pay/AliPayService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/pay/AliPayService.java index f254ac26f..1ce4a6721 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/pay/AliPayService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/pay/AliPayService.java @@ -1,10 +1,10 @@ package org.dromara.daxpay.channel.alipay.service.pay; import cn.bootx.platform.core.util.BigDecimalUtil; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; -import org.dromara.daxpay.channel.alipay.param.pay.AliPayParam; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.channel.alipay.code.AlipayCode; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.param.pay.AlipayParam; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.PayMethodEnum; import org.dromara.daxpay.core.exception.AmountExceedLimitException; import org.dromara.daxpay.core.exception.TradeFailException; @@ -17,6 +17,7 @@ import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.StrUtil; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; +import com.alipay.api.AlipayConstants; import com.alipay.api.AlipayResponse; import com.alipay.api.domain.*; import com.alipay.api.request.*; @@ -41,15 +42,14 @@ import java.util.Objects; @RequiredArgsConstructor public class AliPayService { - private final AliPayConfigService aliPayConfigService; + private final AlipayConfigService aliPayConfigService; /** * 支付前检查支付方式是否可用 */ - public void validation(PayParam payParam) { - AliPayConfig alipayConfig = aliPayConfigService.getAndCheckConfig(); + public void validation(PayParam payParam, AliPayConfig aliPayConfig) { // 验证订单金额是否超限 - if(BigDecimalUtil.isGreaterThan(payParam.getAmount(), alipayConfig.getLimitAmount())){ + if(BigDecimalUtil.isGreaterThan(payParam.getAmount(), aliPayConfig.getLimitAmount())){ throw new AmountExceedLimitException("支付宝支付金额超过限额"); } } @@ -57,34 +57,34 @@ public class AliPayService { /** * 调起支付 */ - public PayResultBo pay(PayOrder payOrder, AliPayParam aliPayParam) { + public PayResultBo pay(PayOrder payOrder, AlipayParam aliPayParam, AliPayConfig aliPayConfig) { String amount = PayUtil.toDecimal(payOrder.getAmount()).toString(); String payBody = null; // 异步线程存储 PayResultBo payResult = new PayResultBo(); // wap支付 if (Objects.equals(payOrder.getMethod(), PayMethodEnum.WAP.getCode())) { - payBody = this.wapPay(amount, payOrder); + payBody = this.wapPay(amount, payOrder, aliPayConfig); } - // APP支付 + // 程序支付 else if (Objects.equals(payOrder.getMethod(), PayMethodEnum.APP.getCode())) { - payBody = this.appPay(amount, payOrder); + payBody = this.appPay(amount, payOrder, aliPayConfig); } // pc支付 else if (Objects.equals(payOrder.getMethod(), PayMethodEnum.WEB.getCode())) { - payBody = this.webPay(amount, payOrder); + payBody = this.webPay(amount, payOrder, aliPayConfig); } // jsapi支付 else if (Objects.equals(payOrder.getMethod(), PayMethodEnum.JSAPI.getCode())) { - payBody = this.jsapiPay(amount, payOrder, aliPayParam); + payBody = this.jsapiPay(amount, payOrder, aliPayParam, aliPayConfig); } // 二维码支付 else if (Objects.equals(payOrder.getMethod(), PayMethodEnum.QRCODE.getCode())) { - payBody = this.qrCodePay(amount, payOrder); + payBody = this.qrCodePay(amount, payOrder, aliPayConfig); } // 付款码支付, 付款码存在直接支付成功的情况, 所以返回结果特殊处理 else if (Objects.equals(payOrder.getMethod(), PayMethodEnum.BARCODE.getCode())) { - this.barCode(amount, payOrder, aliPayParam, payResult); + this.barCode(amount, payOrder, aliPayParam, payResult, aliPayConfig); return payResult; } // 通常是发起支付的参数 @@ -96,9 +96,9 @@ public class AliPayService { * wap支付 */ @SneakyThrows - public String wapPay(String amount, PayOrder payOrder) { + public String wapPay(String amount, PayOrder payOrder, AliPayConfig aliPayConfig) { // 获取支付宝客户端 - AlipayClient alipayClient = aliPayConfigService.getAlipayClient(); + AlipayClient alipayClient = aliPayConfigService.getAlipayClient(aliPayConfig); AlipayTradeWapPayModel model = new AlipayTradeWapPayModel(); model.setSubject(payOrder.getTitle()); @@ -106,7 +106,7 @@ public class AliPayService { model.setTotalAmount(amount); // 过期时间 model.setTimeExpire(this.getAliTimeExpire(payOrder.getExpiredTime())); - model.setProductCode(AliPayCode.Products.QUICK_WAP_PAY); + model.setProductCode(AlipayCode.Products.QUICK_WAP_PAY); // 是否分账 if (payOrder.getAllocation()){ ExtendParams extendParams = new ExtendParams(); @@ -115,11 +115,15 @@ public class AliPayService { } AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } request.setBizModel(model); // 异步回调必须到当前支付网关系统中, 然后系统负责转发 - request.setNotifyUrl(aliPayConfigService.getNotifyUrl()); + request.setNotifyUrl(aliPayConfigService.getNotifyUrl(aliPayConfig.isIsv())); // 同步回调地址必须到当前支付网关系统中, 然后系统负责跳转 - request.setReturnUrl(aliPayConfigService.getReturnUrl()); + request.setReturnUrl(aliPayConfigService.getReturnUrl(aliPayConfig.isIsv())); try { // 通过GET方式的请求, 返回URL的响应, 默认是POST方式的请求, 返回的是表单响应 @@ -136,10 +140,10 @@ public class AliPayService { * app支付 */ @SneakyThrows - public String appPay(String amount, PayOrder payOrder) { + public String appPay(String amount, PayOrder payOrder, AliPayConfig aliPayConfig) { AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setSubject(payOrder.getTitle()); - model.setProductCode(AliPayCode.Products.QUICK_MSECURITY_PAY); + model.setProductCode(AlipayCode.Products.QUICK_MSECURITY_PAY); model.setOutTradeNo(payOrder.getOrderNo()); // 过期时间 model.setTimeExpire(this.getAliTimeExpire(payOrder.getExpiredTime())); @@ -151,11 +155,15 @@ public class AliPayService { model.setExtendParams(extendParams); } AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } request.setBizModel(model); - request.setNotifyUrl(aliPayConfigService.getNotifyUrl()); + request.setNotifyUrl(aliPayConfigService.getNotifyUrl(aliPayConfig.isIsv())); try { // 异步回调必须到当前系统中 - AlipayTradeAppPayResponse response = aliPayConfigService.execute(request); + AlipayTradeAppPayResponse response = aliPayConfigService.execute(request,aliPayConfig); return response.getBody(); } catch (AlipayApiException e) { @@ -168,10 +176,9 @@ public class AliPayService { * PC支付 */ @SneakyThrows - public String webPay(String amount, PayOrder payOrder) { + public String webPay(String amount, PayOrder payOrder, AliPayConfig aliPayConfig) { // 获取支付宝客户端 - AlipayClient alipayClient = aliPayConfigService.getAlipayClient(); - + AlipayClient alipayClient = aliPayConfigService.getAlipayClient(aliPayConfig); AlipayTradePagePayModel model = new AlipayTradePagePayModel(); model.setSubject(payOrder.getTitle()); model.setOutTradeNo(payOrder.getOrderNo()); @@ -179,7 +186,7 @@ public class AliPayService { model.setTimeExpire(this.getAliTimeExpire(payOrder.getExpiredTime())); model.setTotalAmount(amount); // 目前仅支持FAST_INSTANT_TRADE_PAY - model.setProductCode(AliPayCode.Products.FAST_INSTANT_TRADE_PAY); + model.setProductCode(AlipayCode.Products.FAST_INSTANT_TRADE_PAY); // 是否分账 if (payOrder.getAllocation()){ @@ -187,13 +194,16 @@ public class AliPayService { extendParams.setRoyaltyFreeze(Boolean.TRUE.toString()); model.setExtendParams(extendParams); } - AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } request.setBizModel(model); // 异步回调必须到当前系统中 - request.setNotifyUrl(aliPayConfigService.getNotifyUrl()); + request.setNotifyUrl(aliPayConfigService.getNotifyUrl(aliPayConfig.isIsv())); // 同步回调 - request.setReturnUrl(aliPayConfigService.getReturnUrl()); + request.setReturnUrl(aliPayConfigService.getReturnUrl(aliPayConfig.isIsv())); try { // 通过GET方式的请求, 返回URL的响应, 默认是POST方式的请求, 返回的是表单响应 AlipayTradePagePayResponse response = alipayClient.pageExecute(request, HttpMethod.GET.name()); @@ -209,12 +219,10 @@ public class AliPayService { * jsapi支付 */ @SneakyThrows - public String jsapiPay(String amount, PayOrder payOrder, AliPayParam aliPayParam) { - // 构造请求参数以调用接口 - AlipayTradeCreateRequest request = new AlipayTradeCreateRequest(); + public String jsapiPay(String amount, PayOrder payOrder, AlipayParam aliPayParam, AliPayConfig aliPayConfig) { AlipayTradeCreateModel model = new AlipayTradeCreateModel(); model.setOutTradeNo(payOrder.getOrderNo()); - model.setProductCode(AliPayCode.Products.JSAPI_PAY); + model.setProductCode(AlipayCode.Products.JSAPI_PAY); model.setOpAppId(aliPayParam.getOpAppId()); model.setTotalAmount(amount); model.setSubject(payOrder.getTitle()); @@ -233,9 +241,15 @@ public class AliPayService { extendParams.setRoyaltyFreeze(Boolean.TRUE.toString()); model.setExtendParams(extendParams); } + // 构造请求参数以调用接口 + AlipayTradeCreateRequest request = new AlipayTradeCreateRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } request.setBizModel(model); try { - AlipayTradeCreateResponse response = aliPayConfigService.execute(request); + AlipayTradeCreateResponse response = aliPayConfigService.execute(request,aliPayConfig); this.verifyErrorMsg(response); // my.tradePay使用支付宝交易号调起支付 return response.getTradeNo(); @@ -249,7 +263,7 @@ public class AliPayService { * 二维码支付(扫码支付) */ @SneakyThrows - public String qrCodePay(String amount, PayOrder payOrder) { + public String qrCodePay(String amount, PayOrder payOrder, AliPayConfig aliPayConfig) { AlipayTradePrecreateModel model = new AlipayTradePrecreateModel(); model.setSubject(payOrder.getTitle()); model.setOutTradeNo(payOrder.getOrderNo()); @@ -263,10 +277,14 @@ public class AliPayService { // 过期时间 model.setTimeExpire(this.getAliTimeExpire(payOrder.getExpiredTime())); AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } request.setBizModel(model); - request.setNotifyUrl(aliPayConfigService.getNotifyUrl()); + request.setNotifyUrl(aliPayConfigService.getNotifyUrl(aliPayConfig.isIsv())); try { - AlipayTradePrecreateResponse response = aliPayConfigService.execute(request); + AlipayTradePrecreateResponse response = aliPayConfigService.execute(request,aliPayConfig); this.verifyErrorMsg(response); return response.getQrCode(); } @@ -280,11 +298,11 @@ public class AliPayService { * 付款码支付 */ @SneakyThrows - public void barCode(String amount, PayOrder payOrder, AliPayParam aliPayParam, PayResultBo result) { + public void barCode(String amount, PayOrder payOrder, AlipayParam aliPayParam, PayResultBo result, AliPayConfig aliPayConfig) { AlipayTradePayModel model = new AlipayTradePayModel(); model.setSubject(payOrder.getTitle()); model.setOutTradeNo(payOrder.getOrderNo()); - model.setScene(AliPayCode.Products.BAR_CODE); + model.setScene(AlipayCode.Products.BAR_CODE); model.setAuthCode(aliPayParam.getAuthCode()); // 是否分账 if (payOrder.getAllocation()){ @@ -296,19 +314,23 @@ public class AliPayService { model.setTimeExpire(this.getAliTimeExpire(payOrder.getExpiredTime())); model.setTotalAmount(amount); AlipayTradePayRequest request = new AlipayTradePayRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } request.setBizModel(model); - request.setNotifyUrl(aliPayConfigService.getNotifyUrl()); + request.setNotifyUrl(aliPayConfigService.getNotifyUrl(aliPayConfig.isIsv())); try { - AlipayTradePayResponse response = aliPayConfigService.execute(request); + AlipayTradePayResponse response = aliPayConfigService.execute(request,aliPayConfig); // 支付成功处理 金额2000以下免密支付, 记录支付完成相关信息 - if (Objects.equals(response.getCode(), AliPayCode.ResponseCode.SUCCESS)) { + if (Objects.equals(response.getCode(), AlipayCode.ResponseCode.SUCCESS)) { Date gmtPayment = response.getGmtPayment(); result.setOutOrderNo(response.getTradeNo()) .setComplete(true) .setFinishTime(LocalDateTimeUtil.of(gmtPayment)); } // 非支付中响应码, 进行错误处理 - if (!Objects.equals(response.getCode(), AliPayCode.ResponseCode.INPROCESS)) { + if (!Objects.equals(response.getCode(), AlipayCode.ResponseCode.INPROCESS)) { this.verifyErrorMsg(response); } } @@ -322,7 +344,7 @@ public class AliPayService { * 验证错误信息 */ private void verifyErrorMsg(AlipayResponse alipayResponse) { - if (!Objects.equals(alipayResponse.getCode(), AliPayCode.ResponseCode.SUCCESS)) { + if (!alipayResponse.isSuccess()) { String errorMsg = alipayResponse.getSubMsg(); if (StrUtil.isBlank(errorMsg)) { errorMsg = alipayResponse.getMsg(); diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/reconcile/AliPayReconcileService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/reconcile/AlipayReconcileService.java similarity index 85% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/reconcile/AliPayReconcileService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/reconcile/AlipayReconcileService.java index e2ab9978c..c7e4470ad 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/reconcile/AliPayReconcileService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/reconcile/AlipayReconcileService.java @@ -1,15 +1,5 @@ package org.dromara.daxpay.channel.alipay.service.reconcile; -import org.dromara.daxpay.channel.alipay.bo.reconcile.AliReconcileBillDetail; -import org.dromara.daxpay.channel.alipay.bo.reconcile.AliReconcileBillTotal; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; -import org.dromara.daxpay.core.enums.TradeStatusEnum; -import org.dromara.daxpay.core.enums.TradeTypeEnum; -import org.dromara.daxpay.core.exception.ReconciliationFailException; -import org.dromara.daxpay.service.bo.reconcile.ChannelReconcileTradeBo; -import org.dromara.daxpay.service.bo.reconcile.ReconcileResolveResultBo; -import org.dromara.daxpay.service.entity.reconcile.ReconcileStatement; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.IoUtil; @@ -18,14 +8,24 @@ import cn.hutool.core.text.csv.CsvUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayConstants; import com.alipay.api.domain.AlipayDataDataserviceBillDownloadurlQueryModel; import com.alipay.api.request.AlipayDataDataserviceBillDownloadurlQueryRequest; -import com.alipay.api.response.AlipayDataDataserviceBillDownloadurlQueryResponse; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; +import org.dromara.daxpay.channel.alipay.bo.reconcile.AlipayReconcileBillDetail; +import org.dromara.daxpay.channel.alipay.bo.reconcile.AlipayReconcileBillTotal; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.core.enums.TradeStatusEnum; +import org.dromara.daxpay.core.enums.TradeTypeEnum; +import org.dromara.daxpay.core.exception.ReconciliationFailException; +import org.dromara.daxpay.service.bo.reconcile.ChannelReconcileTradeBo; +import org.dromara.daxpay.service.bo.reconcile.ReconcileResolveResultBo; +import org.dromara.daxpay.service.entity.reconcile.ReconcileStatement; import org.dromara.x.file.storage.core.FileInfo; import org.dromara.x.file.storage.core.FileStorageService; import org.dromara.x.file.storage.core.upload.UploadPretreatment; @@ -50,9 +50,9 @@ import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor -public class AliPayReconcileService { +public class AlipayReconcileService { - private final AliPayConfigService aliPayConfigService; + private final AlipayConfigService aliPayConfigService; private final FileStorageService fileStorageService; @@ -65,16 +65,21 @@ public class AliPayReconcileService { */ @SneakyThrows @Transactional(rollbackFor = Exception.class) - public ReconcileResolveResultBo downAndResolve(String date, ReconcileStatement statement){ + public ReconcileResolveResultBo downAndResolve(String date, ReconcileStatement statement, AliPayConfig aliPayConfig){ try { AlipayDataDataserviceBillDownloadurlQueryModel model = new AlipayDataDataserviceBillDownloadurlQueryModel(); model.setBillDate(date); + // 下载交易类型 model.setBillType("trade"); AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } request.setBizModel(model); - AlipayDataDataserviceBillDownloadurlQueryResponse response = aliPayConfigService.execute(request); + var response = aliPayConfigService.execute(request,aliPayConfig); // 判断返回结果 - if (!Objects.equals(AliPayCode.ResponseCode.SUCCESS, response.getCode())) { + if (!response.isSuccess()) { log.error("获取支付宝对账单失败: {}", response.getSubMsg()); throw new ReconciliationFailException(response.getSubMsg()); } @@ -85,7 +90,7 @@ public class AliPayReconcileService { // 使用 Apache commons-compress 包装流, 读取返回的对账CSV文件 ZipArchiveInputStream zipArchiveInputStream = new ZipArchiveInputStream(new ByteArrayInputStream(zipBytes), "GBK"); ZipArchiveEntry entry; - List billDetails = new ArrayList<>(); + List billDetails = new ArrayList<>(); byte[] bytes = null; while ((entry = zipArchiveInputStream.getNextZipEntry()) != null) { bytes = IoUtil.readBytes(zipArchiveInputStream); @@ -120,7 +125,7 @@ public class AliPayReconcileService { public ReconcileResolveResultBo upload(ReconcileStatement statement, byte[] bytes) { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(bytes),"GBK")); List strings = IoUtil.readLines(bufferedReader, new ArrayList<>()); - List billDetails = this.parseDetail(strings); + List billDetails = this.parseDetail(strings); // 保存原始对账文件 String originalFile = this.saveOriginalFile(statement, bytes); // 将原始交易明细对账记录转换通用结构 @@ -134,7 +139,7 @@ public class AliPayReconcileService { /** * 转换为通用对账记录对象 */ - private List convertReconcileTrade(List billDetails){ + private List convertReconcileTrade(List billDetails){ return billDetails.stream() .map(this::convert) .toList(); @@ -143,7 +148,7 @@ public class AliPayReconcileService { /** * 转换为通用对账记录对象 */ - private ChannelReconcileTradeBo convert(AliReconcileBillDetail billDetail){ + private ChannelReconcileTradeBo convert(AlipayReconcileBillDetail billDetail){ // 金额 var amount = new BigDecimal(billDetail.getOrderAmount()); // 默认为支付对账记录 @@ -172,7 +177,7 @@ public class AliPayReconcileService { /** * 解析明细 */ - private List parseDetail(List list){ + private List parseDetail(List list){ // 截取需要进行解析的文本内容 String billDetail = list.stream() .collect(Collectors.joining(System.lineSeparator())); @@ -181,13 +186,13 @@ public class AliPayReconcileService { "#-----------------------------------------业务明细列表结束------------------------------------"); billDetail = billDetail.replaceAll("\t", ""); CsvReader reader = CsvUtil.getReader(); - return reader.read(billDetail, AliReconcileBillDetail.class); + return reader.read(billDetail, AlipayReconcileBillDetail.class); } /** * 解析汇总 */ - private List parseTotal(List list){ + private List parseTotal(List list){ // 去除前 4 行和后 2 行 然后合并是个一个字符串 String billTotal = list.stream() .collect(Collectors.joining(System.lineSeparator())); @@ -197,7 +202,7 @@ public class AliPayReconcileService { billTotal = billTotal.replaceAll("\t", ""); CsvReader reader = CsvUtil.getReader(); - return reader.read(billTotal, AliReconcileBillTotal.class); + return reader.read(billTotal, AlipayReconcileBillTotal.class); } /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/redirect/AliPayRedirectUrlService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/redirect/AlipayRedirectUrlService.java similarity index 82% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/redirect/AliPayRedirectUrlService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/redirect/AlipayRedirectUrlService.java index 1dead8046..73cce100d 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/redirect/AliPayRedirectUrlService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/redirect/AlipayRedirectUrlService.java @@ -2,8 +2,8 @@ package org.dromara.daxpay.channel.alipay.service.redirect; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.exception.ValidationFailedException; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.channel.alipay.code.AlipayCode; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.dao.order.pay.PayOrderManager; import org.dromara.daxpay.service.entity.config.PlatformConfig; @@ -25,23 +25,23 @@ import java.util.Map; @Slf4j @Service @RequiredArgsConstructor -public class AliPayRedirectUrlService { - private final AliPayConfigService aliPayConfigService; +public class AlipayRedirectUrlService { + private final AlipayConfigService aliPayConfigService; private final PayOrderManager payOrderManager; private final PlatformConfigService platformConfigService; /** * 回调地址处理 */ - public String redirect(HttpServletRequest request){ + public String redirect(HttpServletRequest request, boolean isv){ Map map = PayUtil.toMap(request); // 首先进行验签 - if (!aliPayConfigService.verifyNotify(map)){ + if (!aliPayConfigService.verifyNotify(map,isv)){ log.error("支付宝同步通知消息验签失败"); throw new ValidationFailedException("支付宝同步通知消息验签失败"); } // 获取订单号 - String outTradeNo = map.get(AliPayCode.ResponseParams.OUT_TRADE_NO); + String outTradeNo = map.get(AlipayCode.ResponseParams.OUT_TRADE_NO); PayOrder order = payOrderManager.findByOrderNo(outTradeNo) .orElseThrow(() -> new DataNotExistException("订单不存在")); // 订单配置后跳转到指定的地址, 不存在跳转到预设的地址 @@ -51,6 +51,7 @@ public class AliPayRedirectUrlService { PlatformConfig platformConfig = platformConfigService.getConfig(); String serverUrl = platformConfig.getGatewayMobileUrl(); return StrUtil.format("{}/alipay/pay/finish", serverUrl); + } } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/refund/AliPayRefundService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/refund/AlipayRefundService.java similarity index 79% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/refund/AliPayRefundService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/refund/AlipayRefundService.java index bf468d420..7db698d52 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/refund/AliPayRefundService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/refund/AlipayRefundService.java @@ -1,7 +1,7 @@ package org.dromara.daxpay.channel.alipay.service.refund; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.RefundStatusEnum; import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.core.exception.TradeFailException; @@ -9,6 +9,7 @@ import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.trade.RefundResultBo; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayConstants; import com.alipay.api.domain.AlipayTradeRefundModel; import com.alipay.api.request.AlipayTradeRefundRequest; import com.alipay.api.response.AlipayTradeRefundResponse; @@ -18,7 +19,6 @@ import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.List; -import java.util.Objects; /** * 支付宝退款服务 @@ -28,16 +28,16 @@ import java.util.Objects; @Slf4j @Service @RequiredArgsConstructor -public class AliPayRefundService { +public class AlipayRefundService { - private final AliPayConfigService aliPayConfigService; + private final AlipayConfigService aliPayConfigService; /** * 退款, 调用支付宝退款 */ - public RefundResultBo refund(RefundOrder refundOrder) { + public RefundResultBo refund(RefundOrder refundOrder,AliPayConfig aliPayConfig) { RefundResultBo refundInfo = new RefundResultBo(); - AlipayTradeRefundModel model = new AlipayTradeRefundModel(); + var model = new AlipayTradeRefundModel(); model.setOutTradeNo(refundOrder.getOrderNo()); model.setOutRequestNo(refundOrder.getRefundNo()); // 金额格式化 @@ -45,12 +45,15 @@ public class AliPayRefundService { model.setRefundAmount(refundAmount); // 银行卡冲退信息, 只有传输了此值, 才会触发退款回调 model.setQueryOptions(List.of("deposit_back_info")); - AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } request.setBizModel(model); try { - AlipayTradeRefundResponse response = aliPayConfigService.execute(request); - if (!Objects.equals(AliPayCode.ResponseCode.SUCCESS, response.getCode())) { + AlipayTradeRefundResponse response = aliPayConfigService.execute(request,aliPayConfig); + if (!response.isSuccess()) { TradeFailException operationFailException = new TradeFailException("支付宝退款失败: "+response.getSubMsg()); log.error("支付宝退款失败: {}", response.getSubMsg()); throw operationFailException; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AliPayRefundSyncService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AlipayRefundSyncService.java similarity index 74% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AliPayRefundSyncService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AlipayRefundSyncService.java index 944f778fe..aafb52d28 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AliPayRefundSyncService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AlipayRefundSyncService.java @@ -1,13 +1,15 @@ package org.dromara.daxpay.channel.alipay.service.sync; import cn.bootx.platform.core.util.JsonUtil; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.channel.alipay.code.AlipayCode; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.RefundStatusEnum; import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; import cn.hutool.core.date.LocalDateTimeUtil; import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayConstants; import com.alipay.api.domain.AlipayTradeFastpayRefundQueryModel; import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest; import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse; @@ -27,15 +29,15 @@ import java.util.Objects; @Slf4j @Service @RequiredArgsConstructor -public class AliPayRefundSyncService { +public class AlipayRefundSyncService { - private final AliPayConfigService aliPayConfigService; + private final AlipayConfigService aliPayConfigService; /** * 退款同步查询 * 注意: 支付宝退款没有网关订单号, 网关订单号是支付单的 */ - public RefundSyncResultBo syncRefundStatus(RefundOrder refundOrder){ + public RefundSyncResultBo syncRefundStatus(RefundOrder refundOrder,AliPayConfig aliPayConfig){ RefundSyncResultBo syncResult = new RefundSyncResultBo(); try { AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel(); @@ -44,13 +46,17 @@ public class AliPayRefundSyncService { // 商户订单号 model.setOutTradeNo(String.valueOf(refundOrder.getOrderNo())); // 设置返回退款完成时间 - model.setQueryOptions(Collections.singletonList(AliPayCode.ResponseParams.GMT_REFUND_PAY)); + model.setQueryOptions(Collections.singletonList(AlipayCode.ResponseParams.GMT_REFUND_PAY)); AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } request.setBizModel(model); - AlipayTradeFastpayRefundQueryResponse response = aliPayConfigService.execute(request); + AlipayTradeFastpayRefundQueryResponse response = aliPayConfigService.execute(request,aliPayConfig); syncResult.setSyncData(JsonUtil.toJsonStr(response)); // 失败 - if (!Objects.equals(AliPayCode.ResponseCode.SUCCESS, response.getCode())) { + if (!response.isSuccess()) { syncResult.setSyncSuccess(false) .setSyncErrorCode(response.getSubCode()) .setRefundStatus(RefundStatusEnum.FAIL) @@ -59,7 +65,7 @@ public class AliPayRefundSyncService { } String tradeStatus = response.getRefundStatus(); // 成功 - if (Objects.equals(tradeStatus, AliPayCode.RefundStatus.REFUND_SUCCESS)){ + if (Objects.equals(tradeStatus, AlipayCode.RefundStatus.REFUND_SUCCESS)){ LocalDateTime localDateTime = LocalDateTimeUtil.of(response.getGmtRefundPay()); return syncResult.setFinishTime(localDateTime).setRefundStatus(RefundStatusEnum.SUCCESS); } else { @@ -67,10 +73,10 @@ public class AliPayRefundSyncService { } } catch (AlipayApiException e) { log.error("退款订单同步失败:", e); - syncResult.setSyncErrorMsg(e.getErrMsg()); + syncResult.setSyncErrorMsg(e.getErrMsg()) + .setSyncSuccess(false) + .setRefundStatus(RefundStatusEnum.FAIL); } return syncResult; } - - } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AliPaySyncService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AlipaySyncService.java similarity index 78% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AliPaySyncService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AlipaySyncService.java index 5a78d3602..99580cb5b 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AliPaySyncService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AlipaySyncService.java @@ -1,14 +1,16 @@ package org.dromara.daxpay.channel.alipay.service.sync; import cn.bootx.platform.core.util.JsonUtil; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.code.AliPayCode.PayStatus; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.channel.alipay.code.AlipayCode; +import org.dromara.daxpay.channel.alipay.code.AlipayCode.PayStatus; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import cn.hutool.core.date.LocalDateTimeUtil; import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayConstants; import com.alipay.api.domain.AlipayTradeQueryModel; import com.alipay.api.request.AlipayTradeQueryRequest; import com.alipay.api.response.AlipayTradeQueryResponse; @@ -29,8 +31,8 @@ import java.util.Objects; @Slf4j @Service @RequiredArgsConstructor -public class AliPaySyncService { - private final AliPayConfigService aliPayConfigService; +public class AlipaySyncService { + private final AlipayConfigService aliPayConfigService; /** * 与支付宝网关同步状态, 退款状态有 @@ -40,15 +42,19 @@ public class AliPaySyncService { * 4 查询不到 * 5 查询失败 */ - public PaySyncResultBo syncPayStatus(PayOrder payOrder){ + public PaySyncResultBo syncPayStatus(PayOrder payOrder,AliPayConfig aliPayConfig){ PaySyncResultBo syncResult = new PaySyncResultBo(); // 查询 try { AlipayTradeQueryModel model = new AlipayTradeQueryModel(); model.setOutTradeNo(payOrder.getOrderNo()); AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } request.setBizModel(model); - AlipayTradeQueryResponse response = aliPayConfigService.execute(request); + AlipayTradeQueryResponse response = aliPayConfigService.execute(request,aliPayConfig); String tradeStatus = response.getTradeStatus(); syncResult.setSyncData(JsonUtil.toJsonStr(response)); // 设置网关订单号 @@ -73,11 +79,11 @@ public class AliPaySyncService { } } // 支付宝支付后, 客户未进行操作将不会创建出订单, 所以交易不存在约等于未查询订单 - if (Objects.equals(response.getSubCode(), AliPayCode.ResponseCode.ACQ_TRADE_NOT_EXIST)) { + if (Objects.equals(response.getSubCode(), AlipayCode.ResponseCode.ACQ_TRADE_NOT_EXIST)) { return syncResult.setPayStatus(PayStatusEnum.PROGRESS); } // 查询失败 - if (!Objects.equals(AliPayCode.ResponseCode.SUCCESS, response.getCode())) { + if (!response.isSuccess()) { return syncResult.setSyncSuccess(false) .setSyncErrorCode(response.getSubCode()) .setSyncErrorMsg(response.getSubMsg()); @@ -85,7 +91,9 @@ public class AliPaySyncService { } catch (AlipayApiException e) { log.error("支付订单同步失败:", e); - syncResult.setSyncErrorMsg(e.getErrMsg()).setSyncSuccess(false); + syncResult.setSyncErrorMsg(e.getErrMsg()) + .setSyncSuccess(false) + .setPayStatus(PayStatusEnum.FAIL); } return syncResult; } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AliPayTransferSyncService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AlipayTransferSyncService.java similarity index 76% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AliPayTransferSyncService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AlipayTransferSyncService.java index 09acaf4d9..b4a7c4fd9 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AliPayTransferSyncService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/sync/AlipayTransferSyncService.java @@ -1,12 +1,14 @@ package org.dromara.daxpay.channel.alipay.service.sync; import cn.bootx.platform.core.util.JsonUtil; -import org.dromara.daxpay.channel.alipay.code.AliPayCode.TransferStatus; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.channel.alipay.code.AlipayCode.TransferStatus; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.TransferStatusEnum; import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo; import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayConstants; import com.alipay.api.domain.AlipayFundTransCommonQueryModel; import com.alipay.api.request.AlipayFundTransCommonQueryRequest; import lombok.RequiredArgsConstructor; @@ -24,17 +26,20 @@ import java.util.Objects; @Slf4j @Service @RequiredArgsConstructor -public class AliPayTransferSyncService { +public class AlipayTransferSyncService { - private final AliPayConfigService aliPayConfigService; + private final AlipayConfigService aliPayConfigService; /** * 转账同步 */ - public TransferSyncResultBo syncTransferStatus(TransferOrder transferOrder){ + public TransferSyncResultBo syncTransferStatus(TransferOrder transferOrder, AliPayConfig aliPayConfig){ TransferSyncResultBo syncResult = new TransferSyncResultBo(); - // 构造请求参数以调用接口 - AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest(); + var request = new AlipayFundTransCommonQueryRequest(); + // 特约商户调用 + if (aliPayConfig.isIsv()){ + request.putOtherTextParam(AlipayConstants.APP_AUTH_TOKEN, aliPayConfig.getAppAuthToken()); + } AlipayFundTransCommonQueryModel model = new AlipayFundTransCommonQueryModel(); // 设置销售产品码 model.setProductCode("STD_RED_PACKET"); @@ -44,7 +49,7 @@ public class AliPayTransferSyncService { model.setOutBizNo(transferOrder.getTransferNo()); request.setBizModel(model); try { - var response = aliPayConfigService.execute(request); + var response = aliPayConfigService.execute(request,aliPayConfig); // 设置网关订单号 syncResult.setSyncData(JsonUtil.toJsonStr(response)); // 设置网关订单号 @@ -70,7 +75,9 @@ public class AliPayTransferSyncService { return syncResult; } catch (AlipayApiException e) { log.error("支付宝转账记录同步失败:", e); - return syncResult.setSyncErrorMsg(e.getErrMsg()).setSyncSuccess(false); + return syncResult.setSyncErrorMsg(e.getErrMsg()) + .setSyncSuccess(false) + .setTransferStatus(TransferStatusEnum.FAIL); } } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/transfer/AliPayTransferService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/transfer/AlipayTransferService.java similarity index 88% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/transfer/AliPayTransferService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/transfer/AlipayTransferService.java index e67ab6644..b8df69735 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/transfer/AliPayTransferService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/transfer/AlipayTransferService.java @@ -1,8 +1,8 @@ package org.dromara.daxpay.channel.alipay.service.transfer; -import org.dromara.daxpay.channel.alipay.code.AliPayCode; -import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.channel.alipay.code.AlipayCode; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.TransferPayeeTypeEnum; import org.dromara.daxpay.core.enums.TransferStatusEnum; import org.dromara.daxpay.core.exception.OperationFailException; @@ -30,9 +30,9 @@ import java.util.Objects; @Slf4j @Service @RequiredArgsConstructor -public class AliPayTransferService { +public class AlipayTransferService { - private final AliPayConfigService aliPayConfigService; + private final AlipayConfigService aliPayConfigService; /** * 余额查询接口 @@ -40,18 +40,18 @@ public class AliPayTransferService { @SneakyThrows public void queryAccountAmount(AliPayConfig config, AliPayConfig aliPayConfig){ AlipayFundAccountQueryModel model = new AlipayFundAccountQueryModel(); - model.setAccountType(AliPayCode.Products.QUERY_ACCOUNT_TYPE); + model.setAccountType(AlipayCode.Products.QUERY_ACCOUNT_TYPE); model.setAlipayUserId(config.getAlipayUserId()); AlipayFundAccountQueryRequest request = new AlipayFundAccountQueryRequest(); request.setBizModel(model); - AlipayFundAccountQueryResponse response = aliPayConfigService.execute(request); + AlipayFundAccountQueryResponse response = aliPayConfigService.execute(request,aliPayConfig); } /** * 转账接口 */ @SneakyThrows - public TransferResultBo transfer(TransferOrder order){ + public TransferResultBo transfer(TransferOrder order,AliPayConfig aliPayConfig){ TransferResultBo transferInfo = new TransferResultBo(); // 构造请求参数以调用接口 AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); @@ -84,15 +84,15 @@ public class AliPayTransferService { model.setPayeeInfo(payeeInfo); model.setRemark(order.getReason()); request.setBizModel(model); - AlipayFundTransUniTransferResponse response = aliPayConfigService.execute(request); - if (!Objects.equals(AliPayCode.ResponseCode.SUCCESS, response.getCode())) { + AlipayFundTransUniTransferResponse response = aliPayConfigService.execute(request,aliPayConfig); + if (!response.isSuccess()) { log.error("支付宝转账失败: {}", response.getSubMsg()); throw new TradeFailException("支付宝转账失败: "+response.getSubMsg()); } // 通道转账号 transferInfo.setOutTransferNo(response.getOrderId()); // 有完成时间代表处理完成 - if (Objects.equals(response.getStatus(), AliPayCode.ResponseCode.TRANSFER_SUCCESS)){ + if (Objects.equals(response.getStatus(), AlipayCode.ResponseCode.TRANSFER_SUCCESS)){ // 时间 String transDate = response.getTransDate(); LocalDateTime time = LocalDateTimeUtil.parse(transDate, DatePattern.NORM_DATETIME_PATTERN); diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierCodeStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierCodeStrategy.java deleted file mode 100644 index f960b62c9..000000000 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCashierCodeStrategy.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.dromara.daxpay.channel.alipay.strategy; - -import org.dromara.daxpay.core.enums.ChannelEnum; -import org.dromara.daxpay.service.strategy.AbsCashierCodeStrategy; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * 支付宝收银码牌支付 - * @author xxm - * @since 2024/9/29 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class AliPayCashierCodeStrategy extends AbsCashierCodeStrategy { - - /** - * 策略标识, 可以自行进行扩展 - */ - @Override - public String getChannel() { - return ChannelEnum.ALIPAY.getCode(); - } -} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvAuthStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvAuthStrategy.java new file mode 100644 index 000000000..2340da081 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvAuthStrategy.java @@ -0,0 +1,56 @@ +package org.dromara.daxpay.channel.alipay.strategy.isv; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.extra.AlipayAuthService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.param.assist.AuthCodeParam; +import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; +import org.dromara.daxpay.core.result.assist.AuthResult; +import org.dromara.daxpay.core.result.assist.AuthUrlResult; +import org.dromara.daxpay.service.strategy.AbsChannelAuthStrategy; +import org.springframework.stereotype.Component; + +/** + * 支付宝授权策略 + * @author xxm + * @since 2024/9/24 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class AlipayIsvAuthStrategy extends AbsChannelAuthStrategy { + private final AlipayAuthService aliPayAuthService; + private final AlipayConfigService aliPayConfigService; + + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.ALIPAY_ISV.getCode(); + } + + /** + * 获取授权链接 + */ + @Override + public AuthUrlResult generateAuthUrl(GenerateAuthUrlParam param) { + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); + return aliPayAuthService.generateAuthUrl(param, aliPayConfig); + } + + /** + * 通过AuthCode兑换认证结果 + */ + @Override + public AuthResult doAuth(AuthCodeParam param) { + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); + return aliPayAuthService.getOpenIdOrUserId(param.getAuthCode(), aliPayConfig); + } + +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvCheckoutStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvCheckoutStrategy.java new file mode 100644 index 000000000..093f1b687 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvCheckoutStrategy.java @@ -0,0 +1,38 @@ +package org.dromara.daxpay.channel.alipay.strategy.isv; + +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.strategy.AbsCheckoutStrategy; +import org.springframework.stereotype.Component; + +/** + * 支付宝 + * @author xxm + * @since 2024/12/2 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class AlipayIsvCheckoutStrategy extends AbsCheckoutStrategy { + + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.ALIPAY_ISV.getCode(); + } + + /** + * 检测付款码 + */ + @Override + public boolean checkBarCode(String barCode){ + String[] ali = { "25", "26", "27", "28", "29", "30" }; + return StrUtil.startWithAny(barCode.substring(0, 2), ali); + } +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvCloseStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvCloseStrategy.java new file mode 100644 index 000000000..235591225 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvCloseStrategy.java @@ -0,0 +1,54 @@ +package org.dromara.daxpay.channel.alipay.strategy.isv; + +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.close.AliPayCloseService; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.CloseTypeEnum; +import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 支付宝支付订单关闭 + * @author xxm + * @since 2023/12/30 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AlipayIsvCloseStrategy extends AbsPayCloseStrategy { + private final AlipayConfigService alipayConfigService; + + private final AliPayCloseService aliPayCloseService; + + private AliPayConfig alipayConfig; + + @Override + public String getChannel() { + return ChannelEnum.ALIPAY_ISV.getCode(); + } + + /** + * 关闭前的处理方式 + */ + @Override + public void doBeforeCloseHandler() { + this.alipayConfig = alipayConfigService.getAndCheckConfig(true); + } + + /** + * 关闭操作 + */ + @Override + public CloseTypeEnum doCloseHandler() { + if (this.isUseCancel()){ + aliPayCloseService.cancel(this.getOrder(), this.alipayConfig); + return CloseTypeEnum.CANCEL; + } else { + aliPayCloseService.close(this.getOrder(), this.alipayConfig); + return CloseTypeEnum.CLOSE; + } + } +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvPayStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvPayStrategy.java new file mode 100644 index 000000000..ba7b85797 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvPayStrategy.java @@ -0,0 +1,73 @@ +package org.dromara.daxpay.channel.alipay.strategy.isv; + +import cn.bootx.platform.core.exception.ValidationFailedException; +import cn.bootx.platform.core.util.JsonUtil; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.param.pay.AlipayParam; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.pay.AliPayService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.trade.PayResultBo; +import org.dromara.daxpay.service.strategy.AbsPayStrategy; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONException; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 支付宝支付 + * @author xxm + * @since 2021/2/27 + */ +@Scope(SCOPE_PROTOTYPE) +@Component +@RequiredArgsConstructor +public class AlipayIsvPayStrategy extends AbsPayStrategy { + + private final AliPayService aliPayService; + + private final AlipayConfigService aliPayConfigService; + + private AlipayParam aliPayParam; + + private AliPayConfig aliPayConfig; + + @Override + public String getChannel() { + return ChannelEnum.ALIPAY_ISV.getCode(); + } + + /** + * 支付前操作 + */ + @Override + public void doBeforePayHandler() { + try { + // 支付宝参数验证 + String channelParam = this.getPayParam().getExtraParam(); + if (StrUtil.isNotBlank(channelParam)) { + this.aliPayParam = JsonUtil.toBean(channelParam, AlipayParam.class); + } + else { + this.aliPayParam = new AlipayParam(); + } + } + catch (JSONException e) { + throw new ValidationFailedException("支付参数错误"); + } + aliPayConfig = aliPayConfigService.getAndCheckConfig(true); + // 支付宝相关校验 + aliPayService.validation(this.getPayParam(),aliPayConfig); + } + + /** + * 发起支付操作 + */ + @Override + public PayResultBo doPayHandler() { + return aliPayService.pay(this.getOrder(), this.aliPayParam,aliPayConfig); + } +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvReconcileStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvReconcileStrategy.java new file mode 100644 index 000000000..5c778e73f --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvReconcileStrategy.java @@ -0,0 +1,64 @@ +package org.dromara.daxpay.channel.alipay.strategy.isv; + +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.reconcile.AlipayReconcileService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.reconcile.ReconcileResolveResultBo; +import org.dromara.daxpay.service.enums.ReconcileFileTypeEnum; +import org.dromara.daxpay.service.strategy.AbsReconcileStrategy; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 支付宝对账策略 + * @author xxm + * @since 2024/1/17 + */ +@Slf4j +@Service +@Scope(SCOPE_PROTOTYPE) +@RequiredArgsConstructor +public class AlipayIsvReconcileStrategy extends AbsReconcileStrategy { + + private final AlipayReconcileService reconcileService; + private final AlipayConfigService aliPayConfigService; + + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.ALIPAY_ISV.getCode(); + } + + /** + * 上传对账单解析并保存 + * + */ + @SneakyThrows + @Override + public ReconcileResolveResultBo uploadAndResolve(MultipartFile file, ReconcileFileTypeEnum fileType) { + return reconcileService.upload(this.getStatement(), file.getBytes()); + } + + /** + * 下载对账单到本地进行保存 + */ + @Override + public ReconcileResolveResultBo downAndResolve() { + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); + String date = LocalDateTimeUtil.format(this.getStatement().getDate(), DatePattern.NORM_DATE_PATTERN); + return reconcileService.downAndResolve(date, this.getStatement(),aliPayConfig); + } +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvRefundStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvRefundStrategy.java new file mode 100644 index 000000000..db8e02a52 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvRefundStrategy.java @@ -0,0 +1,46 @@ +package org.dromara.daxpay.channel.alipay.strategy.isv; + +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.refund.AlipayRefundService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.strategy.AbsRefundStrategy; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 支付宝退款 + * @author xxm + * @since 2023/7/4 + */ +@Scope(SCOPE_PROTOTYPE) +@Component +@RequiredArgsConstructor +public class AlipayIsvRefundStrategy extends AbsRefundStrategy { + + private final AlipayRefundService aliRefundService; + private final AlipayConfigService aliPayConfigService; + + /** + * 策略标识 + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.ALIPAY_ISV.getCode(); + } + + + /** + * 退款 + */ + @Override + public RefundResultBo doRefundHandler() { + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); + return aliRefundService.refund(this.getRefundOrder(), aliPayConfig); + } +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvSyncOrderStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvSyncOrderStrategy.java new file mode 100644 index 000000000..c15c3ebc4 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvSyncOrderStrategy.java @@ -0,0 +1,45 @@ +package org.dromara.daxpay.channel.alipay.strategy.isv; + +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.sync.AlipaySyncService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 支付宝支付同步 + * @author xxm + * @since 2023/7/14 + */ +@Scope(SCOPE_PROTOTYPE) +@Component +@RequiredArgsConstructor +public class AlipayIsvSyncOrderStrategy extends AbsSyncPayOrderStrategy { + + private final AlipaySyncService alipaySyncService; + + private final AlipayConfigService aliPayConfigService; + + /** + * 策略标识 + */ + @Override + public String getChannel() { + return ChannelEnum.ALIPAY_ISV.getCode(); + } + + /** + * 异步支付单与支付网关进行状态比对 + */ + @Override + public PaySyncResultBo doSync() { + AliPayConfig andCheckConfig = aliPayConfigService.getAndCheckConfig(true); + return alipaySyncService.syncPayStatus(this.getOrder(),andCheckConfig); + } +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvSyncRefundStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvSyncRefundStrategy.java new file mode 100644 index 000000000..054d26133 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvSyncRefundStrategy.java @@ -0,0 +1,66 @@ +package org.dromara.daxpay.channel.alipay.strategy.isv; + +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.sync.AlipayRefundSyncService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 支付宝退款订单查询 + * @author xxm + * @since 2024/7/25 + */ +@Scope(SCOPE_PROTOTYPE) +@Component +@RequiredArgsConstructor +public class AlipayIsvSyncRefundStrategy extends AbsSyncRefundOrderStrategy { + + + private final AlipayRefundSyncService alipaySyncService; + + private final AlipayConfigService aliPayConfigService; + + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.ALIPAY_ISV.getCode(); + } + + + /** + * 间隔10秒以上再发起退款查询请求。小于10s可能会导致查询到的状态不正确, 因为支付宝没有转账失败的状态 + */ + @Override + public void doBeforeHandler() { + RefundOrder refundOrder = this.getRefundOrder(); + if (refundOrder.getReqTime().plusSeconds(10).isAfter(LocalDateTime.now())) { + throw new OperationFailException("间隔10秒以上再发起退款查询请求"); + } + } + + /** + * 异步支付单与支付网关进行状态比对后的结果 + * + */ + @Override + public RefundSyncResultBo doSync() { + AliPayConfig aliPayConfig = aliPayConfigService.getAndCheckConfig(true); + return alipaySyncService.syncRefundStatus(this.getRefundOrder(),aliPayConfig); + } + +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayCheckoutStrategy.java similarity index 93% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayCheckoutStrategy.java index e239aa90a..af3d97e85 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCheckoutStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayCheckoutStrategy.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.alipay.strategy; +package org.dromara.daxpay.channel.alipay.strategy.merchant; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayStrategy.java similarity index 72% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayStrategy.java index b28b7b0f5..aaed57076 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayStrategy.java @@ -1,8 +1,10 @@ -package org.dromara.daxpay.channel.alipay.strategy; +package org.dromara.daxpay.channel.alipay.strategy.merchant; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.JsonUtil; -import org.dromara.daxpay.channel.alipay.param.pay.AliPayParam; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.param.pay.AlipayParam; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.channel.alipay.service.pay.AliPayService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.trade.PayResultBo; @@ -27,7 +29,11 @@ public class AliPayStrategy extends AbsPayStrategy { private final AliPayService aliPayService; - private AliPayParam aliPayParam; + private final AlipayConfigService aliPayConfigService; + + private AlipayParam aliPayParam; + + private AliPayConfig aliPayConfig; @Override public String getChannel() { @@ -43,17 +49,18 @@ public class AliPayStrategy extends AbsPayStrategy { // 支付宝参数验证 String channelParam = this.getPayParam().getExtraParam(); if (StrUtil.isNotBlank(channelParam)) { - this.aliPayParam = JsonUtil.toBean(channelParam, AliPayParam.class); + this.aliPayParam = JsonUtil.toBean(channelParam, AlipayParam.class); } else { - this.aliPayParam = new AliPayParam(); + this.aliPayParam = new AlipayParam(); } } catch (JSONException e) { throw new ValidationFailedException("支付参数错误"); } + aliPayConfig = aliPayConfigService.getAndCheckConfig(false); // 支付宝相关校验 - aliPayService.validation(this.getPayParam()); + aliPayService.validation(this.getPayParam(),aliPayConfig); } /** @@ -61,7 +68,7 @@ public class AliPayStrategy extends AbsPayStrategy { */ @Override public PayResultBo doPayHandler() { - return aliPayService.pay(this.getOrder(), this.aliPayParam); + return aliPayService.pay(this.getOrder(), this.aliPayParam,aliPayConfig); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncTransferStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPaySyncTransferStrategy.java similarity index 63% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncTransferStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPaySyncTransferStrategy.java index 8765f0742..41fb7c871 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncTransferStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPaySyncTransferStrategy.java @@ -1,10 +1,12 @@ -package org.dromara.daxpay.channel.alipay.strategy; +package org.dromara.daxpay.channel.alipay.strategy.merchant; -import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.channel.alipay.service.sync.AliPayTransferSyncService; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.sync.AlipayTransferSyncService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo; import org.dromara.daxpay.service.strategy.AbsSyncTransferOrderStrategy; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -20,7 +22,8 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @RequiredArgsConstructor public class AliPaySyncTransferStrategy extends AbsSyncTransferOrderStrategy { - private final AliPayTransferSyncService syncTransferOrderStrategy; + private final AlipayTransferSyncService syncTransferOrderStrategy; + private final AlipayConfigService aliPayConfigService; /** * 策略标识, 可以自行进行扩展 @@ -37,7 +40,8 @@ public class AliPaySyncTransferStrategy extends AbsSyncTransferOrderStrategy { */ @Override public TransferSyncResultBo doSync() { - return syncTransferOrderStrategy.syncTransferStatus(getTransferOrder()); + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); + return syncTransferOrderStrategy.syncTransferStatus(this.getTransferOrder(),aliPayConfig); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAllocReceiverStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocReceiverStrategy.java similarity index 72% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAllocReceiverStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocReceiverStrategy.java index 746a45d65..881770779 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAllocReceiverStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocReceiverStrategy.java @@ -1,9 +1,11 @@ -package org.dromara.daxpay.channel.alipay.strategy; +package org.dromara.daxpay.channel.alipay.strategy.merchant; import cn.bootx.platform.core.exception.ValidationFailedException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.allocation.AliPayAllocReceiverService; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.strategy.AbsAllocReceiverStrategy; @@ -23,10 +25,12 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Service @Scope(SCOPE_PROTOTYPE) @RequiredArgsConstructor -public class AliPayAllocReceiverStrategy extends AbsAllocReceiverStrategy { +public class AlipayAllocReceiverStrategy extends AbsAllocReceiverStrategy { private final AliPayAllocReceiverService receiverService; + private final AlipayConfigService aliPayConfigService; + /** * 策略标识 */ @@ -45,6 +49,7 @@ public class AliPayAllocReceiverStrategy extends AbsAllocReceiverStrategy { */ @Override public boolean validation(){ + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); return receiverService.validation(this.getAllocReceiver()); } @@ -53,10 +58,11 @@ public class AliPayAllocReceiverStrategy extends AbsAllocReceiverStrategy { */ @Override public void bind() { + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); if (!receiverService.validation(this.getAllocReceiver())){ throw new ValidationFailedException("分账接收者参数未通过校验"); } - receiverService.bind(this.getAllocReceiver()); + receiverService.bind(this.getAllocReceiver(),aliPayConfig); } /** @@ -64,9 +70,10 @@ public class AliPayAllocReceiverStrategy extends AbsAllocReceiverStrategy { */ @Override public void unbind() { + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); if (!receiverService.validation(this.getAllocReceiver())){ throw new ValidationFailedException("分账参数未通过校验"); } - receiverService.unbind(this.getAllocReceiver()); + receiverService.unbind(this.getAllocReceiver(),aliPayConfig); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java similarity index 62% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java index 79f47871a..a87f93f00 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliAllocationStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java @@ -1,12 +1,14 @@ -package org.dromara.daxpay.channel.alipay.strategy; +package org.dromara.daxpay.channel.alipay.strategy.merchant; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.allocation.AliPayAllocationService; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** @@ -17,10 +19,12 @@ import org.springframework.stereotype.Component; @Slf4j @Component @RequiredArgsConstructor -public class AliAllocationStrategy extends AbsAllocationStrategy { +public class AlipayAllocationStrategy extends AbsAllocationStrategy { private final AliPayAllocationService aliPayAllocationService; + private final AlipayConfigService aliPayConfigService; + /** * 分账通道 */ @@ -34,7 +38,8 @@ public class AliAllocationStrategy extends AbsAllocationStrategy { */ @Override public AllocStartResultBo start() { - return aliPayAllocationService.start(getOrder(), getDetails()); + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); + return aliPayAllocationService.start(getOrder(), getDetails(), aliPayConfig); } /** @@ -42,7 +47,8 @@ public class AliAllocationStrategy extends AbsAllocationStrategy { */ @Override public void finish() { - aliPayAllocationService.finish(getOrder(), getDetails()); + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); + aliPayAllocationService.finish(getOrder(), getDetails(), aliPayConfig); } /** @@ -50,6 +56,7 @@ public class AliAllocationStrategy extends AbsAllocationStrategy { */ @Override public AllocSyncResultBo doSync() { - return aliPayAllocationService.sync(getOrder(), getDetails()); + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); + return aliPayAllocationService.sync(getOrder(), getDetails(), aliPayConfig); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAuthStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAuthStrategy.java similarity index 61% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAuthStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAuthStrategy.java index f424276fa..799dc96a1 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayAuthStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAuthStrategy.java @@ -1,6 +1,8 @@ -package org.dromara.daxpay.channel.alipay.strategy; +package org.dromara.daxpay.channel.alipay.strategy.merchant; -import org.dromara.daxpay.channel.alipay.service.extra.AliPayAuthService; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.extra.AlipayAuthService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.param.assist.AuthCodeParam; import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; @@ -19,8 +21,10 @@ import org.springframework.stereotype.Component; @Slf4j @Component @RequiredArgsConstructor -public class AliPayAuthStrategy extends AbsChannelAuthStrategy { - private final AliPayAuthService aliPayAuthService; +public class AlipayAuthStrategy extends AbsChannelAuthStrategy { + private final AlipayAuthService aliPayAuthService; + + private final AlipayConfigService aliPayConfigService; /** * 策略标识, 可以自行进行扩展 @@ -37,7 +41,8 @@ public class AliPayAuthStrategy extends AbsChannelAuthStrategy { */ @Override public AuthUrlResult generateAuthUrl(GenerateAuthUrlParam param) { - return aliPayAuthService.generateAuthUrl(param); + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); + return aliPayAuthService.generateAuthUrl(param, aliPayConfig); } /** @@ -45,7 +50,8 @@ public class AliPayAuthStrategy extends AbsChannelAuthStrategy { */ @Override public AuthResult doAuth(AuthCodeParam param) { - return aliPayAuthService.getOpenIdOrUserId(param.getAuthCode()); + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); + return aliPayAuthService.getOpenIdOrUserId(param.getAuthCode(), aliPayConfig); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCloseStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayCloseStrategy.java similarity index 79% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCloseStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayCloseStrategy.java index c961fa763..5f89b9864 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayCloseStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayCloseStrategy.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.channel.alipay.strategy; +package org.dromara.daxpay.channel.alipay.strategy.merchant; -import org.dromara.daxpay.channel.alipay.entity.config.AliPayConfig; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.close.AliPayCloseService; -import org.dromara.daxpay.channel.alipay.service.config.AliPayConfigService; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.CloseTypeEnum; import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy; @@ -18,8 +18,8 @@ import org.springframework.stereotype.Service; @Slf4j @Service @RequiredArgsConstructor -public class AliPayCloseStrategy extends AbsPayCloseStrategy { - private final AliPayConfigService alipayConfigService; +public class AlipayCloseStrategy extends AbsPayCloseStrategy { + private final AlipayConfigService alipayConfigService; private final AliPayCloseService aliPayCloseService; @@ -35,7 +35,7 @@ public class AliPayCloseStrategy extends AbsPayCloseStrategy { */ @Override public void doBeforeCloseHandler() { - this.alipayConfig = alipayConfigService.getAndCheckConfig(); + this.alipayConfig = alipayConfigService.getAndCheckConfig(false); } /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayReconcileStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayReconcileStrategy.java similarity index 74% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayReconcileStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayReconcileStrategy.java index 04469df5b..d097a9369 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayReconcileStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayReconcileStrategy.java @@ -1,6 +1,8 @@ -package org.dromara.daxpay.channel.alipay.strategy; +package org.dromara.daxpay.channel.alipay.strategy.merchant; -import org.dromara.daxpay.channel.alipay.service.reconcile.AliPayReconcileService; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.reconcile.AlipayReconcileService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.reconcile.ReconcileResolveResultBo; import org.dromara.daxpay.service.enums.ReconcileFileTypeEnum; @@ -25,9 +27,10 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Service @Scope(SCOPE_PROTOTYPE) @RequiredArgsConstructor -public class AliPayReconcileStrategy extends AbsReconcileStrategy { +public class AlipayReconcileStrategy extends AbsReconcileStrategy { - private final AliPayReconcileService reconcileService; + private final AlipayReconcileService reconcileService; + private final AlipayConfigService aliPayConfigService; /** @@ -55,7 +58,8 @@ public class AliPayReconcileStrategy extends AbsReconcileStrategy { */ @Override public ReconcileResolveResultBo downAndResolve() { + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); String date = LocalDateTimeUtil.format(this.getStatement().getDate(), DatePattern.NORM_DATE_PATTERN); - return reconcileService.downAndResolve(date, this.getStatement()); + return reconcileService.downAndResolve(date, this.getStatement(),aliPayConfig); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayRefundStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayRefundStrategy.java similarity index 57% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayRefundStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayRefundStrategy.java index 467ef4216..4aa08c4eb 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayRefundStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayRefundStrategy.java @@ -1,6 +1,8 @@ -package org.dromara.daxpay.channel.alipay.strategy; +package org.dromara.daxpay.channel.alipay.strategy.merchant; -import org.dromara.daxpay.channel.alipay.service.refund.AliPayRefundService; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.refund.AlipayRefundService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.trade.RefundResultBo; import org.dromara.daxpay.service.strategy.AbsRefundStrategy; @@ -18,9 +20,10 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Scope(SCOPE_PROTOTYPE) @Component @RequiredArgsConstructor -public class AliPayRefundStrategy extends AbsRefundStrategy { +public class AlipayRefundStrategy extends AbsRefundStrategy { - private final AliPayRefundService aliRefundService; + private final AlipayRefundService aliRefundService; + private final AlipayConfigService aliPayConfigService; /** * 策略标识 @@ -37,6 +40,7 @@ public class AliPayRefundStrategy extends AbsRefundStrategy { */ @Override public RefundResultBo doRefundHandler() { - return aliRefundService.refund(this.getRefundOrder()); + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); + return aliRefundService.refund(this.getRefundOrder(), aliPayConfig); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncOrderStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncOrderStrategy.java similarity index 57% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncOrderStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncOrderStrategy.java index d0c8918e6..bcfd7b724 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncOrderStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncOrderStrategy.java @@ -1,10 +1,12 @@ -package org.dromara.daxpay.channel.alipay.strategy; +package org.dromara.daxpay.channel.alipay.strategy.merchant; -import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.channel.alipay.service.sync.AliPaySyncService; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.sync.AlipaySyncService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -18,9 +20,10 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Scope(SCOPE_PROTOTYPE) @Component @RequiredArgsConstructor -public class AliPaySyncOrderStrategy extends AbsSyncPayOrderStrategy { +public class AlipaySyncOrderStrategy extends AbsSyncPayOrderStrategy { - private final AliPaySyncService alipaySyncService; + private final AlipaySyncService alipaySyncService; + private final AlipayConfigService aliPayConfigService; /** * 策略标识 @@ -35,6 +38,7 @@ public class AliPaySyncOrderStrategy extends AbsSyncPayOrderStrategy { */ @Override public PaySyncResultBo doSync() { - return alipaySyncService.syncPayStatus(this.getOrder()); + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); + return alipaySyncService.syncPayStatus(this.getOrder(),aliPayConfig); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncRefundStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncRefundStrategy.java similarity index 71% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncRefundStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncRefundStrategy.java index 67044e718..29269dbc2 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPaySyncRefundStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipaySyncRefundStrategy.java @@ -1,12 +1,14 @@ -package org.dromara.daxpay.channel.alipay.strategy; +package org.dromara.daxpay.channel.alipay.strategy.merchant; -import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.channel.alipay.service.sync.AliPayRefundSyncService; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.sync.AlipayRefundSyncService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy; +import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -22,9 +24,11 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Scope(SCOPE_PROTOTYPE) @Component @RequiredArgsConstructor -public class AliPaySyncRefundStrategy extends AbsSyncRefundOrderStrategy { +public class AlipaySyncRefundStrategy extends AbsSyncRefundOrderStrategy { - private final AliPayRefundSyncService alipaySyncService; + + private final AlipayRefundSyncService alipaySyncService; + private final AlipayConfigService aliPayConfigService; /** * 策略标识, 可以自行进行扩展 @@ -54,7 +58,8 @@ public class AliPaySyncRefundStrategy extends AbsSyncRefundOrderStrategy { */ @Override public RefundSyncResultBo doSync() { - return alipaySyncService.syncRefundStatus(getRefundOrder()); + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); + return alipaySyncService.syncRefundStatus(this.getRefundOrder(), aliPayConfig); } } diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayTransferStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayTransferStrategy.java similarity index 72% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayTransferStrategy.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayTransferStrategy.java index e2270b252..efe814922 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/AliPayTransferStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayTransferStrategy.java @@ -1,13 +1,15 @@ -package org.dromara.daxpay.channel.alipay.strategy; +package org.dromara.daxpay.channel.alipay.strategy.merchant; import cn.bootx.platform.core.exception.ValidationFailedException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.alipay.service.transfer.AliPayTransferService; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.channel.alipay.service.transfer.AlipayTransferService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.param.trade.transfer.TransferParam; import org.dromara.daxpay.service.bo.trade.TransferResultBo; import org.dromara.daxpay.service.strategy.AbsTransferStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; @@ -25,14 +27,16 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Service @Scope(SCOPE_PROTOTYPE) @RequiredArgsConstructor -public class AliPayTransferStrategy extends AbsTransferStrategy { +public class AlipayTransferStrategy extends AbsTransferStrategy { - private final AliPayTransferService aliPayTransferService; + private final AlipayTransferService aliPayTransferService; + + private final AlipayConfigService aliPayConfigService; /** * 策略标识 */ - @Override + @Override public String getChannel() { return ChannelEnum.ALIPAY.getCode(); } @@ -51,6 +55,7 @@ public class AliPayTransferStrategy extends AbsTransferStrategy { */ @Override public TransferResultBo doTransferHandler() { - return aliPayTransferService.transfer(this.getTransferOrder()); + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(false); + return aliPayTransferService.transfer(this.getTransferOrder(),aliPayConfig); } } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java index 5d4f6c3e2..1156444f8 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java @@ -53,7 +53,7 @@ public class WeChatPayAllocationV2Service { private final WechatPayConfigService wechatPayConfigService; /** - * 分账 + * 发起分账 使用分账号作为请求号 */ public AllocStartResultBo start(AllocOrder allocOrder, List details, WechatPayConfig config) { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); @@ -89,7 +89,7 @@ public class WeChatPayAllocationV2Service { } /** - * 完结 + * 分账完结 使用ID作为请求号 */ public void finish(AllocOrder allocOrder, WechatPayConfig config) { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/ChannelEnum.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/ChannelEnum.java index f6759b2e9..fd7145c01 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/ChannelEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/enums/ChannelEnum.java @@ -16,8 +16,12 @@ public enum ChannelEnum { /** 支付宝 - 直连商户 */ ALIPAY("ali_pay"), + /** 支付宝 - 服务商 */ + ALIPAY_ISV("alipay_isv"), /** 微信支付 */ WECHAT("wechat_pay"), + /** 微信支付服务商 */ + WECHAT_ISV("wechat_pay_isv"), /** 云闪付 */ UNION_PAY("union_pay"), From 8aa6b68894d6856ad93a1a780d131db70d71f0e9 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Tue, 24 Dec 2024 19:00:26 +0800 Subject: [PATCH 45/54] =?UTF-8?q?fix=20=E6=94=AF=E4=BB=98=E5=AE=9D?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=95=86=E7=BC=BA=E5=B0=91=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AlipayReconcileBillDetail.java | 2 +- .../AlipayReconcileBillTotal.java | 2 +- .../{config => }/AlipayConfigConvert.java | 2 +- .../channel/alipay/entity/AliPayConfig.java | 2 +- ...e.java => AlipayAllocReceiverService.java} | 2 +- ...vice.java => AlipayAllocationService.java} | 2 +- .../service/config/AlipayConfigService.java | 2 +- .../reconcile/AlipayReconcileService.java | 4 +- .../isv/AlipayIsvAllocReceiverStrategy.java | 78 +++++++++++++++++++ .../isv/AlipayIsvAllocationStrategy.java | 62 +++++++++++++++ .../isv/AlipayIsvCashierCodeStrategy.java | 27 +++++++ .../merchant/AliPayCashierCodeStrategy.java | 27 +++++++ .../merchant/AlipayAllocReceiverStrategy.java | 4 +- .../merchant/AlipayAllocationStrategy.java | 4 +- 14 files changed, 207 insertions(+), 13 deletions(-) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/{reconcile => }/AlipayReconcileBillDetail.java (97%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/{reconcile => }/AlipayReconcileBillTotal.java (96%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/{config => }/AlipayConfigConvert.java (91%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/{AliPayAllocReceiverService.java => AlipayAllocReceiverService.java} (99%) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/{AliPayAllocationService.java => AlipayAllocationService.java} (99%) create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvAllocReceiverStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvAllocationStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvCashierCodeStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayCashierCodeStrategy.java diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AlipayReconcileBillDetail.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/AlipayReconcileBillDetail.java similarity index 97% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AlipayReconcileBillDetail.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/AlipayReconcileBillDetail.java index 6b87a5f72..53214b917 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AlipayReconcileBillDetail.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/AlipayReconcileBillDetail.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.alipay.bo.reconcile; +package org.dromara.daxpay.channel.alipay.bo; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.hutool.core.annotation.Alias; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AlipayReconcileBillTotal.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/AlipayReconcileBillTotal.java similarity index 96% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AlipayReconcileBillTotal.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/AlipayReconcileBillTotal.java index 4bd376918..68a2b55e6 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/reconcile/AlipayReconcileBillTotal.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/bo/AlipayReconcileBillTotal.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.alipay.bo.reconcile; +package org.dromara.daxpay.channel.alipay.bo; import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; import cn.hutool.core.annotation.Alias; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AlipayConfigConvert.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayConfigConvert.java similarity index 91% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AlipayConfigConvert.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayConfigConvert.java index 9d9187de2..5a8929b50 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/config/AlipayConfigConvert.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayConfigConvert.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.alipay.convert.config; +package org.dromara.daxpay.channel.alipay.convert; import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; import org.dromara.daxpay.channel.alipay.param.config.AlipayConfigParam; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/AliPayConfig.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/AliPayConfig.java index a491e19b8..1c368968e 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/AliPayConfig.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/AliPayConfig.java @@ -2,7 +2,7 @@ package org.dromara.daxpay.channel.alipay.entity; import cn.bootx.platform.common.mybatisplus.function.ToResult; import cn.bootx.platform.core.util.JsonUtil; -import org.dromara.daxpay.channel.alipay.convert.config.AlipayConfigConvert; +import org.dromara.daxpay.channel.alipay.convert.AlipayConfigConvert; import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.entity.config.ChannelConfig; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocReceiverService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverService.java similarity index 99% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocReceiverService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverService.java index 4765ec23d..8671d7a05 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocReceiverService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocReceiverService.java @@ -36,7 +36,7 @@ import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.*; @Slf4j @Service @RequiredArgsConstructor -public class AliPayAllocReceiverService { +public class AlipayAllocReceiverService { private final AlipayConfigService aliPayConfigService; /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocationService.java similarity index 99% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocationService.java index ed2888445..239f08d3a 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AliPayAllocationService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/allocation/AlipayAllocationService.java @@ -43,7 +43,7 @@ import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor -public class AliPayAllocationService { +public class AlipayAllocationService { private final AlipayConfigService aliPayConfigService; /** diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AlipayConfigService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AlipayConfigService.java index 376af1fc2..10ba77b61 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AlipayConfigService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/config/AlipayConfigService.java @@ -12,7 +12,7 @@ import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.alipay.code.AlipayCode; -import org.dromara.daxpay.channel.alipay.convert.config.AlipayConfigConvert; +import org.dromara.daxpay.channel.alipay.convert.AlipayConfigConvert; import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; import org.dromara.daxpay.channel.alipay.param.config.AlipayConfigParam; import org.dromara.daxpay.channel.alipay.result.config.AlipayConfigResult; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/reconcile/AlipayReconcileService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/reconcile/AlipayReconcileService.java index c7e4470ad..5b830f5b1 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/reconcile/AlipayReconcileService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/reconcile/AlipayReconcileService.java @@ -16,8 +16,8 @@ import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; -import org.dromara.daxpay.channel.alipay.bo.reconcile.AlipayReconcileBillDetail; -import org.dromara.daxpay.channel.alipay.bo.reconcile.AlipayReconcileBillTotal; +import org.dromara.daxpay.channel.alipay.bo.AlipayReconcileBillDetail; +import org.dromara.daxpay.channel.alipay.bo.AlipayReconcileBillTotal; import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.TradeStatusEnum; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvAllocReceiverStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvAllocReceiverStrategy.java new file mode 100644 index 000000000..515c8463a --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvAllocReceiverStrategy.java @@ -0,0 +1,78 @@ +package org.dromara.daxpay.channel.alipay.strategy.isv; + +import cn.bootx.platform.core.exception.ValidationFailedException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.allocation.AlipayAllocReceiverService; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.strategy.AbsAllocReceiverStrategy; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; + +import java.util.List; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 支付宝分账接收者策略 + * @author xxm + * @since 2024/4/1 + */ +@Slf4j +@Service +@Scope(SCOPE_PROTOTYPE) +@RequiredArgsConstructor +public class AlipayIsvAllocReceiverStrategy extends AbsAllocReceiverStrategy { + + private final AlipayAllocReceiverService receiverService; + + private final AlipayConfigService aliPayConfigService; + + /** + * 策略标识 + */ + @Override + public String getChannel() { + return ChannelEnum.ALIPAY_ISV.getCode(); + } + + @Override + public List getSupportReceiverTypes() { + return List.of(AllocReceiverTypeEnum.LOGIN_NAME, AllocReceiverTypeEnum.USER_ID, AllocReceiverTypeEnum.OPEN_ID); + } + + /** + * 校验方法 + */ + @Override + public boolean validation(){ + return receiverService.validation(this.getAllocReceiver()); + } + + /** + * 添加到支付系统中 + */ + @Override + public void bind() { + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); + if (!receiverService.validation(this.getAllocReceiver())){ + throw new ValidationFailedException("分账接收者参数未通过校验"); + } + receiverService.bind(this.getAllocReceiver(),aliPayConfig); + } + + /** + * 从三方支付系统中删除 + */ + @Override + public void unbind() { + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); + if (!receiverService.validation(this.getAllocReceiver())){ + throw new ValidationFailedException("分账参数未通过校验"); + } + receiverService.unbind(this.getAllocReceiver(),aliPayConfig); + } +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvAllocationStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvAllocationStrategy.java new file mode 100644 index 000000000..859f2aba3 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvAllocationStrategy.java @@ -0,0 +1,62 @@ +package org.dromara.daxpay.channel.alipay.strategy.isv; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; +import org.dromara.daxpay.channel.alipay.service.allocation.AlipayAllocationService; +import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; +import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; +import org.springframework.stereotype.Component; + +/** + * 支付宝分账 + * @author xxm + * @since 2024/12/9 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class AlipayIsvAllocationStrategy extends AbsAllocationStrategy { + + private final AlipayAllocationService aliPayAllocationService; + + private final AlipayConfigService aliPayConfigService; + + /** + * 分账通道 + */ + @Override + public String getChannel() { + return ChannelEnum.ALIPAY_ISV.getCode(); + } + + /** + * 开始分账 + */ + @Override + public AllocStartResultBo start() { + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); + return aliPayAllocationService.start(getOrder(), getDetails(), aliPayConfig); + } + + /** + * 分账完结 + */ + @Override + public void finish() { + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); + aliPayAllocationService.finish(getOrder(), getDetails(), aliPayConfig); + } + + /** + * 同步状态 + */ + @Override + public AllocSyncResultBo doSync() { + AliPayConfig aliPayConfig = aliPayConfigService.getAliPayConfig(true); + return aliPayAllocationService.sync(getOrder(), getDetails(), aliPayConfig); + } +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvCashierCodeStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvCashierCodeStrategy.java new file mode 100644 index 000000000..4b5302c60 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/isv/AlipayIsvCashierCodeStrategy.java @@ -0,0 +1,27 @@ +package org.dromara.daxpay.channel.alipay.strategy.isv; + + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.strategy.AbsCashierCodeStrategy; +import org.springframework.stereotype.Component; + +/** + * 支付宝收银码牌支付 + * @author xxm + * @since 2024/9/29 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class AlipayIsvCashierCodeStrategy extends AbsCashierCodeStrategy { + + /** + * 策略标识, 可以自行进行扩展 + */ + @Override + public String getChannel() { + return ChannelEnum.ALIPAY_ISV.getCode(); + } +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayCashierCodeStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayCashierCodeStrategy.java new file mode 100644 index 000000000..3425a447b --- /dev/null +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AliPayCashierCodeStrategy.java @@ -0,0 +1,27 @@ +package org.dromara.daxpay.channel.alipay.strategy.merchant; + + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.strategy.AbsCashierCodeStrategy; +import org.springframework.stereotype.Component; + +/** + * 支付宝收银码牌支付 + * @author xxm + * @since 2024/9/29 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class AliPayCashierCodeStrategy extends AbsCashierCodeStrategy { + + /** + * 策略标识, 可以自行进行扩展 + */ + @Override + public String getChannel() { + return ChannelEnum.ALIPAY.getCode(); + } +} diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocReceiverStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocReceiverStrategy.java index 881770779..c310c7aef 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocReceiverStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocReceiverStrategy.java @@ -4,7 +4,7 @@ import cn.bootx.platform.core.exception.ValidationFailedException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; -import org.dromara.daxpay.channel.alipay.service.allocation.AliPayAllocReceiverService; +import org.dromara.daxpay.channel.alipay.service.allocation.AlipayAllocReceiverService; import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; import org.dromara.daxpay.core.enums.ChannelEnum; @@ -27,7 +27,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @RequiredArgsConstructor public class AlipayAllocReceiverStrategy extends AbsAllocReceiverStrategy { - private final AliPayAllocReceiverService receiverService; + private final AlipayAllocReceiverService receiverService; private final AlipayConfigService aliPayConfigService; diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java index a87f93f00..8b0dbf6d2 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/strategy/merchant/AlipayAllocationStrategy.java @@ -1,7 +1,7 @@ package org.dromara.daxpay.channel.alipay.strategy.merchant; import org.dromara.daxpay.channel.alipay.entity.AliPayConfig; -import org.dromara.daxpay.channel.alipay.service.allocation.AliPayAllocationService; +import org.dromara.daxpay.channel.alipay.service.allocation.AlipayAllocationService; import org.dromara.daxpay.channel.alipay.service.config.AlipayConfigService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; @@ -21,7 +21,7 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor public class AlipayAllocationStrategy extends AbsAllocationStrategy { - private final AliPayAllocationService aliPayAllocationService; + private final AlipayAllocationService aliPayAllocationService; private final AlipayConfigService aliPayConfigService; From b74084dd14c75002d80f285dc42b9d857e2641e3 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Tue, 24 Dec 2024 20:00:50 +0800 Subject: [PATCH 46/54] =?UTF-8?q?feat=20=E5=BE=AE=E4=BF=A1=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=95=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../channel/wechat/code/WechatPayCode.java | 8 +- .../WechatPayCallbackController.java | 44 +- .../wechat/entity/config/WechatPayConfig.java | 37 +- .../WxPayPartnerOrderReverseV3Request.java | 74 +++ .../param/config/WechatPayConfigParam.java | 38 +- .../wechat/param/pay/WechatPayParam.java | 7 + .../param/pay/WxPayPartnerCodepayRequest.java | 629 ++++++++++++++++++ .../result/config/WechatPayConfigResult.java | 45 +- .../WeChatPayAllocationV2Service.java | 27 +- .../WeChatPayAllocationV3Service.java | 21 +- .../WeChatPaySubAllocationV2Service.java | 170 +++++ .../WeChatPaySubAllocationV3Service.java | 170 +++++ .../WechatPayAllocReceiverV2Service.java | 12 +- .../WechatPayAllocReceiverV3Service.java | 12 +- .../WechatPaySubAllocReceiverV2Service.java | 104 +++ .../WechatSubAllocReceiverV3Service.java | 103 +++ .../service/assist/WechatAuthService.java | 25 +- .../service/assist/WechatSubAuthService.java | 80 +++ .../callback/WechatPayCallbackService.java | 42 +- .../callback/WechatRefundCallbackService.java | 45 +- .../WechatTransferCallbackService.java | 30 +- .../close/WechatPayCloseV3Service.java | 8 +- .../close/WechatPaySubCloseV2Service.java | 55 ++ .../close/WechatPaySubCloseV3Service.java | 65 ++ .../config/WechatPayConfigService.java | 30 +- .../service/pay/isv/WechatPaySubService.java | 46 ++ .../pay/isv/WechatPaySubV2Service.java | 255 +++++++ .../pay/isv/WechatPaySubV3Service.java | 298 +++++++++ .../pay/{ => merchant}/WechatPayService.java | 4 +- .../{ => merchant}/WechatPayV2Service.java | 37 +- .../{ => merchant}/WechatPayV3Service.java | 28 +- ...rvice.java => WechatReconcileService.java} | 35 +- .../reconcile/WechatSubReconcileService.java | 169 +++++ .../service/refund/WechatRefundV2Service.java | 14 +- .../service/refund/WechatRefundV3Service.java | 16 +- .../refund/WechatSubRefundV2Service.java | 57 ++ .../refund/WechatSubRefundV3Service.java | 64 ++ ...rvice.java => WechatPaySyncV2Service.java} | 16 +- ...rvice.java => WechatPaySyncV3Service.java} | 23 +- .../sync/pay/WechatSubPaySyncV2Service.java | 84 +++ .../sync/pay/WechatSubPaySyncV3Service.java | 85 +++ .../refund/WechatRefundSyncV2Service.java | 8 +- .../refund/WechatRefundSyncV3Service.java | 16 +- .../refund/WechatSubRefundSyncV2Service.java | 78 +++ .../refund/WechatSubRefundSyncV3Service.java | 67 ++ .../transfer/WechatTransferSyncV3Service.java | 6 +- ...vice.java => WechatTransferV3Service.java} | 18 +- .../isv/WechatIsvAllocReceiverStrategy.java | 93 +++ .../isv/WechatIsvAllocationStrategy.java | 86 +++ .../strategy/isv/WechatIsvAuthStrategy.java | 45 ++ .../isv/WechatIsvCashierCodeStrategy.java | 64 ++ .../isv/WechatIsvCheckoutStrategy.java | 76 +++ .../strategy/isv/WechatIsvCloseStrategy.java | 81 +++ .../strategy/isv/WechatIsvPayStrategy.java | 77 +++ .../isv/WechatIsvReconcileStrategy.java | 62 ++ .../strategy/isv/WechatIsvRefundStrategy.java | 68 ++ .../isv/WechatIsvSyncPayStrategy.java | 60 ++ .../isv/WechatIsvSyncRefundStrategy.java | 58 ++ .../WechatAllocReceiverStrategy.java | 8 +- .../WechatAllocationStrategy.java | 9 +- .../{ => merchant}/WechatAuthStrategy.java | 2 +- .../WechatCashierCodeStrategy.java | 2 +- .../WechatCheckoutStrategy.java | 2 +- .../WechatCloseStrategy.java} | 6 +- .../{ => merchant}/WechatPayStrategy.java | 10 +- .../WechatReconcileStrategy.java | 8 +- .../{ => merchant}/WechatRefundStrategy.java | 6 +- .../{ => merchant}/WechatSyncPayStrategy.java | 18 +- .../WechatSyncRefundStrategy.java | 6 +- .../WechatSyncTransferStrategy.java | 6 +- .../WechatTransferStrategy.java | 14 +- 71 files changed, 3843 insertions(+), 329 deletions(-) create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/clode/WxPayPartnerOrderReverseV3Request.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/pay/WxPayPartnerCodepayRequest.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPaySubAllocationV2Service.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPaySubAllocationV3Service.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPaySubAllocReceiverV2Service.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatSubAllocReceiverV3Service.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatSubAuthService.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPaySubCloseV2Service.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPaySubCloseV3Service.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/isv/WechatPaySubService.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/isv/WechatPaySubV2Service.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/isv/WechatPaySubV3Service.java rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/{ => merchant}/WechatPayService.java (97%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/{ => merchant}/WechatPayV2Service.java (96%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/{ => merchant}/WechatPayV3Service.java (99%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/reconcile/{WechatPayReconcileService.java => WechatReconcileService.java} (92%) create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/reconcile/WechatSubReconcileService.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatSubRefundV2Service.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatSubRefundV3Service.java rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/{WeChatPaySyncV2Service.java => WechatPaySyncV2Service.java} (95%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/{WeChatPaySyncV3Service.java => WechatPaySyncV3Service.java} (92%) create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatSubPaySyncV2Service.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatSubPaySyncV3Service.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatSubRefundSyncV2Service.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatSubRefundSyncV3Service.java rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/transfer/{WechatPayTransferV3Service.java => WechatTransferV3Service.java} (98%) create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvAllocReceiverStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvAllocationStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvAuthStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvCashierCodeStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvCheckoutStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvCloseStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvPayStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvReconcileStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvRefundStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvSyncPayStrategy.java create mode 100644 daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvSyncRefundStrategy.java rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{ => merchant}/WechatAllocReceiverStrategy.java (95%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{ => merchant}/WechatAllocationStrategy.java (95%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{ => merchant}/WechatAuthStrategy.java (95%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{ => merchant}/WechatCashierCodeStrategy.java (97%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{ => merchant}/WechatCheckoutStrategy.java (97%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{WechatPayCloseStrategy.java => merchant/WechatCloseStrategy.java} (93%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{ => merchant}/WechatPayStrategy.java (88%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{ => merchant}/WechatReconcileStrategy.java (91%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{ => merchant}/WechatRefundStrategy.java (90%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{ => merchant}/WechatSyncPayStrategy.java (78%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{ => merchant}/WechatSyncRefundStrategy.java (96%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{ => merchant}/WechatSyncTransferStrategy.java (95%) rename daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/{ => merchant}/WechatTransferStrategy.java (95%) diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/code/WechatPayCode.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/code/WechatPayCode.java index 32c299efe..38f04b930 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/code/WechatPayCode.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/code/WechatPayCode.java @@ -1,7 +1,5 @@ package org.dromara.daxpay.channel.wechat.code; -import java.util.Arrays; -import java.util.Collections; import java.util.List; /** @@ -17,6 +15,12 @@ public interface WechatPayCode { String API_V3 = "apiV3"; + // OpenId类型 + // 服务商应用 + String SP_OPENID = "sp"; + // 子商户应用 + String SUB_OPENID = "sub"; + /** * User-Agent头部值格式:WechatPay-Java/版本 操作系统/版本 Java/版本 Credential/Credential信息 Validator/Validator信息 diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/WechatPayCallbackController.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/WechatPayCallbackController.java index 137f4fa81..e921b30b1 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/WechatPayCallbackController.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/WechatPayCallbackController.java @@ -30,25 +30,47 @@ public class WechatPayCallbackController { private final WechatPayCallbackService payCallbackService; private final WechatRefundCallbackService refundCallbackService; - @Operation(summary = "微信转账回调") - @PostMapping("/transfer") - public String transferHandle(@PathVariable("AppId") String appId, HttpServletRequest request) { - paymentAssistService.initMchApp(appId); - return transferCallbackService.transferHandle(request); - } - - @Operation(summary = "微信支付回调") + @Operation(summary = "微信支付回调(普通商户)") @PostMapping("/pay") public String wechatPayNotify(@PathVariable("AppId") String appId,HttpServletRequest request) { paymentAssistService.initMchApp(appId); - return payCallbackService.payHandle(request); + return payCallbackService.payHandle(request,false); } - @Operation(summary = "微信退款回调") + @Operation(summary = "微信支付回调(特约商户)") + @PostMapping("/isv/pay") + public String wechatPayIsvNotify(@PathVariable("AppId") String appId,HttpServletRequest request) { + paymentAssistService.initMchApp(appId); + return payCallbackService.payHandle(request,true); + } + + @Operation(summary = "微信退款回调(普通商户)") @PostMapping("/refund") public String wechatRefundNotify(@PathVariable("AppId") String appId,HttpServletRequest request) { paymentAssistService.initMchApp(appId); - return refundCallbackService.refundHandle(request); + return refundCallbackService.refundHandle(request,false); + } + + @Operation(summary = "微信退款回调(特约商户)") + @PostMapping("/isv/refund") + public String wechatIsvRefundNotify(@PathVariable("AppId") String appId,HttpServletRequest request) { + paymentAssistService.initMchApp(appId); + return refundCallbackService.refundHandle(request,true); + } + + + @Operation(summary = "微信转账回调(普通商户)") + @PostMapping("/transfer") + public String wechatTransferNotify(@PathVariable("AppId") String appId, HttpServletRequest request) { + paymentAssistService.initMchApp(appId); + return transferCallbackService.transferHandle(request,false); + } + + @Operation(summary = "微信转账回调(特约商户)") + @PostMapping("/isv/transfer") + public String wechatIsvTransferNotify(@PathVariable("AppId") String appId, HttpServletRequest request) { + paymentAssistService.initMchApp(appId); + return transferCallbackService.transferHandle(request,true); } } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPayConfig.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPayConfig.java index 0ce087468..33c747fce 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPayConfig.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatPayConfig.java @@ -3,13 +3,13 @@ package org.dromara.daxpay.channel.wechat.entity.config; import cn.bootx.platform.common.mybatisplus.function.ToResult; import cn.bootx.platform.core.util.JsonUtil; import cn.hutool.core.util.StrUtil; +import lombok.Data; +import lombok.experimental.Accessors; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.convert.config.WechatPayConfigConvert; import org.dromara.daxpay.channel.wechat.result.config.WechatPayConfigResult; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.entity.config.ChannelConfig; -import lombok.Data; -import lombok.experimental.Accessors; import java.math.BigDecimal; @@ -32,12 +32,21 @@ public class WechatPayConfig implements ToResult { /** 微信应用appId */ private String wxAppId; + /** 子商户号 */ + private String subMchId; + + /** 子应用号 */ + private String subAppId; + /** 是否启用 */ private Boolean enable; /** 授权认证地址 */ private String authUrl; + /** 是否为ISV商户(特约商户) */ + private boolean isv; + /** 支付限额 */ private BigDecimal limitAmount; @@ -56,21 +65,24 @@ public class WechatPayConfig implements ToResult { /** APPID对应的接口密码,用于获取微信公众号jsapi支付时使用 */ private String appSecret; - /** apiclient_key. pem证书base64编码 */ - private String privateKey; + /** 支付公钥(pub_key.pem) */ + private String publicKey; - /** apiclient_cert. pem证书base64编码 */ + /** 支付公钥ID */ + private String publicKeyId; + + /** 商户API证书(apiclient_cert.pem)base64编码 */ private String privateCert; - /** 证书序列号 */ + /** 商户API证书私钥(apiclient_key.pem)证书base64编码 */ + private String privateKey; + + /** 商户API证书序列号 */ private String certSerialNo; - /** API证书中p12证书Base64 */ + /** p12证书Base64 */ private String p12; - /** 是否沙箱环境 */ - private boolean sandbox; - /** 备注 */ private String remark; @@ -87,10 +99,10 @@ public class WechatPayConfig implements ToResult { channelConfig.setOutMchNo(this.getWxMchId()); channelConfig.setAppId(this.getAppId()); channelConfig.setEnable(this.getEnable()); - channelConfig.setChannel(ChannelEnum.WECHAT.getCode()); + channelConfig.setChannel(this.isv? ChannelEnum.WECHAT_ISV.getCode():ChannelEnum.WECHAT.getCode()); WechatPayConfig copy = WechatPayConfigConvert.CONVERT.copy(this); // 清空不需要序列化的字段 - copy.setId(null).setAppId(null).setEnable(null).setWxMchId(null).setAppId(null).setAppId(null); + copy.setId(null).setAppId(null).setEnable(null).setWxMchId(null).setWxAppId(null); String jsonStr = JsonUtil.toJsonStr(copy); channelConfig.setExt(jsonStr); return channelConfig; @@ -110,6 +122,7 @@ public class WechatPayConfig implements ToResult { return config; } + public String getAuthUrl() { return StrUtil.removeSuffix(authUrl, "/"); } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/clode/WxPayPartnerOrderReverseV3Request.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/clode/WxPayPartnerOrderReverseV3Request.java new file mode 100644 index 000000000..df545c05b --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/clode/WxPayPartnerOrderReverseV3Request.java @@ -0,0 +1,74 @@ +package org.dromara.daxpay.channel.wechat.param.clode; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 微信服务商V3撤销订单请求对象类 + * 参考接口地址: ... + * @author xxm + */ +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class WxPayPartnerOrderReverseV3Request implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + *
+     * 字段名:服务商应用ID
+     * 变量名:spAppid
+     * 是否必填:是
+     * 类型:string[1,32]
+     * 描述:
+     *  由微信生成的应用ID,全局唯一。请求统一下单接口时请注意APPID的应用属性,例如公众号场景下,需使用应用属性为公众号的APPID
+     *  示例值:wxd678efh567hg6787
+     * 
+ */ + @SerializedName(value = "sp_appid") + protected String spAppid; + /** + *
+     * 字段名:服务商商户号
+     * 变量名:spMchid
+     * 是否必填:是
+     * 类型:string[1,32]
+     * 描述:
+     *  服务商商户号,由微信支付生成并下发。
+     *  示例值:1230000109
+     * 
+ */ + @SerializedName(value = "sp_mchid") + protected String spMchId; + /** + *
+     * 字段名:子商户应用ID
+     * 变量名:subAppid
+     * 是否必填:否
+     * 类型:string[1,32]
+     * 描述:
+     *  由微信生成的应用ID,全局唯一。请求统一下单接口时请注意APPID的应用属性,例如公众号场景下,需使用应用属性为公众号的APPID
+     *  示例值:wxd678efh567hg6787
+     * 
+ */ + @SerializedName(value = "sub_appid") + protected String subAppid; + /** + *
+     * 字段名:子商户商户号
+     * 变量名:subMchid
+     * 是否必填:是
+     * 类型:string[1,32]
+     * 描述:
+     *  子商户商户号,由微信支付生成并下发。
+     *  示例值:1230000109
+     * 
+ */ + @SerializedName(value = "sub_mchid") + protected String subMchId; +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPayConfigParam.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPayConfigParam.java index e64bf0b75..25380fb18 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPayConfigParam.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatPayConfigParam.java @@ -18,7 +18,6 @@ import java.math.BigDecimal; @Accessors(chain = true) @Schema(title = "微信支付配置") public class WechatPayConfigParam { - /** 主键 */ @Schema(description = "主键") private Long id; @@ -33,6 +32,18 @@ public class WechatPayConfigParam { @Schema(description = "微信应用appId") private String wxAppId; + /** 子商户号 */ + @Schema(description = "子商户号") + private String subMchId; + + /** 子应用号 */ + @Schema(description = "子应用号") + private String subAppId; + + /** 是否为ISV商户(特约商户) */ + @Schema(description = "是否为ISV商户(特约商户)") + private boolean isv; + /** 是否启用 */ @NotNull(message = "是否启用不可为空") @Schema(description = "是否启用") @@ -67,15 +78,23 @@ public class WechatPayConfigParam { @Schema(description = "APPID对应的接口密码,用于获取微信公众号jsapi支付时使用") private String appSecret; - /** apiclient_key.pem证书base64编码 */ - @Schema(description = "私钥证书base64编码") - private String privateKey; + /** 支付公钥(pub_key.pem) */ + @Schema(description = "支付公钥(pub_key.pem)") + private String publicKey; - /** apiclient_cert.pem证书base64编码 */ - @Schema(description = "私钥Key的base64编码") + /** 支付公钥ID */ + @Schema(description = "支付公钥ID") + private String publicKeyId; + + /** 商户API证书(apiclient_cert.pem)base64编码 */ + @Schema(description = "商户API证书(apiclient_cert.pem)base64编码") private String privateCert; - /** 证书序列号 */ + /** 商户API证书私钥(apiclient_key.pem)证书base64编码 */ + @Schema(description = "商户API证书私钥(apiclient_key.pem)证书base64编码") + private String privateKey; + + /** 商户API证书序列号 */ @Schema(description = "证书序列号") private String certSerialNo; @@ -83,15 +102,10 @@ public class WechatPayConfigParam { @Schema(description = "API证书中p12证书") private String p12; - /** 是否沙箱环境 */ - @Schema(description = "是否沙箱环境") - private boolean sandbox; - /** 备注 */ @Schema(description = "备注") private String remark; - /** 商户AppId */ @Schema(description = "商户AppId") @NotBlank(message = "商户AppId不可为空") diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/pay/WechatPayParam.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/pay/WechatPayParam.java index 50f9768eb..7cf0fc398 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/pay/WechatPayParam.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/pay/WechatPayParam.java @@ -17,6 +17,13 @@ public class WechatPayParam { @Schema(description = "微信openId") private String openId; + /** + * 服务商模式下分为 1、sp用户服务标识 2、sub用户子标识 + * @see org.dromara.daxpay.channel.wechat.code.WechatPayCode#SP_OPENID + */ + @Schema(description = "openid类型") + private String openIdType; + @Schema(description = "授权码(主动扫描用户的付款码)") private String authCode; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/pay/WxPayPartnerCodepayRequest.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/pay/WxPayPartnerCodepayRequest.java new file mode 100644 index 000000000..d126812d2 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/pay/WxPayPartnerCodepayRequest.java @@ -0,0 +1,629 @@ +package org.dromara.daxpay.channel.wechat.param.pay; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 微信服务商条码(付款码)支付参数 + * 参考接口地址: ... + * @author xxm + * @since 2024/7/24 + */ +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class WxPayPartnerCodepayRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + *
+     * 字段名:服务商应用ID
+     * 变量名:spAppid
+     * 是否必填:是
+     * 类型:string[1,32]
+     * 描述:
+     *  由微信生成的应用ID,全局唯一。请求统一下单接口时请注意APPID的应用属性,例如公众号场景下,需使用应用属性为公众号的APPID
+     *  示例值:wxd678efh567hg6787
+     * 
+ */ + @SerializedName(value = "sp_appid") + protected String spAppid; + /** + *
+     * 字段名:服务商商户号
+     * 变量名:spMchid
+     * 是否必填:是
+     * 类型:string[1,32]
+     * 描述:
+     *  服务商商户号,由微信支付生成并下发。
+     *  示例值:1230000109
+     * 
+ */ + @SerializedName(value = "sp_mchid") + protected String spMchId; + /** + *
+     * 字段名:子商户应用ID
+     * 变量名:subAppid
+     * 是否必填:否
+     * 类型:string[1,32]
+     * 描述:
+     *  由微信生成的应用ID,全局唯一。请求统一下单接口时请注意APPID的应用属性,例如公众号场景下,需使用应用属性为公众号的APPID
+     *  示例值:wxd678efh567hg6787
+     * 
+ */ + @SerializedName(value = "sub_appid") + protected String subAppid; + /** + *
+     * 字段名:子商户商户号
+     * 变量名:subMchid
+     * 是否必填:是
+     * 类型:string[1,32]
+     * 描述:
+     *  子商户商户号,由微信支付生成并下发。
+     *  示例值:1230000109
+     * 
+ */ + @SerializedName(value = "sub_mchid") + protected String subMchId; + + /** + *
+     * 字段名:商品描述
+     * 变量名:description
+     * 是否必填:是
+     * 类型:string[1,127]
+     * 描述:
+     *  商品描述
+     *  示例值:Image形象店-深圳腾大-QQ公仔
+     * 
+ */ + @SerializedName(value = "description") + protected String description; + /** + *
+     * 字段名:商户订单号
+     * 变量名:out_trade_no
+     * 是否必填:是
+     * 类型:string[6,32]
+     * 描述:
+     *  商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
+     *  示例值:1217752501201407033233368018
+     * 
+ */ + @SerializedName(value = "out_trade_no") + protected String outTradeNo; + + /** + *
+     * 字段名:微信支付返回的订单号
+     * 变量名:transaction_id
+     * 是否必填:是
+     * 类型:string(32)
+     * 描述:
+     *  微信分配的公众账号ID
+     *  示例值:1000320306201511078440737890
+     * 
+ */ + @SerializedName(value = "transaction_id") + private String transactionId; + /** + *
+     * 字段名:附加数据
+     * 变量名:attach
+     * 是否必填:否
+     * 类型:string[1,128]
+     * 描述:
+     *  附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
+     *  示例值:自定义数据
+     * 
+ */ + @SerializedName(value = "attach") + protected String attach; + + /** + *
+     * 字段名:订单优惠标记
+     * 变量名:goods_tag
+     * 是否必填:否
+     * 类型:string[1,256]
+     * 描述:
+     *  订单优惠标记
+     *  示例值:WXG
+     * 
+ */ + @SerializedName(value = "goods_tag") + private String goodsTag; + /** + *
+     * 字段名:电子发票入口开放标识
+     * 变量名:support_fapiao
+     * 是否必填:否
+     * 类型:boolean
+     * 描述:传入true时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效。
+     * 
+ */ + @SerializedName(value = "support_fapiao") + private Boolean supportFapiao; + /** + *
+     * 字段名:支付者
+     * 变量名:payer
+     * 是否必填:是
+     * 类型:object
+     * 描述:
+     *  支付者信息
+     * 
+ */ + @SerializedName(value = "payer") + private Payer payer; + /** + *
+     * 字段名:订单金额
+     * 变量名:amount
+     * 是否必填:是
+     * 类型:object
+     * 描述:
+     *  订单金额信息
+     * 
+ */ + @SerializedName(value = "amount") + private Amount amount; + /** + *
+     * 字段名:场景信息
+     * 变量名:scene_info
+     * 是否必填:否
+     * 类型:object
+     * 描述:
+     *  支付场景描述
+     * 
+ */ + @SerializedName(value = "scene_info") + private SceneInfo sceneInfo; + + /** + *
+     * 字段名:优惠功能
+     * 变量名:promotion_detail
+     * 是否必填:否
+     * 类型:array
+     * 描述:
+     *  优惠功能,享受优惠时返回该字段。
+     * 
+ */ + @SerializedName(value = "promotion_detail") + private List promotionDetails; + + /** + *
+     * 字段名:结算信息
+     * 变量名:settle_info
+     * 是否必填:否
+     * 类型:Object
+     * 描述:结算信息
+     * 
+ */ + @SerializedName(value = "settle_info") + private SettleInfo settleInfo; + + + @Data + @NoArgsConstructor + public static class Amount implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + *
+         * 字段名:总金额
+         * 变量名:total
+         * 是否必填:否
+         * 类型:int
+         * 描述:
+         *  订单总金额,单位为分。
+         *  示例值:100
+         * 
+ */ + @SerializedName(value = "total") + private Integer total; + /** + *
+         * 字段名:用户支付金额
+         * 变量名:payer_total
+         * 是否必填:否
+         * 类型:int
+         * 描述:
+         *  用户支付金额,单位为分。
+         *  示例值:100
+         * 
+ */ + @SerializedName(value = "payer_total") + private Integer payerTotal; + /** + *
+         * 字段名:货币类型
+         * 变量名:currency
+         * 是否必填:否
+         * 类型:string[1,16]
+         * 描述:
+         *  CNY:人民币,境内商户号仅支持人民币。
+         *  示例值:CNY
+         * 
+ */ + @SerializedName(value = "currency") + private String currency; + /** + *
+         * 字段名:用户支付币种
+         * 变量名:payer_currency
+         * 是否必填:否
+         * 类型:string[1,16]
+         * 描述:
+         *  用户支付币种
+         *  示例值: CNY
+         * 
+ */ + @SerializedName(value = "payer_currency") + private String payerCurrency; + } + + @Data + @NoArgsConstructor + public static class Payer implements Serializable { + @Serial + private static final long serialVersionUID = -1L; + /** + *
+         * 字段名:用户标识
+         * 变量名:auth_code
+         * 是否必填:是
+         * 类型:string[32]
+         * 描述:
+         *   付款码支付授权码,即用户打开微信钱包显示的码。
+         *  示例值:130061098828009406
+         * 
+ */ + @SerializedName(value = "auth_code") + private String authCode; + } + + @Data + @NoArgsConstructor + public static class SceneInfo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + *
+         * 字段名:商户端设备 IP
+         * 变量名:device_ip
+         * 是否必填:是
+         * 类型:string[1,45]
+         * 描述:
+         *  用户的客户端IP,支持IPv4和IPv6两种格式的IP地址。
+         *  示例值:14.23.150.211
+         * 
+ */ + @SerializedName(value = "device_ip") + private String deviceIp; + /** + *
+         * 字段名:商户端设备号
+         * 变量名:device_id
+         * 是否必填:否
+         * 类型:string[1,32]
+         * 描述:
+         *  商户端设备号(门店号或收银设备ID)。
+         *  示例值:013467007045764
+         * 
+ */ + @SerializedName(value = "device_id") + private String deviceId; + /** + *
+         * 字段名:商户门店信息
+         * 变量名:store_info
+         * 是否必填:否
+         * 类型:object
+         * 描述:
+         *  商户门店信息
+         * 
+ */ + @SerializedName(value = "store_info") + private StoreInfo storeInfo; + } + + /** + * 商户门店信息 + */ + @Data + @NoArgsConstructor + public static class StoreInfo implements Serializable { + @Serial + private static final long serialVersionUID = -1L; + /** + *
+         * 字段名:门店编号
+         * 变量名:id
+         * 是否必填:是
+         * 类型:string[1,32]
+         * 描述:
+         *  此参数与商家自定义编码(out_id)二选一必填。
+         *  微信支付线下场所ID,格式为纯数字。
+         *  基于合规要求与风险管理目的,线下条码支付时需传入用户实际付款的场景信息。
+         *  指引参见:https://kf.qq.com/faq/230817neeaem2308177ZFfqM.html。
+         *  示例值:0001
+         * 
+ */ + @SerializedName(value = "id") + private String id; + /** + *
+         * 字段名:商家自定义编码
+         * 变量名:out_id
+         * 是否必填:否
+         * 类型:string[1,256]
+         * 描述:
+         *  此参数与门店(id)二选一必填。
+         * 商户系统的门店编码,支持大小写英文字母、数字,仅支持utf-8格式。
+         * 基于合规要求与风险管理目的,线下条码支付时需传入用户实际付款的场景信息。
+         *  示例值:A1111
+         * 
+ */ + @SerializedName(value = "out_id") + private String outId; + } + + + @Data + @NoArgsConstructor + public static class SettleInfo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + *
+         * 字段名:是否指定分账
+         * 变量名:profit_sharing
+         * 是否必填:否
+         * 类型:boolean
+         * 描述:
+         *  是否指定分账
+         *  示例值:false
+         * 
+ */ + @SerializedName(value = "profit_sharing") + private Boolean profitSharing; + } + + + /** + * 优惠功能 + */ + @Data + @NoArgsConstructor + public static class PromotionDetail implements Serializable { + /** + *
+         * 字段名:券ID
+         * 变量名:coupon_id
+         * 是否必填:是
+         * 类型:string[1,32]
+         * 描述:
+         *  券ID
+         *  示例值:109519
+         * 
+ */ + @SerializedName(value = "coupon_id") + private String couponId; + /** + *
+         * 字段名:优惠名称
+         * 变量名:name
+         * 是否必填:否
+         * 类型:string[1,64]
+         * 描述:
+         *  优惠名称
+         *  示例值:单品惠-6
+         * 
+ */ + @SerializedName(value = "name") + private String name; + /** + *
+         * 字段名:优惠范围
+         * 变量名:scope
+         * 是否必填:否
+         * 类型:string[1,32]
+         * 描述:
+         *  GLOBAL:全场代金券
+         *  SINGLE:单品优惠
+         *  示例值:GLOBAL
+         * 
+ */ + @SerializedName(value = "scope") + private String scope; + /** + *
+         * 字段名:优惠类型
+         * 变量名:type
+         * 是否必填:否
+         * 类型:string[1,32]
+         * 描述:
+         *  CASH:充值
+         *  NOCASH:预充值
+         *  示例值:CASH
+         * 
+ */ + @SerializedName(value = "type") + private String type; + /** + *
+         * 字段名:优惠券面额
+         * 变量名:amount
+         * 是否必填:是
+         * 类型:int
+         * 描述:
+         *  优惠券面额
+         *  示例值:100
+         * 
+ */ + @SerializedName(value = "amount") + private Integer amount; + /** + *
+         * 字段名:活动ID
+         * 变量名:stock_id
+         * 是否必填:否
+         * 类型:string[1,32]
+         * 描述:
+         *  活动ID
+         *  示例值:931386
+         * 
+ */ + @SerializedName(value = "stock_id") + private String stockId; + /** + *
+         * 字段名:微信出资
+         * 变量名:wechatpay_contribute
+         * 是否必填:否
+         * 类型:int
+         * 描述:
+         *  微信出资,单位为分
+         *  示例值:0
+         * 
+ */ + @SerializedName(value = "wechatpay_contribute") + private Integer wechatpayContribute; + /** + *
+         * 字段名:商户出资
+         * 变量名:merchant_contribute
+         * 是否必填:否
+         * 类型:int
+         * 描述:
+         *  商户出资,单位为分
+         *  示例值:0
+         * 
+ */ + @SerializedName(value = "merchant_contribute") + private Integer merchantContribute; + /** + *
+         * 字段名:其他出资
+         * 变量名:other_contribute
+         * 是否必填:否
+         * 类型:int
+         * 描述:
+         *  其他出资,单位为分
+         *  示例值:0
+         * 
+ */ + @SerializedName(value = "other_contribute") + private Integer otherContribute; + /** + *
+         * 字段名:优惠币种
+         * 变量名:currency
+         * 是否必填:否
+         * 类型:string[1,16]
+         * 描述:
+         *  CNY:人民币,境内商户号仅支持人民币。
+         *  示例值:CNY
+         * 
+ */ + @SerializedName(value = "currency") + private String currency; + /** + *
+         * 字段名:单品列表
+         * 变量名:goods_detail
+         * 是否必填:否
+         * 类型:array
+         * 描述:
+         *  单品列表信息
+         * 
+ */ + @SerializedName(value = "goods_detail") + private List goodsDetails; + } + + @Data + @NoArgsConstructor + public static class GoodsDetail implements Serializable { + private static final long serialVersionUID = 1L; + /** + *
+         * 字段名:商品编码
+         * 变量名:goods_id
+         * 是否必填:是
+         * 类型:string[1,32]
+         * 描述:
+         *  商品编码
+         *  示例值:M1006
+         * 
+ */ + @SerializedName(value = "goods_id") + private String goodsId; + /** + *
+         * 字段名:商品数量
+         * 变量名:quantity
+         * 是否必填:是
+         * 类型:int
+         * 描述:
+         *  用户购买的数量
+         *  示例值:1
+         * 
+ */ + @SerializedName(value = "quantity") + private Integer quantity; + /** + *
+         * 字段名:商品单价
+         * 变量名:unit_price
+         * 是否必填:是
+         * 类型:int
+         * 描述:
+         *  商品单价,单位为分
+         *  示例值:100
+         * 
+ */ + @SerializedName(value = "unit_price") + private Integer unitPrice; + /** + *
+         * 字段名:商品优惠金额
+         * 变量名:discount_amount
+         * 是否必填:是
+         * 类型:int
+         * 描述:
+         *  商品优惠金额
+         *  示例值:0
+         * 
+ */ + @SerializedName(value = "discount_amount") + private Integer discountAmount; + /** + *
+         * 字段名:商品备注
+         * 变量名:goods_remark
+         * 是否必填:否
+         * 类型:string[1,128]
+         * 描述:
+         *  商品备注信息
+         *  示例值:商品备注信息
+         * 
+ */ + @SerializedName(value = "goods_remark") + private String goodsRemark; + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPayConfigResult.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPayConfigResult.java index af69a532d..956fce41e 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPayConfigResult.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatPayConfigResult.java @@ -29,14 +29,26 @@ public class WechatPayConfigResult { @Schema(description = "微信应用appId") private String wxAppId; - /** 是否启用 */ - @Schema(description = "是否启用") - private Boolean enable; + /** 子商户号 */ + @Schema(description = "子商户号") + private String subMchId; + + /** 子应用号 */ + @Schema(description = "子应用号") + private String subAppId; + + /** 是否为ISV商户(特约商户) */ + @Schema(description = "是否为ISV商户(特约商户)") + private boolean isv; /** 授权认证地址 */ @Schema(description = "授权认证地址") private String authUrl; + /** 是否启用 */ + @Schema(description = "是否启用") + private Boolean enable; + /** 支付限额 */ @Schema(description = "支付限额") private BigDecimal limitAmount; @@ -63,18 +75,29 @@ public class WechatPayConfigResult { @SensitiveInfo private String appSecret; - /** apiclient_key.pem证书base64编码 */ + /** 支付公钥(pub_key.pem) */ + @Schema(description = "支付公钥(pub_key.pem)") @SensitiveInfo - @Schema(description = "私钥Key的base64编码") - private String privateKey; + private String publicKey; - /** apiclient_cert.pem证书base64编码 */ + /** 支付公钥ID */ + @Schema(description = "支付公钥ID") + @SensitiveInfo + private String publicKeyId; + + /** 商户API证书(apiclient_cert.pem)base64编码 */ + @Schema(description = "商户API证书(apiclient_cert.pem)base64编码") @SensitiveInfo - @Schema(description = "私钥证书base64编码") private String privateCert; - /** 证书序列号 */ + /** 商户API证书私钥(apiclient_key.pem)证书base64编码 */ + @Schema(description = "商户API证书私钥(apiclient_key.pem)证书base64编码") + @SensitiveInfo + private String privateKey; + + /** 商户API证书序列号 */ @Schema(description = "证书序列号") + @SensitiveInfo private String certSerialNo; /** apiclient_cert.p12证书Base64 */ @@ -82,10 +105,6 @@ public class WechatPayConfigResult { @SensitiveInfo private String p12; - /** 是否沙箱环境 */ - @Schema(description = "是否沙箱环境") - private boolean sandbox; - /** 备注 */ @Schema(description = "备注") private String remark; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java index 1156444f8..0f2f0eade 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV2Service.java @@ -1,17 +1,6 @@ package org.dromara.daxpay.channel.wechat.service.allocation; import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; -import cn.hutool.json.JSONUtil; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingQueryRequest; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingRequest; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeRequest; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; -import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingQueryResult; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.ProfitSharingService; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum; import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum; @@ -27,6 +16,17 @@ import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; +import cn.hutool.json.JSONUtil; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingQueryRequest; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingRequest; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeRequest; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; +import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingQueryResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.ProfitSharingService; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -40,6 +40,7 @@ import java.util.stream.Collectors; import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; + /** * 微信分账V2版本接口 * @author xxm @@ -53,7 +54,7 @@ public class WeChatPayAllocationV2Service { private final WechatPayConfigService wechatPayConfigService; /** - * 发起分账 使用分账号作为请求号 + * 分账 */ public AllocStartResultBo start(AllocOrder allocOrder, List details, WechatPayConfig config) { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); @@ -89,7 +90,7 @@ public class WeChatPayAllocationV2Service { } /** - * 分账完结 使用ID作为请求号 + * 完结 */ public void finish(AllocOrder allocOrder, WechatPayConfig config) { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java index c713491a8..33dbb44a3 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPayAllocationV3Service.java @@ -1,15 +1,6 @@ package org.dromara.daxpay.channel.wechat.service.allocation; import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; -import cn.hutool.json.JSONUtil; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeV3Request; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; -import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.ProfitSharingService; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum; import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum; @@ -24,6 +15,15 @@ import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; +import cn.hutool.json.JSONUtil; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeV3Request; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; +import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.ProfitSharingService; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -38,6 +38,7 @@ import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; import static org.dromara.daxpay.core.enums.AllocationStatusEnum.*; + /** * 微信分账V3版本接口 * @author xxm @@ -112,7 +113,7 @@ public class WeChatPayAllocationV3Service { ProfitSharingService sharingService = wxPayService.getProfitSharingService(); // 根据订单状态判断 使用ID还是分账号 String outOrderNo; - if (List.of(PROCESSING.getCode(),ALLOC_FAILED.getCode(), ALLOC_END.getCode()).contains(allocOrder.getStatus())){ + if (List.of(PROCESSING.getCode(), ALLOC_FAILED.getCode(), ALLOC_END.getCode()).contains(allocOrder.getStatus())){ outOrderNo = allocOrder.getAllocNo(); } else { outOrderNo = String.valueOf(allocOrder.getId()); diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPaySubAllocationV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPaySubAllocationV2Service.java new file mode 100644 index 000000000..3c75cc35b --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPaySubAllocationV2Service.java @@ -0,0 +1,170 @@ +package org.dromara.daxpay.channel.wechat.service.allocation; + +import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum; +import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.AllocDetailResultEnum; +import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; +import org.dromara.daxpay.core.enums.AllocationStatusEnum; +import org.dromara.daxpay.core.exception.ConfigErrorException; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; +import cn.hutool.json.JSONUtil; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingQueryRequest; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingRequest; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeRequest; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; +import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingQueryResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.ProfitSharingService; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; +import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; + + +/** + * 微信服务商分账V2版本接口 + * @author xxm + * @since 2024/12/9 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WeChatPaySubAllocationV2Service { + + private final WechatPayConfigService wechatPayConfigService; + + /** + * 分账 + */ + public AllocStartResultBo start(AllocOrder allocOrder, List details, WechatPayConfig config) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + + ProfitSharingRequest request = new ProfitSharingRequest(); + request.setAppid(config.getWxAppId()); + request.setOutOrderNo(allocOrder.getAllocNo()); + request.setTransactionId(allocOrder.getOutOrderNo()); + + // 分账接收方信息 + var receivers = details.stream() + .map(o -> { + AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType()); + String receiverType = this.getReceiverType(receiverTypeEnum); + var receiver = new ProfitSharingV3Request.Receiver(); + receiver.setType(receiverType); + receiver.setAmount(PayUtil.convertCentAmount(o.getAmount())); + receiver.setAccount(o.getReceiverAccount()); + receiver.setName(o.getReceiverName()); + receiver.setDescription("订单分账"); + return receiver; + }) + .toList(); + + request.setReceivers(JSONUtil.toJsonStr(receivers)); + try { + var result = sharingService.multiProfitSharing(request); + return new AllocStartResultBo().setOutAllocNo(result.getTransactionId()); + } catch (WxPayException e) { + throw new OperationFailException("微信分账V2失败: "+e.getMessage()); + } + } + + /** + * 完结 + */ + public void finish(AllocOrder allocOrder, WechatPayConfig config) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + var request = new ProfitSharingUnfreezeRequest(); + request.setOutOrderNo(String.valueOf(allocOrder.getId())); + request.setTransactionId(allocOrder.getOutOrderNo()); + request.setDescription("分账完结"); + try { + sharingService.profitSharingFinish(request); + } catch (WxPayException e) { + throw new OperationFailException("微信分账完结V2失败: "+e.getMessage()); + } + } + + /** + * 同步 + */ + public AllocSyncResultBo sync(AllocOrder allocOrder, List details, WechatPayConfig config) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + ProfitSharingQueryRequest request = new ProfitSharingQueryRequest(); + // 根据订单状态判断 使用ID还是分账号 + request.setTransactionId(allocOrder.getOutOrderNo()); + if (Objects.equals(AllocationStatusEnum.PROCESSING.getCode(), allocOrder.getStatus())){ + request.setOutOrderNo(allocOrder.getAllocNo()); + } else { + request.setOutOrderNo(String.valueOf(allocOrder.getId())); + } + + ProfitSharingQueryResult result; + try { + result = sharingService.profitSharingQuery(request); + } catch (WxPayException e) { + throw new OperationFailException("微信分账订单查询V2失败: "+e.getMessage()); + } + var detailMap = details.stream() + .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); + var royaltyDetailList = Optional.ofNullable( result.getReceivers()).orElse(new ArrayList<>(0)); + for (var receiver : royaltyDetailList) { + var detail = detailMap.get(receiver.getAccount()); + if (Objects.nonNull(detail)) { + detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode()); + detail.setErrorMsg(receiver.getFailReason()); + detail.setOutDetailId(receiver.getDetailId()); + // 如果是完成, 更新时间 + if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ + LocalDateTime finishTime = WechatPayUtil.parseV2(receiver.getFinishTime()); + detail.setFinishTime(finishTime) + .setErrorMsg(null) + .setErrorCode(null); + } + } + } + return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result)); + } + + /** + * 获取分账接收方类型编码 + */ + private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ + if (receiverTypeEnum == OPEN_ID){ + return WechatAllocReceiverEnum.PERSONAL_OPENID.getCode(); + } + if (receiverTypeEnum == MERCHANT_NO){ + return WechatAllocReceiverEnum.MERCHANT_ID.getCode(); + } + throw new ConfigErrorException("分账接收方类型错误"); + } + + /** + * 转换支付宝分账类型到系统中统一的状态 + */ + private AllocDetailResultEnum getDetailResultEnum (String result){ + return WechatAllocStatusEnum.findByCode(result).getResult(); + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPaySubAllocationV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPaySubAllocationV3Service.java new file mode 100644 index 000000000..89d9f299a --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/WeChatPaySubAllocationV3Service.java @@ -0,0 +1,170 @@ +package org.dromara.daxpay.channel.wechat.service.allocation; + +import cn.bootx.platform.common.mybatisplus.function.CollectorsFunction; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.enums.WechatAllocReceiverEnum; +import org.dromara.daxpay.channel.wechat.enums.WechatAllocStatusEnum; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.AllocDetailResultEnum; +import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; +import org.dromara.daxpay.core.exception.ConfigErrorException; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; +import org.dromara.daxpay.service.entity.allocation.order.AllocDetail; +import org.dromara.daxpay.service.entity.allocation.order.AllocOrder; +import cn.hutool.json.JSONUtil; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingUnfreezeV3Request; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingV3Request; +import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.ProfitSharingService; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; +import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; +import static org.dromara.daxpay.core.enums.AllocationStatusEnum.*; + + +/** + * 微信服务商分账V3版本接口 + * @author xxm + * @since 2024/12/9 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WeChatPaySubAllocationV3Service { + private final WechatPayConfigService wechatPayConfigService; + + /** + * 发起分账 使用分账号作为请求号 + */ + public AllocStartResultBo start(AllocOrder allocOrder, List orderDetails, WechatPayConfig config){ + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + + ProfitSharingV3Request request = new ProfitSharingV3Request(); + request.setAppid(config.getWxAppId()); + request.setOutOrderNo(allocOrder.getAllocNo()); + request.setTransactionId(allocOrder.getOutOrderNo()); + request.setUnfreezeUnsplit(false); + + // 分账接收方信息 + var receivers = orderDetails.stream() + .map(o -> { + AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(o.getReceiverType()); + String receiverType = this.getReceiverType(receiverTypeEnum); + var receiver = new ProfitSharingV3Request.Receiver(); + receiver.setType(receiverType); + receiver.setAmount(PayUtil.convertCentAmount(o.getAmount())); + receiver.setAccount(o.getReceiverAccount()); + receiver.setName(o.getReceiverName()); + receiver.setDescription("订单分账"); + receiver.setRelationType("PARTNER"); + return receiver; + }) + .toList(); + + request.setReceivers(receivers); + try { + ProfitSharingV3Result result = sharingService.profitSharingV3(request); + return new AllocStartResultBo().setOutAllocNo(result.getTransactionId()); + } catch (WxPayException e) { + throw new OperationFailException("微信分账V3失败: "+e.getMessage()); + } + } + + /** + * 分账完结 使用ID作为请求号 + */ + public void finish(AllocOrder allocOrder, WechatPayConfig config){ + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + var request = new ProfitSharingUnfreezeV3Request(); + request.setOutOrderNo(String.valueOf(allocOrder.getId())); + request.setTransactionId(allocOrder.getOutOrderNo()); + request.setDescription("分账完结"); + try { + sharingService.profitSharingUnfreeze(request); + } catch (WxPayException e) { + throw new OperationFailException("微信分账完结V3失败: "+e.getMessage()); + } + } + + /** + * 同步 + */ + public AllocSyncResultBo sync(AllocOrder allocOrder, List details, WechatPayConfig config){ + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + // 根据订单状态判断 使用ID还是分账号 + String outOrderNo; + if (List.of(PROCESSING.getCode(), ALLOC_FAILED.getCode(), ALLOC_END.getCode()).contains(allocOrder.getStatus())){ + outOrderNo = allocOrder.getAllocNo(); + } else { + outOrderNo = String.valueOf(allocOrder.getId()); + } + + ProfitSharingV3Result result; + try { + result = sharingService.profitSharingQueryV3(outOrderNo,allocOrder.getOutOrderNo(),config.getSubMchId()); + } catch (WxPayException e) { + throw new OperationFailException("微信分账订单查询V3失败: "+e.getMessage()); + } + var detailMap = details.stream() + .collect(Collectors.toMap(AllocDetail::getReceiverAccount, Function.identity(), CollectorsFunction::retainLatest)); + var royaltyDetailList = Optional.ofNullable(result.getReceivers()).orElse(new ArrayList<>(0)); + for (var receiver : royaltyDetailList) { + var detail = detailMap.get(receiver.getAccount()); + if (Objects.nonNull(detail)) { + detail.setResult(this.getDetailResultEnum(receiver.getResult()).getCode()); + detail.setErrorMsg(receiver.getFailReason()); + detail.setOutDetailId(receiver.getDetailId()); + // 如果是完成, 更新时间 + if (AllocDetailResultEnum.SUCCESS.getCode().equals(detail.getResult())){ + LocalDateTime finishTime = WechatPayUtil.parseV3(receiver.getFinishTime()); + detail.setFinishTime(finishTime) + .setErrorMsg(null) + .setErrorCode(null); + } + } + } + return new AllocSyncResultBo().setSyncInfo(JSONUtil.toJsonStr(result)); + } + + /** + * 获取分账接收方类型编码 + */ + private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ + if (receiverTypeEnum == OPEN_ID){ + return WechatAllocReceiverEnum.PERSONAL_OPENID.getCode(); + } + if (receiverTypeEnum == MERCHANT_NO){ + return WechatAllocReceiverEnum.MERCHANT_ID.getCode(); + } + throw new ConfigErrorException("分账接收方类型错误"); + } + + /** + * 转换支付宝分账类型到系统中统一的状态 + */ + private AllocDetailResultEnum getDetailResultEnum (String result){ + return WechatAllocStatusEnum.findByCode(result).getResult(); + } + + +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV2Service.java index 1ab17a34d..3ad549015 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV2Service.java @@ -1,5 +1,11 @@ package org.dromara.daxpay.channel.wechat.service.allocation.receiver; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; +import org.dromara.daxpay.core.exception.ConfigErrorException; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; import com.github.binarywang.wxpay.bean.profitsharing.Receiver; import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverRequest; import com.github.binarywang.wxpay.exception.WxPayException; @@ -9,12 +15,6 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; -import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; -import org.dromara.daxpay.core.exception.ConfigErrorException; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; import org.springframework.stereotype.Service; import java.util.Locale; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV3Service.java index 0b9e9b9e1..cd5b50f40 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPayAllocReceiverV3Service.java @@ -1,17 +1,17 @@ package org.dromara.daxpay.channel.wechat.service.allocation.receiver; -import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverV3Request; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.ProfitSharingService; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; import org.dromara.daxpay.core.exception.ConfigErrorException; import org.dromara.daxpay.core.exception.OperationFailException; import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverV3Request; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.ProfitSharingService; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Locale; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPaySubAllocReceiverV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPaySubAllocReceiverV2Service.java new file mode 100644 index 000000000..368036cae --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatPaySubAllocReceiverV2Service.java @@ -0,0 +1,104 @@ +package org.dromara.daxpay.channel.wechat.service.allocation.receiver; + +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; +import org.dromara.daxpay.core.exception.ConfigErrorException; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; +import com.github.binarywang.wxpay.bean.profitsharing.Receiver; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverRequest; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.ProfitSharingService; +import com.github.binarywang.wxpay.service.WxPayService; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Locale; +import java.util.Objects; + +import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; +import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; + +/** + * 微信分账接收方服务 + * @author xxm + * @since 2024/4/1 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatPaySubAllocReceiverV2Service { + + private final WechatPayConfigService wechatPayConfigService; + + private static final Gson GSON = new GsonBuilder().create(); + + /** + * 绑定 + */ + public void bind(AllocReceiver allocReceiver, WechatPayConfig config){ + AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(allocReceiver.getReceiverType()); + String receiverType = this.getReceiverType(receiverTypeEnum); + + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + + ProfitSharingReceiverRequest request = new ProfitSharingReceiverRequest(); + Receiver receiver = new Receiver(receiverType,allocReceiver.getReceiverAccount(),allocReceiver.getReceiverName(),getRelationType(allocReceiver.getRelationType()),allocReceiver.getRelationName()); + request.setReceiver(GSON.toJson(receiver)); + + try { + sharingService.addReceiver(request); + } catch (WxPayException e) { + throw new OperationFailException("微信添加分账方V2失败: "+e.getMessage()); + } + } + + /** + * 解除绑定 + */ + public void unbind(AllocReceiver allocReceiver, WechatPayConfig config){ + AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(allocReceiver.getReceiverType()); + String receiverType = this.getReceiverType(receiverTypeEnum); + + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + + ProfitSharingReceiverRequest request = new ProfitSharingReceiverRequest(); + Receiver receiver = new Receiver(receiverType,allocReceiver.getReceiverAccount()); + request.setReceiver(GSON.toJson(receiver)); + try { + sharingService.removeReceiver(request); + } catch (WxPayException e) { + throw new OperationFailException("微信删除分账方V2失败: "+e.getMessage()); + } + } + + + /** + * 获取分账接收方类型编码 + */ + private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ + if (receiverTypeEnum == OPEN_ID){ + return "PERSONAL_OPENID"; + } + if (receiverTypeEnum == MERCHANT_NO){ + return "MERCHANT_ID"; + } + throw new ConfigErrorException("分账接收方类型错误"); + } + + /** + * 获取分账关系类型编码 + */ + private String getRelationType(String relationType){ + if (Objects.isNull(relationType)){ + return null; + } + return relationType.toUpperCase(Locale.ROOT); + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatSubAllocReceiverV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatSubAllocReceiverV3Service.java new file mode 100644 index 000000000..71b7df438 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/allocation/receiver/WechatSubAllocReceiverV3Service.java @@ -0,0 +1,103 @@ +package org.dromara.daxpay.channel.wechat.service.allocation.receiver; + +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; +import org.dromara.daxpay.core.exception.ConfigErrorException; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.service.entity.allocation.receiver.AllocReceiver; +import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverV3Request; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.ProfitSharingService; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Locale; +import java.util.Objects; + +import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.MERCHANT_NO; +import static org.dromara.daxpay.core.enums.AllocReceiverTypeEnum.OPEN_ID; + +/** + * 微信分账接收方服务 + * @author xxm + * @since 2024/4/1 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatSubAllocReceiverV3Service { + private final WechatPayConfigService wechatPayConfigService; + + /** + * 绑定 + */ + public void bind(AllocReceiver allocReceiver, WechatPayConfig config){ + AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(allocReceiver.getReceiverType()); + String receiverType = this.getReceiverType(receiverTypeEnum); + + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + + ProfitSharingReceiverV3Request request = new ProfitSharingReceiverV3Request(); + request.setAppid(config.getWxAppId()); + request.setType(receiverType); + request.setAccount(allocReceiver.getReceiverAccount()); + request.setName(allocReceiver.getReceiverName()); + request.setRelationType(getRelationType(allocReceiver.getRelationType())); + request.setCustomRelation(allocReceiver.getRelationName()); + try { + sharingService.addReceiverV3(request); + } catch (WxPayException e) { + throw new OperationFailException("微信添加分账方V3失败: "+e.getMessage()); + } + } + + /** + * 解除绑定 + */ + public void unbind(AllocReceiver allocReceiver, WechatPayConfig config){ + AllocReceiverTypeEnum receiverTypeEnum = AllocReceiverTypeEnum.findByCode(allocReceiver.getReceiverType()); + String receiverType = this.getReceiverType(receiverTypeEnum); + + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + ProfitSharingService sharingService = wxPayService.getProfitSharingService(); + + ProfitSharingReceiverV3Request request = new ProfitSharingReceiverV3Request(); + request.setAppid(config.getAppId()); + request.setType(receiverType); + request.setAccount(allocReceiver.getReceiverAccount()); + request.setName(allocReceiver.getReceiverName()); + request.setRelationType(getRelationType(allocReceiver.getRelationType())); + request.setCustomRelation(allocReceiver.getRelationName()); + try { + sharingService.removeReceiverV3(request); + } catch (WxPayException e) { + throw new OperationFailException("微信添加分账方V3失败: "+e.getMessage()); + } + } + + /** + * 获取分账接收方类型编码 + */ + private String getReceiverType(AllocReceiverTypeEnum receiverTypeEnum){ + if (receiverTypeEnum == OPEN_ID){ + return "PERSONAL_OPENID"; + } + if (receiverTypeEnum == MERCHANT_NO){ + return "MERCHANT_ID"; + } + throw new ConfigErrorException("分账接收方类型错误"); + } + /** + * 获取分账关系类型编码 + */ + private String getRelationType(String relationType){ + if (Objects.isNull(relationType)){ + return null; + } + return relationType.toUpperCase(Locale.ROOT); + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java index 60205fdb3..9d4d5c516 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatAuthService.java @@ -29,33 +29,28 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class WechatAuthService { - private final WechatPayConfigService wechatPayConfigService; + private final WechatPayConfigService weChatPayConfigService; + private final PlatformConfigService platformsConfigService; + private final WechatPayConfigService wechatPayConfigService; private final PlatformConfigService platformConfigService; /** * 构建微信oauth2授权的url连接 - * 1. 手段传输回调地址, 直接进行拼接, 后续跳转到传输的回调地址, 而不会经过系统 - * 2. 不传输回调地址, 则会生成一个h5段的认证路径, 后续通过这个页面和系统配合获取认证信息, 会返回查询码用于查询 */ public AuthUrlResult generateAuthUrl(GenerateAuthUrlParam param) { - WechatPayConfig config = wechatPayConfigService.getWechatPayConfig(); - WxMpService wxMpService = this.getWxMpService(config); + WxMpService wxMpService = this.getWxMpService(); // 手段传输回调地址, 直接拼接不做处理 if (StrUtil.isNotBlank(param.getAuthRedirectUrl())){ String url = wxMpService.getOAuth2Service() .buildAuthorizationUrl(param.getAuthRedirectUrl(), WxConsts.OAuth2Scope.SNSAPI_BASE, ""); return new AuthUrlResult().setAuthUrl(url); } else { - // 如果配置中有地址配置则使用, 没有的话使用平台地址进行拼接 - String serverUrl = config.getAuthUrl(); - if (StrUtil.isBlank(serverUrl)){ - PlatformConfig platformConfig = platformConfigService.getConfig(); - serverUrl = platformConfig.getGatewayMobileUrl(); - } - // 生产链接, 授权成功后重定向h5段用于获取授权码的页面, 获取成功后页面自动关闭 + PlatformConfig platformConfig = platformsConfigService.getConfig(); String queryCode = RandomUtil.randomString(10); - String redirectUrl = StrUtil.format("{}/auth/wechat/{}/{}/{}", serverUrl, param.getAppId(), param.getChannel(), queryCode); + // 判断是否独立部署前端 + String serverUrl = platformConfig.getGatewayMobileUrl(); + String redirectUrl = StrUtil.format("{}/wechat/auth/{}/{}/{}", serverUrl, param.getAppId(), param.getChannel(),queryCode); String authUrl = wxMpService.getOAuth2Service().buildAuthorizationUrl(redirectUrl, WxConsts.OAuth2Scope.SNSAPI_BASE, ""); return new AuthUrlResult().setAuthUrl(authUrl).setQueryCode(queryCode); } @@ -66,7 +61,7 @@ public class WechatAuthService { * @param authPath 授权链接, 需要为h5项目中的可访问路由路径 */ public String generateInnerAuthUrl(String authPath) { - WechatPayConfig config = wechatPayConfigService.getWechatPayConfig(); + WechatPayConfig config = wechatPayConfigService.getWechatPayConfig(false); WxMpService wxMpService = this.getWxMpService(config); // 如果配置中有地址配置则使用, 没有的话使用平台地址进行拼接 @@ -95,7 +90,7 @@ public class WechatAuthService { * 获取微信公众号API的Service */ private WxMpService getWxMpService() { - WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(); + WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(false); return getWxMpService(config); } /** diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatSubAuthService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatSubAuthService.java new file mode 100644 index 000000000..cf8bab49a --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/assist/WechatSubAuthService.java @@ -0,0 +1,80 @@ +package org.dromara.daxpay.channel.wechat.service.assist; + +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; +import org.dromara.daxpay.core.result.assist.AuthResult; +import org.dromara.daxpay.core.result.assist.AuthUrlResult; +import org.dromara.daxpay.service.entity.config.PlatformConfig; +import org.dromara.daxpay.service.service.config.PlatformConfigService; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; +import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; +import org.springframework.stereotype.Service; + +/** + * 支付支撑服务类 + * @author xxm + * @since 2024/2/10 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatSubAuthService { + + private final WechatPayConfigService weChatPayConfigService; + + private final PlatformConfigService platformsConfigService; + + /** + * 构建微信oauth2授权的url连接 + */ + public AuthUrlResult generateAuthUrl(GenerateAuthUrlParam param) { + WxMpService wxMpService = this.getWxMpService(); + // 手段传输回调地址, 直接拼接不做处理 + if (StrUtil.isNotBlank(param.getAuthRedirectUrl())){ + String url = wxMpService.getOAuth2Service() + .buildAuthorizationUrl(param.getAuthRedirectUrl(), WxConsts.OAuth2Scope.SNSAPI_BASE, ""); + return new AuthUrlResult().setAuthUrl(url); + } else { + PlatformConfig platformConfig = platformsConfigService.getConfig(); + String queryCode = RandomUtil.randomString(10); + // 判断是否独立部署前端 + String serverUrl = platformConfig.getGatewayMobileUrl(); + String redirectUrl = StrUtil.format("{}/wechat/auth/{}/{}/{}", serverUrl, param.getAppId(), param.getChannel(),queryCode); + String authUrl = wxMpService.getOAuth2Service().buildAuthorizationUrl(redirectUrl, WxConsts.OAuth2Scope.SNSAPI_BASE, ""); + return new AuthUrlResult().setAuthUrl(authUrl).setQueryCode(queryCode); + } + } + + /** + * 获取微信AccessToken数据 + */ + @SneakyThrows + public AuthResult getTokenAndOpenId(String authCode){ + WxMpService wxMpService = this.getWxMpService(); + WxOAuth2AccessToken accessToken = wxMpService.getOAuth2Service().getAccessToken(authCode); + return new AuthResult() + .setAccessToken(accessToken.getAccessToken()) + .setOpenId(accessToken.getOpenId()); + } + + /** + * 获取微信公众号API的Service + */ + private WxMpService getWxMpService() { + var config = weChatPayConfigService.getAndCheckConfig(true); + WxMpService wxMpService = new WxMpServiceImpl(); + WxMpDefaultConfigImpl wxMpConfig = new WxMpDefaultConfigImpl(); + wxMpConfig.setAppId(config.getWxAppId()); // 设置微信公众号的appid + wxMpConfig.setSecret(config.getAppSecret()); // 设置微信公众号的app corpSecret + wxMpService.setWxMpConfigStorage(wxMpConfig); + return wxMpService; + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatPayCallbackService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatPayCallbackService.java index b3cfde638..71a9f128d 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatPayCallbackService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatPayCallbackService.java @@ -1,5 +1,18 @@ package org.dromara.daxpay.channel.wechat.service.callback; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; +import com.github.binarywang.wxpay.bean.notify.SignatureHeader; +import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; +import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Result; +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; +import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; @@ -13,16 +26,6 @@ import org.dromara.daxpay.service.common.context.CallbackLocal; import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService; import org.dromara.daxpay.service.service.trade.pay.PayCallbackService; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.servlet.JakartaServletUtil; -import com.github.binarywang.wxpay.bean.notify.*; -import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -46,9 +49,9 @@ public class WechatPayCallbackService { /** * 支付回调处理 */ - public String payHandle(HttpServletRequest request){ + public String payHandle(HttpServletRequest request, boolean isv){ // 解析数据 - if (this.resolve(request)){ + if (this.resolve(request,isv)){ // 执行回调业务处理 payCallbackService.payCallback(); // 保存记录 @@ -64,12 +67,13 @@ public class WechatPayCallbackService { /** * 支付回调处理, 解析数据 */ - public boolean resolve(HttpServletRequest request){ + public boolean resolve(HttpServletRequest request, boolean isv){ CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); // 设置类型和通道 - callbackInfo.setCallbackType(TradeTypeEnum.PAY).setChannel(ChannelEnum.WECHAT.getCode()); + callbackInfo.setCallbackType(TradeTypeEnum.PAY) + .setChannel(isv? ChannelEnum.WECHAT_ISV.getCode():ChannelEnum.WECHAT.getCode()); - WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(); + WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(false); WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); // v2 或 v3 if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)) { @@ -80,7 +84,7 @@ public class WechatPayCallbackService { // 转换请求 WxPayOrderNotifyResult wxPayOrderNotifyResult = wxPayService.parseOrderNotifyResult(xml); // 解析数据 - this.resolveV2Data(wxPayOrderNotifyResult); + this.resolveV2Data(wxPayOrderNotifyResult,isv); return true; } catch (WxPayException e) { log.error("微信支付回调V2处理失败", e); @@ -101,7 +105,7 @@ public class WechatPayCallbackService { // 转换请求 WxPayNotifyV3Result wxPayNotifyV3Result = wxPayService.parseOrderNotifyV3Result(body, signatureHeader); // 解析数据 - this.resolvePayData(wxPayNotifyV3Result); + this.resolvePayData(wxPayNotifyV3Result,isv); } catch (WxPayException e) { callbackInfo.setCallbackStatus(CallbackStatusEnum.FAIL); log.error("微信支付回调V3处理失败", e); @@ -114,7 +118,7 @@ public class WechatPayCallbackService { /** * 解析数据 v2 */ - private void resolveV2Data(WxPayOrderNotifyResult result){ + private void resolveV2Data(WxPayOrderNotifyResult result, boolean isv){ CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); // 回调数据 Map map = result.toMap(); @@ -137,7 +141,7 @@ public class WechatPayCallbackService { /** * 解析数据 v3 */ - private void resolvePayData(WxPayNotifyV3Result v3Result){ + private void resolvePayData(WxPayNotifyV3Result v3Result, boolean isv){ CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); var result = v3Result.getResult(); // 回调数据 diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java index c62385ba4..5461a2247 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java @@ -1,7 +1,20 @@ package org.dromara.daxpay.channel.wechat.service.callback; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; +import com.github.binarywang.wxpay.bean.notify.SignatureHeader; +import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; +import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult; +import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result; +import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; @@ -15,19 +28,6 @@ import org.dromara.daxpay.service.common.context.CallbackLocal; import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService; import org.dromara.daxpay.service.service.trade.refund.RefundCallbackService; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.servlet.JakartaServletUtil; -import com.github.binarywang.wxpay.bean.notify.SignatureHeader; -import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; -import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult; -import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result; -import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -50,9 +50,9 @@ public class WechatRefundCallbackService { /** * 退款回调处理 */ - public String refundHandle(HttpServletRequest request){ + public String refundHandle(HttpServletRequest request, boolean isv){ // 解析数据 - if (this.resolve(request)){ + if (this.resolve(request,isv)){ // 执行回调业务处理 refundCallbackService.refundCallback(); // 保存记录 @@ -68,13 +68,14 @@ public class WechatRefundCallbackService { /** * 退款回调处理, 解析数据 */ - public boolean resolve(HttpServletRequest request){ + public boolean resolve(HttpServletRequest request, boolean isv){ CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); // 设置类型和通道 - callbackInfo.setCallbackType(TradeTypeEnum.REFUND).setChannel(ChannelEnum.WECHAT.getCode()); + callbackInfo.setCallbackType(TradeTypeEnum.REFUND) + .setChannel(isv? ChannelEnum.WECHAT_ISV.getCode():ChannelEnum.WECHAT.getCode()); - WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(); + WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(false); WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); // v2 或 v3 if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)) { @@ -85,7 +86,7 @@ public class WechatRefundCallbackService { // 转换请求 var result = wxPayService.parseRefundNotifyResult(xml); // 解析数据 - resolveV2Data(result); + resolveV2Data(result,isv); return true; } catch (WxPayException e) { callbackInfo.setCallbackStatus(CallbackStatusEnum.FAIL); @@ -106,7 +107,7 @@ public class WechatRefundCallbackService { // 转换请求 var result = wxPayService.parseRefundNotifyV3Result(body, signatureHeader); // 解析数据 - this.resolveV3Data(result); + this.resolveV3Data(result,isv); return true; } catch (WxPayException e) { callbackInfo.setCallbackStatus(CallbackStatusEnum.FAIL); @@ -119,7 +120,7 @@ public class WechatRefundCallbackService { /** * 解析数据 v2 */ - public void resolveV2Data(WxPayRefundNotifyResult notifyResult){ + public void resolveV2Data(WxPayRefundNotifyResult notifyResult, boolean isv){ CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); // 解密的数据 var result = notifyResult.getReqInfo(); @@ -154,7 +155,7 @@ public class WechatRefundCallbackService { /** * 解析数据 v3 */ - public void resolveV3Data(WxPayRefundNotifyV3Result v3Result){ + public void resolveV3Data(WxPayRefundNotifyV3Result v3Result, boolean isv){ CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); var result = v3Result.getResult(); // 回调数据 diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatTransferCallbackService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatTransferCallbackService.java index 4b0d595ef..afbba2e78 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatTransferCallbackService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatTransferCallbackService.java @@ -1,5 +1,14 @@ package org.dromara.daxpay.channel.wechat.service.callback; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; +import com.github.binarywang.wxpay.bean.notify.SignatureHeader; +import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.result.transfer.WxPayTransferBatchesNotifyV3Result; @@ -12,15 +21,6 @@ import org.dromara.daxpay.service.common.context.CallbackLocal; import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.service.record.callback.TradeCallbackRecordService; import org.dromara.daxpay.service.service.trade.transfer.TransferCallbackService; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.extra.servlet.JakartaServletUtil; -import com.github.binarywang.wxpay.bean.notify.SignatureHeader; -import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; @@ -44,9 +44,9 @@ public class WechatTransferCallbackService { /** * 回调处理 */ - public String transferHandle(HttpServletRequest request) { + public String transferHandle(HttpServletRequest request, boolean isv) { // 解析数据 - if (this.resolve(request)){ + if (this.resolve(request,isv)){ // 执行回调业务处理 transferCallbackService.transferCallback(); // 保存记录 @@ -62,11 +62,11 @@ public class WechatTransferCallbackService { /** * 微信转账到零钱回调 */ - public boolean resolve(HttpServletRequest request) { + public boolean resolve(HttpServletRequest request, boolean isv) { CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); callbackInfo.setChannel(ChannelEnum.WECHAT.getCode()) .setCallbackType(TradeTypeEnum.TRANSFER); - WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(); + WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(false); WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); // V3 回调接收处理 String body = JakartaServletUtil.getBody(request); @@ -80,7 +80,7 @@ public class WechatTransferCallbackService { try { var notifyV3Result = wxPayService.baseParseOrderNotifyV3Result(body, signatureHeader, WxPayTransferBatchesNotifyV3Result.class, WxPayTransferBatchesNotifyV3Result.DecryptNotifyResult.class); // 解析数据 - this.resolveData(notifyV3Result); + this.resolveData(notifyV3Result,isv); } catch (WxPayException e) { callbackInfo.setCallbackStatus(CallbackStatusEnum.FAIL); log.error("微信转账回调V3处理失败", e); @@ -92,7 +92,7 @@ public class WechatTransferCallbackService { /** * 微信转账到零钱回调 */ - public void resolveData(WxPayTransferBatchesNotifyV3Result notifyV3Result) { + public void resolveData(WxPayTransferBatchesNotifyV3Result notifyV3Result, boolean isv) { CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); // 解析数据 var result = notifyV3Result.getResult(); diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPayCloseV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPayCloseV3Service.java index fceeb6c8c..dadf51514 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPayCloseV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPayCloseV3Service.java @@ -1,14 +1,14 @@ package org.dromara.daxpay.channel.wechat.service.close; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.service.entity.order.pay.PayOrder; import com.github.binarywang.wxpay.bean.request.WxPayOrderReverseV3Request; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.springframework.stereotype.Service; /** diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPaySubCloseV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPaySubCloseV2Service.java new file mode 100644 index 000000000..3e16240df --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPaySubCloseV2Service.java @@ -0,0 +1,55 @@ +package org.dromara.daxpay.channel.wechat.service.close; + +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import com.github.binarywang.wxpay.bean.request.WxPayOrderReverseRequest; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 微信支付关闭 V2 + * @author xxm + * @since 2024/7/21 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatPaySubCloseV2Service { + private final WechatPayConfigService wechatPayConfigService; + + + /** + * 关闭支付, 微信对已经关闭的支付单也可以重复关闭 + */ + public void close(PayOrder payOrder, WechatPayConfig weChatPayConfig) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(weChatPayConfig); + try { + wxPayService.closeOrder(payOrder.getOrderNo()); + } catch (WxPayException e) { + log.error("微信关闭订单V2失败", e); + throw new TradeFailException("微信关闭订单V2失败: "+e.getMessage()); + } + } + + + /** + * 撤销接口 + */ + public void cancel(PayOrder payOrder, WechatPayConfig weChatPayConfig){ + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(weChatPayConfig); + try { + WxPayOrderReverseRequest request = new WxPayOrderReverseRequest(); + request.setOutTradeNo(payOrder.getOrderNo()); + wxPayService.reverseOrder(request); + } catch (WxPayException e) { + log.error("微信撤销订单V2失败", e); + throw new TradeFailException("微信撤销订单V2失败: "+e.getMessage()); + } + } + +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPaySubCloseV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPaySubCloseV3Service.java new file mode 100644 index 000000000..3403a05df --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/close/WechatPaySubCloseV3Service.java @@ -0,0 +1,65 @@ +package org.dromara.daxpay.channel.wechat.service.close; + +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.param.clode.WxPayPartnerOrderReverseV3Request; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.springframework.stereotype.Service; + +/** + * 微信支付关闭 V3 + * @author xxm + * @since 2024/7/21 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatPaySubCloseV3Service { + private final WechatPayConfigService wechatPayConfigService; + private static final Gson GSON = new GsonBuilder().create(); + + /** + * 关闭支付, 微信对已经关闭的支付单也可以重复关闭 + */ + public void close(PayOrder payOrder, WechatPayConfig weChatPayConfig) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(weChatPayConfig); + try { + wxPayService.closeOrderV3(payOrder.getOrderNo()); + } catch (WxPayException e) { + log.error("微信关闭支付V3失败", e); + throw new TradeFailException("微信退款V3失败: "+e.getMessage()); + } + } + + /** + * 撤销支付 + */ + public void cancel(PayOrder payOrder, WechatPayConfig config){ + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + try { + WxPayConfig wxPayConfig = wxPayService.getConfig(); + // 设置公共属性 + WxPayPartnerOrderReverseV3Request request = new WxPayPartnerOrderReverseV3Request(); + request.setSpMchId(wxPayConfig.getMchId()); + request.setSpAppid(wxPayConfig.getAppId()); + request.setSubMchId(config.getSubMchId()); + request.setSubAppid(wxPayConfig.getSubAppId()); + + // 拼接参数请求路径并发送 + String url = String.format("%s/v3/pay/transactions/out-trade-no/%s/reverse", + wxPayService.getPayBaseUrl(), payOrder.getOrderNo()); + wxPayService.postV3(url, GSON.toJson(request)); + } catch (WxPayException e) { + log.error("微信撤销支付V3失败", e); + throw new TradeFailException("微信撤销支付V3失败: "+e.getMessage()); + } + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatPayConfigService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatPayConfigService.java index f7d5b0d7e..3244e9cb9 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatPayConfigService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatPayConfigService.java @@ -93,36 +93,38 @@ public class WechatPayConfigService { /** * 获取支付异步通知地址 */ - public String getPayNotifyUrl() { + public String getPayNotifyUrl(boolean isv) { + String url = isv ? "{}/unipay/callback/{}/wechat/isv/pay":"{}/unipay/callback/{}/wechat/pay"; MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); var platformInfo = platformConfigService.getConfig(); - return StrUtil.format("{}/unipay/callback/{}/wechat/pay",platformInfo.getGatewayServiceUrl(),mchAppInfo.getAppId()); + return StrUtil.format(url,platformInfo.getGatewayServiceUrl(),mchAppInfo.getAppId()); } /** * 获取退款异步通知地址 */ - public String getRefundNotifyUrl() { + public String getRefundNotifyUrl(boolean isv) { + String url = isv ? "{}/unipay/callback/{}/wechat/isv/refund":"{}/unipay/callback/{}/wechat/refund"; MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); var platformInfo = platformConfigService.getConfig(); - return StrUtil.format("{}/unipay/callback/{/wechat/refund",platformInfo.getGatewayServiceUrl(), mchAppInfo.getAppId()); + return StrUtil.format(url,platformInfo.getGatewayServiceUrl(), mchAppInfo.getAppId()); } /** * 转账回调地址 */ - public String getTransferNotifyUrl() { + public String getTransferNotifyUrl(boolean isv) { + String url = isv ? "{}/unipay/callback/{}/wechat/isv/transfer":"{}/unipay/callback/{}/wechat/transfer"; MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); var platformInfo = platformConfigService.getConfig(); - return StrUtil.format("{}/unipay/callback/{}/wechat/transfer",platformInfo.getGatewayServiceUrl(), mchAppInfo.getAppId()); + return StrUtil.format(url,platformInfo.getGatewayServiceUrl(), mchAppInfo.getAppId()); } - /** * 获取并检查支付配置 */ - public WechatPayConfig getAndCheckConfig(){ - var payConfig = this.getWechatPayConfig(); + public WechatPayConfig getAndCheckConfig(boolean isv){ + var payConfig = this.getWechatPayConfig(isv); if (!payConfig.getEnable()){ throw new ChannelNotEnableException("支付宝支付通道未启用"); } @@ -132,9 +134,9 @@ public class WechatPayConfigService { /** * 获取微信支付配置 */ - public WechatPayConfig getWechatPayConfig(){ + public WechatPayConfig getWechatPayConfig(boolean isv){ MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); - ChannelConfig channelConfig = channelConfigCacheService.get(mchAppInfo.getAppId(), ChannelEnum.WECHAT.getCode()); + ChannelConfig channelConfig = channelConfigCacheService.get(mchAppInfo.getAppId(), isv? ChannelEnum.WECHAT_ISV.getCode():ChannelEnum.WECHAT.getCode()); return WechatPayConfig.convertConfig(channelConfig); } @@ -145,11 +147,15 @@ public class WechatPayConfigService { WxPayConfig payConfig = new WxPayConfig(); payConfig.setMchId(wechatPayConfig.getWxMchId()); payConfig.setAppId(wechatPayConfig.getWxAppId()); + payConfig.setSubMchId(wechatPayConfig.getSubMchId()); + payConfig.setSubAppId(wechatPayConfig.getSubAppId()); payConfig.setMchKey(wechatPayConfig.getApiKeyV2()); payConfig.setApiV3Key(wechatPayConfig.getApiKeyV3()); // 注意不要使用base64的方式进行配置, 因为wxjava 是直接读取文本并不会进行解码, 会导致证书异常 - payConfig.setPrivateKeyContent(Base64.decode(wechatPayConfig.getPrivateKey())); + payConfig.setPublicKeyContent(Base64.decode(wechatPayConfig.getPublicKey())); + payConfig.setPublicKeyId(wechatPayConfig.getPublicKeyId()); payConfig.setPrivateCertContent(Base64.decode(wechatPayConfig.getPrivateCert())); + payConfig.setPrivateKeyContent(Base64.decode(wechatPayConfig.getPrivateKey())); payConfig.setCertSerialNo(wechatPayConfig.getCertSerialNo()); payConfig.setKeyContent(Base64.decode(wechatPayConfig.getP12())); WxPayService wxPayService = new WxPayServiceImpl(); diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/isv/WechatPaySubService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/isv/WechatPaySubService.java new file mode 100644 index 000000000..e9e3e5dbf --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/isv/WechatPaySubService.java @@ -0,0 +1,46 @@ +package org.dromara.daxpay.channel.wechat.service.pay.isv; + +import cn.bootx.platform.core.exception.ValidationFailedException; +import cn.bootx.platform.core.util.BigDecimalUtil; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.core.exception.AmountExceedLimitException; +import org.dromara.daxpay.core.param.trade.pay.PayParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * 微信支付服务 + * @author xxm + * @since 2024/7/17 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatPaySubService { + /** + * 校验 + */ + public void validation(PayParam payParam, WechatPayParam wechatPayParam, WechatPayConfig weChatPayConfig) { + // 支付金额是否超限 + if (BigDecimalUtil.isGreaterThan(payParam.getAmount(),weChatPayConfig.getLimitAmount())) { + throw new AmountExceedLimitException("微信支付金额超限"); + } + // 微信JSAPI支付 + if (Objects.equals(payParam.getMethod(), PayMethodEnum.JSAPI.getCode())){ + if (Objects.isNull(wechatPayParam.getOpenId())) { + throw new ValidationFailedException("微信JSAPI支付必须传入openId参数"); + } + } + // 付款码支付 + if (Objects.equals(payParam.getMethod(), PayMethodEnum.BARCODE.getCode())){ + if (Objects.isNull(wechatPayParam.getAuthCode())) { + throw new ValidationFailedException("微信付款码支付必须传入付款码参数"); + } + } + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/isv/WechatPaySubV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/isv/WechatPaySubV2Service.java new file mode 100644 index 000000000..9e95a9317 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/isv/WechatPaySubV2Service.java @@ -0,0 +1,255 @@ +package org.dromara.daxpay.channel.wechat.service.pay.isv; + +import cn.bootx.platform.common.spring.exception.RetryableException; +import cn.bootx.platform.core.util.JsonUtil; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.exception.MethodNotExistException; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.core.result.trade.pay.PaySyncResult; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.trade.PayResultBo; +import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.service.trade.pay.PaySyncService; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult; +import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; +import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; +import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; +import com.github.binarywang.wxpay.constant.WxPayErrorCode; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * 微信支付服务v2版本 + * @author xxm + * @since 2024/7/17 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatPaySubV2Service { + private final WechatPayConfigService wechatPayConfigService; + private final PaySyncService paySyncService; + + /** + * 调起支付 + */ + public PayResultBo pay(PayOrder payOrder, WechatPayParam wechatPayParam, WechatPayConfig config) { + PayResultBo payInfo = new PayResultBo(); + String payBody = null; + PayMethodEnum payMethodEnum = PayMethodEnum.findByCode(payOrder.getMethod()); + + // wap支付 + if (payMethodEnum == PayMethodEnum.WAP) { + payBody = this.wapPay(payOrder, config); + } + // APP支付 + else if (payMethodEnum == PayMethodEnum.APP) { + payBody = this.appPay(payOrder, config); + } + // 微信公众号支付或者小程序支付 + else if (payMethodEnum == PayMethodEnum.JSAPI) { + payBody = this.jsPay(payOrder, wechatPayParam.getOpenId(), config); + } + // 二维码支付 + else if (payMethodEnum == PayMethodEnum.QRCODE) { + payBody = this.qrCodePay(payOrder, config); + } + // 付款码支付 + else if (payMethodEnum == PayMethodEnum.BARCODE) { + this.barCodePay(payOrder, wechatPayParam.getAuthCode(), config, payInfo); + return payInfo; + } else { + throw new MethodNotExistException("不支持的支付方式"); + } + payInfo.setPayBody(payBody); + return payInfo; + } + + /** + * wap支付 + */ + @SneakyThrows + private String wapPay(PayOrder payOrder, WechatPayConfig wechatPayConfig) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); + WxPayUnifiedOrderRequest request = this.buildRequest(payOrder,wechatPayConfig); + try { + var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.MWEB, request); + return result.getMwebUrl(); + } catch (WxPayException e) { + log.error("微信V2Wap支付失败", e); + throw new TradeFailException("微信V2手机网站支付失败: "+e.getMessage()); + } + } + + /** + * 程序支付 + */ + private String appPay(PayOrder payOrder, WechatPayConfig wechatPayConfig) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); + WxPayUnifiedOrderRequest request = this.buildRequest(payOrder, wechatPayConfig); + try { + var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.APP, request); + Map map = this.buildAppResult(result); + return JsonUtil.toJsonStr(map); + } catch (WxPayException e) { + log.error("微信V2App支付失败", e); + throw new TradeFailException("微信V2App程序支付失败: "+e.getMessage()); + } + } + + /** + * 微信公众号支付或者小程序支付 + */ + private String jsPay(PayOrder payOrder, String openId, WechatPayConfig wechatPayConfig) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); + WxPayUnifiedOrderRequest request = this.buildRequest(payOrder, wechatPayConfig); + request.setOpenid(openId); + try { + var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.JSAPI, request); + Map map = this.buildJsapiResult(result); + return JsonUtil.toJsonStr(map); + } catch (WxPayException e) { + log.error("微信V2Jaspi支付失败", e); + throw new TradeFailException("微信V2Jaspi支付失败: "+e.getMessage()); + } + } + + /** + * 二维码支付 + */ + private String qrCodePay(PayOrder payOrder, WechatPayConfig wechatPayConfig) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); + WxPayUnifiedOrderRequest request = this.buildRequest(payOrder, wechatPayConfig); + request.setProductId(payOrder.getOrderNo()); + try { + var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.NATIVE, request); + return result.getCodeUrl(); + } catch (WxPayException e) { + log.error("微信V2扫码支付失败", e); + throw new TradeFailException("微信V2扫码支付失败: "+e.getMessage()); + } + } + + /** + * 付款码支付 + */ + public void barCodePay(PayOrder payOrder, String authCode, WechatPayConfig wechatPayConfig, PayResultBo payResult) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); + WxPayMicropayRequest request = new WxPayMicropayRequest(); + request.setAuthCode(authCode); + request.setTotalFee(PayUtil.convertCentAmount(payOrder.getAmount())); + request.setOutTradeNo(payOrder.getOrderNo()); + request.setSpbillCreateIp(payOrder.getClientIp()); + request.setDetail(payOrder.getDescription()); + request.setBody(payOrder.getTitle()); + request.setProfitSharing(payOrder.getAutoAllocation()?"Y":"N"); + try { + WxPayMicropayResult result = wxPayService.micropay(request); + // 支付成功处理, 如果不成功会走异常流 + String timeEnd = result.getTimeEnd(); + LocalDateTime time = WechatPayUtil.parseV2(timeEnd); + payResult.setOutOrderNo(result.getTransactionId()) + .setFinishTime(time) + .setComplete(true); + } catch (WxPayException e) { + String errCode = e.getErrCode(); + String resultCode = e.getResultCode(); + // 支付中, 发起轮训同步 + // 提交支付请求后微信会同步返回支付结果。当返回结果为“系统错误”时,商户系统等待5秒后调用【查询订单API】 + // 查询支付实际交易结果;当返回结果为“USERPAYING”时,商户系统可设置间隔时间(建议10秒)重新查询支付结果,直到支付成功或超时(建议45秒); + if (Objects.equals(resultCode, WxPayErrorCode.UnifiedOrder.SYSTEMERROR) + || Objects.equals(errCode, WxpayTradeStatus.USER_PAYING)) { + SpringUtil.getBean(this.getClass()).rotationSync(payOrder); + return; + } + log.error("微信V2付款码支付失败", e); + throw new TradeFailException("微信V2付款码支付失败: "+e.getMessage()); + } + } + + /** + * 转换APP参数 + */ + private Map buildAppResult(WxPayAppOrderResult result){ + Map packageParams = new HashMap<>(6); + packageParams.put("appid", result.getAppId()); + packageParams.put("partnerid", result.getPartnerId()); + packageParams.put("prepayid", result.getPrepayId()); + packageParams.put("package", result.getPackageValue()); + packageParams.put("nonceStr", result.getNonceStr()); + packageParams.put("timeStamp", result.getTimeStamp()); + packageParams.put("sign", result.getSign()); + return packageParams; + } + + /** + * 转换Jsapi参数 + */ + private Map buildJsapiResult(WxPayMpOrderResult result){ + Map packageParams = new HashMap<>(6); + packageParams.put("appId", result.getAppId()); + packageParams.put("timeStamp", result.getTimeStamp()); + packageParams.put("nonceStr", result.getNonceStr()); + packageParams.put("package", result.getPackageValue()); + packageParams.put("signType", result.getSignType()); + packageParams.put("paySign", result.getPaySign()); + return packageParams; + } + + /** + * 构建下单请求参数 + */ + private WxPayUnifiedOrderRequest buildRequest(PayOrder payOrder, WechatPayConfig wechatPayConfig){ + WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); + request.setOutTradeNo(payOrder.getOrderNo()); + request.setBody(payOrder.getTitle()); + request.setDetail(payOrder.getDescription()); + request.setTimeExpire(this.getExpiredTime(payOrder.getExpiredTime())); + request.setTotalFee(PayUtil.convertCentAmount(payOrder.getAmount())); + request.setNotifyUrl(wechatPayConfigService.getPayNotifyUrl(true)); + request.setSpbillCreateIp(payOrder.getClientIp()); + request.setSubMchId(wechatPayConfig.getSubMchId()); + request.setSubAppId(wechatPayConfig.getSubAppId()); + return request; + } + + /** + * 获取微信的过期时间 yyyyMMddHHmmss + */ + private String getExpiredTime(LocalDateTime dateTime) { + return LocalDateTimeUtil.format(dateTime, DatePattern.PURE_DATETIME_PATTERN); + } + + /** + * 多次重试同步支付状态, 最多10次, 30秒不操作微信会自动关闭 + */ + @Async + public void rotationSync(PayOrder payOrder) { + PaySyncResult paySyncResult = paySyncService.syncPayOrder(payOrder); + // 不为支付中状态后, 调用系统同步更新状态, 支付状态则继续重试 + if (Objects.equals(PayStatusEnum.PROGRESS.getCode(), paySyncResult.getOrderStatus())) { + throw new RetryableException(); + } + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/isv/WechatPaySubV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/isv/WechatPaySubV3Service.java new file mode 100644 index 000000000..c01ce9e88 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/isv/WechatPaySubV3Service.java @@ -0,0 +1,298 @@ +package org.dromara.daxpay.channel.wechat.service.pay.isv; + +import cn.bootx.platform.common.spring.exception.RetryableException; +import cn.bootx.platform.core.util.JsonUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.github.binarywang.wxpay.bean.request.WxPayPartnerUnifiedOrderV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayCodepayResult; +import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; +import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.constant.WxPayErrorCode; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; +import org.dromara.daxpay.channel.wechat.param.pay.WxPayPartnerCodepayRequest; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.exception.MethodNotExistException; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.core.result.trade.pay.PaySyncResult; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.trade.PayResultBo; +import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.service.trade.pay.PaySyncService; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * 微信支付服务v3版本 + * @author xxm + * @since 2024/7/17 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatPaySubV3Service { + private final WechatPayConfigService wechatPayConfigService; + + private static final Gson GSON = new GsonBuilder().create(); + private final PaySyncService paySyncService; + + /** + * 调起支付 + */ + public PayResultBo pay(PayOrder payOrder, WechatPayParam wechatPayParam, WechatPayConfig config) { + PayResultBo payResult = new PayResultBo(); + String payBody = null; + PayMethodEnum payMethodEnum = PayMethodEnum.findByCode(payOrder.getMethod()); + + // wap支付 + if (payMethodEnum == PayMethodEnum.WAP) { + payBody = this.wapPay(payOrder, config); + } + // APP支付 + else if (payMethodEnum == PayMethodEnum.APP) { + payBody = this.appPay(payOrder, config); + } + // 微信公众号支付或者小程序支付 + else if (payMethodEnum == PayMethodEnum.JSAPI) { + payBody = this.jsPay(payOrder, wechatPayParam, config); + } + // 二维码支付 + else if (payMethodEnum == PayMethodEnum.QRCODE) { + payBody = this.qrCodePay(payOrder, config); + } + // 付款码支付 + else if (payMethodEnum == PayMethodEnum.BARCODE) { + this.barCodePay(payOrder, wechatPayParam.getAuthCode(), config, payResult); + } else { + throw new MethodNotExistException("不支持的支付方式"); + } + payResult.setPayBody(payBody); + return payResult; + } + + + /** + * wap支付 + */ + private String wapPay(PayOrder payOrder, WechatPayConfig wechatPayConfig) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); + var request = this.buildRequest(payOrder); + var sceneInfo = new WxPayPartnerUnifiedOrderV3Request.SceneInfo(); + sceneInfo.setPayerClientIp(payOrder.getClientIp()); + var h5Info = new WxPayPartnerUnifiedOrderV3Request.H5Info(); + h5Info.setType("Wap"); + sceneInfo.setH5Info(h5Info); + request.setSceneInfo(sceneInfo); + try { + // h5Url + return wxPayService.createPartnerOrderV3(TradeTypeEnum.H5, request); + } catch (WxPayException e) { + log.error("微信V3手机网站支付失败", e); + throw new TradeFailException("微信V3手机网站支付失败: "+e.getMessage()); + } + } + + /** + * 程序支付 + */ + private String appPay(PayOrder payOrder, WechatPayConfig wechatPayConfig) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); + var request = this.buildRequest(payOrder); + try { + WxPayUnifiedOrderV3Result.AppResult result = wxPayService.createPartnerOrderV3(TradeTypeEnum.APP, request); + Map map = this.buildAppResult(result); + return JsonUtil.toJsonStr(map); + } catch (WxPayException e) { + log.error("微信V3程序支付失败", e); + throw new TradeFailException("微信V3程序支付失败: "+e.getMessage()); + } + } + + /** + * 微信公众号支付或者小程序支付 + */ + private String jsPay(PayOrder payOrder, WechatPayParam wechatPayParam, WechatPayConfig wechatPayConfig) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); + var request = this.buildRequest(payOrder); + WxPayPartnerUnifiedOrderV3Request.Payer payer = new WxPayPartnerUnifiedOrderV3Request.Payer(); + if (Objects.equals(wechatPayParam.getOpenIdType(), WechatPayCode.SUB_OPENID)){ + payer.setSubOpenid(wechatPayParam.getOpenId()); + } else { + payer.setSpOpenid(wechatPayParam.getOpenId()); + } + request.setPayer(payer); + try { + WxPayUnifiedOrderV3Result.JsapiResult result = wxPayService.createPartnerOrderV3(TradeTypeEnum.JSAPI, request); + Map map = this.buildJsapiResult(result); + return JsonUtil.toJsonStr(map); + } catch (WxPayException e) { + log.error("微信V3JsApi支付失败", e); + throw new TradeFailException("微信V3JsApi支付失败: "+e.getMessage()); + } + } + + /** + * 二维码支付 + */ + private String qrCodePay(PayOrder payOrder, WechatPayConfig wechatPayConfig) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); + var request = this.buildRequest(payOrder); + try { + return wxPayService.createPartnerOrderV3(TradeTypeEnum.NATIVE, request); + } catch (WxPayException e) { + log.error("微信V3扫码支付失败", e); + throw new TradeFailException("微信V3扫码支付失败: "+e.getMessage()); + } + } + + /** + * 转换APP参数 + */ + private Map buildAppResult(WxPayUnifiedOrderV3Result.AppResult result){ + Map packageParams = new HashMap<>(6); + packageParams.put("appid", result.getAppid()); + packageParams.put("partnerid", result.getPartnerId()); + packageParams.put("prepayid", result.getPrepayId()); + packageParams.put("package", result.getPackageValue()); + packageParams.put("nonceStr", result.getNoncestr()); + packageParams.put("timeStamp", result.getTimestamp()); + packageParams.put("sign", result.getSign()); + return packageParams; + } + + /** + * 转换Jsapi参数 + */ + private Map buildJsapiResult(WxPayUnifiedOrderV3Result.JsapiResult result){ + Map packageParams = new HashMap<>(6); + packageParams.put("appId", result.getAppId()); + packageParams.put("timeStamp", result.getTimeStamp()); + packageParams.put("nonceStr", result.getNonceStr()); + packageParams.put("package", result.getPackageValue()); + String signType = result.getSignType(); + if (result.getSignType() == null) { + signType = "MD5"; + } + packageParams.put("signType", signType); + packageParams.put("paySign", result.getPaySign()); + return packageParams; + } + + /** + * 付款码支付 + */ + private void barCodePay(PayOrder payOrder, String authCode, WechatPayConfig config, PayResultBo payResult) { + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + try { + var request = new WxPayPartnerCodepayRequest(); + // 设置公共属性 + WxPayConfig wxPayConfig = wxPayService.getConfig(); + request.setSpMchId(wxPayConfig.getMchId()) + .setSpAppid(wxPayConfig.getAppId()) + .setSubMchId(config.getSubMchId()) + .setSubAppid(config.getSubAppId()); + + request.setDescription(payOrder.getTitle()); + request.setOutTradeNo(payOrder.getOrderNo()); + + // 金额 + var amount = new WxPayPartnerCodepayRequest.Amount(); + amount.setTotal(PayUtil.convertCentAmount(payOrder.getAmount())); + request.setAmount(amount); + + // 场景信息 + var sceneInfo = new WxPayPartnerCodepayRequest.SceneInfo(); + var storeInfo = new WxPayPartnerCodepayRequest.StoreInfo(); + storeInfo.setOutId("1"); + sceneInfo.setStoreInfo(storeInfo); + request.setSceneInfo(sceneInfo); + + // 条码参数 + var payer = new WxPayPartnerCodepayRequest.Payer(); + payer.setAuthCode(authCode); + request.setPayer(payer); + + // 分账参数 + if (payOrder.getAllocation()){ + var settleInfo = new WxPayPartnerCodepayRequest.SettleInfo(); + settleInfo.setProfitSharing(true); + request.setSettleInfo(settleInfo); + } + // 拼接和发送请求 + String url = String.format("%s/v3/pay/partner/transactions/codepay", wxPayService.getPayBaseUrl()); + String body = wxPayService.postV3(url, GSON.toJson(request)); + var result = GSON.fromJson(body, WxPayCodepayResult.class); + + // 支付成功处理, 如果不成功会走异常流 + payResult.setComplete(true) + .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime())) + .setOutOrderNo(result.getTransactionId()); + } catch (WxPayException e) { + String errCode = e.getErrCode(); + String resultCode = e.getResultCode(); + // 支付中, 发起轮训同步 + // 提交支付请求后微信会同步返回支付结果。当返回结果为“系统错误”时,商户系统等待5秒后调用【查询订单API】 + // 查询支付实际交易结果;当返回结果为“USERPAYING”时,商户系统可设置间隔时间(建议10秒)重新查询支付结果,直到支付成功或超时(建议45秒); + if (Objects.equals(resultCode, WxPayErrorCode.UnifiedOrder.SYSTEMERROR) + || Objects.equals(errCode, WxPayConstants.WxpayTradeStatus.USER_PAYING)) { + SpringUtil.getBean(this.getClass()).rotationSync(payOrder); + return; + } + log.error("微信付款码支付V3失败", e); + throw new TradeFailException("微信付款码支付V3失败: "+e.getMessage()); + } + } + + /** + * 构建请求参数 + */ + public WxPayPartnerUnifiedOrderV3Request buildRequest(PayOrder payOrder){ + WxPayPartnerUnifiedOrderV3Request request = new WxPayPartnerUnifiedOrderV3Request(); + WxPayPartnerUnifiedOrderV3Request.Amount amount = new WxPayPartnerUnifiedOrderV3Request.Amount(); + amount.setTotal(PayUtil.convertCentAmount(payOrder.getAmount())); + request.setDescription(payOrder.getTitle()); + request.setOutTradeNo(payOrder.getOrderNo()); + request.setTimeExpire(WechatPayUtil.formatV3(payOrder.getExpiredTime())); + if (payOrder.getAllocation()){ + var settleInfo = new WxPayPartnerUnifiedOrderV3Request.SettleInfo(); + settleInfo.setProfitSharing(true); + request.setSettleInfo(settleInfo); + } + request.setNotifyUrl(wechatPayConfigService.getPayNotifyUrl(true)); + request.setAmount(amount); + return request; + } + + + /** + * 多次重试同步支付状态, 最多10次, 30秒不操作微信会自动关闭 + */ + @Async + @Retryable(retryFor = RetryableException.class, maxAttempts = 10, backoff = @Backoff(value = 5000L)) + public void rotationSync(PayOrder payOrder) { + PaySyncResult paySyncResult = paySyncService.syncPayOrder(payOrder); + // 不为支付中状态后, 调用系统同步更新状态, 支付状态则继续重试 + if (Objects.equals(PayStatusEnum.PROGRESS.getCode(), paySyncResult.getOrderStatus())) { + throw new RetryableException(); + } + } +} + diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/merchant/WechatPayService.java similarity index 97% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayService.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/merchant/WechatPayService.java index 3345699dd..20cd27731 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/merchant/WechatPayService.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.service.pay; +package org.dromara.daxpay.channel.wechat.service.pay.merchant; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.BigDecimalUtil; @@ -33,8 +33,6 @@ public class WechatPayService { if (!List.of(PayMethodEnum.APP,PayMethodEnum.BARCODE,PayMethodEnum.WAP,PayMethodEnum.QRCODE,PayMethodEnum.JSAPI).contains(methodEnum)) { throw new ValidationFailedException("不支持的支付方式"); } - - // 支付金额是否超限 if (BigDecimalUtil.isGreaterThan(payParam.getAmount(),weChatPayConfig.getLimitAmount())) { throw new AmountExceedLimitException("微信支付金额超限"); diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/merchant/WechatPayV2Service.java similarity index 96% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV2Service.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/merchant/WechatPayV2Service.java index 1cfa885b1..02f41cec9 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/merchant/WechatPayV2Service.java @@ -1,7 +1,20 @@ -package org.dromara.daxpay.channel.wechat.service.pay; +package org.dromara.daxpay.channel.wechat.service.pay.merchant; import cn.bootx.platform.common.spring.exception.RetryableException; import cn.bootx.platform.core.util.JsonUtil; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.exception.MethodNotExistException; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.core.result.trade.pay.PaySyncResult; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.trade.PayResultBo; +import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.service.trade.pay.PaySyncService; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.extra.spring.SpringUtil; @@ -18,19 +31,6 @@ import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; -import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; -import org.dromara.daxpay.core.enums.PayMethodEnum; -import org.dromara.daxpay.core.enums.PayStatusEnum; -import org.dromara.daxpay.core.exception.MethodNotExistException; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.core.result.trade.pay.PaySyncResult; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.PayResultBo; -import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import org.dromara.daxpay.service.service.trade.pay.PaySyncService; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -79,7 +79,7 @@ public class WechatPayV2Service { else if (payMethodEnum == PayMethodEnum.BARCODE) { this.barCodePay(payOrder, wechatPayParam.getAuthCode(), config, payInfo); return payInfo; - } else { + } else { throw new MethodNotExistException("不支持的支付方式"); } payInfo.setPayBody(payBody); @@ -142,7 +142,6 @@ public class WechatPayV2Service { private String qrCodePay(PayOrder payOrder, WechatPayConfig wechatPayConfig) { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); WxPayUnifiedOrderRequest request = this.buildRequest(payOrder); - // NATIVE此参数必传。此id为二维码中包含的商品Id,商户自行定义。 request.setProductId(payOrder.getOrderNo()); try { var result = wxPayService.createOrder(WxPayConstants.TradeType.Specific.NATIVE, request); @@ -165,7 +164,7 @@ public class WechatPayV2Service { request.setSpbillCreateIp(payOrder.getClientIp()); request.setDetail(payOrder.getDescription()); request.setBody(payOrder.getTitle()); - request.setProfitSharing(payOrder.getAllocation()?"Y":"N"); + request.setProfitSharing(payOrder.getAutoAllocation()?"Y":"N"); try { WxPayMicropayResult result = wxPayService.micropay(request); // 支付成功处理, 如果不成功会走异常流 @@ -228,11 +227,9 @@ public class WechatPayV2Service { request.setBody(payOrder.getTitle()); request.setDetail(payOrder.getDescription()); request.setTimeExpire(this.getExpiredTime(payOrder.getExpiredTime())); - request.setNotifyUrl(wechatPayConfigService.getPayNotifyUrl()); request.setTotalFee(PayUtil.convertCentAmount(payOrder.getAmount())); - request.setNotifyUrl(wechatPayConfigService.getPayNotifyUrl()); + request.setNotifyUrl(wechatPayConfigService.getPayNotifyUrl(false)); request.setSpbillCreateIp(payOrder.getClientIp()); - request.setProfitSharing(payOrder.getAllocation()?"Y":"N"); return request; } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/merchant/WechatPayV3Service.java similarity index 99% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV3Service.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/merchant/WechatPayV3Service.java index f2e6f32dc..096a775cd 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/WechatPayV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/pay/merchant/WechatPayV3Service.java @@ -1,18 +1,7 @@ -package org.dromara.daxpay.channel.wechat.service.pay; +package org.dromara.daxpay.channel.wechat.service.pay.merchant; import cn.bootx.platform.common.spring.exception.RetryableException; import cn.bootx.platform.core.util.JsonUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest; -import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; -import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; -import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; -import com.github.binarywang.wxpay.constant.WxPayConstants; -import com.github.binarywang.wxpay.constant.WxPayErrorCode; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; @@ -26,6 +15,17 @@ import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.trade.PayResultBo; import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.service.trade.pay.PaySyncService; +import cn.hutool.extra.spring.SpringUtil; +import com.github.binarywang.wxpay.bean.request.WxPayCodepayRequest; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; +import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.constant.WxPayErrorCode; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Retryable; import org.springframework.scheduling.annotation.Async; @@ -179,7 +179,7 @@ public class WechatPayV3Service { packageParams.put("package", result.getPackageValue()); String signType = result.getSignType(); if (result.getSignType() == null) { - signType = "RSA"; + signType = "MD5"; } packageParams.put("signType", signType); packageParams.put("paySign", result.getPaySign()); @@ -255,7 +255,7 @@ public class WechatPayV3Service { settleInfo.setProfitSharing(true); request.setSettleInfo(settleInfo); } - request.setNotifyUrl(wechatPayConfigService.getPayNotifyUrl()); + request.setNotifyUrl(wechatPayConfigService.getPayNotifyUrl(false)); request.setAmount(amount); return request; } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/reconcile/WechatPayReconcileService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/reconcile/WechatReconcileService.java similarity index 92% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/reconcile/WechatPayReconcileService.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/reconcile/WechatReconcileService.java index d2782f454..3b622dd60 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/reconcile/WechatPayReconcileService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/reconcile/WechatReconcileService.java @@ -1,14 +1,5 @@ package org.dromara.daxpay.channel.wechat.service.reconcile; -import org.dromara.daxpay.channel.wechat.entity.reconcile.WechatReconcileBillDetail; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; -import org.dromara.daxpay.core.enums.TradeStatusEnum; -import org.dromara.daxpay.core.enums.TradeTypeEnum; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.service.bo.reconcile.ChannelReconcileTradeBo; -import org.dromara.daxpay.service.bo.reconcile.ReconcileResolveResultBo; -import org.dromara.daxpay.service.entity.reconcile.ReconcileStatement; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.IoUtil; @@ -23,6 +14,15 @@ import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.entity.reconcile.WechatReconcileBillDetail; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.TradeStatusEnum; +import org.dromara.daxpay.core.enums.TradeTypeEnum; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.service.bo.reconcile.ChannelReconcileTradeBo; +import org.dromara.daxpay.service.bo.reconcile.ReconcileResolveResultBo; +import org.dromara.daxpay.service.entity.reconcile.ReconcileStatement; import org.dromara.x.file.storage.core.FileInfo; import org.dromara.x.file.storage.core.FileStorageService; import org.springframework.stereotype.Service; @@ -43,7 +43,7 @@ import java.util.Objects; @Slf4j @Service @RequiredArgsConstructor -public class WechatPayReconcileService { +public class WechatReconcileService { private final FileStorageService fileStorageService; private final WechatPayConfigService wechatPayConfigService; @@ -56,7 +56,7 @@ public class WechatPayReconcileService { @SneakyThrows @Transactional(rollbackFor = Exception.class) public ReconcileResolveResultBo downAndResolve(ReconcileStatement statement, String date) { - WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(); + WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(false); WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); var request = new WxPayApplyTradeBillV3Request(); request.setBillDate(date); @@ -124,7 +124,7 @@ public class WechatPayReconcileService { if (Objects.equals(billDetail.getTradeState(), WxPayConstants.WxpayTradeStatus.SUCCESS)) { tradeBo.setTradeType(TradeTypeEnum.PAY.getCode()) .setAmount(new BigDecimal(billDetail.getTotalFee())) - .setTradeStatus(TradeStatusEnum.SUCCESS.getCode()); + .setTradeStatus(TradeStatusEnum.SUCCESS.getCode()); } // 退款覆盖更新对应的字段 @@ -133,6 +133,7 @@ public class WechatPayReconcileService { .setTradeNo(billDetail.getRefundId()) .setAmount(new BigDecimal(billDetail.getRefundFee())) .setTradeType(TradeTypeEnum.REFUND.getCode()); + tradeBo.setTradeType(TradeTypeEnum.REFUND.getCode()); // 状态 switch (billDetail.getRefundStatus()) { case WxPayConstants.RefundStatus.SUCCESS -> tradeBo.setTradeStatus(TradeStatusEnum.SUCCESS.getCode()); @@ -140,20 +141,22 @@ public class WechatPayReconcileService { case WxPayConstants.ResultCode.FAIL -> tradeBo.setTradeStatus(TradeStatusEnum.FAIL.getCode()); case WxPayConstants.RefundStatus.CHANGE -> tradeBo.setTradeStatus(TradeStatusEnum.EXCEPTION.getCode()); } + tradeBo.setTradeStatus(TradeStatusEnum.SUCCESS.getCode()); } // 撤销状态 if (Objects.equals(billDetail.getTradeState(), WxPayConstants.WxpayTradeStatus.REVOKED)) { - tradeBo.setTradeType(TradeTypeEnum.PAY.getCode()) - .setTradeStatus(TradeStatusEnum.REVOKED.getCode()); + tradeBo.setTradeType(TradeTypeEnum.PAY.getCode()); + tradeBo.setTradeStatus(TradeStatusEnum.REVOKED.getCode()); } + return tradeBo; } /** * 保存下载的原始对账文件 */ - private String saveOriginalFile(ReconcileStatement statement, byte[] bytes) { - String date = LocalDateTimeUtil.format(statement.getDate(), DatePattern.PURE_DATE_PATTERN); + private String saveOriginalFile(ReconcileStatement reconcileOrder, byte[] bytes) { + String date = LocalDateTimeUtil.format(reconcileOrder.getDate(), DatePattern.PURE_DATE_PATTERN); // 将原始文件进行保存 通道-日期 String fileName = StrUtil.format("交易对账单-微信-{}.csv",date); var uploadPretreatment = fileStorageService.of(bytes); diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/reconcile/WechatSubReconcileService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/reconcile/WechatSubReconcileService.java new file mode 100644 index 000000000..c79423295 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/reconcile/WechatSubReconcileService.java @@ -0,0 +1,169 @@ +package org.dromara.daxpay.channel.wechat.service.reconcile; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.text.csv.CsvReader; +import cn.hutool.core.text.csv.CsvUtil; +import cn.hutool.core.util.StrUtil; +import com.github.binarywang.wxpay.bean.request.WxPayApplyTradeBillV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayApplyBillV3Result; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.entity.reconcile.WechatReconcileBillDetail; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.TradeStatusEnum; +import org.dromara.daxpay.core.enums.TradeTypeEnum; +import org.dromara.daxpay.core.exception.OperationFailException; +import org.dromara.daxpay.service.bo.reconcile.ChannelReconcileTradeBo; +import org.dromara.daxpay.service.bo.reconcile.ReconcileResolveResultBo; +import org.dromara.daxpay.service.entity.reconcile.ReconcileStatement; +import org.dromara.x.file.storage.core.FileInfo; +import org.dromara.x.file.storage.core.FileStorageService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.*; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; + +/** + * 微信支付对账 + * @author xxm + * @since 2024/1/17 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatSubReconcileService { + private final FileStorageService fileStorageService; + private final WechatPayConfigService wechatPayConfigService; + + /** + * 下载对账单并保存 + * + * @param statement 对账订单 + * @param date 对账日期 yyyyMMdd 格式 + */ + @SneakyThrows + @Transactional(rollbackFor = Exception.class) + public ReconcileResolveResultBo downAndResolve(ReconcileStatement statement, String date) { + WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(true); + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + var request = new WxPayApplyTradeBillV3Request(); + request.setBillDate(date); + request.setBillType("ALL"); + try { + WxPayApplyBillV3Result wxPayApplyBillV3Result = wxPayService.applyTradeBill(request); + String downloadUrl = wxPayApplyBillV3Result.getDownloadUrl(); + byte[] bytes; + try (InputStream inputStream = wxPayService.downloadBill(downloadUrl)) { + bytes = IoUtil.readBytes(inputStream); + } + + BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(bytes))); + String result = IoUtil.read(reader); + // 过滤特殊字符 + result = result.replaceAll("`", "").replaceAll("\uFEFF", ""); + CsvReader csvRows = CsvUtil.getReader(); + // 获取交易记录并保存 同时过滤出当前应用的交易记录 + String billDetail = StrUtil.subBefore(result, "总交易单数", false); + var billDetails = csvRows.read(billDetail, WechatReconcileBillDetail.class).stream() + // 只读取当前商户的订单 + .filter(o->Objects.equals(o.getAppid(), config.getSubAppId())) + // 只读取对账日的记录 + .filter(o->{ + String transactionTime = o.getTransactionTime(); + LocalDateTime time = LocalDateTimeUtil.parse(transactionTime, DatePattern.NORM_DATETIME_PATTERN); + return Objects.equals(statement.getDate(), LocalDate.from(time)); + }) + .toList(); + + // 保存原始对账文件 + String originalFile = this.saveOriginalFile(statement, bytes); + // 解析账单文件 + var tradeBos = this.convertReconcileTrade(billDetails); + return new ReconcileResolveResultBo() + .setOriginalFileUrl(originalFile) + .setChannelTrades(tradeBos); + } catch (WxPayException | IOException e) { + log.error("下载对账单失败", e); + throw new OperationFailException("下载对账单失败"); + } + } + + /** + * 转换为通用对账记录对象 + */ + private List convertReconcileTrade(List billDetails){ + return billDetails.stream() + .map(this::convert) + .toList(); + } + + /** + * 转换为通用对账记录对象 + */ + private ChannelReconcileTradeBo convert(WechatReconcileBillDetail billDetail){ + // 交易时间时间 指该笔交易的支付成功时间或发起退款成功时间(注:不是退款成功时间) + LocalDateTime time = LocalDateTimeUtil.parse(billDetail.getTransactionTime(), DatePattern.NORM_DATETIME_PATTERN); + // 默认为支付对账记录 + ChannelReconcileTradeBo tradeBo = new ChannelReconcileTradeBo() + .setOutTradeNo(billDetail.getOutTradeNo()) + .setTradeType(TradeTypeEnum.PAY.getCode()) + .setTradeTime(time) + .setTradeNo(billDetail.getTransactionId()); + if (Objects.equals(billDetail.getTradeState(), WxPayConstants.WxpayTradeStatus.SUCCESS)) { + tradeBo.setTradeType(TradeTypeEnum.PAY.getCode()) + .setAmount(new BigDecimal(billDetail.getTotalFee())) + .setTradeStatus(TradeStatusEnum.SUCCESS.getCode()); + } + + // 退款覆盖更新对应的字段 + if (Objects.equals(billDetail.getTradeState(), WxPayConstants.WxpayTradeStatus.REFUND)) { + tradeBo.setOutTradeNo(billDetail.getOutRefundNo()) + .setTradeNo(billDetail.getRefundId()) + .setAmount(new BigDecimal(billDetail.getRefundFee())) + .setTradeType(TradeTypeEnum.REFUND.getCode()); + tradeBo.setTradeType(TradeTypeEnum.REFUND.getCode()); + // 状态 + switch (billDetail.getRefundStatus()) { + case WxPayConstants.RefundStatus.SUCCESS -> tradeBo.setTradeStatus(TradeStatusEnum.SUCCESS.getCode()); + case WxPayConstants.RefundStatus.PROCESSING -> tradeBo.setTradeStatus(TradeStatusEnum.CLOSED.getCode()); + case WxPayConstants.ResultCode.FAIL -> tradeBo.setTradeStatus(TradeStatusEnum.FAIL.getCode()); + case WxPayConstants.RefundStatus.CHANGE -> tradeBo.setTradeStatus(TradeStatusEnum.EXCEPTION.getCode()); + } + tradeBo.setTradeStatus(TradeStatusEnum.SUCCESS.getCode()); + } + // 撤销状态 + if (Objects.equals(billDetail.getTradeState(), WxPayConstants.WxpayTradeStatus.REVOKED)) { + tradeBo.setTradeType(TradeTypeEnum.PAY.getCode()); + tradeBo.setTradeStatus(TradeStatusEnum.REVOKED.getCode()); + } + + return tradeBo; + } + + /** + * 保存下载的原始对账文件 + */ + private String saveOriginalFile(ReconcileStatement reconcileOrder, byte[] bytes) { + String date = LocalDateTimeUtil.format(reconcileOrder.getDate(), DatePattern.PURE_DATE_PATTERN); + // 将原始文件进行保存 通道-日期 + String fileName = StrUtil.format("交易对账单-微信-{}.csv",date); + var uploadPretreatment = fileStorageService.of(bytes); + if (StrUtil.isNotBlank(fileName)) { + uploadPretreatment.setOriginalFilename(fileName); + } + FileInfo upload = uploadPretreatment.upload(); + return upload.getUrl(); + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatRefundV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatRefundV2Service.java index b113fc21a..02c3152ab 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatRefundV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatRefundV2Service.java @@ -1,5 +1,11 @@ package org.dromara.daxpay.channel.wechat.service.refund; +import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest; +import com.github.binarywang.wxpay.bean.result.WxPayRefundResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.core.enums.RefundStatusEnum; @@ -7,12 +13,6 @@ import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.trade.RefundResultBo; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest; -import com.github.binarywang.wxpay.bean.result.WxPayRefundResult; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** @@ -37,7 +37,7 @@ public class WechatRefundV2Service { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); WxPayRefundRequest request = new WxPayRefundRequest() .setOutRefundNo(refundOrder.getRefundNo()) - .setNotifyUrl(wechatPayConfigService.getRefundNotifyUrl()) + .setNotifyUrl(wechatPayConfigService.getRefundNotifyUrl(false)) .setRefundDesc(refundOrder.getReason()) .setOutTradeNo(refundOrder.getOrderNo()) .setTotalFee(PayUtil.convertCentAmount(refundOrder.getOrderAmount())) diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatRefundV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatRefundV3Service.java index 08b3e7101..0e27e5d5f 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatRefundV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatRefundV3Service.java @@ -1,5 +1,12 @@ package org.dromara.daxpay.channel.wechat.service.refund; +import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.enums.WechatRefundStatusEnum; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; @@ -8,13 +15,6 @@ import org.dromara.daxpay.core.exception.TradeFailException; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.trade.RefundResultBo; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request; -import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result; -import com.github.binarywang.wxpay.constant.WxPayConstants; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** @@ -42,7 +42,7 @@ public class WechatRefundV3Service { .setTotal(PayUtil.convertCentAmount(refundOrder.getOrderAmount())); WxPayRefundV3Request request = new WxPayRefundV3Request() .setOutRefundNo(refundOrder.getRefundNo()) - .setNotifyUrl(wechatPayConfigService.getRefundNotifyUrl()) + .setNotifyUrl(wechatPayConfigService.getRefundNotifyUrl(true)) .setReason(refundOrder.getReason()) .setOutTradeNo(refundOrder.getOrderNo()) .setAmount(amount); diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatSubRefundV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatSubRefundV2Service.java new file mode 100644 index 000000000..f7c3c1e22 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatSubRefundV2Service.java @@ -0,0 +1,57 @@ +package org.dromara.daxpay.channel.wechat.service.refund; + +import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest; +import com.github.binarywang.wxpay.bean.result.WxPayRefundResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.RefundStatusEnum; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.springframework.stereotype.Service; + +/** + * 微信退款服务 v2 + * @author xxm + * @since 2023/12/25 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatSubRefundV2Service { + + private final WechatPayConfigService wechatPayConfigService; + + /** + * 退款方法 + * 微信需要同时传输订单金额或退款金额 + */ + public RefundResultBo refund(RefundOrder refundOrder, WechatPayConfig config) { + RefundResultBo refundInfo = new RefundResultBo(); + + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + WxPayRefundRequest request = new WxPayRefundRequest() + .setOutRefundNo(refundOrder.getRefundNo()) + .setNotifyUrl(wechatPayConfigService.getRefundNotifyUrl(true)) + .setRefundDesc(refundOrder.getReason()) + .setOutTradeNo(refundOrder.getOrderNo()) + .setTotalFee(PayUtil.convertCentAmount(refundOrder.getOrderAmount())) + .setRefundFee(PayUtil.convertCentAmount(refundOrder.getAmount())); + request.setSubMchId(config.getSubMchId()).setSubAppId(config.getSubAppId()); + try { + WxPayRefundResult result = wxPayService.refund(request); + // 微信V2版本的退款不会返回状态, 需要等待回调或手动查询 + refundInfo.setStatus(RefundStatusEnum.PROGRESS) + .setOutRefundNo(result.getRefundId()); + } catch (WxPayException e) { + log.error("微信退款V2失败", e); + throw new TradeFailException("微信退款V2失败: " + e.getMessage()); + } + return refundInfo; + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatSubRefundV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatSubRefundV3Service.java new file mode 100644 index 000000000..191b1f84c --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/refund/WechatSubRefundV3Service.java @@ -0,0 +1,64 @@ +package org.dromara.daxpay.channel.wechat.service.refund; + +import com.github.binarywang.wxpay.bean.request.WxPayPartnerRefundV3Request; +import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.enums.WechatRefundStatusEnum; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.springframework.stereotype.Service; + +/** + * 微信退款 v3 + * @author xxm + * @since 2024/7/21 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatSubRefundV3Service { + + private final WechatPayConfigService wechatPayConfigService; + + /** + * 退款 + */ + public RefundResultBo refund(RefundOrder refundOrder, WechatPayConfig config) { + RefundResultBo refundInfo = new RefundResultBo(); + + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); + var amount = new WxPayRefundV3Request.Amount() + .setCurrency(WxPayConstants.CurrencyType.CNY) + .setRefund(PayUtil.convertCentAmount(refundOrder.getAmount())) + .setTotal(PayUtil.convertCentAmount(refundOrder.getOrderAmount())); + var request = new WxPayPartnerRefundV3Request(); + request.setOutRefundNo(refundOrder.getRefundNo()) + .setNotifyUrl(wechatPayConfigService.getRefundNotifyUrl(true)) + .setReason(refundOrder.getReason()) + .setOutTradeNo(refundOrder.getOrderNo()) + .setAmount(amount) + .setSubMchid(config.getSubMchId()); + try { + WxPayRefundV3Result result = wxPayService.refundV3(request); + + WechatRefundStatusEnum statusEnum = WechatRefundStatusEnum.findByCode(result.getStatus()); + refundInfo.setStatus(statusEnum.getRefundStatus()) + .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime())) + .setOutRefundNo(result.getRefundId()); + } catch (WxPayException e) { + log.error("微信退款V3失败", e); + throw new TradeFailException("微信退款V3失败: "+e.getMessage()); + } + return refundInfo; + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WeChatPaySyncV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatPaySyncV2Service.java similarity index 95% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WeChatPaySyncV2Service.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatPaySyncV2Service.java index ce3d05906..2476fa65a 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WeChatPaySyncV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatPaySyncV2Service.java @@ -1,6 +1,11 @@ package org.dromara.daxpay.channel.wechat.service.sync.pay; import cn.bootx.platform.core.util.JsonUtil; +import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; @@ -8,11 +13,6 @@ import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; @@ -28,7 +28,7 @@ import java.util.Objects; @Slf4j @Service @RequiredArgsConstructor -public class WeChatPaySyncV2Service { +public class WechatPaySyncV2Service { private final WechatPayConfigService wechatPayConfigService; /** @@ -69,7 +69,9 @@ public class WeChatPaySyncV2Service { if (Objects.equals(e.getErrCode(), "ORDERNOTEXIST")){ syncResult.setPayStatus(PayStatusEnum.CLOSE); } else { - syncResult.setSyncErrorMsg(e.getCustomErrorMsg()).setSyncSuccess(false); + syncResult.setSyncErrorMsg(e.getCustomErrorMsg()) + .setSyncSuccess(false) + .setPayStatus(PayStatusEnum.FAIL); } } return syncResult; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WeChatPaySyncV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatPaySyncV3Service.java similarity index 92% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WeChatPaySyncV3Service.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatPaySyncV3Service.java index d1940467f..87027afd1 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WeChatPaySyncV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatPaySyncV3Service.java @@ -2,6 +2,11 @@ package org.dromara.daxpay.channel.wechat.service.sync.pay; import cn.bootx.platform.core.util.JsonUtil; import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryV3Result; +import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; @@ -9,11 +14,6 @@ import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; import org.dromara.daxpay.service.entity.order.pay.PayOrder; -import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; @@ -28,7 +28,7 @@ import java.util.Optional; @Slf4j @Service @RequiredArgsConstructor -public class WeChatPaySyncV3Service { +public class WechatPaySyncV3Service { private final WechatPayConfigService wechatPayConfigService; /** @@ -39,16 +39,15 @@ public class WeChatPaySyncV3Service { WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); try { var result = wxPayService.queryOrderV3(null, order.getOrderNo()); - // 获取支付金额 - var payerTotal = Optional.ofNullable(result.getAmount()) + var amount = Optional.ofNullable(result) + .map(WxPayOrderQueryV3Result::getAmount) .map(WxPayOrderQueryV3Result.Amount::getTotal) .map(PayUtil::conversionAmount) .orElse(null); - syncResult.setSyncData(JsonUtil.toJsonStr(result)) .setOutOrderNo(result.getTransactionId()) - .setAmount(payerTotal); + .setAmount(amount); // 支付状态 - 成功 SUCCESS:支付成功 REFUND:转入退款 if (List.of(WxpayTradeStatus.SUCCESS, WxpayTradeStatus.REFUND).contains(result.getTradeState())){ syncResult.setPayStatus(PayStatusEnum.SUCCESS) @@ -76,7 +75,9 @@ public class WeChatPaySyncV3Service { if (Objects.equals(e.getErrCode(), "ORDER_NOT_EXIST")){ syncResult.setPayStatus(PayStatusEnum.CLOSE); } else { - syncResult.setSyncErrorMsg(e.getCustomErrorMsg()).setSyncSuccess(false); + syncResult.setSyncErrorMsg(e.getCustomErrorMsg()) + .setSyncSuccess(false) + .setPayStatus(PayStatusEnum.FAIL); } } return syncResult; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatSubPaySyncV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatSubPaySyncV2Service.java new file mode 100644 index 000000000..620cbd138 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatSubPaySyncV2Service.java @@ -0,0 +1,84 @@ +package org.dromara.daxpay.channel.wechat.service.sync.pay; + +import cn.bootx.platform.core.util.JsonUtil; +import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryRequest; +import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + + +/** + * 微信支付同步服务 + * + * @author xxm + * @since 2021/6/21 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatSubPaySyncV2Service { + private final WechatPayConfigService wechatPayConfigService; + + /** + * 支付信息查询 + */ + public PaySyncResultBo sync(PayOrder order, WechatPayConfig wechatPayConfig) { + PaySyncResultBo syncResult = new PaySyncResultBo(); + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); + try { + WxPayOrderQueryRequest request = new WxPayOrderQueryRequest(); + request.setOutTradeNo(order.getOrderNo()); + request.setSubMchId(wechatPayConfig.getSubMchId()) + .setSubAppId(wechatPayConfig.getSubAppId()); + var result = wxPayService.queryOrder(request); + syncResult.setSyncData(JsonUtil.toJsonStr(result)) + .setOutOrderNo(result.getTransactionId()) + .setAmount(PayUtil.conversionAmount(result.getTotalFee())); + // 支付状态 - 成功 SUCCESS:支付成功 REFUND:转入退款 + if (List.of(WxpayTradeStatus.SUCCESS, WxpayTradeStatus.REFUND).contains(result.getTradeState())){ + syncResult.setPayStatus(PayStatusEnum.SUCCESS) + .setFinishTime(WechatPayUtil.parseV2(result.getTimeEnd())); + } + // 支付状态 - 支付中 NOTPAY:未支付,等待扣款 USERPAYING:用户支付中(付款码支付) + if (List.of(WxpayTradeStatus.NOTPAY, WxpayTradeStatus.USER_PAYING).contains(result.getTradeState())){ + syncResult.setPayStatus(PayStatusEnum.PROGRESS); + } + // 支付状态 - 失败 PAYERROR:支付失败(其他原因,如银行返回失败) + if (Objects.equals(WxpayTradeStatus.PAY_ERROR, result.getTradeState())){ + syncResult.setPayStatus(PayStatusEnum.FAIL); + } + // 关闭 REVOKED:已撤销(付款码支付) CLOSED:已关闭 + if (Objects.equals(WxpayTradeStatus.CLOSED, result.getTradeState())){ + syncResult.setPayStatus(PayStatusEnum.CLOSE); + } + // 撤销 + if (Objects.equals(WxpayTradeStatus.REVOKED, result.getTradeState())){ + syncResult.setPayStatus(PayStatusEnum.CANCEL); + } + } catch (WxPayException e) { + log.error("微信支付V2订单查询失败", e); + // 订单不存在 + if (Objects.equals(e.getErrCode(), "ORDERNOTEXIST")){ + syncResult.setPayStatus(PayStatusEnum.CLOSE); + } else { + syncResult.setSyncErrorMsg(e.getCustomErrorMsg()) + .setSyncSuccess(false) + .setPayStatus(PayStatusEnum.FAIL); + } + } + return syncResult; + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatSubPaySyncV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatSubPaySyncV3Service.java new file mode 100644 index 000000000..f92689389 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/pay/WechatSubPaySyncV3Service.java @@ -0,0 +1,85 @@ +package org.dromara.daxpay.channel.wechat.service.sync.pay; + +import cn.bootx.platform.core.util.JsonUtil; +import com.github.binarywang.wxpay.bean.result.WxPayPartnerOrderQueryV3Result; +import com.github.binarywang.wxpay.constant.WxPayConstants.WxpayTradeStatus; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.PayStatusEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +/** + * 微信支付信息同步 v3 + * @author xxm + * @since 2024/7/29 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatSubPaySyncV3Service { + private final WechatPayConfigService wechatPayConfigService; + + /** + * 微信支付订单 + */ + public PaySyncResultBo sync(PayOrder order, WechatPayConfig wechatPayConfig) { + PaySyncResultBo syncResult = new PaySyncResultBo(); + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(wechatPayConfig); + try { + var result = wxPayService.queryPartnerOrderV3(null, order.getOrderNo()); + // 获取支付金额 + var amount = Optional.ofNullable(result) + .map(WxPayPartnerOrderQueryV3Result::getAmount) + .map(WxPayPartnerOrderQueryV3Result.Amount::getTotal) + .map(PayUtil::conversionAmount) + .orElse(null); + syncResult.setSyncData(JsonUtil.toJsonStr(result)) + .setOutOrderNo(result.getTransactionId()) + .setAmount(amount); + // 支付状态 - 成功 SUCCESS:支付成功 REFUND:转入退款 + if (List.of(WxpayTradeStatus.SUCCESS, WxpayTradeStatus.REFUND).contains(result.getTradeState())){ + syncResult.setPayStatus(PayStatusEnum.SUCCESS) + .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime())); + } + // 支付状态 - 支付中 NOTPAY:未支付,等待扣款 USERPAYING:用户支付中(付款码支付) + if (List.of(WxpayTradeStatus.NOTPAY, WxpayTradeStatus.USER_PAYING).contains(result.getTradeState())){ + syncResult.setPayStatus(PayStatusEnum.PROGRESS); + } + // 支付状态 - 失败 PAYERROR:支付失败(其他原因,如银行返回失败) + if (Objects.equals(WxpayTradeStatus.PAY_ERROR, result.getTradeState())){ + syncResult.setPayStatus(PayStatusEnum.FAIL); + } + // 关闭 REVOKED:已撤销(付款码支付) CLOSED:已关闭 + if (Objects.equals(WxpayTradeStatus.CLOSED, result.getTradeState())){ + syncResult.setPayStatus(PayStatusEnum.CLOSE); + } + // 撤销 + if (Objects.equals(WxpayTradeStatus.REVOKED, result.getTradeState())){ + syncResult.setPayStatus(PayStatusEnum.CANCEL); + } + } catch (WxPayException e) { + log.error("微信支付V3订单查询失败", e); + // 订单不存在 + if (Objects.equals(e.getErrCode(), "ORDER_NOT_EXIST")){ + syncResult.setPayStatus(PayStatusEnum.CLOSE); + } else { + syncResult.setSyncErrorMsg(e.getCustomErrorMsg()) + .setSyncSuccess(false) + .setPayStatus(PayStatusEnum.FAIL); + } + } + return syncResult; + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatRefundSyncV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatRefundSyncV2Service.java index 0711855e2..1f7ee0684 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatRefundSyncV2Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatRefundSyncV2Service.java @@ -48,7 +48,7 @@ public class WechatRefundSyncV2Service { .setAmount(PayUtil.conversionAmount(result.getRefundFee())); // 交易不存在 if (CollUtil.isEmpty(result.getRefundRecords())){ - syncResult.setRefundStatus(RefundStatusEnum.FAIL).setTradeErrorMsg("交易不存在"); + syncResult.setRefundStatus(RefundStatusEnum.CLOSE).setTradeErrorMsg("交易不存在"); } var record = result.getRefundRecords().getFirst(); // 退款状态 - 成功 @@ -63,11 +63,13 @@ public class WechatRefundSyncV2Service { } // 退款状态 - 失败 if (Objects.equals(RefundStatus.CHANGE, record.getRefundStatus())){ - syncResult.setRefundStatus(RefundStatusEnum.FAIL); + syncResult.setRefundStatus(RefundStatusEnum.CLOSE); } } catch (WxPayException e) { log.error("微信退款订单查询V3失败", e); - syncResult.setSyncErrorMsg(e.getCustomErrorMsg()).setSyncSuccess(false); + syncResult.setSyncErrorMsg(e.getCustomErrorMsg()) + .setSyncSuccess(false) + .setRefundStatus(RefundStatusEnum.FAIL); } return syncResult; } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatRefundSyncV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatRefundSyncV3Service.java index da2f57066..3efb01534 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatRefundSyncV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatRefundSyncV3Service.java @@ -1,5 +1,10 @@ package org.dromara.daxpay.channel.wechat.service.sync.refund; +import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; @@ -7,11 +12,6 @@ import org.dromara.daxpay.core.enums.RefundStatusEnum; import org.dromara.daxpay.core.util.PayUtil; import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; -import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus; -import com.github.binarywang.wxpay.exception.WxPayException; -import com.github.binarywang.wxpay.service.WxPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Objects; @@ -50,11 +50,13 @@ public class WechatRefundSyncV3Service { } // 退款状态 - 失败 if (Objects.equals(RefundStatus.ABNORMAL, result.getStatus())){ - syncResult.setRefundStatus(RefundStatusEnum.FAIL); + syncResult.setRefundStatus(RefundStatusEnum.CLOSE); } } catch (WxPayException e) { log.error("微信退款订单查询V3失败", e); - syncResult.setSyncErrorMsg(e.getCustomErrorMsg()).setSyncSuccess(false); + syncResult.setSyncErrorMsg(e.getCustomErrorMsg()) + .setSyncSuccess(false) + .setRefundStatus(RefundStatusEnum.FAIL); } return syncResult; } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatSubRefundSyncV2Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatSubRefundSyncV2Service.java new file mode 100644 index 000000000..d9f848c6c --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatSubRefundSyncV2Service.java @@ -0,0 +1,78 @@ +package org.dromara.daxpay.channel.wechat.service.sync.refund; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryRequest; +import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.RefundStatusEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.Objects; + +/** + * 微信退款订单信息同步 + * @author xxm + * @since 2024/7/25 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatSubRefundSyncV2Service { + private final WechatPayConfigService wechatPayConfigService; + + /** + * 退款信息查询 + */ + public RefundSyncResultBo sync(RefundOrder refundOrder, WechatPayConfig weChatPayConfig){ + RefundSyncResultBo syncResult = new RefundSyncResultBo(); + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(weChatPayConfig); + // 使用退款单号查询, 只返回当前这条, 如果使用支付订单号查询,返回所有相关的 + var request = new WxPayRefundQueryRequest(); + request.setOutRefundNo(refundOrder.getRefundNo()); + request.setSubMchId(weChatPayConfig.getSubMchId()) + .setSubAppId(weChatPayConfig.getSubAppId()); + try { + var result = wxPayService.refundQuery(request); + // 网关退款号 + syncResult.setOutRefundNo(result.getTransactionId()) + + .setAmount(PayUtil.conversionAmount(result.getRefundFee())); + // 交易不存在 + if (CollUtil.isEmpty(result.getRefundRecords())){ + syncResult.setRefundStatus(RefundStatusEnum.CLOSE).setTradeErrorMsg("交易不存在"); + } + var record = result.getRefundRecords().getFirst(); + // 退款状态 - 成功 + if (Objects.equals(RefundStatus.SUCCESS, record.getRefundStatus())){ + LocalDateTime finishTime = LocalDateTimeUtil.parse(record.getRefundSuccessTime(), DatePattern.NORM_DATETIME_PATTERN); + syncResult.setRefundStatus(RefundStatusEnum.SUCCESS) + .setFinishTime(finishTime); + } + // 退款状态 - 退款关闭 + if (Objects.equals(RefundStatus.REFUND_CLOSE, record.getRefundStatus())){ + syncResult.setRefundStatus(RefundStatusEnum.CLOSE); + } + // 退款状态 - 失败 + if (Objects.equals(RefundStatus.CHANGE, record.getRefundStatus())){ + syncResult.setRefundStatus(RefundStatusEnum.CLOSE); + } + } catch (WxPayException e) { + log.error("微信退款订单查询V3失败", e); + syncResult.setSyncErrorMsg(e.getCustomErrorMsg()) + .setSyncSuccess(false) + .setRefundStatus(RefundStatusEnum.FAIL); + } + return syncResult; + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatSubRefundSyncV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatSubRefundSyncV3Service.java new file mode 100644 index 000000000..ead831043 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/refund/WechatSubRefundSyncV3Service.java @@ -0,0 +1,67 @@ +package org.dromara.daxpay.channel.wechat.service.sync.refund; + +import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryV3Request; +import com.github.binarywang.wxpay.constant.WxPayConstants.RefundStatus; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.util.WechatPayUtil; +import org.dromara.daxpay.core.enums.RefundStatusEnum; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.entity.order.refund.RefundOrder; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * 微信退款订单同步 + * @author xxm + * @since 2024/7/25 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatSubRefundSyncV3Service { + private final WechatPayConfigService wechatPayConfigService; + + /** + * 退款信息查询 + */ + public RefundSyncResultBo sync(RefundOrder refundOrder, WechatPayConfig weChatPayConfig){ + RefundSyncResultBo syncResult = new RefundSyncResultBo(); + WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(weChatPayConfig); + // 使用退款单号查询, 只返回当前这条, 如果使用支付订单号查询,返回所有相关的 + try { + WxPayRefundQueryV3Request request = new WxPayRefundQueryV3Request(); + request.setOutRefundNo(refundOrder.getRefundNo()); + request.setSubMchid(weChatPayConfig.getSubMchId()); + var result = wxPayService.refundPartnerQueryV3(request); + // 网关退款号 + syncResult.setOutRefundNo(result.getTransactionId()) + .setAmount(PayUtil.conversionAmount(result.getAmount().getRefundFee())); + // 退款状态 - 成功 + if (Objects.equals(RefundStatus.SUCCESS, result.getStatus())){ + syncResult.setRefundStatus(RefundStatusEnum.SUCCESS) + .setFinishTime(WechatPayUtil.parseV3(result.getSuccessTime())); + } + // 退款状态 - 退款关闭 + if (Objects.equals(RefundStatus.CLOSED, result.getStatus())){ + syncResult.setRefundStatus(RefundStatusEnum.CLOSE); + } + // 退款状态 - 失败 + if (Objects.equals(RefundStatus.ABNORMAL, result.getStatus())){ + syncResult.setRefundStatus(RefundStatusEnum.CLOSE); + } + } catch (WxPayException e) { + log.error("微信退款订单查询V3失败", e); + syncResult.setSyncErrorMsg(e.getCustomErrorMsg()) + .setSyncSuccess(false) + .setRefundStatus(RefundStatusEnum.FAIL); + } + return syncResult; + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/transfer/WechatTransferSyncV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/transfer/WechatTransferSyncV3Service.java index 8843ca49a..39c74fe78 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/transfer/WechatTransferSyncV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/sync/transfer/WechatTransferSyncV3Service.java @@ -51,7 +51,7 @@ public class WechatTransferSyncV3Service { } // FAIL:转账失败。需要确认失败原因后,再决定是否重新发起对该笔明细单的转账(并非整个转账批次单) if ("FAIL".equals(result.getDetailStatus())){ - syncResult.setTransferStatus(TransferStatusEnum.FAIL); + syncResult.setTransferStatus(TransferStatusEnum.CLOSE); } // INIT: 初始态。 系统转账校验中 WAIT_PAY: 待确认。待商户确认, 符合免密条件时, 系统会自动扭转为转账中 // PROCESSING:转账中。正在处理中,转账结果尚未明确 @@ -61,7 +61,9 @@ public class WechatTransferSyncV3Service { } catch (WxPayException e) { log.error("微信转账订单查询V3失败", e); - syncResult.setSyncErrorMsg(e.getCustomErrorMsg()).setSyncSuccess(false); + syncResult.setSyncErrorMsg(e.getCustomErrorMsg()) + .setSyncSuccess(false) + .setTransferStatus(TransferStatusEnum.FAIL); } return syncResult; } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/transfer/WechatPayTransferV3Service.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/transfer/WechatTransferV3Service.java similarity index 98% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/transfer/WechatPayTransferV3Service.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/transfer/WechatTransferV3Service.java index 496d7b258..093686dc9 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/transfer/WechatPayTransferV3Service.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/transfer/WechatTransferV3Service.java @@ -1,12 +1,5 @@ package org.dromara.daxpay.channel.wechat.service.transfer; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; -import org.dromara.daxpay.channel.wechat.param.transfer.TransferCreateV3Request; -import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; -import org.dromara.daxpay.core.exception.TradeFailException; -import org.dromara.daxpay.core.util.PayUtil; -import org.dromara.daxpay.service.bo.trade.TransferResultBo; -import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; import cn.hutool.core.util.StrUtil; import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateRequest; import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateResult; @@ -15,6 +8,13 @@ import com.github.binarywang.wxpay.service.MerchantTransferService; import com.github.binarywang.wxpay.service.WxPayService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.param.transfer.TransferCreateV3Request; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.exception.TradeFailException; +import org.dromara.daxpay.core.util.PayUtil; +import org.dromara.daxpay.service.bo.trade.TransferResultBo; +import org.dromara.daxpay.service.entity.order.transfer.TransferOrder; import org.springframework.stereotype.Service; import java.util.Collections; @@ -27,7 +27,7 @@ import java.util.Collections; @Slf4j @Service @RequiredArgsConstructor -public class WechatPayTransferV3Service { +public class WechatTransferV3Service { private final WechatPayConfigService wechatPayConfigService; /** @@ -54,7 +54,7 @@ public class WechatPayTransferV3Service { .setUserName(order.getPayeeName()); // 设置回调地址 var request = new TransferCreateV3Request() - .setNotifyUrl(wechatPayConfigService.getTransferNotifyUrl()); + .setNotifyUrl(wechatPayConfigService.getTransferNotifyUrl(false)); request.setAppid(config.getWxAppId()) .setOutBatchNo(String.valueOf(order.getId())) .setBatchName(order.getTitle()) diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvAllocReceiverStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvAllocReceiverStrategy.java new file mode 100644 index 000000000..6327ae742 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvAllocReceiverStrategy.java @@ -0,0 +1,93 @@ +package org.dromara.daxpay.channel.wechat.strategy.isv; + +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.allocation.receiver.WechatPaySubAllocReceiverV2Service; +import org.dromara.daxpay.channel.wechat.service.allocation.receiver.WechatSubAllocReceiverV3Service; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.strategy.AbsAllocReceiverStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 微信分账接收策略 + * @author xxm + * @since 2024/4/1 + */ +@Slf4j +@Service +@Scope(SCOPE_PROTOTYPE) +@RequiredArgsConstructor +public class WechatIsvAllocReceiverStrategy extends AbsAllocReceiverStrategy { + + private final WechatPaySubAllocReceiverV2Service receiverV2Service; + + private final WechatSubAllocReceiverV3Service receiverV3Service; + + private final WechatPayConfigService wechatPayConfigService; + + private WechatPayConfig config; + + /** + * 策略标识 + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT_ISV.getCode(); + } + + @Override + public List getSupportReceiverTypes() { + return List.of(AllocReceiverTypeEnum.OPEN_ID, AllocReceiverTypeEnum.MERCHANT_NO); + } + + /** + * 校验方法 + */ + @Override + public boolean validation(){ + List list = Arrays.asList(AllocReceiverTypeEnum.OPEN_ID.getCode(), AllocReceiverTypeEnum.MERCHANT_NO.getCode()); + String receiverType = this.getAllocReceiver().getReceiverType(); + return list.contains(receiverType); + } + + @Override + public void doBeforeHandler(){ + this.config = wechatPayConfigService.getAndCheckConfig(true); + } + + + /** + * 添加到支付系统中 + */ + @Override + public void bind() { + if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){ + receiverV2Service.bind(getAllocReceiver(), this.config); + } else { + receiverV3Service.bind(getAllocReceiver(), this.config); + } + } + + /** + * 从三方支付系统中删除 + */ + @Override + public void unbind() { + if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){ + receiverV2Service.unbind(getAllocReceiver(), this.config); + } else { + receiverV3Service.unbind(getAllocReceiver(), this.config); + } + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvAllocationStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvAllocationStrategy.java new file mode 100644 index 000000000..131e9572c --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvAllocationStrategy.java @@ -0,0 +1,86 @@ +package org.dromara.daxpay.channel.wechat.strategy.isv; + +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.allocation.WeChatPaySubAllocationV2Service; +import org.dromara.daxpay.channel.wechat.service.allocation.WeChatPaySubAllocationV3Service; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; +import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; +import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 微信分账策略 + * @author xxm + * @since 2024/12/9 + */ +@Slf4j +@Scope(SCOPE_PROTOTYPE) +@Component +@RequiredArgsConstructor +public class WechatIsvAllocationStrategy extends AbsAllocationStrategy { + private final WeChatPaySubAllocationV3Service weChatPayAllocationV3Service; + private final WeChatPaySubAllocationV2Service weChatPayAllocationV2Service; + private final WechatPayConfigService wechatPayConfigService; + + private WechatPayConfig config; + + /** + * 分账通道 + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT_ISV.getCode(); + } + + @Override + public void doBeforeHandler(){ + this.config = wechatPayConfigService.getAndCheckConfig(true); + } + + /** + * 开始分账 + */ + @Override + public AllocStartResultBo start() { + if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ + return weChatPayAllocationV3Service.start(getOrder(), getDetails(), this.config); + } else { + return weChatPayAllocationV2Service.start(getOrder(), getDetails(), this.config); + } + } + + /** + * 完结 + */ + @Override + public void finish() { + if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ + weChatPayAllocationV3Service.finish(getOrder(), this.config); + } else { + weChatPayAllocationV2Service.finish(getOrder(), this.config); + } + } + + /** + * 同步状态 + */ + @Override + public AllocSyncResultBo doSync() { + if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V3)){ + return weChatPayAllocationV3Service.sync(getOrder(), this.getDetails(), this.config); + } else { + return weChatPayAllocationV2Service.sync(getOrder(), this.getDetails(), this.config); + } + } + +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvAuthStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvAuthStrategy.java new file mode 100644 index 000000000..788411bbb --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvAuthStrategy.java @@ -0,0 +1,45 @@ +package org.dromara.daxpay.channel.wechat.strategy.isv; + +import org.dromara.daxpay.channel.wechat.service.assist.WechatSubAuthService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.param.assist.AuthCodeParam; +import org.dromara.daxpay.core.param.assist.GenerateAuthUrlParam; +import org.dromara.daxpay.core.result.assist.AuthResult; +import org.dromara.daxpay.core.result.assist.AuthUrlResult; +import org.dromara.daxpay.service.strategy.AbsChannelAuthStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 微信认证 + * @author xxm + * @since 2024/9/24 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatIsvAuthStrategy extends AbsChannelAuthStrategy { + private final WechatSubAuthService wechatAuthService; + + @Override + public String getChannel() { + return ChannelEnum.WECHAT_ISV.getCode(); + } + + /** + * 获取授权链接 + */ + @Override + public AuthUrlResult generateAuthUrl(GenerateAuthUrlParam param) { + return wechatAuthService.generateAuthUrl(param); + } + + /** + * 通过AuthCode兑换认证结果 + */ + @Override + public AuthResult doAuth(AuthCodeParam param) { + return wechatAuthService.getTokenAndOpenId(param.getAuthCode()); + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvCashierCodeStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvCashierCodeStrategy.java new file mode 100644 index 000000000..85888b59a --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvCashierCodeStrategy.java @@ -0,0 +1,64 @@ +package org.dromara.daxpay.channel.wechat.strategy.isv; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; +import org.dromara.daxpay.channel.wechat.service.assist.WechatAuthService; +import org.dromara.daxpay.core.enums.ChannelAuthStatusEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.param.assist.AuthCodeParam; +import org.dromara.daxpay.core.param.cashier.CashierCodePayParam; +import org.dromara.daxpay.core.param.trade.pay.PayParam; +import org.dromara.daxpay.core.result.assist.AuthResult; +import org.dromara.daxpay.service.strategy.AbsCashierCodeStrategy; +import org.springframework.stereotype.Component; + +/** + * 微信收银码牌支付 + * @author xxm + * @since 2024/9/29 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class WechatIsvCashierCodeStrategy extends AbsCashierCodeStrategy { + private final WechatAuthService wechatAuthService; + + /** + * 生成授权链接, 主要是微信类通道使用, 用于获取OpenId + */ + @Override + public String generateAuthUrl(String cashierCode) { + String redirectUrl = StrUtil.format("/cashier/wechat/{}", cashierCode); + return wechatAuthService.generateInnerAuthUrl(redirectUrl); + } + + /** + * 获取认证结果 + */ + @Override + public AuthResult doAuth(AuthCodeParam param) { + String openId = wechatAuthService.getTokenAndOpenId(param.getAuthCode()).getOpenId(); + return new AuthResult().setStatus(ChannelAuthStatusEnum.SUCCESS.getCode()).setOpenId(openId); + } + + /** + * 支付参数处理 + */ + @Override + public void handlePayParam(CashierCodePayParam cashierPayParam, PayParam payParam) { + WechatPayParam wechatPayParam = new WechatPayParam(); + wechatPayParam.setOpenId(cashierPayParam.getOpenId()); + payParam.setExtraParam(JSONUtil.toJsonStr(wechatPayParam)); + } + + /** + * 策略标识, 可以自行进行扩展 + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT.getCode(); + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvCheckoutStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvCheckoutStrategy.java new file mode 100644 index 000000000..ee3661196 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvCheckoutStrategy.java @@ -0,0 +1,76 @@ +package org.dromara.daxpay.channel.wechat.strategy.isv; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; +import org.dromara.daxpay.channel.wechat.service.assist.WechatAuthService; +import org.dromara.daxpay.core.enums.ChannelAuthStatusEnum; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.param.assist.AuthCodeParam; +import org.dromara.daxpay.core.param.checkout.CheckoutPayParam; +import org.dromara.daxpay.core.param.trade.pay.PayParam; +import org.dromara.daxpay.core.result.assist.AuthResult; +import org.dromara.daxpay.service.strategy.AbsCheckoutStrategy; +import org.springframework.stereotype.Component; + +/** + * 微信收银台支付策略 + * @author xxm + * @since 2024/12/2 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class WechatIsvCheckoutStrategy extends AbsCheckoutStrategy { + private final WechatAuthService wechatAuthService; + + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT_ISV.getCode(); + } + + /** + * 生成授权链接, 主要是微信类通道使用, 用于获取OpenId + */ + @Override + public String generateAuthUrl(String orderNo) { + String redirectUrl = StrUtil.format("/aggregate/wechat/{}", orderNo); + return wechatAuthService.generateInnerAuthUrl(redirectUrl); + } + + /** + * 检测付款码 + */ + @Override + public boolean checkBarCode(String barCode){ + String[] wx = { "10", "11", "12", "13", "14", "15" }; + return StrUtil.startWithAny(barCode.substring(0, 2), wx); + } + /** + * 获取认证结果 + */ + @Override + public AuthResult doAuth(AuthCodeParam param) { + String openId = wechatAuthService.getTokenAndOpenId(param.getAuthCode()).getOpenId(); + return new AuthResult().setStatus(ChannelAuthStatusEnum.SUCCESS.getCode()).setOpenId(openId); + } + + /** + * 支付参数处理 + */ + @Override + public void handlePayParam(CheckoutPayParam checkoutPayParam, PayParam payParam) { + WechatPayParam wechatPayParam = new WechatPayParam(); + wechatPayParam.setOpenId(checkoutPayParam.getOpenId()); + wechatPayParam.setAuthCode(checkoutPayParam.getBarCode()); + payParam.setExtraParam(JSONUtil.toJsonStr(wechatPayParam)); + } + +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvCloseStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvCloseStrategy.java new file mode 100644 index 000000000..989892ccf --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvCloseStrategy.java @@ -0,0 +1,81 @@ +package org.dromara.daxpay.channel.wechat.strategy.isv; + +import cn.bootx.platform.core.exception.ValidationFailedException; +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.close.WechatPaySubCloseV2Service; +import org.dromara.daxpay.channel.wechat.service.close.WechatPaySubCloseV3Service; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.core.enums.CloseTypeEnum; +import org.dromara.daxpay.core.enums.PayMethodEnum; +import org.dromara.daxpay.service.entity.order.pay.PayOrder; +import org.dromara.daxpay.service.strategy.AbsPayCloseStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 微信支付关闭策略 + * @author xxm + * @since 2023/12/30 + */ +@Slf4j +@Scope(SCOPE_PROTOTYPE) +@Service +@RequiredArgsConstructor +public class WechatIsvCloseStrategy extends AbsPayCloseStrategy { + + private final WechatPayConfigService wechatPayConfigService; + private final WechatPaySubCloseV2Service payCloseV2Service; + private final WechatPaySubCloseV3Service payCloseV3Service; + + private WechatPayConfig config; + + @Override + public String getChannel() { + return ChannelEnum.WECHAT_ISV.getCode(); + } + + /** + * 关闭前的处理方式 + */ + @Override + public void doBeforeCloseHandler() { + PayOrder order = this.getOrder(); + // 只有付款码可以撤销支付 + if (this.isUseCancel() && !order.getMethod().equals(PayMethodEnum.BARCODE.getCode())){ + throw new ValidationFailedException("该订单不支持撤销操作"); + } + this.config = wechatPayConfigService.getAndCheckConfig(true); + } + + /** + * 关闭操作 + */ + @Override + public CloseTypeEnum doCloseHandler() { + PayOrder order = this.getOrder(); + // 只有付款码可以撤销支付 + if (this.isUseCancel() && order.getMethod().equals(PayMethodEnum.BARCODE.getCode())){ + if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){ + payCloseV2Service.cancel(order,config); + } else { + payCloseV3Service.cancel(order,config); + } + return CloseTypeEnum.CANCEL; + } + // 判断接口是v2还是v3 + if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){ + payCloseV2Service.close(order,config); + } else { + payCloseV3Service.close(order,config); + } + return CloseTypeEnum.CLOSE; + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvPayStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvPayStrategy.java new file mode 100644 index 000000000..d634dbd5c --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvPayStrategy.java @@ -0,0 +1,77 @@ +package org.dromara.daxpay.channel.wechat.strategy.isv; + +import cn.bootx.platform.common.jackson.util.JacksonUtil; +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.service.pay.isv.WechatPaySubService; +import org.dromara.daxpay.channel.wechat.service.pay.isv.WechatPaySubV2Service; +import org.dromara.daxpay.channel.wechat.service.pay.isv.WechatPaySubV3Service; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.trade.PayResultBo; +import org.dromara.daxpay.service.strategy.AbsPayStrategy; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 微信支付 + * @author xxm + * @since 2021/4/5 + */ +@Scope(SCOPE_PROTOTYPE) +@Component +@RequiredArgsConstructor +public class WechatIsvPayStrategy extends AbsPayStrategy { + + private final WechatPayConfigService wechatPayConfigService; + + private final WechatPaySubService wechatPayService; + + private final WechatPaySubV2Service wechatPayV2Service; + + private final WechatPaySubV3Service wechatPayV3Service; + + private WechatPayConfig wechatPayConfig; + + private WechatPayParam wechatPayParam; + + /** + * 策略标识, 可以自行进行扩展 + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT_ISV.getCode(); + } + + @Override + public void doBeforePayHandler(){ + // 微信参数验证 + String channelParam = this.getPayParam().getExtraParam(); + if (StrUtil.isNotEmpty(channelParam)) { + this.wechatPayParam = JacksonUtil.toBean(channelParam, WechatPayParam.class); + } else { + this.wechatPayParam = new WechatPayParam(); + } + this.wechatPayConfig = wechatPayConfigService.getAndCheckConfig(true); + wechatPayService.validation(this.getPayParam(), this.wechatPayParam, wechatPayConfig); + } + + /** + * 支付操作 + */ + @Override + public PayResultBo doPayHandler() { + if (Objects.equals(wechatPayConfig.getApiVersion(), WechatPayCode.API_V2)){ + return wechatPayV2Service.pay(getOrder(), wechatPayParam, wechatPayConfig); + } else { + return wechatPayV3Service.pay(getOrder(), wechatPayParam, wechatPayConfig); + } + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvReconcileStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvReconcileStrategy.java new file mode 100644 index 000000000..67aa9a001 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvReconcileStrategy.java @@ -0,0 +1,62 @@ +package org.dromara.daxpay.channel.wechat.strategy.isv; + +import org.dromara.daxpay.channel.wechat.service.reconcile.WechatSubReconcileService; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.reconcile.ReconcileResolveResultBo; +import org.dromara.daxpay.service.enums.ReconcileFileTypeEnum; +import org.dromara.daxpay.service.strategy.AbsReconcileStrategy; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 微信支付对账策略 + * @author xxm + * @since 2024/1/17 + */ +@Slf4j +@Scope(SCOPE_PROTOTYPE) +@Service +@RequiredArgsConstructor +public class WechatIsvReconcileStrategy extends AbsReconcileStrategy { + + private final WechatSubReconcileService reconcileService; + + /** + * 策略标识 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT_ISV.getCode(); + } + + /** + * 上传对账单解析并保存 + */ + @SneakyThrows + @Override + public ReconcileResolveResultBo uploadAndResolve(MultipartFile file, ReconcileFileTypeEnum fileType) { +// WechatPayConfig wechatPayConfig = wechatPayConfigService.getAndCheckConfig(); +// return reconcileService.uploadBill(file.getBytes(),wechatPayConfig); + return null; + } + + /** + * 下载对账单 + */ + @Override + public ReconcileResolveResultBo downAndResolve() { + String date = LocalDateTimeUtil.format(this.getStatement().getDate(), DatePattern.NORM_DATE_PATTERN); + return reconcileService.downAndResolve(this.getStatement(), date); + } + +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvRefundStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvRefundStrategy.java new file mode 100644 index 000000000..c20cad388 --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvRefundStrategy.java @@ -0,0 +1,68 @@ +package org.dromara.daxpay.channel.wechat.strategy.isv; + +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; +import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.service.refund.WechatSubRefundV2Service; +import org.dromara.daxpay.channel.wechat.service.refund.WechatSubRefundV3Service; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.trade.RefundResultBo; +import org.dromara.daxpay.service.strategy.AbsRefundStrategy; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 微信支付退款 + * @author xxm + * @since 2023/7/5 + */ +@Scope(SCOPE_PROTOTYPE) +@Component +@RequiredArgsConstructor +public class WechatIsvRefundStrategy extends AbsRefundStrategy { + + private final WechatPayConfigService weChatPayConfigService; + + private final WechatSubRefundV2Service wechatRefundV2Service; + + private final WechatSubRefundV3Service wechatRefundV3Service; + + private WechatPayConfig config; + + /** + * 策略标识 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT_ISV.getCode(); + } + + /** + * 退款前对处理, 初始化微信支付配置 + */ + @Override + public void doBeforeRefundHandler() { + this.config = weChatPayConfigService.getAndCheckConfig(true); + } + + + /** + * 退款操作 + */ + @Override + public RefundResultBo doRefundHandler() { + if (Objects.equals(config.getApiVersion(), WechatPayCode.API_V2)){ + return wechatRefundV2Service.refund(this.getRefundOrder(),this.config); + } else { + return wechatRefundV3Service.refund(this.getRefundOrder(),this.config); + } + } + +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvSyncPayStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvSyncPayStrategy.java new file mode 100644 index 000000000..36e341f8d --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvSyncPayStrategy.java @@ -0,0 +1,60 @@ +package org.dromara.daxpay.channel.wechat.strategy.isv; + +import lombok.RequiredArgsConstructor; +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.service.sync.pay.WechatSubPaySyncV2Service; +import org.dromara.daxpay.channel.wechat.service.sync.pay.WechatSubPaySyncV3Service; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; +import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 微信支付订单同步 + * @author xxm + * @since 2023/7/14 + */ +@Scope(SCOPE_PROTOTYPE) +@Component +@RequiredArgsConstructor +public class WechatIsvSyncPayStrategy extends AbsSyncPayOrderStrategy { + + private final WechatSubPaySyncV3Service weChatPaySyncV3Service; + + private final WechatSubPaySyncV2Service weChatPaySyncV2Service; + + private final WechatPayConfigService wechatPayConfigService; + + + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT_ISV.getCode(); + } + + + + /** + * 异步支付单与支付网关进行状态比对后的结果 + * + */ + @Override + public PaySyncResultBo doSync() { + var wechatPayConfig = wechatPayConfigService.getAndCheckConfig(true); + if (Objects.equals(wechatPayConfig.getApiVersion(), WechatPayCode.API_V2)){ + return weChatPaySyncV2Service.sync(getOrder(), wechatPayConfig); + } else { + return weChatPaySyncV3Service.sync(getOrder(), wechatPayConfig); + } + } +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvSyncRefundStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvSyncRefundStrategy.java new file mode 100644 index 000000000..e88e135ce --- /dev/null +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/isv/WechatIsvSyncRefundStrategy.java @@ -0,0 +1,58 @@ +package org.dromara.daxpay.channel.wechat.strategy.isv; + +import org.dromara.daxpay.channel.wechat.code.WechatPayCode; +import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; +import org.dromara.daxpay.channel.wechat.service.sync.refund.WechatSubRefundSyncV2Service; +import org.dromara.daxpay.channel.wechat.service.sync.refund.WechatSubRefundSyncV3Service; +import org.dromara.daxpay.core.enums.ChannelEnum; +import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; +import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; + +/** + * 微信退款订单查询 + * @author xxm + * @since 2024/7/25 + */ +@Scope(SCOPE_PROTOTYPE) +@Component +@RequiredArgsConstructor +public class WechatIsvSyncRefundStrategy extends AbsSyncRefundOrderStrategy { + + private final WechatSubRefundSyncV2Service wechatRefundSyncV2Service; + + private final WechatSubRefundSyncV3Service wechatRefundSyncV3Service; + + private final WechatPayConfigService wechatPayConfigService; + + /** + * 策略标识, 可以自行进行扩展 + * + * @see ChannelEnum + */ + @Override + public String getChannel() { + return ChannelEnum.WECHAT_ISV.getCode(); + } + + /** + * 异步支付单与支付网关进行状态比对后的结果 + * + */ + @Override + public RefundSyncResultBo doSync() { + var wechatPayConfig = wechatPayConfigService.getAndCheckConfig(true); + if (Objects.equals(wechatPayConfig.getApiVersion(), WechatPayCode.API_V2)){ + return wechatRefundSyncV2Service.sync(this.getRefundOrder(), wechatPayConfig); + } else { + return wechatRefundSyncV3Service.sync(this.getRefundOrder(), wechatPayConfig); + } + } + +} diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocReceiverStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocReceiverStrategy.java similarity index 95% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocReceiverStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocReceiverStrategy.java index a8436e910..e42600bbe 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocReceiverStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocReceiverStrategy.java @@ -1,7 +1,5 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.allocation.receiver.WechatPayAllocReceiverV2Service; @@ -10,6 +8,8 @@ import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.core.enums.AllocReceiverTypeEnum; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.strategy.AbsAllocReceiverStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; @@ -63,7 +63,7 @@ public class WechatAllocReceiverStrategy extends AbsAllocReceiverStrategy { @Override public void doBeforeHandler(){ - this.config = wechatPayConfigService.getAndCheckConfig(); + this.config = wechatPayConfigService.getAndCheckConfig(false); } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocationStrategy.java similarity index 95% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocationStrategy.java index 6b5ce3295..126be8f23 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAllocationStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAllocationStrategy.java @@ -1,7 +1,5 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.allocation.WeChatPayAllocationV2Service; @@ -11,6 +9,8 @@ import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.allocation.AllocStartResultBo; import org.dromara.daxpay.service.bo.allocation.AllocSyncResultBo; import org.dromara.daxpay.service.strategy.AbsAllocationStrategy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -44,7 +44,7 @@ public class WechatAllocationStrategy extends AbsAllocationStrategy { @Override public void doBeforeHandler(){ - this.config = wechatPayConfigService.getAndCheckConfig(); + this.config = wechatPayConfigService.getAndCheckConfig(false); } /** @@ -82,5 +82,4 @@ public class WechatAllocationStrategy extends AbsAllocationStrategy { return weChatPayAllocationV2Service.sync(getOrder(), this.getDetails(), this.config); } } - } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAuthStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAuthStrategy.java similarity index 95% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAuthStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAuthStrategy.java index 9905ca854..0983967c9 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatAuthStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatAuthStrategy.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; import org.dromara.daxpay.channel.wechat.service.assist.WechatAuthService; import org.dromara.daxpay.core.enums.ChannelEnum; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCashierCodeStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCashierCodeStrategy.java similarity index 97% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCashierCodeStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCashierCodeStrategy.java index 7ffea5065..16d2f8d71 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCashierCodeStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCashierCodeStrategy.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCheckoutStrategy.java similarity index 97% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCheckoutStrategy.java index 302ee4d52..00bf2e6e9 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatCheckoutStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCheckoutStrategy.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayCloseStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCloseStrategy.java similarity index 93% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayCloseStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCloseStrategy.java index 4a0fae96a..05b1af978 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayCloseStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatCloseStrategy.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; import cn.bootx.platform.core.exception.ValidationFailedException; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; @@ -29,7 +29,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @Scope(SCOPE_PROTOTYPE) @Service @RequiredArgsConstructor -public class WechatPayCloseStrategy extends AbsPayCloseStrategy { +public class WechatCloseStrategy extends AbsPayCloseStrategy { private final WechatPayConfigService wechatPayConfigService; private final WechatPayCloseV2Service payCloseV2Service; @@ -52,7 +52,7 @@ public class WechatPayCloseStrategy extends AbsPayCloseStrategy { if (this.isUseCancel() && !order.getMethod().equals(PayMethodEnum.BARCODE.getCode())){ throw new ValidationFailedException("该订单不支持撤销操作"); } - this.config = wechatPayConfigService.getAndCheckConfig(); + this.config = wechatPayConfigService.getAndCheckConfig(false); } /** diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatPayStrategy.java similarity index 88% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatPayStrategy.java index 318a4be39..35b371491 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatPayStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatPayStrategy.java @@ -1,13 +1,13 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; import cn.bootx.platform.common.jackson.util.JacksonUtil; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.param.pay.WechatPayParam; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.service.pay.WechatPayService; -import org.dromara.daxpay.channel.wechat.service.pay.WechatPayV2Service; -import org.dromara.daxpay.channel.wechat.service.pay.WechatPayV3Service; +import org.dromara.daxpay.channel.wechat.service.pay.merchant.WechatPayService; +import org.dromara.daxpay.channel.wechat.service.pay.merchant.WechatPayV2Service; +import org.dromara.daxpay.channel.wechat.service.pay.merchant.WechatPayV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.trade.PayResultBo; import org.dromara.daxpay.service.strategy.AbsPayStrategy; @@ -59,7 +59,7 @@ public class WechatPayStrategy extends AbsPayStrategy { } else { this.wechatPayParam = new WechatPayParam(); } - this.wechatPayConfig = aliPayConfigService.getAndCheckConfig(); + this.wechatPayConfig = aliPayConfigService.getAndCheckConfig(false); wechatPayService.validation(this.getPayParam(), this.wechatPayParam, wechatPayConfig); } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatReconcileStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatReconcileStrategy.java similarity index 91% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatReconcileStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatReconcileStrategy.java index 5bd9e2315..b4a131d40 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatReconcileStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatReconcileStrategy.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.dromara.daxpay.channel.wechat.service.reconcile.WechatPayReconcileService; +import org.dromara.daxpay.channel.wechat.service.reconcile.WechatReconcileService; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.reconcile.ReconcileResolveResultBo; import org.dromara.daxpay.service.enums.ReconcileFileTypeEnum; @@ -27,7 +27,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @RequiredArgsConstructor public class WechatReconcileStrategy extends AbsReconcileStrategy { - private final WechatPayReconcileService reconcileService; + private final WechatReconcileService reconcileService; /** * 策略标识 @@ -45,7 +45,7 @@ public class WechatReconcileStrategy extends AbsReconcileStrategy { @SneakyThrows @Override public ReconcileResolveResultBo uploadAndResolve(MultipartFile file, ReconcileFileTypeEnum fileType) { -// WechatPayConfig wechatPayConfig = wechatPayConfigService.getWechatPayConfig(); +// WechatPayConfig wechatPayConfig = wechatPayConfigService.getAndCheckConfig(); // return reconcileService.uploadBill(file.getBytes(),wechatPayConfig); return null; } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatRefundStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatRefundStrategy.java similarity index 90% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatRefundStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatRefundStrategy.java index e1c6f2656..9c8811d9b 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatRefundStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatRefundStrategy.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; @@ -26,7 +26,7 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @RequiredArgsConstructor public class WechatRefundStrategy extends AbsRefundStrategy { - private final WechatPayConfigService wechatPayConfigService; + private final WechatPayConfigService weChatPayConfigService; private final WechatRefundV2Service wechatRefundV2Service; @@ -49,7 +49,7 @@ public class WechatRefundStrategy extends AbsRefundStrategy { */ @Override public void doBeforeRefundHandler() { - this.config = wechatPayConfigService.getAndCheckConfig(); + this.config = weChatPayConfigService.getAndCheckConfig(false); } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatSyncPayStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncPayStrategy.java similarity index 78% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatSyncPayStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncPayStrategy.java index 94cf170c1..79524b1b1 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatSyncPayStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncPayStrategy.java @@ -1,14 +1,13 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; +import lombok.RequiredArgsConstructor; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; -import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.service.sync.pay.WeChatPaySyncV2Service; -import org.dromara.daxpay.channel.wechat.service.sync.pay.WeChatPaySyncV3Service; +import org.dromara.daxpay.channel.wechat.service.sync.pay.WechatPaySyncV2Service; +import org.dromara.daxpay.channel.wechat.service.sync.pay.WechatPaySyncV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.sync.PaySyncResultBo; import org.dromara.daxpay.service.strategy.AbsSyncPayOrderStrategy; -import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -26,13 +25,12 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @RequiredArgsConstructor public class WechatSyncPayStrategy extends AbsSyncPayOrderStrategy { - private final WeChatPaySyncV3Service weChatPaySyncV3Service; + private final WechatPaySyncV3Service weChatPaySyncV3Service; + + private final WechatPaySyncV2Service weChatPaySyncV2Service; - private final WeChatPaySyncV2Service weChatPaySyncV2Service; private final WechatPayConfigService wechatPayConfigService; - private WechatPayConfig config; - /** * 策略标识, 可以自行进行扩展 @@ -52,7 +50,7 @@ public class WechatSyncPayStrategy extends AbsSyncPayOrderStrategy { */ @Override public PaySyncResultBo doSync() { - var wechatPayConfig = wechatPayConfigService.getAndCheckConfig(); + var wechatPayConfig = wechatPayConfigService.getAndCheckConfig(false); if (Objects.equals(wechatPayConfig.getApiVersion(), WechatPayCode.API_V2)){ return weChatPaySyncV2Service.sync(getOrder(), wechatPayConfig); } else { diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatSyncRefundStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncRefundStrategy.java similarity index 96% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatSyncRefundStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncRefundStrategy.java index f0dd406b6..1ffb7d83c 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatSyncRefundStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncRefundStrategy.java @@ -1,5 +1,6 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; +import lombok.RequiredArgsConstructor; import org.dromara.daxpay.channel.wechat.code.WechatPayCode; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.service.sync.refund.WechatRefundSyncV2Service; @@ -7,7 +8,6 @@ import org.dromara.daxpay.channel.wechat.service.sync.refund.WechatRefundSyncV3S import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.sync.RefundSyncResultBo; import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy; -import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -47,7 +47,7 @@ public class WechatSyncRefundStrategy extends AbsSyncRefundOrderStrategy { */ @Override public RefundSyncResultBo doSync() { - var wechatPayConfig = wechatPayConfigService.getAndCheckConfig(); + var wechatPayConfig = wechatPayConfigService.getAndCheckConfig(false); if (Objects.equals(wechatPayConfig.getApiVersion(), WechatPayCode.API_V2)){ return wechatRefundSyncV2Service.sync(this.getRefundOrder(), wechatPayConfig); } else { diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatSyncTransferStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncTransferStrategy.java similarity index 95% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatSyncTransferStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncTransferStrategy.java index 9be3f5bb9..9a29e613b 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatSyncTransferStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatSyncTransferStrategy.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; +import lombok.RequiredArgsConstructor; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; import org.dromara.daxpay.channel.wechat.service.sync.transfer.WechatTransferSyncV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.service.bo.sync.TransferSyncResultBo; import org.dromara.daxpay.service.strategy.AbsSyncTransferOrderStrategy; -import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -41,7 +41,7 @@ public class WechatSyncTransferStrategy extends AbsSyncTransferOrderStrategy { */ @Override public TransferSyncResultBo doSync() { - var wechatPayConfig = wechatPayConfigService.getAndCheckConfig(); + var wechatPayConfig = wechatPayConfigService.getAndCheckConfig(false); return wechatTransferSyncV3Service.sync(this.getTransferOrder(), wechatPayConfig); } diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatTransferStrategy.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatTransferStrategy.java similarity index 95% rename from daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatTransferStrategy.java rename to daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatTransferStrategy.java index 9fa472b9c..5a23761f2 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/WechatTransferStrategy.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/strategy/merchant/WechatTransferStrategy.java @@ -1,18 +1,18 @@ -package org.dromara.daxpay.channel.wechat.strategy; +package org.dromara.daxpay.channel.wechat.strategy.merchant; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.BigDecimalUtil; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.channel.wechat.entity.config.WechatPayConfig; import org.dromara.daxpay.channel.wechat.service.config.WechatPayConfigService; -import org.dromara.daxpay.channel.wechat.service.transfer.WechatPayTransferV3Service; +import org.dromara.daxpay.channel.wechat.service.transfer.WechatTransferV3Service; import org.dromara.daxpay.core.enums.ChannelEnum; import org.dromara.daxpay.core.enums.TransferPayeeTypeEnum; import org.dromara.daxpay.core.param.trade.transfer.TransferParam; import org.dromara.daxpay.service.bo.trade.TransferResultBo; import org.dromara.daxpay.service.strategy.AbsTransferStrategy; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; @@ -34,7 +34,7 @@ public class WechatTransferStrategy extends AbsTransferStrategy { private final WechatPayConfigService wechatPayConfigService; - private final WechatPayTransferV3Service transferV3Service; + private final WechatTransferV3Service transferV3Service; private WechatPayConfig weChatPayConfig; @@ -75,7 +75,7 @@ public class WechatTransferStrategy extends AbsTransferStrategy { */ @Override public void doBeforeHandler() { - this.weChatPayConfig = wechatPayConfigService.getAndCheckConfig(); + this.weChatPayConfig = wechatPayConfigService.getAndCheckConfig(true); } /** From 842cf71a93e4a4a1de85716d866efa1bb88cd162 Mon Sep 17 00:00:00 2001 From: DaxPay Date: Tue, 24 Dec 2024 20:15:33 +0800 Subject: [PATCH 47/54] =?UTF-8?q?feat=20=E5=AF=B9=E5=90=84=E7=A7=8D?= =?UTF-8?q?=E4=BA=A4=E6=98=93=E5=A2=9E=E5=8A=A0=E6=96=B0=E7=9A=84=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=A4=B1=E8=B4=A5=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= =?UTF-8?q?,=20=E9=98=B2=E6=AD=A2=E5=90=8C=E6=AD=A5=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E5=90=8E=E6=97=A0=E9=99=90=E8=BF=9B=E8=A1=8C=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 8 +-- .../service/trade/pay/PaySyncService.java | 39 +++++++++----- .../trade/refund/RefundAssistService.java | 13 +++-- .../service/trade/refund/RefundService.java | 4 +- .../trade/refund/RefundSyncService.java | 51 +++++++++--------- .../trade/transfer/TransferAssistService.java | 10 ++++ .../trade/transfer/TransferService.java | 6 +-- .../trade/transfer/TransferSyncService.java | 52 ++++++++++--------- 8 files changed, 105 insertions(+), 78 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index 629fb540c..075d995f2 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -4,14 +4,14 @@ - [ ] 同步回调页 - [ ] 收银台功能优化 - [ ] 支持配置背景色和图标 -- [ ] 对各种交易增加新的同步失败异常处理, 防止同步失败后无限进行同步 +- [x] 对各种交易增加新的同步失败异常处理, 防止同步失败后无限进行同步 - [ ] 增加首页驾驶舱功能 - [ ] 商户应用要有类似删除的功能, 实现停用冻结, 但不影响数据的关联 - [ ] 同步接口优化, 返回同步完的数据 -- [ ] 服务商支付支持 +- [x] 服务商支付支持 - [x] 支付宝 - - [ ] 微信 -- [ ] 微信增加公钥证书方式 + - [x] 微信 +- [x] 微信增加公钥证书方式 - [ ] 分账重试 ## 3.0.0.bate3: 分账 - [x] SDK接口 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PaySyncService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PaySyncService.java index 33827a861..dba18b357 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PaySyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/pay/PaySyncService.java @@ -83,12 +83,6 @@ public class PaySyncService { try { // 执行操作, 获取支付网关同步的结果 PaySyncResultBo syncResult = syncPayStrategy.doSync(); - // 判断是否同步成功 - if (!syncResult.isSyncSuccess()){ - // 同步失败, 返回失败响应, 同时记录失败的日志 - this.saveRecord(payOrder, syncResult, false); - throw new OperationFailException(syncResult.getSyncErrorMsg()); - } // 支付订单的网关订单号是否一致, 不一致进行更新 if (!Objects.equals(syncResult.getOutOrderNo(), payOrder.getOutOrderNo())){ payOrder.setOutOrderNo(syncResult.getOutOrderNo()); @@ -101,14 +95,17 @@ public class PaySyncService { if (!statusSync){ this.adjustHandler(syncResult, payOrder); } - } catch (PayFailureException e) { + } catch (Exception e) { // 同步失败, 返回失败响应, 同时记录失败的日志 - syncResult.setSyncSuccess(false); - this.saveRecord(payOrder, syncResult, false); - throw e; + syncResult.setSyncSuccess(false).setSyncErrorMsg(e.getMessage()); + } + if (syncResult.isSyncSuccess()){ + // 同步成功记录日志 + this.saveRecord(payOrder, syncResult, !statusSync); + } else { + // 同步失败记录日志 + this.saveRecord(payOrder, syncResult, true); } - // 同步成功记录日志 - this.saveRecord(payOrder, syncResult, !statusSync); return new PaySyncResult() .setOrderStatus(payOrder.getStatus()) .setAdjust(statusSync); @@ -125,7 +122,10 @@ public class PaySyncService { private boolean checkAndAdjust(PaySyncResultBo payRemoteSyncResult, PayOrder order){ var payStatus = payRemoteSyncResult.getPayStatus(); String orderStatus = order.getStatus(); - + // 如果本地订单为失败时, 直接返回需要进行调整 + if (orderStatus.equals(FAIL.getCode())){ + return false; + } // 本地订单为支付中时, 对状态进行比较, if (orderStatus.equals(PROGRESS.getCode())){ // 如果返回订单也是支付中 @@ -157,6 +157,8 @@ public class PaySyncService { case CLOSE, CANCEL -> this.closeLocal(payOrder); // 超时关闭和交易不存在(特殊) 关闭本地支付订单, 同时调用网关进行关闭, 确保后续这个订单不能被支付 case TIMEOUT -> this.closeRemote(payOrder); + // 同步失败处理 + case FAIL -> this.failLocal(payOrder,payRemoteSyncResult); default -> throw new SystemUnknownErrorException("代码有问题"); } } @@ -187,6 +189,17 @@ public class PaySyncService { payOrderManager.updateById(order); merchantNoticeService.registerPayNotice(order); } + + /** + * 同步失败 + * 同步失败后, 讲订单设置为失败状态, 预防无限重试, 失败不会触发消息通知 + */ + private void failLocal(PayOrder order, PaySyncResultBo syncResult) { + // 执行策略的关闭方法 + order.setStatus(FAIL.getCode()).setErrorMsg(syncResult.getSyncErrorMsg()); + payOrderManager.updateById(order); + } + /** * 关闭网关交易, 同时也会关闭本地支付 * 回调: 执行所有的支付通道关闭支付逻辑 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundAssistService.java index 95efb06a5..aeacade5b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundAssistService.java @@ -3,6 +3,9 @@ package org.dromara.daxpay.service.service.trade.refund; import cn.bootx.platform.core.exception.DataNotExistException; import cn.bootx.platform.core.exception.ValidationFailedException; import cn.bootx.platform.core.util.BigDecimalUtil; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.PayRefundStatusEnum; import org.dromara.daxpay.core.enums.PayStatusEnum; import org.dromara.daxpay.core.enums.RefundStatusEnum; @@ -17,11 +20,7 @@ import org.dromara.daxpay.service.entity.order.pay.PayOrder; import org.dromara.daxpay.service.entity.order.refund.RefundOrder; import org.dromara.daxpay.service.service.notice.MerchantNoticeService; import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; @@ -116,9 +115,9 @@ public class RefundAssistService { /** * 更新退款错误信息 */ - @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) - public void updateOrderByError(RefundOrder refundOrder, Exception e){ - refundOrder.setErrorMsg(e.getMessage()); + @Transactional(rollbackFor = Exception.class) + public void updateOrderByError(RefundOrder refundOrder, String message){ + refundOrder.setErrorMsg(message); refundOrder.setStatus(RefundStatusEnum.FAIL.getCode()); refundOrderManager.updateById(refundOrder); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundService.java index f8fff02e7..5baa8b91e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundService.java @@ -111,7 +111,7 @@ public class RefundService { } catch (Exception e) { log.error("退款出现错误", e); // 更新退款失败的记录 - refundAssistService.updateOrderByError(refundOrder, e); + refundAssistService.updateOrderByError(refundOrder, e.getMessage()); return refundAssistService.buildResult(refundOrder); } SpringUtil.getBean(this.getClass()).successHandler(refundOrder, payOrder, refundResultBo); @@ -163,7 +163,7 @@ public class RefundService { } catch (Exception e) { log.error("重新退款失败:", e); // 记录退款失败的记录 - refundAssistService.updateOrderByError(refundOrder, e); + refundAssistService.updateOrderByError(refundOrder, e.getMessage()); // 返回错误响应对象 return refundAssistService.buildResult(refundOrder); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundSyncService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundSyncService.java index b76d63f4f..4f7e05841 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundSyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/refund/RefundSyncService.java @@ -1,10 +1,12 @@ package org.dromara.daxpay.service.service.trade.refund; import cn.bootx.platform.core.exception.RepetitiveOperationException; +import com.baomidou.lock.LockInfo; +import com.baomidou.lock.LockTemplate; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.RefundStatusEnum; import org.dromara.daxpay.core.enums.TradeTypeEnum; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.core.exception.PayFailureException; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.param.trade.refund.RefundSyncParam; import org.dromara.daxpay.core.result.trade.refund.RefundSyncResult; @@ -17,16 +19,14 @@ import org.dromara.daxpay.service.service.order.refund.RefundOrderQueryService; import org.dromara.daxpay.service.service.record.sync.TradeSyncRecordService; import org.dromara.daxpay.service.strategy.AbsSyncRefundOrderStrategy; import org.dromara.daxpay.service.util.PaymentStrategyFactory; -import com.baomidou.lock.LockInfo; -import com.baomidou.lock.LockTemplate; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.Objects; +import static org.dromara.daxpay.core.enums.TradeStatusEnum.FAIL; + /** * 支付退款同步服务类 * @author xxm @@ -75,35 +75,33 @@ public class RefundSyncService { try { // 执行操作, 获取支付网关同步的结果 - RefundSyncResultBo syncResultBo = syncPayStrategy.doSync(); + RefundSyncResultBo syncResult = syncPayStrategy.doSync(); - // 判断是否同步成功 - if (!syncResultBo.isSyncSuccess()) { - // 同步失败, 返回失败响应, 同时记录失败的日志 - this.saveRecord(refundOrder, syncResultBo, false); - throw new OperationFailException(syncResultBo.getSyncErrorMsg()); - } // 订单的通道交易号是否一致, 不一致进行更新 - if (Objects.nonNull(syncResultBo.getOutRefundNo()) && !Objects.equals(syncResultBo.getOutRefundNo(), refundOrder.getOutRefundNo())){ - refundOrder.setOutRefundNo(syncResultBo.getOutRefundNo()); + if (Objects.nonNull(syncResult.getOutRefundNo()) && !Objects.equals(syncResult.getOutRefundNo(), refundOrder.getOutRefundNo())){ + refundOrder.setOutRefundNo(syncResult.getOutRefundNo()); refundOrderManager.updateById(refundOrder); } // 判断网关状态是否和支付单一致 - boolean statusSync = this.checkStatus(syncResultBo, refundOrder); + boolean statusSync = this.checkStatus(syncResult, refundOrder); try { // 状态不一致,执行退款单调整逻辑 if (!statusSync) { // 如果没有支付来源, 设置支付来源为同步 - this.adjustHandler(syncResultBo, refundOrder); + this.adjustHandler(syncResult, refundOrder); } - } catch (PayFailureException e) { + } catch (Exception e) { // 同步失败, 返回失败响应, 同时记录失败的日志 - syncResultBo.setSyncSuccess(false); - this.saveRecord(refundOrder, syncResultBo, false); - throw e; + syncResult.setSyncSuccess(false).setSyncErrorMsg(e.getMessage()); + } + // 判断是否同步成功 + if (!syncResult.isSyncSuccess()) { + // 同步成功记录日志 + this.saveRecord(refundOrder, syncResult, !statusSync); + } else { + // 同步失败, 返回失败响应, 同时记录失败的日志 + this.saveRecord(refundOrder, syncResult, true); } - // 同步成功记录日志 - this.saveRecord(refundOrder, syncResultBo, !statusSync); return new RefundSyncResult() .setOrderStatus(refundOrder.getStatus()) .setAdjust(statusSync); @@ -120,6 +118,10 @@ public class RefundSyncService { private boolean checkStatus(RefundSyncResultBo syncResult, RefundOrder order){ var syncStatus = syncResult.getRefundStatus(); String orderStatus = order.getStatus(); + // 如果本地订单为失败时, 直接返回需要进行调整 + if (orderStatus.equals(FAIL.getCode())){ + return false; + } // 如果订单为退款中, 对状态进行比较 if (Objects.equals(orderStatus, RefundStatusEnum.SUCCESS.getCode())){ @@ -148,7 +150,8 @@ public class RefundSyncService { switch (refundStatus) { case SUCCESS -> refundAssistService.success(order, syncResult.getFinishTime()); case PROGRESS -> {} - case FAIL, CLOSE-> refundAssistService.close(order); + case CLOSE-> refundAssistService.close(order); + case FAIL -> refundAssistService.updateOrderByError(order, syncResult.getSyncErrorMsg()); default -> log.error("退款同步结果未知, 退款单号:{}, 错误信息:{}", order.getRefundNo(), syncResult.getSyncErrorMsg()); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferAssistService.java index ab5aef76e..abe46923d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferAssistService.java @@ -52,6 +52,16 @@ public class TransferAssistService { return transferOrder; } + /** + * 更新转账错误信息 + */ + @Transactional(rollbackFor = Exception.class) + public void updateOrderByError(TransferOrder transferOrder, String message){ + transferOrder.setErrorMsg(message); + transferOrder.setStatus(TransferStatusEnum.FAIL.getCode()); + transferOrderManager.updateById(transferOrder); + } + /** * 转账关闭 */ diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferService.java index 2a2c35d15..534e37f08 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferService.java @@ -89,8 +89,7 @@ public class TransferService { } catch (Exception e) { log.error("转账出现错误", e); // 更新转账失败的记录 - order.setStatus(TransferStatusEnum.FAIL.getCode()).setErrorMsg(e.getMessage()); - transferOrderManager.updateById(order); + transferAssistService.updateOrderByError(order,e.getMessage()); return transferAssistService.buildResult(order); } SpringUtil.getBean(this.getClass()).successHandler(order, transferResultBo); @@ -119,8 +118,7 @@ public class TransferService { } catch (Exception e) { log.error("重现转账出现错误", e); // 更新转账失败的记录 - order.setStatus(TransferStatusEnum.FAIL.getCode()).setErrorMsg(e.getMessage()); - transferOrderManager.updateById(order); + transferAssistService.updateOrderByError(order,e.getMessage()); return transferAssistService.buildResult(order); } SpringUtil.getBean(this.getClass()).successHandler(order, transferResultBo); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferSyncService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferSyncService.java index 9da3cf530..10ebaf57b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferSyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/trade/transfer/TransferSyncService.java @@ -2,10 +2,14 @@ package org.dromara.daxpay.service.service.trade.transfer; import cn.bootx.platform.core.exception.BizException; import cn.bootx.platform.core.exception.RepetitiveOperationException; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.baomidou.lock.LockInfo; +import com.baomidou.lock.LockTemplate; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.TradeTypeEnum; import org.dromara.daxpay.core.enums.TransferStatusEnum; -import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.core.exception.PayFailureException; import org.dromara.daxpay.core.exception.TradeNotExistException; import org.dromara.daxpay.core.param.trade.transfer.TransferSyncParam; import org.dromara.daxpay.core.result.trade.transfer.TransferSyncResult; @@ -20,17 +24,13 @@ import org.dromara.daxpay.service.service.record.flow.TradeFlowRecordService; import org.dromara.daxpay.service.service.record.sync.TradeSyncRecordService; import org.dromara.daxpay.service.strategy.AbsSyncTransferOrderStrategy; import org.dromara.daxpay.service.util.PaymentStrategyFactory; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.baomidou.lock.LockInfo; -import com.baomidou.lock.LockTemplate; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Objects; +import static org.dromara.daxpay.core.enums.TradeStatusEnum.FAIL; + /** * 转账同步接口 * @author xxm @@ -54,7 +54,7 @@ public class TransferSyncService { */ public TransferSyncResult sync(TransferSyncParam param) { TransferOrder transferOrder = transferOrderService.findByBizOrTransferNo(param.getTransferNo(), param.getBizTransferNo(),param.getAppId()) - .orElseThrow(() -> new TradeNotExistException("退款订单不存在")); + .orElseThrow(() -> new TradeNotExistException("转账订单不存在")); // 执行订单同步逻辑 return this.syncTransferOrder(transferOrder); } @@ -76,12 +76,6 @@ public class TransferSyncService { try { // 执行操作, 获取支付网关同步的结果 var syncResult = syncPayStrategy.doSync(); - // 判断是否同步成功 - if (!syncResult.isSyncSuccess()){ - // 同步失败, 返回失败响应, 同时记录失败的日志 - this.saveRecord(transferOrder, syncResult, false); - throw new OperationFailException(syncResult.getSyncErrorMsg()); - } // 转账订单的网关订单号是否一致, 不一致进行更新 if (!Objects.equals(syncResult.getOutTransferNo(), transferOrder.getOutTransferNo())){ transferOrder.setOutTransferNo(syncResult.getOutTransferNo()); @@ -94,14 +88,20 @@ public class TransferSyncService { if (!statusSync){ this.adjustHandler(syncResult, transferOrder); } - } catch (PayFailureException e) { + } catch (Exception e) { // 同步失败, 返回失败响应, 同时记录失败的日志 syncResult.setSyncSuccess(false); this.saveRecord(transferOrder, syncResult, false); throw e; } - // 同步成功记录日志 - this.saveRecord(transferOrder, syncResult, statusSync); + // 判断是否同步成功 + if (syncResult.isSyncSuccess()){ + // 同步成功 + this.saveRecord(transferOrder, syncResult, statusSync); + } else { + // 同步失败, 返回失败响应, 同时记录失败的日志 + this.saveRecord(transferOrder, syncResult, true); + } return new TransferSyncResult() .setOrderStatus(transferOrder.getStatus()) .setAdjust(statusSync); @@ -113,13 +113,16 @@ public class TransferSyncService { /** * 检查状态是否一致 - * @see TransferStatusEnum 退款单状态 + * @see TransferStatusEnum 转账单状态 */ private boolean checkStatus(TransferSyncResultBo syncResult, TransferOrder order){ var syncStatus = syncResult.getTransferStatus(); String orderStatus = order.getStatus(); - - // 如果订单为退款中, 对状态进行比较 + // 如果本地订单为失败时, 直接返回需要进行调整 + if (orderStatus.equals(FAIL.getCode())){ + return false; + } + // 如果订单为转账中, 对状态进行比较 if (Objects.equals(orderStatus, TransferStatusEnum.SUCCESS.getCode())){ // 转账完成 if (Objects.equals(syncStatus, TransferStatusEnum.SUCCESS)) { @@ -138,7 +141,7 @@ public class TransferSyncService { } /** - * 进行退款订单和支付订单的调整 + * 进行转账订单和支付订单的调整 */ private void adjustHandler(TransferSyncResultBo syncResult, TransferOrder order){ var syncStatusEnum = syncResult.getTransferStatus(); @@ -146,14 +149,15 @@ public class TransferSyncService { switch (syncStatusEnum) { case SUCCESS -> SpringUtil.getBean(this.getClass()).success(order, syncResult); case PROGRESS -> {} - case FAIL,CLOSE -> transferAssistService.close(order,syncResult.getFinishTime()); + case CLOSE -> transferAssistService.close(order,syncResult.getFinishTime()); + case FAIL -> transferAssistService.updateOrderByError(order,syncResult.getSyncErrorMsg()); default -> throw new BizException("代码有问题"); } } /** - * 退款成功, 更新退款单和支付单 + * 转账成功, 更新转账单和支付单 */ @Transactional(rollbackFor = Exception.class) public void success(TransferOrder order, TransferSyncResultBo syncResult) { From db5720e2a90abd6b2c1524c5bbbcf206a1646f1d Mon Sep 17 00:00:00 2001 From: DaxPay Date: Thu, 26 Dec 2024 09:59:51 +0800 Subject: [PATCH 48/54] =?UTF-8?q?feat=20=E5=95=86=E6=88=B7=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E5=A2=9E=E5=8A=A0=E5=81=9C=E7=94=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 2 +- .../service/entity/merchant/MchApp.java | 8 ++++++++ .../service/param/merchant/MchAppParam.java | 19 ++++++++++++++----- .../service/assist/PaymentAssistService.java | 5 +++++ .../service/merchant/MchAppService.java | 4 +--- 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/_doc/Task.md b/_doc/Task.md index 075d995f2..eeebaa6cd 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -6,7 +6,7 @@ - [ ] 支持配置背景色和图标 - [x] 对各种交易增加新的同步失败异常处理, 防止同步失败后无限进行同步 - [ ] 增加首页驾驶舱功能 -- [ ] 商户应用要有类似删除的功能, 实现停用冻结, 但不影响数据的关联 +- [x] 商户应用增加停用功能, 实现停用冻结, 但不影响数据的关联 - [ ] 同步接口优化, 返回同步完的数据 - [x] 服务商支付支持 - [x] 支付宝 diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/merchant/MchApp.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/merchant/MchApp.java index 3f19ca45a..d1da09baf 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/merchant/MchApp.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/merchant/MchApp.java @@ -6,6 +6,7 @@ import org.dromara.daxpay.core.enums.SignTypeEnum; import org.dromara.daxpay.core.enums.MerchantNotifyTypeEnum; import org.dromara.daxpay.service.convert.merchant.MchAppConvert; import org.dromara.daxpay.service.enums.MchAppStatusEnum; +import org.dromara.daxpay.service.param.merchant.MchAppParam; import org.dromara.daxpay.service.result.merchant.MchAppResult; import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; @@ -72,6 +73,13 @@ public class MchApp extends MpBaseEntity implements ToResult { @TableField(updateStrategy = FieldStrategy.ALWAYS) private String notifyUrl; + /** + * 初始化 + */ + public static MchApp init(MchAppParam param){ + return MchAppConvert.CONVERT.toEntity(param); + } + @Override public MchAppResult toResult() { return MchAppConvert.CONVERT.toResult(this); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/merchant/MchAppParam.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/merchant/MchAppParam.java index 3c145de9d..165668965 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/merchant/MchAppParam.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/merchant/MchAppParam.java @@ -8,6 +8,7 @@ import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.experimental.Accessors; +import org.dromara.daxpay.service.enums.MchAppStatusEnum; import java.math.BigDecimal; @@ -28,7 +29,7 @@ public class MchAppParam { /** 应用名称 */ @Schema(description = "应用名称") - @NotNull(message = "应用名称不可为空", groups = ValidationGroup.add.class) + @NotNull(message = "应用名称不可为空") private String appName; /** @@ -36,13 +37,21 @@ public class MchAppParam { * @see SignTypeEnum */ @Schema(description = "签名方式") - @NotNull(message = "签名方式不可为空", groups = ValidationGroup.add.class) + @NotNull(message = "签名方式不可为空") private String signType; + /** + * 应用状态 + * @see MchAppStatusEnum + */ + @Schema(description = "应用状态") + @NotNull(message = "应用状态不可为空") + private String status; + /** 签名秘钥 */ @Schema(description = "签名秘钥") - @NotNull(message = "签名秘钥不可为空", groups = ValidationGroup.add.class) + @NotNull(message = "签名秘钥不可为空") private String signSecret; /** 是否对请求进行验签 */ @@ -51,12 +60,12 @@ public class MchAppParam { /** 支付限额 */ @Schema(description = "支付限额") - @NotNull(message = "支付限额不可为空", groups = ValidationGroup.add.class) + @NotNull(message = "支付限额不可为空") private BigDecimal limitAmount; /** 订单默认超时时间(分钟) */ @Schema(description = "订单默认超时时间(分钟)") - @NotNull(message = "订单默认超时时间(分钟)不可为空", groups = ValidationGroup.add.class) + @NotNull(message = "订单默认超时时间(分钟)不可为空") @Min(value = 5, message = "订单默认超时时间(分钟)不可小于5分钟") private Integer orderTimeout; diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/assist/PaymentAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/assist/PaymentAssistService.java index d1cd9ae79..86ab4d5f0 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/assist/PaymentAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/assist/PaymentAssistService.java @@ -7,6 +7,7 @@ import cn.hutool.core.date.LocalDateTimeUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.enums.SignTypeEnum; +import org.dromara.daxpay.core.exception.ConfigNotEnableException; import org.dromara.daxpay.core.exception.VerifySignFailedException; import org.dromara.daxpay.core.param.PaymentCommonParam; import org.dromara.daxpay.core.result.DaxResult; @@ -16,6 +17,7 @@ import org.dromara.daxpay.service.common.context.ClientLocal; import org.dromara.daxpay.service.common.context.MchAppLocal; import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.entity.merchant.MchApp; +import org.dromara.daxpay.service.enums.MchAppStatusEnum; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -131,6 +133,9 @@ public class PaymentAssistService { public void initMchApp(String appId) { // 获取应用信息 MchApp mchApp = mchAppCacheService.get(appId); + if (!Objects.equals(mchApp.getStatus(), MchAppStatusEnum.ENABLE.getCode())){ + throw new ConfigNotEnableException("商户应用未启用"); + } // 初始化支付上下文信息 MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); BeanUtil.copyProperties(mchApp, mchAppInfo); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/merchant/MchAppService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/merchant/MchAppService.java index 98e7de8ab..f8129dc29 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/merchant/MchAppService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/merchant/MchAppService.java @@ -12,7 +12,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.daxpay.core.exception.ConfigNotExistException; import org.dromara.daxpay.core.exception.OperationFailException; -import org.dromara.daxpay.service.convert.merchant.MchAppConvert; import org.dromara.daxpay.service.dao.config.ChannelConfigManager; import org.dromara.daxpay.service.dao.merchant.MchAppManager; import org.dromara.daxpay.service.entity.config.ChannelConfig; @@ -44,7 +43,7 @@ public class MchAppService { * 添加应用 */ public void add(MchAppParam param) { - MchApp entity = MchAppConvert.CONVERT.toEntity(param); + MchApp entity = MchApp.init(param); // 生成应用号 entity.setAppId(this.generateAppId()) .setStatus(MchAppStatusEnum.ENABLE.getCode()); @@ -92,7 +91,6 @@ public class MchAppService { if (channelConfigManager.existedByField(ChannelConfig::getAppId, mchApp.getAppId())){ throw new OperationFailException("该商户应用已绑定支付配置,请先删除支付配置"); } - mchAppManager.deleteById(id); } From d7144450a5f92ee3752e410a089b1800ffcf240d Mon Sep 17 00:00:00 2001 From: DaxPay Date: Thu, 26 Dec 2024 17:28:31 +0800 Subject: [PATCH 49/54] =?UTF-8?q?doc=20=E6=9B=B4=E6=96=B0=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/ChangeLog.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index 3062003a7..66ee31f7d 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -1,6 +1,13 @@ # CHANGELOG ## [v3.0.0.beta4] 2025-01-10 - +- 新增: 微信服务商支付支持 +- 新增: 支付宝服务商支付支持 +- 新增: 微信支持公钥证书方式 +- 优化: 商户应用增加停用功能 +- 优化: 对各种交易增加新的同步失败异常处理, 防止同步失败后无限进行同步 +- fix: 微信支付同步V3接口金额空指针问题 +- fix: 订单支付成功重复更新问题 +- fix: 优化自动分账没有默认分账组时的处理 ## [v3.0.0.beta3] 2024-12-22 - 新增: 支持支付宝分账功能 - 新增: 支持微信分账功能 From d6b7f35bf4e8fd5cb19d2bd5c06c2c8b82dfdb13 Mon Sep 17 00:00:00 2001 From: bootx Date: Sat, 28 Dec 2024 20:35:24 +0800 Subject: [PATCH 50/54] =?UTF-8?q?fix:=20=E7=B1=BB=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{AliPayCallbackService.java => AlipayCallbackService.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/{AliPayCallbackService.java => AlipayCallbackService.java} (100%) diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/AliPayCallbackService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/AlipayCallbackService.java similarity index 100% rename from daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/AliPayCallbackService.java rename to daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/callback/AlipayCallbackService.java From d1238dd43cca6860f34025303120c6a04664f1b3 Mon Sep 17 00:00:00 2001 From: bootx Date: Sun, 29 Dec 2024 10:00:01 +0800 Subject: [PATCH 51/54] =?UTF-8?q?fix:=20=E5=AF=B9=E8=B4=A6=E5=8D=95?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=98=AF=E5=90=A6=E4=B8=80=E8=87=B4=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/reconcile/ReconcileDiscrepancyService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/reconcile/ReconcileDiscrepancyService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/reconcile/ReconcileDiscrepancyService.java index 357879655..3a24db3fe 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/reconcile/ReconcileDiscrepancyService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/reconcile/ReconcileDiscrepancyService.java @@ -117,16 +117,16 @@ public class ReconcileDiscrepancyService { // 判断类型是否相同 if (!Objects.equals(outDetail.getTradeType(), localTrade.getTradeType())){ - return false; + return true; } // 判断金额是否一致 if (!Objects.equals(outDetail.getAmount(), localTrade.getAmount())){ - return false; + return true; } // 判断状态是否一致 if (!Objects.equals(outDetail.getTradeStatus(), localTrade.getTradeStatus())){ - return false; + return true; } - return true; + return false; } } From 2b8d8b7ee0d6971b37dc5dd9f0b579121242ed00 Mon Sep 17 00:00:00 2001 From: bootx Date: Sun, 29 Dec 2024 10:28:19 +0800 Subject: [PATCH 52/54] =?UTF-8?q?fix:=20=E5=BE=AE=E4=BF=A1V2=E9=80=80?= =?UTF-8?q?=E6=AC=BE=E5=9B=9E=E8=B0=83=E9=80=80=E6=AC=BE=E5=8F=B7=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wechat/service/callback/WechatRefundCallbackService.java | 4 ++-- .../daxpay/service/entity/order/refund/RefundOrder.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java index 5461a2247..67c807799 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java @@ -128,9 +128,9 @@ public class WechatRefundCallbackService { // 回调数据 callbackInfo.setCallbackData(BeanUtil.beanToMap(result)); // 网关退款号 - callbackInfo.setOutTradeNo(result.getTransactionId()); + callbackInfo.setOutTradeNo(result.getRefundId()); // 退款号 - callbackInfo.setTradeNo(result.getRefundId()); + callbackInfo.setTradeNo(result.getOutRefundNo()); // 退款状态 - 成功 if (Objects.equals(RefundStatus.SUCCESS, result.getRefundStatus())){ callbackInfo.setTradeStatus(RefundStatusEnum.SUCCESS.getCode()); diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/order/refund/RefundOrder.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/order/refund/RefundOrder.java index b7d10f380..1d258d1c3 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/order/refund/RefundOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/entity/order/refund/RefundOrder.java @@ -39,7 +39,7 @@ public class RefundOrder extends MchAppBaseEntity implements ToResult Date: Sun, 29 Dec 2024 10:46:45 +0800 Subject: [PATCH 53/54] =?UTF-8?q?perf:=20=E5=9B=9E=E8=B0=83=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=8F=82=E6=95=B0=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/callback/WechatPayCallbackService.java | 8 ++++---- .../service/callback/WechatRefundCallbackService.java | 8 ++++---- .../callback/WechatTransferCallbackService.java | 10 +++------- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatPayCallbackService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatPayCallbackService.java index 71a9f128d..eafc494a6 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatPayCallbackService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatPayCallbackService.java @@ -84,7 +84,7 @@ public class WechatPayCallbackService { // 转换请求 WxPayOrderNotifyResult wxPayOrderNotifyResult = wxPayService.parseOrderNotifyResult(xml); // 解析数据 - this.resolveV2Data(wxPayOrderNotifyResult,isv); + this.resolveV2Data(wxPayOrderNotifyResult); return true; } catch (WxPayException e) { log.error("微信支付回调V2处理失败", e); @@ -105,7 +105,7 @@ public class WechatPayCallbackService { // 转换请求 WxPayNotifyV3Result wxPayNotifyV3Result = wxPayService.parseOrderNotifyV3Result(body, signatureHeader); // 解析数据 - this.resolvePayData(wxPayNotifyV3Result,isv); + this.resolvePayData(wxPayNotifyV3Result); } catch (WxPayException e) { callbackInfo.setCallbackStatus(CallbackStatusEnum.FAIL); log.error("微信支付回调V3处理失败", e); @@ -118,7 +118,7 @@ public class WechatPayCallbackService { /** * 解析数据 v2 */ - private void resolveV2Data(WxPayOrderNotifyResult result, boolean isv){ + private void resolveV2Data(WxPayOrderNotifyResult result){ CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); // 回调数据 Map map = result.toMap(); @@ -141,7 +141,7 @@ public class WechatPayCallbackService { /** * 解析数据 v3 */ - private void resolvePayData(WxPayNotifyV3Result v3Result, boolean isv){ + private void resolvePayData(WxPayNotifyV3Result v3Result){ CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); var result = v3Result.getResult(); // 回调数据 diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java index 67c807799..38860a989 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatRefundCallbackService.java @@ -86,7 +86,7 @@ public class WechatRefundCallbackService { // 转换请求 var result = wxPayService.parseRefundNotifyResult(xml); // 解析数据 - resolveV2Data(result,isv); + resolveV2Data(result); return true; } catch (WxPayException e) { callbackInfo.setCallbackStatus(CallbackStatusEnum.FAIL); @@ -107,7 +107,7 @@ public class WechatRefundCallbackService { // 转换请求 var result = wxPayService.parseRefundNotifyV3Result(body, signatureHeader); // 解析数据 - this.resolveV3Data(result,isv); + this.resolveV3Data(result); return true; } catch (WxPayException e) { callbackInfo.setCallbackStatus(CallbackStatusEnum.FAIL); @@ -120,7 +120,7 @@ public class WechatRefundCallbackService { /** * 解析数据 v2 */ - public void resolveV2Data(WxPayRefundNotifyResult notifyResult, boolean isv){ + public void resolveV2Data(WxPayRefundNotifyResult notifyResult){ CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); // 解密的数据 var result = notifyResult.getReqInfo(); @@ -155,7 +155,7 @@ public class WechatRefundCallbackService { /** * 解析数据 v3 */ - public void resolveV3Data(WxPayRefundNotifyV3Result v3Result, boolean isv){ + public void resolveV3Data(WxPayRefundNotifyV3Result v3Result){ CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); var result = v3Result.getResult(); // 回调数据 diff --git a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatTransferCallbackService.java b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatTransferCallbackService.java index afbba2e78..f55ba7cd6 100644 --- a/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatTransferCallbackService.java +++ b/daxpay-single-channel/daxpay-single-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/callback/WechatTransferCallbackService.java @@ -64,7 +64,7 @@ public class WechatTransferCallbackService { */ public boolean resolve(HttpServletRequest request, boolean isv) { CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); - callbackInfo.setChannel(ChannelEnum.WECHAT.getCode()) + callbackInfo.setChannel(isv? ChannelEnum.WECHAT_ISV.getCode():ChannelEnum.WECHAT.getCode()) .setCallbackType(TradeTypeEnum.TRANSFER); WechatPayConfig config = wechatPayConfigService.getAndCheckConfig(false); WxPayService wxPayService = wechatPayConfigService.wxJavaSdk(config); @@ -80,7 +80,7 @@ public class WechatTransferCallbackService { try { var notifyV3Result = wxPayService.baseParseOrderNotifyV3Result(body, signatureHeader, WxPayTransferBatchesNotifyV3Result.class, WxPayTransferBatchesNotifyV3Result.DecryptNotifyResult.class); // 解析数据 - this.resolveData(notifyV3Result,isv); + this.resolveData(notifyV3Result); } catch (WxPayException e) { callbackInfo.setCallbackStatus(CallbackStatusEnum.FAIL); log.error("微信转账回调V3处理失败", e); @@ -92,14 +92,10 @@ public class WechatTransferCallbackService { /** * 微信转账到零钱回调 */ - public void resolveData(WxPayTransferBatchesNotifyV3Result notifyV3Result, boolean isv) { + public void resolveData(WxPayTransferBatchesNotifyV3Result notifyV3Result) { CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); // 解析数据 var result = notifyV3Result.getResult(); - - // 设置类型和通道 - callbackInfo.setCallbackType(TradeTypeEnum.TRANSFER) - .setChannel(ChannelEnum.WECHAT.getCode()); // 回调数据 callbackInfo.setCallbackData(BeanUtil.beanToMap(result)); // 网关转账批次号 From fd2dfee3ba166a3cccd78e9f6da4f849a4200f5e Mon Sep 17 00:00:00 2001 From: DaxPay Date: Fri, 3 Jan 2025 13:41:59 +0800 Subject: [PATCH 54/54] =?UTF-8?q?fix=20=E6=94=AF=E4=BB=98=E5=AE=9DApp?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E4=BD=BF=E7=94=A8=E6=96=B9=E6=B3=95=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/ChangeLog.md | 2 +- _doc/Task.md | 77 +------------------ .../alipay/service/pay/AliPayService.java | 3 +- 3 files changed, 5 insertions(+), 77 deletions(-) diff --git a/_doc/ChangeLog.md b/_doc/ChangeLog.md index 66ee31f7d..d80853759 100644 --- a/_doc/ChangeLog.md +++ b/_doc/ChangeLog.md @@ -2,6 +2,7 @@ ## [v3.0.0.beta4] 2025-01-10 - 新增: 微信服务商支付支持 - 新增: 支付宝服务商支付支持 +- 新增: 系统首页驾驶舱数据展示页 - 新增: 微信支持公钥证书方式 - 优化: 商户应用增加停用功能 - 优化: 对各种交易增加新的同步失败异常处理, 防止同步失败后无限进行同步 @@ -32,7 +33,6 @@ - 新增: 增加收银台配置功能 - 新增: 交易调试页增加收银台调试选项 - 新增: SDK增加收银台相关接口/认证相关接口 -- 新增: 系统首页驾驶舱数据展示页 - 重构: 原支付收银台改为支付码牌, 一个应用支持多个码牌 - 重构: SDK命名空间更改为org.dromara.daxpay - 优化: 微信通道添加单独的认证跳转地址 diff --git a/_doc/Task.md b/_doc/Task.md index eeebaa6cd..9aca17f01 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -2,86 +2,13 @@ ## 3.0.0.bate4 功能优化和服务商支付 - [ ] 网关配套移动端开发 - [ ] 同步回调页 -- [ ] 收银台功能优化 - - [ ] 支持配置背景色和图标 - [x] 对各种交易增加新的同步失败异常处理, 防止同步失败后无限进行同步 - [ ] 增加首页驾驶舱功能 - [x] 商户应用增加停用功能, 实现停用冻结, 但不影响数据的关联 -- [ ] 同步接口优化, 返回同步完的数据 - [x] 服务商支付支持 - [x] 支付宝 - [x] 微信 - [x] 微信增加公钥证书方式 -- [ ] 分账重试 -## 3.0.0.bate3: 分账 -- [x] SDK接口 - - [x] 分账相关接口: 分账,完结,同步,查询 -- [x] 分账界面功能优化 - - [x] 分账接收方配置 - - [x] 分账单管理 -- [x] 分账接口开发 开启/完结/同步 - - [x] 支付宝 - - [x] 微信 -- [x] 分账扩展能力 - - [x] 自动分账 - - [x] 自动完结 - - [x] 自动同步状态 - - [x] 分账消息通知和回调 -- [x] 分账接收方和分账组优化, 后台管理时, 编号自动生成 -- [x] 支付订单新增待支付状态 -## 3.0.0.beta2 收银台 -- [x] 收银台功能 - - [x] 收银台配置 - - [x] 分类配置 - - [x] 明细配置 - - [x] 聚合支付配置 - - [x] 支持通过订单信息生成多种类型的收银台链接, - - [x] pc收银台 - - [x] 扫码支付 - - [x] 条码支付 - - [x] 跳转支付 - - [x] 聚合支付(生成扫码链接) - - [x] 聚合支付(条码支付) - - [x] H5收银台 - - [x] 跳转支付 - - [x] 升级为聚合支付 - - [x] 聚合收银台 - - [x] Jsapi调用 - - [x] 跳转支付 -- [x] 支付码牌功能改造 - - [x] 一个应用支持多码牌 - - [x] 码牌不再使用应用号作为标识, 使用独立的编码 - - [x] 码牌H5页面对接 -- [x] 分账配置/分账组/分账接收方合并为一个tabs页面 -- [x] 微信通道添加单独的认证跳转地址, 处理它的特殊情况 -## 3.0.0.beta1 收银台 -- [x] 收银台功能 - - [x] 收银台配置 - - [x] 分类配置 - - [x] 明细配置 - - [x] 聚合支付配置 - - [x] 支持通过订单信息生成多种类型的收银台链接, - - [x] pc收银台 - - [x] 扫码支付 - - [x] 条码支付 - - [x] 跳转支付 - - [x] 聚合支付(生成扫码链接) - - [x] 聚合支付(条码支付) - - [x] H5收银台 - - [x] 跳转支付 - - [x] 升级为聚合支付 - - [x] 聚合收银台 - - [x] Jsapi调用 - - [x] 跳转支付 -- [x] 支付码牌功能改造 - - [x] 一个应用支持多码牌 - - [x] 码牌不再使用应用号作为标识, 使用独立的编码 - - [x] 码牌H5页面对接 -- [ ] 分账配置/分账组/分账接收方合并为一个tabs页面 - -## bugs -- [x] 修复 BigDecimal 类型数据序列化和签名异常问题 -- [x] 获取是否订阅消息通知类型查询范围错误问题 - ## 任务池 -- [ ] 退款支持以撤销的方式进行退款 +- [ ] 分账重试 +- [ ] 同步接口优化, 返回同步完的数据 diff --git a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/pay/AliPayService.java b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/pay/AliPayService.java index 1ce4a6721..e6c124258 100644 --- a/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/pay/AliPayService.java +++ b/daxpay-single-channel/daxpay-single-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/pay/AliPayService.java @@ -141,6 +141,7 @@ public class AliPayService { */ @SneakyThrows public String appPay(String amount, PayOrder payOrder, AliPayConfig aliPayConfig) { + AlipayClient alipayClient = aliPayConfigService.getAlipayClient(aliPayConfig); AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setSubject(payOrder.getTitle()); model.setProductCode(AlipayCode.Products.QUICK_MSECURITY_PAY); @@ -163,7 +164,7 @@ public class AliPayService { request.setNotifyUrl(aliPayConfigService.getNotifyUrl(aliPayConfig.isIsv())); try { // 异步回调必须到当前系统中 - AlipayTradeAppPayResponse response = aliPayConfigService.execute(request,aliPayConfig); + AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); return response.getBody(); } catch (AlipayApiException e) {