diff --git a/_doc/Task.md b/_doc/Task.md index c78feb30c..4cc6e64a4 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -22,12 +22,12 @@ - [ ] 支付码牌配置 - [x] 一个应用支持多码牌 - [x] 码牌不再使用应用号座位标识, 使用独立的编码 + - [ ] 码牌H5页面对接 ## bugs - [x] 修复 BigDecimal 类型数据序列化和签名异常问题 - [x] 获取是否订阅消息通知类型查询范围错误问题 - ## 任务池 - [ ] 定时同步任务频次不要太高, 预防产生过多的数据 - [ ] 退款支持以撤销的方式进行退款 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 98baf7674..0ce087468 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 @@ -2,6 +2,7 @@ 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 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; @@ -109,6 +110,10 @@ public class WechatPayConfig implements ToResult { return config; } + public String getAuthUrl() { + return StrUtil.removeSuffix(authUrl, "/"); + } + @Override public WechatPayConfigResult toResult() { return WechatPayConfigConvert.CONVERT.toResult(this); 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 c3a58ae56..94354f014 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 @@ -31,7 +31,7 @@ public class WechatAuthService { private final WechatPayConfigService wechatPayConfigService; - private final PlatformConfigService platformsConfigService; + private final PlatformConfigService platformConfigService; /** * 构建微信oauth2授权的url连接 @@ -45,10 +45,10 @@ public class WechatAuthService { .buildAuthorizationUrl(param.getAuthRedirectUrl(), WxConsts.OAuth2Scope.SNSAPI_BASE, ""); return new AuthUrlResult().setAuthUrl(url); } else { - String serverUrl = platformsConfigService.getConfig().getGatewayMobileUrl(); // 如果配置中有地址配置则使用, 没有的话使用平台地址进行拼接 - if (StrUtil.isNotBlank(config.getAuthUrl())){ - PlatformConfig platformConfig = platformsConfigService.getConfig(); + String serverUrl = config.getAuthUrl(); + if (StrUtil.isBlank(serverUrl)){ + PlatformConfig platformConfig = platformConfigService.getConfig(); serverUrl = platformConfig.getGatewayMobileUrl(); } String queryCode = RandomUtil.randomString(10); 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 index ec39bf4f8..f3c205673 100644 --- 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 @@ -40,10 +40,16 @@ public class WechatPayCashierService { * 生成授权链接, 主要是微信类通道使用, 用于获取OpenId */ public String generateAuthUrl(CashierAuthUrlParam param) { - WxMpService wxMpService = this.getWxMpService(); - PlatformConfig platformConfig = platformConfigService.getConfig(); - String serverUrl = platformConfig.getGatewayMobileUrl(); - String redirectUrl = StrUtil.format("{}/wechat/cashier/{}", serverUrl, param.getAppId()); + 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, ""); } @@ -78,6 +84,12 @@ public class WechatPayCashierService { */ 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 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/CashierAuthUrlParam.java index c1b08f0fb..fa7ec0454 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/CashierAuthUrlParam.java @@ -15,7 +15,7 @@ import lombok.experimental.Accessors; public class CashierAuthUrlParam { @Schema(description = "应用号") - private String appId; + private String cashierCode; @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/CashierPayParam.java index 17714a0ca..4afaade1f 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/CashierPayParam.java @@ -16,8 +16,8 @@ import java.math.BigDecimal; @Schema(title = "通道收银支付参数") public class CashierPayParam { - @Schema(description = "应用号") - private String appId; + @Schema(description = "收银码牌Code") + private String cashierCode; @Schema(description = "支付金额") private BigDecimal amount; diff --git a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/cashier/CashierCodeResult.java b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/cashier/CashierCodeResult.java index 49d1bf45a..d87c7cd12 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/cashier/CashierCodeResult.java +++ b/daxpay-single/daxpay-single-core/src/main/java/org/dromara/daxpay/core/result/cashier/CashierCodeResult.java @@ -37,4 +37,13 @@ public class CashierCodeResult { */ @Schema(description = "支付方式") private String payMethod; + + /** 应用号 */ + @Schema(description = "应用号") + private String appId; + + /** 是否分账 */ + @Schema(description = "是否分账") + private boolean allocation; + } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/cashier/CashierCodeController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/cashier/CashierCodeController.java deleted file mode 100644 index 25abefec0..000000000 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/cashier/CashierCodeController.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.dromara.daxpay.service.controller.cashier; - -import cn.bootx.platform.core.annotation.IgnoreAuth; -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 jakarta.validation.constraints.NotBlank; -import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.core.result.cashier.CashierCodeResult; -import org.dromara.daxpay.service.service.config.CashierCodeConfigService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 支付码牌配置 - * @author xxm - * @since 2024/11/20 - */ -@Validated -@IgnoreAuth -@Tag(name = "支付码牌配置") -@RestController -@RequestMapping("/cashier/code") -@RequiredArgsConstructor -public class CashierCodeController { - private final CashierCodeConfigService cashierCodeConfigService; - - @Operation(summary = "根据code和类型查询码牌信息和配置") - @GetMapping("/findByCashierType") - public Result findByCashierType(@NotBlank(message = "码牌code不可为空") String cashierCode, - @NotBlank(message = "码牌类型不可为空") String cashierType){ - return Res.ok(cashierCodeConfigService.findByCashierType(cashierCode, cashierType)); - } - - -} 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 new file mode 100644 index 000000000..6e095c810 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/CashierCodeController.java @@ -0,0 +1,64 @@ +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 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.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.service.service.cashier.CashierCodeService; +import org.dromara.daxpay.service.service.config.CashierCodeConfigService; +import org.springframework.web.bind.annotation.*; + +/** + * 通道码牌服务 + * @author xxm + * @since 2024/9/28 + */ +@IgnoreAuth +@Tag(name = "通道码牌服务") +@RestController +@RequestMapping("/unipay/cashier/code") +@RequiredArgsConstructor +public class CashierCodeController { + + private final CashierCodeConfigService codeConfigService; + + private final CashierCodeService cashierCodeService; + + @Operation(summary = "根据code和类型查询码牌信息和配置") + @GetMapping("/findByCashierType") + public Result findByCashierType(@NotBlank(message = "码牌code不可为空") String cashierCode, + @NotBlank(message = "码牌类型不可为空") String cashierType){ + return Res.ok(codeConfigService.findByCashierType(cashierCode, cashierType)); + } + + @Operation(summary = "获取码牌所需授权链接, 用于获取OpenId一类的信息") + @PostMapping("/generateAuthUrl") + public Result generateAuthUrl(@RequestBody CashierAuthUrlParam param){ + ValidationUtil.validateParam(param); + return Res.ok(cashierCodeService.generateAuthUrl(param)); + } + + @Operation(summary = "授权获取结果") + @PostMapping("/auth") + public Result auth(@RequestBody CashierCodeAuthCodeParam param){ + ValidationUtil.validateParam(param); + return Res.ok(cashierCodeService.auth(param)); + } + + @Operation(summary = "发起支付") + @PostMapping("/pay") + public Result cashierPay(@RequestBody CashierPayParam 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/ChannelCashierController.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/ChannelCashierController.java deleted file mode 100644 index e80811e65..000000000 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/controller/unipay/ChannelCashierController.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.dromara.daxpay.service.controller.unipay; - -import cn.bootx.platform.core.annotation.IgnoreAuth; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.dromara.daxpay.service.service.assist.PaymentAssistService; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 通道收银台服务 - * @author xxm - * @since 2024/9/28 - */ -@IgnoreAuth -@Tag(name = "通道收银台服务") -@RestController -@RequestMapping("/unipay/cashier/code") -@RequiredArgsConstructor -public class ChannelCashierController { - - private final PaymentAssistService paymentAssistService; - -// @Operation(summary = "获取收银台信息") -// @GetMapping("/getCashierInfo") -// public Result getCashierInfo(String cashierType,String appId){ -// paymentAssistService.initMchApp(appId); -// return Res.ok(cashierConfigService.findByCashierType(cashierType)); -// } -// -// -// @Operation(summary = "获取收银台所需授权链接, 用于获取OpenId一类的信息") -// @PostMapping("/generateAuthUrl") -// public Result generateAuthUrl(@RequestBody CashierAuthUrlParam param){ -// ValidationUtil.validateParam(param); -// paymentAssistService.initMchApp(param.getAppId()); -// return Res.ok(channelCashierService.generateAuthUrl(param)); -// } -// -// @Operation(summary = "授权获取结果") -// @PostMapping("/auth") -// public Result auth(@RequestBody CashierAuthCodeParam param){ -// ValidationUtil.validateParam(param); -// paymentAssistService.initMchApp(param.getAppId()); -// return Res.ok(channelCashierService.auth(param)); -// } -// -// @Operation(summary = "发起支付") -// @PostMapping("/pay") -// public Result cashierPay(@RequestBody CashierPayParam param){ -// ValidationUtil.validateParam(param); -// paymentAssistService.initMchApp(param.getAppId()); -// return Res.ok(channelCashierService.cashierPay(param)); -// } -} diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/CashierCodeTypeConfigManager.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/CashierCodeTypeConfigManager.java index 5721741c1..b12f56fd5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/CashierCodeTypeConfigManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/dao/config/CashierCodeTypeConfigManager.java @@ -3,8 +3,6 @@ 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.common.context.MchAppLocal; -import org.dromara.daxpay.service.common.local.PaymentContextLocal; import org.dromara.daxpay.service.entity.config.CashierCodeTypeConfig; import org.springframework.stereotype.Repository; @@ -54,11 +52,9 @@ public class CashierCodeTypeConfigManager extends BaseManager findByCashierType(Long cashierCodeId, String cashierType) { - MchAppLocal mchAppInfo = PaymentContextLocal.get().getMchAppInfo(); return lambdaQuery() .eq(CashierCodeTypeConfig::getCashierCodeId, cashierCodeId) .eq(CashierCodeTypeConfig::getType, cashierType) - .eq(CashierCodeTypeConfig::getAppId, mchAppInfo.getAppId()) .oneOpt(); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/cashier/CashierCodeAuthCodeParam.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/cashier/CashierCodeAuthCodeParam.java new file mode 100644 index 000000000..b9685c961 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/cashier/CashierCodeAuthCodeParam.java @@ -0,0 +1,25 @@ +package org.dromara.daxpay.service.param.cashier; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 收银码牌认证码参数 + * @author xxm + * @since 2024/11/25 + */ +@Data +@Accessors(chain = true) +@Schema(title = "收银码牌认证码参数") +public class CashierCodeAuthCodeParam { + + @Schema(description = "码牌Code") + private String code; + + @Schema(description = "收银台类型") + private String type; + + @Schema(description = "认证Code") + private String authCode; +} 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 new file mode 100644 index 000000000..e66bb2eb9 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/param/cashier/CashierCodeAuthUrlParam.java @@ -0,0 +1,22 @@ +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 794645a88..d9ed3552c 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 @@ -1,9 +1,28 @@ package org.dromara.daxpay.service.service.cashier; +import cn.bootx.platform.common.spring.util.WebServletUtil; +import cn.bootx.platform.core.util.ValidationUtil; +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.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.CashierCodeConfigService; +import org.dromara.daxpay.service.service.trade.pay.PayService; +import org.dromara.daxpay.service.strategy.AbsChannelCashierStrategy; +import org.dromara.daxpay.service.util.PaymentStrategyFactory; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; + /** * 通知支付控制台服务 * @author xxm @@ -14,63 +33,71 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class CashierCodeService { -// -// private final PaymentAssistService paymentAssistService; -// -// private final PayService payService; -// -// /** -// * 生成授权链接跳转链接, 主要是微信类通道使用, 用于获取OpenId -// */ -// public String generateAuthUrl(CashierAuthUrlParam param){ -// // 查询配置 -// var cashierConfig = lCashierConfigService.findByCashierType(param.getCashierType()); -// // 获取策略 -// AbsChannelCashierStrategy cashierStrategy = PaymentStrategyFactory.create(cashierConfig.getChannel(), AbsChannelCashierStrategy.class); -// return cashierStrategy.generateAuthUrl(param); -// } -// -// -// /** -// * 授权结果 -// */ -// public AuthResult auth(CashierAuthCodeParam param) { -// // 查询配置 -// var cashierConfig = lCashierConfigService.findByCashierType(param.getCashierType()); -// // 获取策略 -// AbsChannelCashierStrategy cashierStrategy = PaymentStrategyFactory.create(cashierConfig.getChannel(), AbsChannelCashierStrategy.class); -// return cashierStrategy.doAuth(param); -// } -// -// /** -// * 支付处理 -// */ -// public PayResult cashierPay(CashierPayParam param){ -// String clientIP = JakartaServletUtil.getClientIP(WebServletUtil.getRequest()); -// // 查询配置 -// var cashierConfig = lCashierConfigService.findByCashierType(param.getCashierType()); -// // 构建支付参数 -// PayParam payParam = new PayParam(); -// payParam.setBizOrderNo(TradeNoGenerateUtil.pay()); -// payParam.setTitle(StrUtil.format("手机收银金额: {}元", param.getAmount())); -// payParam.setDescription(param.getDescription()); -// payParam.setChannel(cashierConfig.getChannel()); -// payParam.setMethod(cashierConfig.getPayMethod()); -// payParam.setAmount(param.getAmount()); -// payParam.setAppId(param.getAppId()); -// payParam.setClientIp(clientIP); -// payParam.setReqTime(LocalDateTime.now()); -// String sign = paymentAssistService.genSign(payParam); -// payParam.setSign(sign); -// -// // 获取策略 -// AbsChannelCashierStrategy cashierStrategy = PaymentStrategyFactory.create(cashierConfig.getChannel(), AbsChannelCashierStrategy.class); -// // 进行参数预处理 -// cashierStrategy.handlePayParam(param, payParam); -// // 参数校验 -// ValidationUtil.validateParam(payParam); -// // 发起支付 -// return payService.pay(payParam); -// } + private final CashierCodeConfigService codeConfigService; + + private final PaymentAssistService paymentAssistService; + + private final PayService payService; + + /** + * 生成授权链接跳转链接, 主要是微信类通道使用, 用于获取OpenId + */ + public String generateAuthUrl(CashierAuthUrlParam 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); + } + + + /** + * 授权结果 + */ + public AuthResult auth(CashierCodeAuthCodeParam param) { + // 查询配置 + var cashierConfig = codeConfigService.findByCashierType(param.getCode(),param.getType()); + 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()); + return cashierStrategy.doAuth(authCodeParam); + } + + /** + * 支付处理 + */ + public PayResult cashierPay(CashierPayParam param){ + String clientIP = JakartaServletUtil.getClientIP(WebServletUtil.getRequest()); + // 查询配置 + var cashierConfig = codeConfigService.findByCashierType(param.getCashierCode(), param.getCashierType()); + paymentAssistService.initMchApp(cashierConfig.getAppId()); + // 构建支付参数 + PayParam payParam = new PayParam(); + payParam.setBizOrderNo(TradeNoGenerateUtil.pay()); + payParam.setTitle(StrUtil.format("手机收银金额: {}元", param.getAmount())); + payParam.setDescription(param.getDescription()); + payParam.setChannel(cashierConfig.getChannel()); + payParam.setMethod(cashierConfig.getPayMethod()); + payParam.setAppId(cashierConfig.getAppId()); + payParam.setAmount(param.getAmount()); + payParam.setClientIp(clientIP); + payParam.setReqTime(LocalDateTime.now()); + String sign = paymentAssistService.genSign(payParam); + payParam.setSign(sign); + + // 获取策略 + AbsChannelCashierStrategy cashierStrategy = PaymentStrategyFactory.create(cashierConfig.getChannel(), AbsChannelCashierStrategy.class); + // 进行参数预处理 + cashierStrategy.handlePayParam(param, payParam); + // 参数校验 + ValidationUtil.validateParam(payParam); + // 发起支付 + return payService.pay(payParam); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/config/CashierCodeConfigService.java b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/config/CashierCodeConfigService.java index f49f87a4a..f11fdef09 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/config/CashierCodeConfigService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/org/dromara/daxpay/service/service/config/CashierCodeConfigService.java @@ -93,7 +93,7 @@ public class CashierCodeConfigService { .orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); PlatformConfig platformConfig = platformConfigService.getConfig(); String serverUrl = platformConfig.getGatewayMobileUrl(); - return StrUtil.format("{}/cashier/code/{}", serverUrl, codeConfig.getCode()); + return StrUtil.format("{}/cashier/{}", serverUrl, codeConfig.getCode()); } /** @@ -110,10 +110,11 @@ public class CashierCodeConfigService { CashierCodeTypeConfig codeTypeConfig = cashierCodeTypeConfigManager.findByCashierType(codeConfig.getId(), cashierType) .orElseThrow(() -> new DataNotExistException("收银码牌配置不存在")); return new CashierCodeResult() + .setAppId(codeConfig.getAppId()) + .setAllocation(codeTypeConfig.isAllocation()) .setChannel(codeTypeConfig.getChannel()) .setPayMethod(codeTypeConfig.getPayMethod()) .setName(codeConfig.getName()) .setTemplateCode(codeConfig.getTemplateCode()); } - }