From 4ea1e39e2fc4c3cb5861b473cbf154d3a1fbc0cd Mon Sep 17 00:00:00 2001 From: DaxPay Date: Mon, 2 Dec 2024 19:11:42 +0800 Subject: [PATCH] =?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 43c87cce..03442a3f 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 00000000..ed582112 --- /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 1ea44b15..729c8a30 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 94354f01..e2f03e69 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 f3c20567..00000000 --- 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 1663ae80..7ddc0be9 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 00000000..7ffea506 --- /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 00000000..ad54125a --- /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 d763f0e9..00000000 --- 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 cd9c70a4..5bd9e231 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 b9685c96..d31b9395 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 fa7ec045..045f504a 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 4afaade1..28142a59 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 9149b779..ed8883d8 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 ac47d761..7f84dafa 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 00000000..61f18ffd --- /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 2ba9daff..2484ef04 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 846944c5..288237b2 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 1004d574..6f7e4f66 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 e66bb2eb..00000000 --- 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 94baa09d..9fee9624 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 c5399cb7..ef8dc401 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 4b4a298e..9d34931e 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 77095376..af5f02e0 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 00000000..8a764029 --- /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 c0876997..00000000 --- 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 00000000..73b1ddf0 --- /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) { + } +}