From e3702275ac4b79f1125e0332c259f2c428797c88 Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Fri, 15 Dec 2023 11:20:50 +0800 Subject: [PATCH] =?UTF-8?q?ref=20=E6=94=AF=E4=BB=98=E7=BD=91=E5=85=B3?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + dax-pay/pom.xml | 187 --------- .../platform/daxpay/code/CachingCode.java | 17 - .../platform/daxpay/code/MchAndAppCode.java | 41 -- .../daxpay/code/PaymentEventCode.java | 23 -- .../daxpay/code/pay/PayStatusCode.java | 57 --- .../daxpay/code/pay/PaySyncStatus.java | 32 -- .../daxpay/code/pay/PayWayExtraCode.java | 32 -- .../daxpay/code/paymodel/AliPayCode.java | 86 ---- .../daxpay/code/paymodel/AliPayWay.java | 41 -- .../daxpay/code/paymodel/VoucherCode.java | 55 --- .../daxpay/code/paymodel/WalletCode.java | 73 ---- .../daxpay/code/paymodel/WeChatPayCode.java | 88 ---- .../daxpay/code/paymodel/WeChatPayWay.java | 40 -- .../configuration/DaxPayProperties.java | 37 -- .../controller/AggregateController.java | 37 -- .../controller/AlipayConfigController.java | 73 ---- .../daxpay/controller/CashierController.java | 66 --- .../controller/MchApplicationController.java | 87 ---- .../controller/MerchantInfoController.java | 83 ---- .../controller/PayCallbackController.java | 55 --- .../PayChannelConfigController.java | 75 ---- .../daxpay/controller/PayController.java | 80 ---- .../controller/PayNotifyRecordController.java | 42 -- .../controller/PayRefundRecordController.java | 42 -- .../controller/PaySyncRecordController.java | 34 -- .../daxpay/controller/PaymentController.java | 71 ---- .../daxpay/controller/VoucherController.java | 137 ------- .../controller/VoucherLogController.java | 33 -- .../controller/WalletAdminController.java | 100 ----- .../controller/WalletConfigController.java | 44 -- .../daxpay/controller/WalletController.java | 38 -- .../controller/WalletLogController.java | 54 --- .../controller/WeChatPayConfigController.java | 71 ---- .../aggregate/entity/AggregatePayInfo.java | 27 -- .../aggregate/service/AggregateService.java | 77 ---- .../core/cashier/service/CashierService.java | 211 ---------- .../channel/alipay/convert/AlipayConvert.java | 26 -- .../channel/alipay/dao/AliPaymentManager.java | 25 -- .../channel/alipay/dao/AliPaymentMapper.java | 16 - .../alipay/dao/AlipayConfigManager.java | 43 -- .../alipay/dao/AlipayConfigMapper.java | 10 - .../channel/alipay/entity/AliPayment.java | 34 -- .../channel/alipay/entity/AlipayConfig.java | 158 ------- .../alipay/service/AliPayCallbackService.java | 108 ----- .../alipay/service/AliPayCancelService.java | 84 ---- .../channel/alipay/service/AliPayService.java | 260 ------------ .../alipay/service/AliPaymentService.java | 124 ------ .../alipay/service/AlipayConfigService.java | 163 -------- .../alipay/service/AlipaySyncService.java | 74 ---- .../core/channel/base/entity/BasePayment.java | 53 --- .../channel/cash/dao/CashPaymentManager.java | 26 -- .../channel/cash/dao/CashPaymentMapper.java | 16 - .../core/channel/cash/entity/CashPayment.java | 21 - .../channel/cash/service/CashService.java | 71 ---- .../convert/PayChannelConfigConvert.java | 24 -- .../config/dao/PayChannelConfigManager.java | 53 --- .../config/dao/PayChannelConfigMapper.java | 16 - .../config/entity/PayChannelConfig.java | 54 --- .../service/PayChannelConfigService.java | 92 ----- .../union/convert/UnionPayConvert.java | 19 - .../union/dao/UnionPayConfigManager.java | 18 - .../union/dao/UnionPayConfigMapper.java | 14 - .../union/dao/UnionPaymentManager.java | 18 - .../channel/union/dao/UnionPaymentMapper.java | 14 - .../channel/union/entity/UnionPayConfig.java | 29 -- .../channel/union/entity/UnionPayment.java | 19 - .../union/service/UnionPayConfigService.java | 19 - .../union/service/UnionPaymentService.java | 16 - .../voucher/convert/VoucherConvert.java | 27 -- .../voucher/dao/VoucherLogManager.java | 33 -- .../channel/voucher/dao/VoucherLogMapper.java | 14 - .../channel/voucher/dao/VoucherManager.java | 83 ---- .../channel/voucher/dao/VoucherMapper.java | 14 - .../voucher/dao/VoucherPaymentManager.java | 27 -- .../voucher/dao/VoucherPaymentMapper.java | 14 - .../core/channel/voucher/entity/Voucher.java | 91 ---- .../channel/voucher/entity/VoucherLog.java | 69 ---- .../voucher/entity/VoucherPayment.java | 44 -- .../channel/voucher/entity/VoucherRecord.java | 22 - .../voucher/service/VoucherLogService.java | 32 -- .../voucher/service/VoucherPayService.java | 388 ------------------ .../service/VoucherPaymentService.java | 87 ---- .../voucher/service/VoucherQueryService.java | 117 ------ .../voucher/service/VoucherService.java | 166 -------- .../channel/wallet/convert/WalletConvert.java | 36 -- .../wallet/dao/WalletConfigManager.java | 24 -- .../wallet/dao/WalletConfigMapper.java | 14 - .../channel/wallet/dao/WalletLogManager.java | 56 --- .../channel/wallet/dao/WalletLogMapper.java | 16 - .../channel/wallet/dao/WalletManager.java | 161 -------- .../core/channel/wallet/dao/WalletMapper.java | 96 ----- .../wallet/dao/WalletPaymentManager.java | 19 - .../wallet/dao/WalletPaymentMapper.java | 10 - .../core/channel/wallet/entity/Wallet.java | 75 ---- .../channel/wallet/entity/WalletConfig.java | 66 --- .../core/channel/wallet/entity/WalletLog.java | 72 ---- .../channel/wallet/entity/WalletPayment.java | 33 -- .../wallet/service/WalletConfigService.java | 70 ---- .../wallet/service/WalletLogService.java | 49 --- .../wallet/service/WalletPayService.java | 176 -------- .../wallet/service/WalletPaymentService.java | 86 ---- .../wallet/service/WalletQueryService.java | 106 ----- .../channel/wallet/service/WalletService.java | 170 -------- .../channel/wechat/convert/WeChatConvert.java | 30 -- .../wechat/dao/WeChatPayConfigManager.java | 40 -- .../wechat/dao/WeChatPayConfigMapper.java | 16 - .../wechat/dao/WeChatPaymentManager.java | 26 -- .../wechat/dao/WeChatPaymentMapper.java | 10 - .../wechat/entity/WeChatPayConfig.java | 144 ------- .../channel/wechat/entity/WeChatPayment.java | 32 -- .../service/WeChatPayCallbackService.java | 103 ----- .../service/WeChatPayCancelService.java | 118 ------ .../service/WeChatPayConfigService.java | 110 ----- .../wechat/service/WeChatPayService.java | 281 ------------- .../wechat/service/WeChatPaySyncService.java | 88 ---- .../wechat/service/WeChatPaymentService.java | 122 ------ .../convert/MchApplicationConvert.java | 24 -- .../merchant/convert/MerchantInfoConvert.java | 24 -- .../core/merchant/dao/MchAppManager.java | 50 --- .../merchant/dao/MchAppPayConfigManager.java | 27 -- .../merchant/dao/MchAppPayConfigMapper.java | 16 - .../merchant/dao/MchApplicationMapper.java | 16 - .../merchant/dao/MerchantInfoManager.java | 54 --- .../core/merchant/dao/MerchantInfoMapper.java | 16 - .../core/merchant/entity/MchAppPayConfig.java | 46 --- .../core/merchant/entity/MchApplication.java | 70 ---- .../core/merchant/entity/MerchantInfo.java | 83 ---- .../service/MchAppPayConfigService.java | 76 ---- .../core/merchant/service/MchAppService.java | 115 ------ .../merchant/service/MerchantInfoService.java | 99 ----- .../core/notify/convert/PayNotifyConvert.java | 21 - .../notify/dao/PayNotifyRecordManager.java | 36 -- .../notify/dao/PayNotifyRecordMapper.java | 10 - .../core/notify/entity/PayNotifyRecord.java | 76 ---- .../service/PayNotifyRecordService.java | 43 -- .../core/pay/builder/PayEventBuilder.java | 48 --- .../core/pay/builder/PaymentBuilder.java | 137 ------- .../daxpay/core/pay/convert/PayConvert.java | 21 - .../core/pay/exception/BaseException.java | 16 - .../core/pay/exception/ExceptionInfo.java | 27 -- .../core/pay/factory/PayStrategyFactory.java | 121 ------ .../core/pay/func/AbsPayCallbackStrategy.java | 115 ------ .../daxpay/core/pay/func/AbsPayStrategy.java | 94 ----- .../core/pay/func/PayStrategyConsumer.java | 18 - .../core/pay/local/AsyncPayInfoLocal.java | 37 -- .../core/pay/result/PayCallbackResult.java | 26 -- .../core/pay/service/PayCallbackService.java | 224 ---------- .../core/pay/service/PayCancelService.java | 121 ------ .../daxpay/core/pay/service/PayService.java | 288 ------------- .../core/pay/strategy/AliPayStrategy.java | 166 -------- .../core/pay/strategy/CashPayStrategy.java | 71 ---- .../core/pay/strategy/UnionPayStrategy.java | 45 -- .../core/pay/strategy/VoucherPayStrategy.java | 84 ---- .../core/pay/strategy/WalletPayStrategy.java | 114 ----- .../core/pay/strategy/WeChatPayStrategy.java | 166 -------- .../core/payment/convert/PaymentConvert.java | 21 - .../dao/PaymentExpiredTimeRepository.java | 52 --- .../core/payment/dao/PaymentManager.java | 68 --- .../core/payment/dao/PaymentMapper.java | 16 - .../daxpay/core/payment/entity/Payment.java | 137 ------- .../payment/service/PaymentQueryService.java | 78 ---- .../core/payment/service/PaymentService.java | 109 ----- .../factory/PayRefundStrategyFactory.java | 119 ------ .../refund/func/AbsPayRefundStrategy.java | 61 --- .../func/PayRefundStrategyConsumer.java | 17 - .../core/refund/local/AsyncRefundLocal.java | 72 ---- .../refund/record/convert/RefundConvert.java | 19 - .../record/dao/PayRefundRecordManager.java | 34 -- .../record/dao/PayRefundRecordMapper.java | 14 - .../refund/record/entity/PayRefundRecord.java | 82 ---- .../service/PayRefundRecordService.java | 43 -- .../core/refund/service/PayRefundService.java | 249 ----------- .../refund/strategy/AliPayRefundStrategy.java | 60 --- .../strategy/CashPayRefundStrategy.java | 44 -- .../strategy/UnionPayRefundStrategy.java | 37 -- .../strategy/VoucherPayRefundStrategy.java | 65 --- .../strategy/WalletPayRefundStrategy.java | 45 -- .../strategy/WeChatPayRefundStrategy.java | 66 --- .../sync/factory/PaySyncStrategyFactory.java | 38 -- .../core/sync/func/AbsPaySyncStrategy.java | 35 -- .../record/convert/PaySyncRecordConvert.java | 19 - .../sync/record/dao/PaySyncRecordManager.java | 35 -- .../sync/record/dao/PaySyncRecordMapper.java | 14 - .../sync/record/entity/PaySyncRecord.java | 76 ---- .../record/service/PaySyncRecordService.java | 63 --- .../core/sync/result/PaySyncResult.java | 36 -- .../sync/service/PayExpiredTimeService.java | 174 -------- .../core/sync/service/PaySyncService.java | 202 --------- .../sync/strategy/AliPaySyncStrategy.java | 53 --- .../sync/strategy/WeChatPaySyncStrategy.java | 49 --- .../dto/channel/alipay/AliPaymentDto.java | 26 -- .../dto/channel/alipay/AlipayConfigDto.java | 91 ---- .../channel/config/PayChannelConfigDto.java | 33 -- .../dto/channel/union/UnionPayConfigDto.java | 19 - .../dto/channel/voucher/VoucherDto.java | 56 --- .../dto/channel/voucher/VoucherLogDto.java | 61 --- .../channel/voucher/VoucherPaymentDto.java | 19 - .../dto/channel/wallet/WalletConfigDto.java | 37 -- .../daxpay/dto/channel/wallet/WalletDto.java | 45 -- .../dto/channel/wallet/WalletInfoDto.java | 23 -- .../dto/channel/wallet/WalletLogDto.java | 59 --- .../dto/channel/wallet/WalletPaymentDto.java | 26 -- .../channel/wechat/WeChatPayConfigDto.java | 81 ---- .../dto/channel/wechat/WeChatPaymentDto.java | 26 -- .../dto/merchant/MchAppPayConfigResult.java | 33 -- .../dto/merchant/MchApplicationDto.java | 36 -- .../daxpay/dto/merchant/MerchantInfoDto.java | 45 -- .../daxpay/dto/notify/PayNotifyRecordDto.java | 48 --- .../platform/daxpay/dto/pay/AsyncPayInfo.java | 29 -- .../platform/daxpay/dto/pay/PayResult.java | 40 -- .../daxpay/dto/payment/BasePaymentDto.java | 47 --- .../daxpay/dto/payment/PayChannelInfo.java | 35 -- .../daxpay/dto/payment/PaymentDto.java | 93 ----- .../daxpay/dto/payment/RefundableInfo.java | 29 -- .../daxpay/dto/refund/PayRefundRecordDto.java | 69 ---- .../daxpay/dto/sync/PaySyncRecordDto.java | 60 --- .../platform/daxpay/event/PayEventSender.java | 62 --- .../platform/daxpay/event/PayMqMsgSender.java | 24 -- .../daxpay/event/domain/PayCancelEvent.java | 30 -- .../daxpay/event/domain/PayCompleteEvent.java | 29 -- .../daxpay/event/domain/PayEvent.java | 18 - .../event/domain/PayExpiredTimeEvent.java | 29 -- .../daxpay/event/domain/PayRefundEvent.java | 29 -- .../listener/PayActiveMqMsgListener.java | 14 - .../active/sender/PayActiveMqMsgSender.java | 47 --- .../rabbit/config/PayRabbitBeanRegistry.java | 80 ---- .../listener/PayRabbitMqMsgListener.java | 60 --- .../rabbit/sender/PayRabbitMqMsgSender.java | 42 -- .../listener/PayRocketMqMsgListener.java | 26 -- .../rocket/sender/PayRocketMqMsgSender.java | 36 -- .../spring/sender/PaySpringMsgSender.java | 41 -- .../waller/WalletBannedException.java | 18 - .../waller/WalletInfoNotExistException.java | 18 - .../waller/WalletLackOfBalanceException.java | 18 - .../exception/waller/WalletLogError.java | 18 - .../waller/WalletNotExistsException.java | 18 - .../cashier/CashierCombinationPayParam.java | 40 -- .../param/cashier/CashierSinglePayParam.java | 57 --- .../channel/alipay/AlipayConfigParam.java | 79 ---- .../channel/alipay/AlipayConfigQuery.java | 29 -- .../channel/config/PayChannelConfigParam.java | 38 -- .../channel/voucher/VoucherChangeParam.java | 57 --- .../voucher/VoucherGenerationParam.java | 51 --- .../channel/voucher/VoucherImportParam.java | 54 --- .../param/channel/voucher/VoucherParam.java | 54 --- .../channel/voucher/VoucherRefundParam.java | 23 -- .../channel/wallet/WalletLogQueryParam.java | 43 -- .../channel/wallet/WalletQueryParam.java | 29 -- .../channel/wallet/WalletRechargeParam.java | 29 -- .../channel/wallet/WalletRefundParam.java | 16 - .../channel/wechat/WalletConfigParam.java | 37 -- .../channel/wechat/WeChatPayConfigParam.java | 83 ---- .../param/merchant/MchApplicationParam.java | 38 -- .../param/merchant/MerchantInfoParam.java | 53 --- .../daxpay/param/payment/PaymentQuery.java | 37 -- .../daxpay/param/refund/RefundModeParam.java | 48 --- .../daxpay/param/refund/RefundParam.java | 26 -- .../daxpay/task/PayExpiredTimeTask.java | 31 -- .../task/PayExpiredTimeTaskService.java | 44 -- .../platform/daxpay/util/PayWayUtil.java | 158 ------- ...ot.autoconfigure.AutoConfiguration.imports | 1 - .../template/import/ImportVoucher.xlsx | Bin 10060 -> 0 bytes .../resources/templates/errorCashier.html | 10 - .../resources/templates/wechatJsapiPay.html | 47 --- dax-start/pom.xml | 73 ---- .../resources/mapper/wallet/WalletMapper.xml | 81 ---- daxpay-common/pom.xml | 42 ++ .../pay}/PayAmountAbnormalException.java | 8 +- .../exception/pay}/PayFailureException.java | 8 +- .../pay}/PayHasExistedException.java | 6 +- .../pay}/PayIsProcessingException.java | 6 +- .../pay}/PayNotExistedException.java | 6 +- .../pay}/PayUnsupportedMethodException.java | 6 +- daxpay-core/pom.xml | 40 ++ .../platform/daxpay/code/DaxPayErrorCode.java | 32 +- .../platform/daxpay/code}/PayChannelEnum.java | 25 +- .../platform/daxpay/code}/PayWayEnum.java | 4 +- .../pay/PayAmountAbnormalException.java | 22 + .../exception/pay/PayFailureException.java | 22 + .../exception/pay/PayHasExistedException.java | 18 + .../pay/PayIsProcessingException.java | 18 + .../exception/pay/PayNotExistedException.java | 18 + .../pay/PayUnsupportedMethodException.java | 18 + .../daxpay/param/channel}/AliPayParam.java | 5 +- .../param/channel}/VoucherPayParam.java | 6 +- .../daxpay/param/channel}/WalletPayParam.java | 2 +- .../daxpay/param/channel}/WeChatPayParam.java | 2 +- .../platform/daxpay/param/pay/PayParam.java | 7 +- .../daxpay/param/pay/PayWayParam.java | 30 +- daxpay-single/daxpay-single-admin/pom.xml | 70 ++++ .../daxpay/DaxPaySingleGatewayApp.java | 10 +- .../openapi/controller/UniPayController.java | 65 +++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + daxpay-single/daxpay-single-gateway/pom.xml | 22 + .../daxpay/DaxpaySingleGatewayApp.java | 14 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + daxpay-single/daxpay-single-service/pom.xml | 33 ++ .../daxpay/DaxpaySingleServiceApp.java | 15 + .../daxpay/core/pay/service/PayService.java | 9 +- ...ot.autoconfigure.AutoConfiguration.imports | 1 + daxpay-single/daxpay-single-start/pom.xml | 39 ++ .../platform/daxpay/DaxpaySingleStart.java | 10 +- ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../src/main/resources/application-dev.yml | 52 +-- .../src/main/resources/application.yml | 6 +- .../src/main/resources/banner.txt | 0 .../src/main/resources/logback-spring.xml | 2 +- daxpay-single/pom.xml | 43 ++ pom.xml | 38 +- 310 files changed, 582 insertions(+), 16280 deletions(-) delete mode 100644 dax-pay/pom.xml delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/code/CachingCode.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/code/MchAndAppCode.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/code/PaymentEventCode.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayStatusCode.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PaySyncStatus.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayWayExtraCode.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/AliPayCode.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/AliPayWay.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/VoucherCode.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/WalletCode.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/WeChatPayCode.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/WeChatPayWay.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/configuration/DaxPayProperties.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/AggregateController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/AlipayConfigController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/CashierController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/MchApplicationController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/MerchantInfoController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayCallbackController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayChannelConfigController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayNotifyRecordController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayRefundRecordController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PaySyncRecordController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PaymentController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/VoucherController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/VoucherLogController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletAdminController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletConfigController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletLogController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WeChatPayConfigController.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/aggregate/entity/AggregatePayInfo.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/aggregate/service/AggregateService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/cashier/service/CashierService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/convert/AlipayConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AliPaymentManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AliPaymentMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AlipayConfigManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AlipayConfigMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/entity/AliPayment.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/entity/AlipayConfig.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCallbackService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCancelService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPaymentService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AlipayConfigService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AlipaySyncService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/base/entity/BasePayment.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/dao/CashPaymentManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/dao/CashPaymentMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/entity/CashPayment.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/service/CashService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/convert/PayChannelConfigConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/dao/PayChannelConfigManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/dao/PayChannelConfigMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/entity/PayChannelConfig.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/service/PayChannelConfigService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/convert/UnionPayConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPayConfigManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPayConfigMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPaymentManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPaymentMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/entity/UnionPayConfig.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/entity/UnionPayment.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/service/UnionPayConfigService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/service/UnionPaymentService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/convert/VoucherConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherLogManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherLogMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherPaymentManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherPaymentMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/Voucher.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/VoucherLog.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/VoucherPayment.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/VoucherRecord.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherLogService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPayService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPaymentService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherQueryService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/convert/WalletConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletConfigManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletConfigMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletLogManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletLogMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletPaymentManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletPaymentMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/Wallet.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/WalletConfig.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/WalletLog.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/WalletPayment.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletConfigService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletLogService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPayService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPaymentService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletQueryService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/convert/WeChatConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPayConfigManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPayConfigMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPaymentManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPaymentMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/entity/WeChatPayConfig.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/entity/WeChatPayment.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCallbackService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCancelService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayConfigService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPaySyncService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPaymentService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/convert/MchApplicationConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/convert/MerchantInfoConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchAppManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchAppPayConfigManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchAppPayConfigMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchApplicationMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MerchantInfoManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MerchantInfoMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/entity/MchAppPayConfig.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/entity/MchApplication.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/entity/MerchantInfo.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/service/MchAppPayConfigService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/service/MchAppService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/service/MerchantInfoService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/convert/PayNotifyConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/dao/PayNotifyRecordManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/dao/PayNotifyRecordMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/entity/PayNotifyRecord.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/service/PayNotifyRecordService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/builder/PayEventBuilder.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/builder/PaymentBuilder.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/convert/PayConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/exception/BaseException.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/exception/ExceptionInfo.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/factory/PayStrategyFactory.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/func/AbsPayCallbackStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/func/AbsPayStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/func/PayStrategyConsumer.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/local/AsyncPayInfoLocal.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/result/PayCallbackResult.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayCallbackService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayCancelService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/AliPayStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/CashPayStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/UnionPayStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/VoucherPayStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/WalletPayStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/WeChatPayStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/convert/PaymentConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/dao/PaymentExpiredTimeRepository.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/dao/PaymentManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/dao/PaymentMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/entity/Payment.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/service/PaymentQueryService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/service/PaymentService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/factory/PayRefundStrategyFactory.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/func/AbsPayRefundStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/func/PayRefundStrategyConsumer.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/local/AsyncRefundLocal.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/convert/RefundConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/dao/PayRefundRecordManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/dao/PayRefundRecordMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/entity/PayRefundRecord.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/service/PayRefundRecordService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/service/PayRefundService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/AliPayRefundStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/CashPayRefundStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/UnionPayRefundStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/VoucherPayRefundStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/WalletPayRefundStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/WeChatPayRefundStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/factory/PaySyncStrategyFactory.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/func/AbsPaySyncStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/convert/PaySyncRecordConvert.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/dao/PaySyncRecordManager.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/dao/PaySyncRecordMapper.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/entity/PaySyncRecord.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/service/PaySyncRecordService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/result/PaySyncResult.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/service/PayExpiredTimeService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/service/PaySyncService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/strategy/AliPaySyncStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/strategy/WeChatPaySyncStrategy.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/alipay/AliPaymentDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/alipay/AlipayConfigDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/config/PayChannelConfigDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/union/UnionPayConfigDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/voucher/VoucherDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/voucher/VoucherLogDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/voucher/VoucherPaymentDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletConfigDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletInfoDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletLogDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletPaymentDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wechat/WeChatPayConfigDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wechat/WeChatPaymentDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/merchant/MchAppPayConfigResult.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/merchant/MchApplicationDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/merchant/MerchantInfoDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/notify/PayNotifyRecordDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/pay/AsyncPayInfo.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/pay/PayResult.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/BasePaymentDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/PayChannelInfo.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/PaymentDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/RefundableInfo.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/refund/PayRefundRecordDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/sync/PaySyncRecordDto.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/PayEventSender.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/PayMqMsgSender.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayCancelEvent.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayCompleteEvent.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayEvent.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayExpiredTimeEvent.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayRefundEvent.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/active/listener/PayActiveMqMsgListener.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/active/sender/PayActiveMqMsgSender.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rabbit/config/PayRabbitBeanRegistry.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rabbit/listener/PayRabbitMqMsgListener.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rabbit/sender/PayRabbitMqMsgSender.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rocket/listener/PayRocketMqMsgListener.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rocket/sender/PayRocketMqMsgSender.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/spring/sender/PaySpringMsgSender.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletBannedException.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletInfoNotExistException.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletLackOfBalanceException.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletLogError.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletNotExistsException.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/cashier/CashierCombinationPayParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/cashier/CashierSinglePayParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/alipay/AlipayConfigParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/alipay/AlipayConfigQuery.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/config/PayChannelConfigParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherChangeParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherGenerationParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherImportParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherRefundParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletLogQueryParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletQueryParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletRechargeParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletRefundParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wechat/WalletConfigParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wechat/WeChatPayConfigParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/merchant/MchApplicationParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/merchant/MerchantInfoParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/payment/PaymentQuery.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/refund/RefundModeParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/param/refund/RefundParam.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/task/PayExpiredTimeTask.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/task/PayExpiredTimeTaskService.java delete mode 100644 dax-pay/src/main/java/cn/bootx/platform/daxpay/util/PayWayUtil.java delete mode 100644 dax-pay/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports delete mode 100644 dax-pay/src/main/resources/template/import/ImportVoucher.xlsx delete mode 100644 dax-pay/src/main/resources/templates/errorCashier.html delete mode 100644 dax-pay/src/main/resources/templates/wechatJsapiPay.html delete mode 100644 dax-start/pom.xml delete mode 100644 dax-start/src/main/resources/mapper/wallet/WalletMapper.xml create mode 100644 daxpay-common/pom.xml rename {dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment => daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay}/PayAmountAbnormalException.java (55%) rename {dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment => daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay}/PayFailureException.java (55%) rename {dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment => daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay}/PayHasExistedException.java (56%) rename {dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment => daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay}/PayIsProcessingException.java (56%) rename {dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment => daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay}/PayNotExistedException.java (55%) rename {dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment => daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay}/PayUnsupportedMethodException.java (57%) create mode 100644 daxpay-core/pom.xml rename dax-pay/src/main/java/cn/bootx/platform/daxpay/code/PaymentErrorCode.java => daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/DaxPayErrorCode.java (53%) rename {dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay => daxpay-core/src/main/java/cn/bootx/platform/daxpay/code}/PayChannelEnum.java (56%) rename {dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay => daxpay-core/src/main/java/cn/bootx/platform/daxpay/code}/PayWayEnum.java (88%) create mode 100644 daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayAmountAbnormalException.java create mode 100644 daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayFailureException.java create mode 100644 daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayHasExistedException.java create mode 100644 daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayIsProcessingException.java create mode 100644 daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayNotExistedException.java create mode 100644 daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayUnsupportedMethodException.java rename {dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/alipay => daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel}/AliPayParam.java (76%) rename {dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher => daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel}/VoucherPayParam.java (73%) rename {dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet => daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel}/WalletPayParam.java (90%) rename {dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wechat => daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel}/WeChatPayParam.java (88%) rename {dax-pay => daxpay-core}/src/main/java/cn/bootx/platform/daxpay/param/pay/PayParam.java (88%) rename {dax-pay => daxpay-core}/src/main/java/cn/bootx/platform/daxpay/param/pay/PayWayParam.java (58%) create mode 100644 daxpay-single/daxpay-single-admin/pom.xml rename dax-pay/src/main/java/cn/bootx/platform/daxpay/DaxPayApplication.java => daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/DaxPaySingleGatewayApp.java (70%) create mode 100644 daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/openapi/controller/UniPayController.java create mode 100644 daxpay-single/daxpay-single-admin/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 daxpay-single/daxpay-single-gateway/pom.xml create mode 100644 daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/DaxpaySingleGatewayApp.java create mode 100644 daxpay-single/daxpay-single-gateway/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 daxpay-single/daxpay-single-service/pom.xml create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/DaxpaySingleServiceApp.java rename dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/service/UnionPayService.java => daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayService.java (60%) create mode 100644 daxpay-single/daxpay-single-service/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 daxpay-single/daxpay-single-start/pom.xml rename dax-start/src/main/java/cn/bootx/platform/daxpay/DaxPayStart.java => daxpay-single/daxpay-single-start/src/main/java/cn/bootx/platform/daxpay/DaxpaySingleStart.java (91%) create mode 100644 daxpay-single/daxpay-single-start/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports rename {dax-start => daxpay-single/daxpay-single-start}/src/main/resources/application-dev.yml (79%) rename {dax-start => daxpay-single/daxpay-single-start}/src/main/resources/application.yml (88%) rename {dax-start => daxpay-single/daxpay-single-start}/src/main/resources/banner.txt (100%) rename {dax-start => daxpay-single/daxpay-single-start}/src/main/resources/logback-spring.xml (94%) create mode 100644 daxpay-single/pom.xml diff --git a/.gitignore b/.gitignore index b28673a4..e8b4b19a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ out/ target/ build/ logs/ +rebel.xml diff --git a/dax-pay/pom.xml b/dax-pay/pom.xml deleted file mode 100644 index 453826e3..00000000 --- a/dax-pay/pom.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - 4.0.0 - - cn.bootx.platform - bootx-dax-pay - 1.0.2 - - - dax-pay - - - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - - net.sourceforge.nekohtml - nekohtml - - - - - org.flywaydb - flyway-core - ${flyway.version} - - - - - org.projectlombok - lombok - provided - - - - - org.projectlombok - lombok-mapstruct-binding - provided - - - - - org.mapstruct - mapstruct-processor - provided - - - - - org.mapstruct - mapstruct - provided - - - - - com.baomidou - lock4j-redis-template-spring-boot-starter - ${lock4j.version} - - - - - cn.bootx.platform - service-baseapi - ${bootx-platform.version} - - - - - cn.bootx.platform - service-iam - ${bootx-platform.version} - - - - - cn.bootx.platform - service-notice - ${bootx-platform.version} - - - - - cn.bootx.platform - common-starter-file - - - - - cn.bootx.platform - common-starter-code-gen - - - - - cn.bootx.platform - common-websocket - - - - - cn.bootx.platform - common-starter-quartz - - - - - org.springframework.boot - spring-boot-starter-amqp - true - - - - org.apache.rocketmq - rocketmq-spring-boot - ${rocketmq.version} - true - - - - - org.springframework.boot - spring-boot-starter-activemq - true - - - - - cn.bootx - table-modify-mysql-boot-starter - - - - - cn.bootx.platform - common-starter-monitor - - - - - com.github.javen205 - IJPay-AliPay - ${IJPay.version} - - - cn.hutool - hutool-all - - - xml-apis - xml-apis - - - fastjson - com.alibaba - - - - - - - io.minio - minio - 8.5.4 - - - - com.github.javen205 - IJPay-WxPay - ${IJPay.version} - - - - com.github.binarywang - weixin-java-pay - ${wxjava.version} - - - - diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/CachingCode.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/CachingCode.java deleted file mode 100644 index 325c9a28..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/CachingCode.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.bootx.platform.daxpay.code; - -/** - * 支付服务缓存 - * - * @author xxm - * @since 2022/7/11 - */ -public interface CachingCode { - - /** 支付单(主键) */ - String PAYMENT_ID = "pay:payment:id"; - - /** 支付单(业务号码) */ - String PAYMENT_BUSINESS_ID = "pay:payment:business"; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/MchAndAppCode.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/MchAndAppCode.java deleted file mode 100644 index 4db74450..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/MchAndAppCode.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.bootx.platform.daxpay.code; - -/** - * 商户和应用相关编码 - * - * @author xxm - * @since 2023/6/12 - */ -public interface MchAndAppCode { - - /* 商户状态 */ - /** 正常 */ - String MCH_STATE_NORMAL = "normal"; - - /** 停用 */ - String MCH_STATE_FORBIDDEN = "forbidden"; - - /** 封禁 */ - String MCH_STATE_BANNED = "banned"; - - /* 商户应用状态 */ - /** 正常 */ - String MCH_APP_STATE_NORMAL = "normal"; - - /** 停用 */ - String MCH_APP_STATE_FORBIDDEN = "forbidden"; - - /** 封禁 */ - String MCH_APP_STATE_BANNED = "banned"; - - /* 应用关联支付配置状态 */ - /** 正常 */ - String PAY_CONFIG_STATE_NORMAL = "normal"; - - /** 停用 */ - String PAY_CONFIG_STATE_FORBIDDEN = "forbidden"; - - /** 封禁 */ - String PAY_CONFIG_STATE_BANNED = "banned"; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/PaymentEventCode.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/PaymentEventCode.java deleted file mode 100644 index 14a29f56..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/PaymentEventCode.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.bootx.platform.daxpay.code; - -public interface PaymentEventCode { - - /** 支付中心交换机 */ - String EXCHANGE_PAYMENT = "service.exchange"; - - /** 支付中心交换机 */ - String DELAYED_EXCHANGE_PAYMENT = "service.delayedExchange"; - - /** 支付完成 */ - String PAY_COMPLETE = "pay.complete"; - - /** 支付取消 */ - String PAY_CANCEL = "pay.cancel"; - - /** 支付退款 */ - String PAY_REFUND = "pay.refund"; - - /** 支付单超时 */ - String PAYMENT_EXPIRED_TIME = "payment.expired:time"; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayStatusCode.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayStatusCode.java deleted file mode 100644 index a9435a40..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayStatusCode.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.bootx.platform.daxpay.code.pay; - -/** - * 支付状态 - * - * @author xxm - * @since 2021/3/1 - */ -public interface PayStatusCode { - - // 支付状态 - /** 未知状态 */ - String TRADE_UNKNOWN = "trade_unknown"; - - /** 支付中 */ - String TRADE_PROGRESS = "trade_progress"; - - /** 成功 */ - String TRADE_SUCCESS = "trade_success"; - - /** 失败 */ - String TRADE_FAIL = "trade_fail"; - - /** 支付取消(超时/手动取消/订单已经关闭,撤销支付单) */ - String TRADE_CANCEL = "trade_cancel"; - - /** 退款中(部分退款) */ - String TRADE_REFUNDING = "trade_refunding"; - - /** 已退款 */ - String TRADE_REFUNDED = "trade_refunded"; - - // 回调信息支付状态 - /** 失败 */ - String NOTIFY_TRADE_FAIL = "notify_trade_fail"; - - /** 成功 */ - String NOTIFY_TRADE_SUCCESS = "notify_trade_success"; - - // 回调处理状态 - /** 失败 */ - String NOTIFY_PROCESS_FAIL = "notify_process_fail"; - - /** 成功 */ - String NOTIFY_PROCESS_SUCCESS = "notify_process_success"; - - /** 忽略 */ - String NOTIFY_PROCESS_IGNORE = "notify_process_ignore"; - - // 退款处理状态 - /** 失败 */ - String REFUND_PROCESS_FAIL = "refund_process_fail"; - - /** 成功 */ - String REFUND_PROCESS_SUCCESS = "refund_process_success"; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PaySyncStatus.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PaySyncStatus.java deleted file mode 100644 index 7511d2fb..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PaySyncStatus.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.bootx.platform.daxpay.code.pay; - -/** - * 支付网关同步状态 - * - * @author xxm - * @since 2021/4/21 - */ -public interface PaySyncStatus { - - /** 不需要同步 */ - String NOT_SYNC = "not_sync"; - - /** 远程支付成功 */ - String TRADE_SUCCESS = "trade_success"; - - /** 交易创建,等待买家付款 */ - String WAIT_BUYER_PAY = "wait_buyer_pay"; - - /** 已关闭 */ - String TRADE_CLOSED = "trade_closed"; - - /** 已退款 */ - String TRADE_REFUND = "trade_refund"; - - /** 查询不到订单 */ - String NOT_FOUND = "not_found"; - - /** 查询失败 */ - String FAIL = "fail"; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayWayExtraCode.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayWayExtraCode.java deleted file mode 100644 index 78a2c1a5..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayWayExtraCode.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.bootx.platform.daxpay.code.pay; - -/** - * 支付方式扩展字段 - * - * @author xxm - * @since 2022/2/27 - */ -public interface PayWayExtraCode { - - /** 付款码 */ - String AUTH_CODE = "auth_code"; - - /** openId */ - String OPEN_ID = "open_id"; - - /** 单张储值卡 */ - String VOUCHER_NO = "voucher_no"; - - /** 多张储值卡 */ - String VOUCHER_NO_LIST = "voucher_no_list"; - - /** 钱包ID */ - String WALLET_ID = "wallet_id"; - - /** 用户ID */ - String USER_ID = "user_id"; - - /** 同步通知路径 支付完成跳转的页面地址 */ - String RETURN_URL = "return_url"; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/AliPayCode.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/AliPayCode.java deleted file mode 100644 index 9c229ff8..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/AliPayCode.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.bootx.platform.daxpay.code.paymodel; - -/** - * 支付宝支付参数 - * - * @author xxm - * @since 2021/2/27 - */ -public interface AliPayCode { - - // 认证类型 - /** 公钥 */ - String AUTH_TYPE_KEY = "key"; - - /** 证书 */ - String AUTH_TYPE_CART = "cart"; - - // 渠道枚举 - /** 目前PC支付必填 */ - String FAST_INSTANT_TRADE_PAY = "FAST_INSTANT_TRADE_PAY"; - - /** WAP支付必填 手机网站支付产品 */ - String QUICK_WAP_PAY = "QUICK_WAP_WAY"; - - /** APP支付必填 APP支付产品 */ - String QUICK_MSECURITY_PAY = "QUICK_MSECURITY_PAY"; - - /** 付款码支付 */ - String BAR_CODE = "bar_code"; - - // 响应字段 - /** 支付状态 */ - String TRADE_STATUS = "trade_status"; - - /** 公用回传参数 */ - String PASS_BACK_PARAMS = "passback_params"; - - /** 对交易或商品的描述(在没有公用回传参数的时候, 这个作为公用回传参数) */ - String BODY = "body"; - - /** 外部订单号-paymentId */ - String OUT_TRADE_NO = "out_trade_no"; - - /** 支付宝流水号 */ - String TRADE_NO = "trade_no"; - - /** appId */ - String APP_ID = "app_id"; - - // 交易状态说明 - /** 交易创建,等待买家付款 */ - String PAYMENT_WAIT_BUYER_PAY = "WAIT_BUYER_PAY"; - - /** 未付款交易超时关闭,或支付完成后全额退款 */ - String PAYMENT_TRADE_CLOSED = "TRADE_CLOSED"; - - /** 交易支付成功 */ - String PAYMENT_TRADE_SUCCESS = "TRADE_SUCCESS"; - - /** 交易结束,不可退款 */ - String PAYMENT_TRADE_FINISHED = "TRADE_FINISHED"; - - // 通知触发条件 - /** 交易完成 */ - String NOTIFY_TRADE_FINISHED = "TRADE_FINISHED"; - - /** 支付成功 */ - String NOTIFY_TRADE_SUCCESS = "TRADE_SUCCESS"; - - /** 交易创建,不触发通知 */ - String NOTIFY_WAIT_BUYER_PAY = "WAIT_BUYER_PAY"; - - /** 交易关闭 */ - String NOTIFY_TRADE_CLOSED = "TRADE_CLOSED"; - - // 错误提示 - /** 交易不存在 */ - String ACQ_TRADE_NOT_EXIST = "ACQ.TRADE_NOT_EXIST"; - - // 网关返回码 - String SUCCESS = "10000"; - - // 网关返回码 支付进行中 order success pay inprocess - String INPROCESS = "10003"; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/AliPayWay.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/AliPayWay.java deleted file mode 100644 index 65209b4f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/AliPayWay.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.bootx.platform.daxpay.code.paymodel; - -import cn.bootx.platform.daxpay.code.pay.PayWayEnum; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import lombok.experimental.UtilityClass; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -/** - * 支付宝支付方式 - * - * @author xxm - * @since 2021/7/2 - */ -@UtilityClass -public class AliPayWay { - - // 支付方式 - private static final List PAY_WAYS = Arrays.asList(PayWayEnum.WAP, PayWayEnum.APP, PayWayEnum.WEB, - PayWayEnum.QRCODE, PayWayEnum.BARCODE); - - /** - * 根据编码获取 - */ - public PayWayEnum findByCode(String code) { - return PAY_WAYS.stream() - .filter(e -> Objects.equals(code, e.getCode())) - .findFirst() - .orElseThrow(() -> new PayFailureException("不存在的支付方式")); - } - - /** - * 获取支持的支付方式 - */ - public List getPayWays() { - return PAY_WAYS; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/VoucherCode.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/VoucherCode.java deleted file mode 100644 index b7b87be6..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/VoucherCode.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.bootx.platform.daxpay.code.paymodel; - -/** - * 储值卡常量 - * - * @author xxm - * @since 2022/3/14 - */ -public interface VoucherCode { - - /** - * 状态-正常 - */ - String STATUS_NORMAL = "normal"; - - /** - * 状态-停用 - */ - String STATUS_FORBIDDEN = "forbidden"; - - /** - * 储值卡日志-开通 - */ - String LOG_ACTIVE = "active"; - - /** - * 储值卡日志-导入 - */ - String LOG_IMPORT = "import"; - - /** - * 储值卡日志-预冻结额度 - */ - String LOG_FREEZE_BALANCE = "freeze"; - - /** - * 储值卡日志-扣减并解冻余额 - */ - String LOG_REDUCE_AND_UNFREEZE_BALANCE = "reduceAndUnfreeze"; - - /** - * 储值卡日志-直接支付 - */ - String LOG_PAY = "pay"; - /** - * 储值卡日志-取消支付 - */ - String LOG_CLOSE_PAY = "closePay"; - - /** - * 储值卡日志-退款到本卡中 - */ - String LOG_REFUND_SELF = "refundSelf"; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/WalletCode.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/WalletCode.java deleted file mode 100644 index a64fa0ea..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/WalletCode.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.bootx.platform.daxpay.code.paymodel; - -/** - * 钱包涉及到的常量 - * - * @author xxm - * @since 2020/12/8 - */ -public interface WalletCode { - - /* 操作类型 */ - /** 系统操作 */ - String OPERATION_SOURCE_SYSTEM = "system"; - - /** 管理员操作 */ - String OPERATION_SOURCE_ADMIN = "admin"; - - /** 用户操作 */ - String OPERATION_SOURCE_USER = "user"; - - /* 钱包状态 */ - /** 钱包状态-正常 */ - String STATUS_NORMAL = "normal"; - - /** 钱包状态-禁用 */ - String STATUS_FORBIDDEN = "forbidden"; - - /* 日志类型 */ - /** - * 钱包日志-开通 - */ - String LOG_ACTIVE = "active"; - - /** - * 钱包日志-Admin操作余额变动 - */ - String LOG_ADMIN_CHANGER = "adminChanger"; - - /** - * 钱包日志-预冻结额度 - */ - String LOG_FREEZE_BALANCE = "freeze"; - - /** - * 钱包日志-解冻并扣减余额 - */ - String LOG_REDUCE_AND_UNFREEZE_BALANCE = "reduceAndUnfreeze"; - - /** - * 钱包日志-直接支付 - */ - String LOG_PAY = "pay"; - /** - * 钱包日志-取消支付 - */ - String LOG_CLOSE_PAY = "closePay"; - - /** - * 钱包日志-退款 - */ - String LOG_REFUND = "refund"; - - /** - * 锁定钱包 - */ - String LOG_LOCK = "lock"; - - /** - * 解锁钱包 - */ - String LOG_UNLOCK = "unlock"; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/WeChatPayCode.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/WeChatPayCode.java deleted file mode 100644 index 52cb8008..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/WeChatPayCode.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.bootx.platform.daxpay.code.paymodel; - -/** - * 微信参数 - * - * @author xxm - * @since 2021/6/21 - */ -public interface WeChatPayCode { - - // 版本 - String API_V2 = "apiV2"; - - String API_V3 = "apiV3"; - - // 请求参数 - /** jsapi发起获取AuthCode时的重定向参数 */ - String JSAPI_REDIRECT_URL = "JsapiRedirectUrl"; - - // 返回参数 - /** 二维码链接 */ - String CODE_URL = "code_url"; - - /** 支付跳转链接 */ - String MWEB_URL = "mweb_url"; - - /** 预支付交易会话ID */ - String PREPAY_ID = "prepay_id"; - - /** 返回状态码 */ - String RETURN_CODE = "return_code"; - - /** 返回信息 */ - String RETURN_MSG = "return_msg"; - - /** 返回错误代码(例如付款码返回的支付中状态就在这里面) */ - String ERR_CODE = "err_code"; - - /** 返回错误信息 */ - String ERR_CODE_DES = "err_code_des"; - - /** 业务结果(部分结果不在这个参数里, 例如付款码的响应码) */ - String RESULT_CODE = "result_code"; - - /** 交易类型 */ - String TRADE_TYPE = "trade_type"; - - /** appid */ - String APPID = "appid"; - - /** 交易状态 */ - String TRADE_STATE = "trade_state"; - - /** 商户订单号 */ - String OUT_TRADE_NO = "out_trade_no"; - - /** 微信交易单号 */ - String TRANSACTION_ID = "transaction_id"; - - // 交易状态 - /** 支付成功 */ - String TRADE_SUCCESS = "SUCCESS"; - - /** 支付失败 */ - String TRADE_FAIL = "FAIL"; - - /** 退款 */ - String TRADE_REFUND = "REFUND"; - - /** 未支付 */ - String TRADE_NOTPAY = "NOTPAY"; - - /** 已关闭 */ - String TRADE_CLOSED = "CLOSED"; - - /** 已接收,等待扣款 */ - String TRADE_ACCEPT = "ACCEPT"; - - /** 已撤销(刷卡支付) */ - String TRADE_REVOKED = "REVOKED"; - - /** 用户支付中(刷卡支付) */ - String TRADE_USERPAYING = "USERPAYING"; - - /** 支付失败(刷卡支付) */ - String TRADE_PAYERROR = "PAYERROR"; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/WeChatPayWay.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/WeChatPayWay.java deleted file mode 100644 index 4014fff5..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/paymodel/WeChatPayWay.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.bootx.platform.daxpay.code.paymodel; - -import cn.bootx.platform.daxpay.code.pay.PayWayEnum; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import lombok.experimental.UtilityClass; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -/** - * 微信支付方式 - * - * @author xxm - * @since 2021/7/2 - */ -@UtilityClass -public class WeChatPayWay { - - private static final List PAY_WAYS = Arrays.asList(PayWayEnum.WAP, PayWayEnum.APP, PayWayEnum.JSAPI, - PayWayEnum.QRCODE, PayWayEnum.BARCODE); - - /** - * 根据数字编号获取 - */ - public PayWayEnum findByCode(String code) { - return PAY_WAYS.stream() - .filter(e -> Objects.equals(code, e.getCode())) - .findFirst() - .orElseThrow(() -> new PayFailureException("不存在的支付方式")); - } - - /** - * 获取支持的支付方式 - */ - public List getPayWays() { - return PAY_WAYS; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/configuration/DaxPayProperties.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/configuration/DaxPayProperties.java deleted file mode 100644 index 60212e8f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/configuration/DaxPayProperties.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.bootx.platform.daxpay.configuration; - -import lombok.Getter; -import lombok.Setter; -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * 项目 - * @author xxm - * @since 2023/7/17 - */ -@Getter -@Setter -@ConfigurationProperties(prefix = "bootx.daxpay") -public class DaxPayProperties { - - /** - * 消息队列类型 - */ - private MqType mqType = MqType.SPRING; - - /** - * 消息队列类型 - * @author xxm - * @since 2023/7/17 - */ - public enum MqType{ - /** Spring 消息 */ - SPRING, - /** ActiveMQ */ - ACTIVE, - /** RabbitMQ */ - RABBIT, - /** RocketMQ */ - ROCKET; - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/AggregateController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/AggregateController.java deleted file mode 100644 index 325dab57..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/AggregateController.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.daxpay.core.aggregate.service.AggregateService; -import cn.bootx.platform.daxpay.param.cashier.CashierSinglePayParam; -import cn.bootx.platform.common.core.annotation.IgnoreAuth; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -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; -import org.springframework.web.bind.annotation.RestController; - -/** - * 聚合支付 - * - * @author xxm - * @since 2022/3/6 - */ -@IgnoreAuth -@Tag(name = "聚合支付") -@RestController -@RequestMapping("/aggregate") -@RequiredArgsConstructor -public class AggregateController { - - private final AggregateService aggregateService; - - @Operation(summary = "创建聚合支付") - @PostMapping("/createAggregatePay") - public ResResult createAggregatePay(@RequestBody CashierSinglePayParam param) { - return Res.ok(aggregateService.createAggregatePay(param)); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/AlipayConfigController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/AlipayConfigController.java deleted file mode 100644 index c35a5270..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/AlipayConfigController.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.dto.KeyValue; -import cn.bootx.platform.common.core.rest.dto.LabelValue; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.daxpay.core.channel.alipay.service.AlipayConfigService; -import cn.bootx.platform.daxpay.dto.channel.alipay.AlipayConfigDto; -import cn.bootx.platform.daxpay.param.channel.alipay.AlipayConfigParam; -import cn.bootx.platform.daxpay.param.channel.alipay.AlipayConfigQuery; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import lombok.SneakyThrows; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.nio.charset.StandardCharsets; -import java.util.List; - -/** - * @author xxm - * @since 2021/2/26 - */ -@Tag(name = "支付宝配置") -@RestController -@RequestMapping("/alipay") -@AllArgsConstructor -public class AlipayConfigController { - - private final AlipayConfigService alipayConfigService; - - @Operation(summary = "添加") - @PostMapping("/add") - public ResResult add(@RequestBody AlipayConfigParam param) { - alipayConfigService.add(param); - return Res.ok(); - } - - @Operation(summary = "更新") - @PostMapping("/update") - public ResResult update(@RequestBody AlipayConfigParam param) { - alipayConfigService.update(param); - return Res.ok(); - } - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult> page(PageParam pageParam, AlipayConfigQuery param) { - return Res.ok(alipayConfigService.page(pageParam, param)); - } - - @Operation(summary = "根据Id查询") - @GetMapping("/findById") - public ResResult findById(Long id) { - return Res.ok(alipayConfigService.findById(id)); - } - - @Operation(summary = "支付宝支持支付方式") - @GetMapping("/findPayWayList") - public ResResult> findPayWayList() { - return Res.ok(alipayConfigService.findPayWayList()); - } - - @SneakyThrows - @Operation(summary = "读取证书文件内容") - @PostMapping("/readPem") - public ResResult readPem(MultipartFile file){ - return Res.ok(new String(file.getBytes(), StandardCharsets.UTF_8)); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/CashierController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/CashierController.java deleted file mode 100644 index 9d5e7d64..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/CashierController.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.annotation.IgnoreAuth; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.daxpay.core.cashier.service.CashierService; -import cn.bootx.platform.daxpay.dto.pay.PayResult; -import cn.bootx.platform.daxpay.exception.payment.PayUnsupportedMethodException; -import cn.bootx.platform.daxpay.param.cashier.CashierCombinationPayParam; -import cn.bootx.platform.daxpay.param.cashier.CashierSinglePayParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.ModelAndView; - -import java.util.Map; - -import static org.springframework.http.HttpHeaders.USER_AGENT; - -/** - * @author xxm - * @since 2022/2/23 - */ -@IgnoreAuth -@Tag(name = "结算台") -@RestController -@RequestMapping("/cashier") -@RequiredArgsConstructor -public class CashierController { - - private final CashierService cashierService; - - @Operation(summary = "发起支付(单渠道)") - @PostMapping("/singlePay") - public ResResult singlePay(@RequestBody CashierSinglePayParam cashierSinglePayParam) { - return Res.ok(cashierService.singlePay(cashierSinglePayParam)); - } - - @Operation(summary = "发起支付(组合支付)") - @PostMapping("/combinationPay") - public ResResult combinationPay(@RequestBody CashierCombinationPayParam param) { - return Res.ok(cashierService.combinationPay(param)); - } - - @Operation(summary = "扫码聚合支付(单渠道)") - @GetMapping("/aggregatePay/{mchCode}/{mchAppCode}") - public ModelAndView aggregatePay(String key,@PathVariable String mchCode,@PathVariable String mchAppCode, @RequestHeader(USER_AGENT) String ua) { - try { - String url = cashierService.aggregatePay(key, mchCode, mchAppCode, ua); - return new ModelAndView("redirect:" + url); - } - catch (PayUnsupportedMethodException e) { - return new ModelAndView("errorCashier"); - } - } - - @Operation(summary = "微信jsapi支付(回调)") - @GetMapping("/wxJsapiPay/{mchCode}/{mchAppCode}") - public ModelAndView wxJsapiPay(String code, @PathVariable String mchCode, @PathVariable String mchAppCode, String state) { - Map map = cashierService.wxJsapiPay(code,mchCode,mchAppCode,state); - // 跳转页面, 调起微信jsapi支付 - return new ModelAndView("wechatJsapiPay").addAllObjects(map); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/MchApplicationController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/MchApplicationController.java deleted file mode 100644 index a6831d51..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/MchApplicationController.java +++ /dev/null @@ -1,87 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.dto.LabelValue; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.daxpay.core.merchant.service.MchAppPayConfigService; -import cn.bootx.platform.daxpay.core.merchant.service.MchAppService; -import cn.bootx.platform.daxpay.dto.merchant.MchAppPayConfigResult; -import cn.bootx.platform.daxpay.dto.merchant.MchApplicationDto; -import cn.bootx.platform.daxpay.param.merchant.MchApplicationParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 商户应用 - * - * @author xxm - * @since 2023-05-23 - */ -@Tag(name = "商户应用") -@RestController -@RequestMapping("/mch/app") -@RequiredArgsConstructor -public class MchApplicationController { - - private final MchAppService applicationService; - - private final MchAppPayConfigService appPayConfigService; - - @Operation(summary = "添加") - @PostMapping(value = "/add") - public ResResult add(@RequestBody MchApplicationParam param) { - applicationService.add(param); - return Res.ok(); - } - - @Operation(summary = "修改") - @PostMapping(value = "/update") - public ResResult update(@RequestBody MchApplicationParam param) { - applicationService.update(param); - return Res.ok(); - } - - @Operation(summary = "删除") - @DeleteMapping(value = "/delete") - public ResResult delete(Long id) { - applicationService.delete(id); - return Res.ok(); - } - - @Operation(summary = "通过ID查询") - @GetMapping(value = "/findById") - public ResResult findById(Long id) { - return Res.ok(applicationService.findById(id)); - } - - @Operation(summary = "下拉列表") - @GetMapping("/dropdown") - public ResResult> dropdown(String mchCode) { - return Res.ok(applicationService.dropdown(mchCode)); - } - - @Operation(summary = "查询所有") - @GetMapping(value = "/findAll") - public ResResult> findAll() { - return Res.ok(applicationService.findAll()); - } - - @Operation(summary = "分页查询") - @GetMapping(value = "/page") - public ResResult> page(PageParam pageParam, MchApplicationParam mchApplicationParam) { - return Res.ok(applicationService.page(pageParam, mchApplicationParam)); - } - - @Operation(summary = "关联支付配置列表") - @GetMapping("/findAllConfig") - public ResResult> findAllConfig(String appCode) { - return Res.ok(appPayConfigService.ListByAppId(appCode)); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/MerchantInfoController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/MerchantInfoController.java deleted file mode 100644 index aedb71bf..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/MerchantInfoController.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.dto.LabelValue; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.daxpay.core.merchant.service.MerchantInfoService; -import cn.bootx.platform.daxpay.dto.merchant.MerchantInfoDto; -import cn.bootx.platform.daxpay.param.merchant.MerchantInfoParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 商户 - * - * @author xxm - * @since 2023-05-17 - */ -@Tag(name = "商户") -@RestController -@RequestMapping("/merchant") -@RequiredArgsConstructor -public class MerchantInfoController { - - private final MerchantInfoService merchantInfoService; - - @Operation(summary = "添加") - @PostMapping(value = "/add") - public ResResult add(@RequestBody MerchantInfoParam param) { - merchantInfoService.add(param); - return Res.ok(); - } - - @Operation(summary = "修改") - @PostMapping(value = "/update") - public ResResult update(@RequestBody MerchantInfoParam param) { - merchantInfoService.update(param); - return Res.ok(); - } - - @Operation(summary = "下拉列表(所有)") - @GetMapping("/dropdown") - public ResResult> dropdown() { - return Res.ok(merchantInfoService.dropdown()); - } - - @Operation(summary = "下拉列表(可用状态的)") - @GetMapping("/dropdownNormal") - public ResResult> dropdownNormal() { - return Res.ok(merchantInfoService.dropdownNormal()); - } - - @Operation(summary = "删除") - @DeleteMapping(value = "/delete") - public ResResult delete(Long id) { - merchantInfoService.delete(id); - return Res.ok(); - } - - @Operation(summary = "通过ID查询") - @GetMapping(value = "/findById") - public ResResult findById(Long id) { - return Res.ok(merchantInfoService.findById(id)); - } - - @Operation(summary = "查询所有") - @GetMapping(value = "/findAll") - public ResResult> findAll() { - return Res.ok(merchantInfoService.findAll()); - } - - @Operation(summary = "分页查询") - @GetMapping(value = "/page") - public ResResult> page(PageParam pageParam, MerchantInfoParam merchantInfoParam) { - return Res.ok(merchantInfoService.page(pageParam, merchantInfoParam)); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayCallbackController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayCallbackController.java deleted file mode 100644 index 490eef24..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayCallbackController.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.annotation.IgnoreAuth; -import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPayCallbackService; -import cn.bootx.platform.daxpay.core.channel.wechat.service.WeChatPayCallbackService; -import com.ijpay.alipay.AliPayApi; -import com.ijpay.core.kit.HttpKit; -import com.ijpay.core.kit.WxPayKit; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; -import java.util.Map; - -/** - * @author xxm - * @since 2021/2/27 - */ -@IgnoreAuth -@Slf4j -@Tag(name = "支付回调") -@RestController -@RequestMapping("/pay/callback") -@AllArgsConstructor -public class PayCallbackController { - - private final AliPayCallbackService aliPayCallbackService; - - private final WeChatPayCallbackService weChatPayCallbackService; - - @SneakyThrows - @Operation(summary = "支付宝回调") - @PostMapping("/alipay/{mchCode}/{appCode}") - public String aliPay(@PathVariable String mchCode,@PathVariable String appCode, HttpServletRequest request) { - Map stringStringMap = AliPayApi.toMap(request); - return aliPayCallbackService.payCallback(mchCode, appCode, stringStringMap); - } - - @SneakyThrows - @Operation(summary = "微信支付回调") - @PostMapping("/wechat/{mchCode}/{appCode}") - public String wechat(@PathVariable String mchCode, @PathVariable String appCode, HttpServletRequest request) { - String xmlMsg = HttpKit.readData(request); - Map params = WxPayKit.xmlToMap(xmlMsg); - return weChatPayCallbackService.payCallback(mchCode, appCode, params); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayChannelConfigController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayChannelConfigController.java deleted file mode 100644 index b77ff4bf..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayChannelConfigController.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.daxpay.core.channel.config.service.PayChannelConfigService; -import cn.bootx.platform.daxpay.dto.channel.config.PayChannelConfigDto; -import cn.bootx.platform.daxpay.param.channel.config.PayChannelConfigParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - * 支付渠道配置 - * - * @author xxm - * @since 2023-05-24 - */ -@Tag(name = "支付渠道配置") -@RestController -@RequestMapping("/channel") -@RequiredArgsConstructor -public class PayChannelConfigController { - - private final PayChannelConfigService channelConfigService; - - @Operation(summary = "添加") - @PostMapping(value = "/add") - public ResResult add(@RequestBody PayChannelConfigParam param) { - channelConfigService.add(param); - return Res.ok(); - } - - @Operation(summary = "修改") - @PostMapping(value = "/update") - public ResResult update(@RequestBody PayChannelConfigParam param) { - channelConfigService.update(param); - return Res.ok(); - } - - @Operation(summary = "删除") - @DeleteMapping(value = "/delete") - public ResResult delete(Long id) { - channelConfigService.delete(id); - return Res.ok(); - } - - @Operation(summary = "通过ID查询") - @GetMapping(value = "/findById") - public ResResult findById(Long id) { - return Res.ok(channelConfigService.findById(id)); - } - - @Operation(summary = "分页查询") - @GetMapping(value = "/page") - public ResResult> page(PageParam pageParam, - PayChannelConfigParam payChannelConfigParam) { - return Res.ok(channelConfigService.page(pageParam, payChannelConfigParam)); - } - - @Operation(summary = "编码是否被使用") - @GetMapping("/existsByCode") - public ResResult existsByCode(String code) { - return Res.ok(channelConfigService.existsByCode(code)); - } - - @Operation(summary = "编码是否被使用(不包含自己)") - @GetMapping("/existsByCodeNotId") - public ResResult existsByCode(String code, Long id) { - return Res.ok(channelConfigService.existsByCode(code, id)); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayController.java deleted file mode 100644 index 70fd402c..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayController.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.daxpay.core.pay.service.PayCancelService; -import cn.bootx.platform.daxpay.core.refund.service.PayRefundService; -import cn.bootx.platform.daxpay.core.pay.service.PayService; -import cn.bootx.platform.daxpay.core.sync.service.PaySyncService; -import cn.bootx.platform.daxpay.dto.pay.PayResult; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import cn.bootx.platform.daxpay.param.refund.RefundParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author xxm - * @since 2020/12/9 - */ -@Tag(name = "统一支付") -@RestController -@RequestMapping("/uniPay") -@AllArgsConstructor -public class PayController { - - private final PayService payService; - - private final PayCancelService payCancelService; - - private final PayRefundService payRefundService; - - private final PaySyncService paySyncService; - - @Operation(summary = "发起支付") - @PostMapping("/pay") - public ResResult pay(@RequestBody PayParam payParam) { - return Res.ok(payService.pay(payParam)); - } - - @Operation(summary = "取消支付(支付id)") - @PostMapping("/cancelByPaymentId") - public ResResult cancelByPaymentId(@Parameter(description = "支付id") Long paymentId) { - payCancelService.cancelByPaymentId(paymentId); - return Res.ok(); - } - - @Operation(summary = "取消支付(业务id)") - @PostMapping("/cancelByBusinessId") - public ResResult cancelByBusinessId(@Parameter(description = "业务id") String businessId) { - payCancelService.cancelByBusinessId(businessId); - return Res.ok(); - } - - @Operation(summary = "刷新指定业务id的支付单状态") - @PostMapping("/syncByBusinessId") - public ResResult syncByBusinessId(@Parameter(description = "业务id") String businessId) { - paySyncService.syncByBusinessId(businessId); - return Res.ok(); - } - - @Operation(summary = "退款(支持部分退款)") - @PostMapping("/refund") - public ResResult refund(@RequestBody RefundParam refundParam) { - payRefundService.refund(refundParam); - return Res.ok(); - } - - @Operation(summary = "全额退款(业务id)") - @PostMapping("/refundByBusinessId") - public ResResult refundByBusinessId(@Parameter(description = "业务id") String businessId) { - payRefundService.refundByBusinessId(businessId); - return Res.ok(); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayNotifyRecordController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayNotifyRecordController.java deleted file mode 100644 index 74dfc00e..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayNotifyRecordController.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.daxpay.core.notify.service.PayNotifyRecordService; -import cn.bootx.platform.daxpay.dto.notify.PayNotifyRecordDto; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 回调记录 - * - * @author xxm - * @since 2021/7/22 - */ -@Tag(name = "支付回调记录") -@RestController -@RequestMapping("/pay/notify/record") -@RequiredArgsConstructor -public class PayNotifyRecordController { - - private final PayNotifyRecordService notifyRecordService; - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult> page(PageParam pageParam, PayNotifyRecordDto param) { - return Res.ok(notifyRecordService.page(pageParam, param)); - } - - @Operation(summary = "根据id查询") - @GetMapping("/findById") - public ResResult findById(Long id) { - return Res.ok(notifyRecordService.findById(id)); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayRefundRecordController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayRefundRecordController.java deleted file mode 100644 index a4a241b8..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PayRefundRecordController.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.daxpay.core.refund.record.service.PayRefundRecordService; -import cn.bootx.platform.daxpay.dto.refund.PayRefundRecordDto; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 退款记录 - * - * @author xxm - * @since 2022/3/3 - */ -@Tag(name = "退款记录") -@RestController -@RequestMapping("/pay/refund") -@RequiredArgsConstructor -public class PayRefundRecordController { - - private final PayRefundRecordService payRefundRecordService; - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult> page(PageParam pageParam, PayRefundRecordDto param) { - return Res.ok(payRefundRecordService.page(pageParam, param)); - } - - @Operation(summary = "根据id查询") - @GetMapping("/findById") - public ResResult findById(Long id) { - return Res.ok(payRefundRecordService.findById(id)); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PaySyncRecordController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PaySyncRecordController.java deleted file mode 100644 index 33d62d4f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PaySyncRecordController.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.daxpay.core.sync.record.service.PaySyncRecordService; -import cn.bootx.platform.daxpay.dto.sync.PaySyncRecordDto; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Tag(name = "支付同步记录") -@RestController -@RequestMapping("/pay/sync") -@RequiredArgsConstructor -public class PaySyncRecordController { - private final PaySyncRecordService syncRecordService; - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult> page(PageParam pageParam, PaySyncRecordDto param) { - return Res.ok(syncRecordService.page(pageParam, param)); - } - - @Operation(summary = "根据id查询") - @GetMapping("/findById") - public ResResult findById(Long id) { - return Res.ok(syncRecordService.findById(id)); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PaymentController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PaymentController.java deleted file mode 100644 index 7db5b820..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/PaymentController.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.annotation.IgnoreAuth; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.query.entity.QueryOrder; -import cn.bootx.platform.common.query.entity.QueryParams; -import cn.bootx.platform.daxpay.core.payment.service.PaymentQueryService; -import cn.bootx.platform.daxpay.dto.payment.PayChannelInfo; -import cn.bootx.platform.daxpay.dto.payment.PaymentDto; -import cn.bootx.platform.daxpay.param.payment.PaymentQuery; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * @author xxm - * @since 2021/6/28 - */ -@Tag(name = "支付记录") -@RestController -@RequestMapping("/payment") -@RequiredArgsConstructor -public class PaymentController { - - private final PaymentQueryService paymentQueryService; - - @Operation(summary = "根据id获取") - @GetMapping("/findById") - public ResResult findById(Long id) { - return Res.ok(paymentQueryService.findById(id)); - } - - @Operation(summary = "分页查询") - @GetMapping("/page") - public ResResult> page(PageParam pageParam, PaymentQuery param, QueryOrder queryOrder) { - return Res.ok(paymentQueryService.page(pageParam, param, queryOrder)); - } - - @Operation(summary = "分页查询(超级查询)") - @PostMapping("/superPage") - public ResResult> superPage(PageParam pageParam, @RequestBody QueryParams queryParams) { - return Res.ok(paymentQueryService.superPage(pageParam, queryParams)); - } - - @IgnoreAuth - @Operation(summary = "根据业务ID获取支付状态`") - @GetMapping("/findStatusByBusinessId") - public ResResult findStatusByBusinessId(String businessId) { - return Res.ok(paymentQueryService.findStatusByBusinessId(businessId)); - } - - @IgnoreAuth - @Operation(summary = "根据businessId获取订单支付方式") - @GetMapping("/findPayTypeInfoByBusinessId") - public ResResult> findPayTypeInfoByBusinessId(String businessId) { - return Res.ok(paymentQueryService.findPayTypeInfoByBusinessId(businessId)); - } - - @Operation(summary = "根据id获取订单支付方式") - @GetMapping("/findPayTypeInfoById") - public ResResult> findPayTypeInfoById(Long id) { - return Res.ok(paymentQueryService.findPayTypeInfoById(id)); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/VoucherController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/VoucherController.java deleted file mode 100644 index d3994776..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/VoucherController.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.daxpay.core.channel.voucher.service.VoucherQueryService; -import cn.bootx.platform.daxpay.core.channel.voucher.service.VoucherService; -import cn.bootx.platform.daxpay.dto.channel.voucher.VoucherDto; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherGenerationParam; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherImportParam; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherParam; -import cn.hutool.core.io.IoUtil; -import com.alibaba.excel.EasyExcel; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.core.io.ResourceLoader; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.io.InputStream; -import java.util.List; - -/** - * @author xxm - * @since 2022/3/14 - */ -@Tag(name = "储值卡") -@RestController -@RequestMapping("/voucher") -@RequiredArgsConstructor -public class VoucherController { - - private final VoucherService voucherService; - - private final VoucherQueryService voucherQueryService; - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult> page(PageParam pageParam, VoucherParam param) { - return Res.ok(voucherQueryService.page(pageParam, param)); - } - - @Operation(summary = "单条查询") - @GetMapping("/findById") - public ResResult findById(Long id) { - return Res.ok(voucherQueryService.findById(id)); - } - - @Operation(summary = "根据卡号查询") - @GetMapping("/findByCardNo") - public ResResult findByCardNo(String cardNo) { - return Res.ok(voucherQueryService.findByCardNo(cardNo)); - } - - @Operation(summary = "获取并判断卡状态") - @GetMapping("/getAndJudgeVoucher") - public ResResult getAndJudgeVoucher(String cardNo) { - return Res.ok(voucherQueryService.getAndJudgeVoucher(cardNo)); - } - - @Operation(summary = "批量生成储值卡") - @PostMapping("/generationBatch") - public ResResult generationBatch(@RequestBody VoucherGenerationParam param) { - voucherService.generationBatch(param); - return Res.ok(); - } - - @Operation(summary = "冻结") - @PostMapping("/lock") - public ResResult lock(Long id) { - voucherService.lock(id); - return Res.ok(); - } - - @Operation(summary = "启用") - @PostMapping("/unlock") - public ResResult unlock(Long id) { - voucherService.unlock(id); - return Res.ok(); - } - - @Operation(summary = "批量冻结") - @PostMapping("/lockBatch") - public ResResult lockBatch(@RequestBody List ids) { - voucherService.lockBatch(ids); - return Res.ok(); - } - - @Operation(summary = "批量启用") - @PostMapping("/unlockBatch") - public ResResult unlockBatch(@RequestBody List ids) { - voucherService.unlockBatch(ids); - return Res.ok(); - } - - @SneakyThrows - @Operation(summary = "导入已有的储值卡") - @PostMapping("/importBatch") - public ResResult importBatch(Boolean skip, String mchCode, String mchAppCode, MultipartFile file){ - List voucherImportParams = EasyExcel.read(file.getInputStream()) - // 设置与Excel表映射的类 - .head(VoucherImportParam.class) - // 设置sheet,默认读取第一个 - .sheet() - // 设置标题所在行数 - .headRowNumber(1) - // 异步读取 - .doReadSync(); - voucherService.importBatch(skip,mchCode,mchAppCode,voucherImportParams); - return Res.ok(); - } - - @SneakyThrows - @Operation(summary = "下载导入模板") - @GetMapping("/excelTemplate") - public ResponseEntity excelTemplate(){ - //设置header信息 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); - headers.setContentDispositionFormData("attachment", - "ImportVoucher.xlsx"); - - ResourceLoader resourceLoader = new DefaultResourceLoader(); - InputStream inputStream = resourceLoader.getResource("classpath:templates//ImportVoucher.xlsx") - .getInputStream(); - - return new ResponseEntity<>(IoUtil.readBytes(inputStream),headers, HttpStatus.OK); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/VoucherLogController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/VoucherLogController.java deleted file mode 100644 index bf97818b..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/VoucherLogController.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.daxpay.core.channel.voucher.service.VoucherLogService; -import cn.bootx.platform.daxpay.dto.channel.voucher.VoucherLogDto; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 储值卡日志 - * @author xxm - * @since 2023/7/6 - */ -@Tag(name = "储值卡日志") -@RestController -@RequestMapping("/voucher/log") -@RequiredArgsConstructor -public class VoucherLogController { - private final VoucherLogService voucherLogService; - - @Operation(summary = "储值卡日志分页") - @GetMapping("/pageByVoucherId") - public ResResult> pageByVoucherId(PageParam pageParam, Long voucherId){ - return Res.ok(voucherLogService.pageByVoucherId(pageParam,voucherId)); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletAdminController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletAdminController.java deleted file mode 100644 index 6aeae0f9..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletAdminController.java +++ /dev/null @@ -1,100 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.annotation.OperateLog; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletQueryService; -import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletService; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletDto; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletInfoDto; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletQueryParam; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletRechargeParam; -import cn.bootx.platform.iam.dto.user.UserInfoDto; -import cn.bootx.platform.iam.param.user.UserInfoParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 钱包 - * - * @author xxm - * @since 2021/2/24 - */ -@Tag(name = "钱包相关的接口") -@RestController -@RequestMapping("/wallet/admin") -@AllArgsConstructor -public class WalletAdminController { - - private final WalletService walletService; - - private final WalletQueryService walletQueryService; - - @Operation(summary = "开通用户钱包操作") - @PostMapping("/createWallet") - public ResResult createWallet(Long userId, String mchCode, String mchAppCode) { - walletService.createWallet(userId,mchCode,mchAppCode); - return Res.ok(); - } - - @Operation(summary = "批量开通用户钱包操作") - @PostMapping("/createWalletBatch") - public ResResult createWalletBatch(@RequestBody List userIds, String mchCode, String mchAppCode) { - walletService.createWalletBatch(userIds,mchCode,mchAppCode); - return Res.ok(); - } - - @Operation(summary = "解锁钱包") - @OperateLog(title = "解锁钱包", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) - @PostMapping("/unlock") - public ResResult unlock(Long walletId) { - walletService.unlock(walletId); - return Res.ok(); - } - - @Operation(summary = "锁定钱包") - @OperateLog(title = "锁定钱包", businessType = OperateLog.BusinessType.UPDATE, saveParam = true) - @PostMapping("/lock") - public ResResult lock(Long walletId) { - walletService.lock(walletId); - return Res.ok(); - } - - @Operation(summary = "充值操作(增减余额)") - @PostMapping("/changerBalance") - public ResResult changerBalance(@RequestBody WalletRechargeParam param) { - walletService.changerBalance(param); - return Res.ok(); - } - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult> page(PageParam pageParam, WalletQueryParam param) { - return Res.ok(walletQueryService.page(pageParam, param)); - } - - @Operation(summary = "分页(未开通钱包的用户)") - @GetMapping("/pageByNotWallet") - public ResResult> pageByNotWallet(PageParam pageParam,String mchCode, UserInfoParam param) { - return Res.ok(walletQueryService.pageByNotWallet(pageParam,mchCode,param)); - } - - @Operation(summary = "根据钱包ID查询钱包") - @GetMapping("/findById") - public ResResult findById(Long walletId) { - return Res.ok(walletQueryService.findById(walletId)); - } - - @Operation(summary = "获取钱包综合信息") - @GetMapping("/getWalletInfo") - public ResResult getWalletInfo(Long walletId) { - return Res.ok(walletQueryService.getWalletInfo(walletId)); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletConfigController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletConfigController.java deleted file mode 100644 index 9c40461f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletConfigController.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletConfigService; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletConfigDto; -import cn.bootx.platform.daxpay.param.channel.wechat.WalletConfigParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - * 钱包配置 - * @author xxm - * @since 2023/7/20 - */ -@Tag(name = "钱包配置") -@RestController -@RequestMapping("/wallet/config") -@RequiredArgsConstructor -public class WalletConfigController { - private final WalletConfigService walletConfigService; - - @Operation(summary = "获取钱包支付配置") - @GetMapping("/findByMchCode") - public ResResult findByMchCode(String mchCode){ - return Res.ok(walletConfigService.findByMchCode(mchCode)); - } - - @Operation(summary = "添加") - @PostMapping("/add") - public ResResult add(@RequestBody WalletConfigParam param) { - walletConfigService.add(param); - return Res.ok(); - } - - @Operation(summary = "更新") - @PostMapping("/update") - public ResResult update(@RequestBody WalletConfigParam param) { - walletConfigService.update(param); - return Res.ok(); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletController.java deleted file mode 100644 index 1b8950b4..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletController.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletQueryService; -import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletService; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletDto; -import cn.bootx.platform.starter.auth.util.SecurityUtil; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Tag(name = "钱包相关的接口") -@RestController -@RequestMapping("/wallet") -@AllArgsConstructor -public class WalletController { - private final WalletQueryService walletQueryService; - private final WalletService walletService; - - @Operation(summary = "根据用户查询钱包") - @GetMapping("/findByUser") - public ResResult findByUser(String mchAppCode) { - return Res.ok(walletQueryService.findByUser(mchAppCode)); - } - - @Operation(summary = "开通用户钱包操作") - @PostMapping("/createWallet") - public ResResult createWallet(String mchCode,String mchAppCode) { - Long userId = SecurityUtil.getUserId(); - walletService.createWallet(userId,mchCode,mchAppCode); - return Res.ok(); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletLogController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletLogController.java deleted file mode 100644 index 0ba1afee..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WalletLogController.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletLogService; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletLogDto; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletLogQueryParam; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import org.springdoc.api.annotations.ParameterObject; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 钱包日志相关接口 - * - * @author xxm - * @since 2020/12/8 - */ -@Tag(name = "钱包日志相关的接口") -@RestController -@RequestMapping("/wallet/log") -@AllArgsConstructor -public class WalletLogController { - - private final WalletLogService walletLogService; - - @Operation(summary = "个人钱包日志") - @PostMapping("/pageByPersonal") - public ResResult> pageByPersonal(@ParameterObject PageParam pageParam, - @ParameterObject WalletLogQueryParam param) { - return Res.ok(walletLogService.pageByPersonal(pageParam, param)); - } - - @Operation(summary = "查询钱包日志(分页)") - @GetMapping("/page") - public ResResult> page(@ParameterObject PageParam pageParam, - @ParameterObject WalletLogQueryParam param) { - return Res.ok(walletLogService.page(pageParam, param)); - } - - @Operation(summary = "根据钱包id查询钱包日志(分页)") - @GetMapping("/pageByWalletId") - public ResResult> pageByWalletId(@ParameterObject PageParam pageParam, - @ParameterObject WalletLogQueryParam param) { - return Res.ok(walletLogService.pageByWalletId(pageParam, param)); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WeChatPayConfigController.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WeChatPayConfigController.java deleted file mode 100644 index 9653f76c..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/controller/WeChatPayConfigController.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.bootx.platform.daxpay.controller; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.Res; -import cn.bootx.platform.common.core.rest.ResResult; -import cn.bootx.platform.common.core.rest.dto.LabelValue; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.daxpay.core.channel.wechat.service.WeChatPayConfigService; -import cn.bootx.platform.daxpay.dto.channel.wechat.WeChatPayConfigDto; -import cn.bootx.platform.daxpay.param.channel.wechat.WeChatPayConfigParam; -import cn.hutool.core.codec.Base64; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import lombok.SneakyThrows; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; - -/** - * @author xxm - * @since 2021/3/19 - */ -@Tag(name = "微信支付配置") -@RestController -@RequestMapping("/wechat/pay") -@AllArgsConstructor -public class WeChatPayConfigController { - - private final WeChatPayConfigService weChatPayConfigService; - - @Operation(summary = "添加微信支付配置") - @PostMapping("/add") - public ResResult add(@RequestBody WeChatPayConfigParam param) { - weChatPayConfigService.add(param); - return Res.ok(); - } - - @Operation(summary = "更新") - @PostMapping("/update") - public ResResult update(@RequestBody WeChatPayConfigParam param) { - weChatPayConfigService.update(param); - return Res.ok(); - } - - @Operation(summary = "分页") - @GetMapping("/page") - public ResResult> page(PageParam pageParam, WeChatPayConfigParam param) { - return Res.ok(weChatPayConfigService.page(pageParam, param)); - } - - @Operation(summary = "根据Id查询") - @GetMapping("/findById") - public ResResult findById(Long id) { - return Res.ok(weChatPayConfigService.findById(id)); - } - - @Operation(summary = "微信支持支付方式") - @GetMapping("/findPayWayList") - public ResResult> findPayWayList() { - return Res.ok(weChatPayConfigService.findPayWayList()); - } - - @SneakyThrows - @Operation(summary = "将文件转换成base64") - @PostMapping("/toBase64") - public ResResult toBase64(MultipartFile file){ - return Res.ok(Base64.encode(file.getBytes())); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/aggregate/entity/AggregatePayInfo.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/aggregate/entity/AggregatePayInfo.java deleted file mode 100644 index b56bb2c2..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/aggregate/entity/AggregatePayInfo.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.bootx.platform.daxpay.core.aggregate.entity; - -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 聚合支付发起信息 - * - * @author xxm - * @since 2022/3/5 - */ -@Data -@Accessors(chain = true) -public class AggregatePayInfo { - - /** 标题 */ - private String title; - - /** 订单ID */ - private String businessId; - - /** 支付金额 */ - private BigDecimal amount; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/aggregate/service/AggregateService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/aggregate/service/AggregateService.java deleted file mode 100644 index 49721680..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/aggregate/service/AggregateService.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.bootx.platform.daxpay.core.aggregate.service; - -import cn.bootx.platform.common.redis.RedisClient; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.aggregate.entity.AggregatePayInfo; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.param.cashier.CashierSinglePayParam; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -/** - * 聚合支付 - * - * @author xxm - * @since 2022/3/6 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AggregateService { - - private final RedisClient redisClient; - - private final String PREFIX_KEY = "cashier:pay:aggregate:"; - - /** - * 创建聚合支付QR支付, 单渠道 - */ - public String createAggregatePay(CashierSinglePayParam param) { - // 保存并生成code - AggregatePayInfo aggregatePayInfo = new AggregatePayInfo().setAmount(param.getAmount()) - .setTitle(param.getTitle()) - .setBusinessId(param.getBusinessId()); - String key = RandomUtil.randomString(10); - redisClient.setWithTimeout(PREFIX_KEY + key, JSONUtil.toJsonStr(aggregatePayInfo), 5 * 60 * 1000); - return key; - } - - /** - * 获取聚合支付信息 - */ - public AggregatePayInfo getAggregateInfo(String key) { - String jsonStr = Optional.ofNullable(redisClient.get(PREFIX_KEY + key)) - .orElseThrow(() -> new PayFailureException("支付超时")); - return JSONUtil.toBean(jsonStr, AggregatePayInfo.class); - } - - /** - * 聚合付款码支付处理 - */ - public PayChannelEnum getPayChannel(String authCode) { - if (StrUtil.isBlank(authCode)) { - throw new PayFailureException("付款码不可为空"); - } - String[] wx = { "10", "11", "12", "13", "14", "15" }; - String[] ali = { "25", "26", "27", "28", "29", "30" }; - - // 微信 - if (StrUtil.startWithAny(authCode.substring(0, 2), wx)) { - return PayChannelEnum.WECHAT; - } - // 支付宝 - else if (StrUtil.startWithAny(authCode.substring(0, 2), ali)) { - return PayChannelEnum.ALI; - } - else { - throw new PayFailureException("不支持的支付方式"); - } - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/cashier/service/CashierService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/cashier/service/CashierService.java deleted file mode 100644 index dc566ac4..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/cashier/service/CashierService.java +++ /dev/null @@ -1,211 +0,0 @@ -package cn.bootx.platform.daxpay.core.cashier.service; - -import cn.bootx.platform.baseapi.core.parameter.dao.SystemParamManager; -import cn.bootx.platform.baseapi.core.parameter.entity.SystemParameter; -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.code.pay.PayWayEnum; -import cn.bootx.platform.daxpay.code.pay.PayWayExtraCode; -import cn.bootx.platform.daxpay.code.paymodel.WeChatPayCode; -import cn.bootx.platform.daxpay.core.aggregate.entity.AggregatePayInfo; -import cn.bootx.platform.daxpay.core.aggregate.service.AggregateService; -import cn.bootx.platform.daxpay.core.channel.wechat.dao.WeChatPayConfigManager; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.bootx.platform.daxpay.core.merchant.dao.MchAppManager; -import cn.bootx.platform.daxpay.core.pay.service.PayService; -import cn.bootx.platform.daxpay.dto.pay.PayResult; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.exception.payment.PayUnsupportedMethodException; -import cn.bootx.platform.daxpay.param.cashier.CashierCombinationPayParam; -import cn.bootx.platform.daxpay.param.cashier.CashierSinglePayParam; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.bootx.platform.daxpay.util.PayWayUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.ijpay.core.enums.SignType; -import com.ijpay.core.kit.WxPayKit; -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; - -import java.math.BigDecimal; -import java.util.*; - -/** - * 结算台 - * - * @author xxm - * @since 2022/2/23 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CashierService { - - private final PayService payService; - - private final AggregateService aggregateService; - - private final WeChatPayConfigManager weChatPayConfigManager; - - private final MchAppManager mchAppManager; - - private final SystemParamManager systemParamManager; - - /** - * 发起支付(单渠道支付) - */ - public PayResult singlePay(CashierSinglePayParam param) { - // 如果是聚合支付,存在付款码时特殊处理(聚合扫码支付不用额外处理) - if (Objects.equals(PayChannelEnum.AGGREGATION.getCode(), param.getPayChannel())) { - String payChannel = aggregateService.getPayChannel(param.getAuthCode()).getCode(); - param.setPayChannel(payChannel); - } - // 构建支付方式参数 - PayWayParam payWayParam = new PayWayParam().setPayChannel(param.getPayChannel()) - .setPayWay(param.getPayWay()) - .setAmount(param.getAmount()); - - // 处理附加参数 - HashMap map = new HashMap<>(1); - map.put(PayWayExtraCode.AUTH_CODE, param.getAuthCode()); - map.put(PayWayExtraCode.OPEN_ID, param.getOpenId()); - map.put(PayWayExtraCode.VOUCHER_NO, param.getVoucherNo()); - map.put(PayWayExtraCode.VOUCHER_NO_LIST, param.getVoucherNoList()); - String extraParamsJson = PayWayUtil.buildExtraParamsJson(param.getPayChannel(), map); - payWayParam.setExtraParamsJson(extraParamsJson); - - PayParam payParam = new PayParam() - .setMchCode(param.getMchCode()) - .setMchAppCode(param.getMchAppCode()) - .setTitle(param.getTitle()) - .setBusinessId(param.getBusinessId()) - .setPayWayList(Collections.singletonList(payWayParam)); - PayResult payResult = payService.pay(payParam); - - if (Objects.equals(PayStatusCode.TRADE_REFUNDED, payResult.getPayStatus())) { - throw new PayFailureException("已经退款"); - } - return payResult; - } - - /** - * 扫码发起自动支付 - */ - public String aggregatePay(String key, String mchCode, String mchAppCode, String ua) { - CashierSinglePayParam cashierSinglePayParam = new CashierSinglePayParam() - .setMchCode(mchCode) - .setMchAppCode(mchAppCode) - .setPayWay(PayWayEnum.QRCODE.getCode()); - // 判断是哪种支付方式 - if (ua.contains(PayChannelEnum.UA_ALI_PAY)) { - cashierSinglePayParam.setPayChannel(PayChannelEnum.ALI.getCode()); - } - else if (ua.contains(PayChannelEnum.UA_WECHAT_PAY)) { - // 跳转微信授权页面, 调用jsapi进行支付 - return this.wxJsapiAuth(key,mchCode,mchAppCode); - } - else { - throw new PayUnsupportedMethodException(); - } - - AggregatePayInfo aggregatePayInfo = aggregateService.getAggregateInfo(key); - cashierSinglePayParam.setTitle(aggregatePayInfo.getTitle()) - .setAmount(aggregatePayInfo.getAmount()) - .setBusinessId(aggregatePayInfo.getBusinessId()); - PayResult payResult = this.singlePay(cashierSinglePayParam); - return payResult.getAsyncPayInfo().getPayBody(); - } - - /** - * 微信jsapi支付 - 跳转到授权页面 - */ - private String wxJsapiAuth(String key, String mchCode, String mchAppCode) { - WeChatPayConfig config = weChatPayConfigManager.findByMchAppCode(mchAppCode) - .orElseThrow(() -> new PayFailureException("未找到启用的微信支付配置")); - WxMpService wxMpService = getWxMpService(config.getWxAppId(), config.getAppSecret()); - // 回调地址为 结算台微信jsapi支付的回调地址 - SystemParameter systemParameter = systemParamManager.findByParamKey(WeChatPayCode.JSAPI_REDIRECT_URL) - .orElseThrow(() -> new PayFailureException("微信支付回调地址参数不存在")); - String url = StrUtil.format("{}cashier/wxJsapiPay/{}/{}",systemParameter.getValue(),mchCode,mchAppCode); - return wxMpService.getOAuth2Service().buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_BASE, key); - } - - /** - * 微信jsapi支付 - 回调发起预支付, 同时调起微信页面jsapi支付 - * @param code 微信授权码, 用来获取id - * @param mchCode 商户编码 - * @param mchAppCode 商户应用编码 - * @param state 聚合支付参数记录的key - * @return 页面中调起jsapi支付的参数 - */ - @SneakyThrows - public Map wxJsapiPay(String code, String mchCode, String mchAppCode, String state) { - WeChatPayConfig config = weChatPayConfigManager.findByMchAppCode(mchAppCode) - .orElseThrow(() -> new PayFailureException("未找到启用的微信支付配置")); - WxMpService wxMpService = this.getWxMpService(config.getWxAppId(), config.getAppSecret()); - WxOAuth2AccessToken accessToken = wxMpService.getOAuth2Service().getAccessToken(code); - String openId = accessToken.getOpenId(); - AggregatePayInfo aggregatePayInfo = aggregateService.getAggregateInfo(state); - // 构造微信API支付参数 - CashierSinglePayParam cashierSinglePayParam = new CashierSinglePayParam() - .setPayChannel(PayChannelEnum.WECHAT.getCode()) - .setPayWay(PayWayEnum.JSAPI.getCode()) - .setMchCode(mchCode) - .setMchAppCode(mchAppCode) - .setTitle(aggregatePayInfo.getTitle()) - .setAmount(aggregatePayInfo.getAmount()) - .setOpenId(openId) - .setBusinessId(aggregatePayInfo.getBusinessId()); - PayResult payResult = this.singlePay(cashierSinglePayParam); - - return WxPayKit.prepayIdCreateSign(payResult.getAsyncPayInfo().getPayBody(), config.getWxAppId(), - config.getApiKeyV2(), SignType.HMACSHA256); - } - - /** - * 获取微信公众号API的Service - */ - private WxMpService getWxMpService(String appId, String secret) { - WxMpService wxMpService = new WxMpServiceImpl(); - WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl(); - config.setAppId(appId); // 设置微信公众号的appid - config.setSecret(secret); // 设置微信公众号的app corpSecret - wxMpService.setWxMpConfigStorage(config); - return wxMpService; - } - - /** - * 组合支付 - */ - public PayResult combinationPay(CashierCombinationPayParam param) { - // 处理支付参数 - List payModeList = param.getPayWayList(); - // 删除小于等于零的 - payModeList.removeIf(payModeParam -> BigDecimalUtil.compareTo(payModeParam.getAmount(), BigDecimal.ZERO) < 1); - if (CollUtil.isEmpty(payModeList)) { - throw new PayFailureException("支付参数有误"); - } - // 发起支付 - PayParam payParam = new PayParam().setTitle(param.getTitle()) - .setMchCode(param.getMchCode()) - .setMchAppCode(param.getMchAppCode()) - .setBusinessId(param.getBusinessId()) - .setPayWayList(param.getPayWayList()); - PayResult payResult = payService.pay(payParam); - - if (Objects.equals(PayStatusCode.TRADE_REFUNDED, payResult.getPayStatus())) { - throw new PayFailureException("已经退款"); - } - return payResult; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/convert/AlipayConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/convert/AlipayConvert.java deleted file mode 100644 index 3b2f6e38..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/convert/AlipayConvert.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.convert; - -import cn.bootx.platform.daxpay.core.channel.alipay.entity.AlipayConfig; -import cn.bootx.platform.daxpay.dto.channel.alipay.AlipayConfigDto; -import cn.bootx.platform.daxpay.param.channel.alipay.AlipayConfigParam; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 支付宝转换 - * - * @author xxm - * @since 2021/7/5 - */ -@Mapper -public interface AlipayConvert { - - AlipayConvert CONVERT = Mappers.getMapper(AlipayConvert.class); - - AlipayConfig convert(AlipayConfigDto in); - - AlipayConfig convert(AlipayConfigParam in); - - AlipayConfigDto convert(AlipayConfig in); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AliPaymentManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AliPaymentManager.java deleted file mode 100644 index 666e1e51..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AliPaymentManager.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.dao; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.channel.alipay.entity.AliPayment; -import cn.bootx.platform.daxpay.core.channel.base.entity.BasePayment; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 支付宝 - * - * @author xxm - * @since 2021/2/26 - */ -@Repository -@RequiredArgsConstructor -public class AliPaymentManager extends BaseManager { - - public Optional findByPaymentId(Long paymentId) { - return this.findByField(BasePayment::getPaymentId, paymentId); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AliPaymentMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AliPaymentMapper.java deleted file mode 100644 index 72fbeec2..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AliPaymentMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.dao; - -import cn.bootx.platform.daxpay.core.channel.alipay.entity.AliPayment; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 支付宝支付 - * - * @author xxm - * @since 2021/2/26 - */ -@Mapper -public interface AliPaymentMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AlipayConfigManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AlipayConfigManager.java deleted file mode 100644 index 82ca2218..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AlipayConfigManager.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.channel.alipay.entity.AlipayConfig; -import cn.bootx.platform.daxpay.param.channel.alipay.AlipayConfigQuery; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 支付宝配置 - * - * @author xxm - * @since 2021/2/26 - */ -@Repository -@RequiredArgsConstructor -public class AlipayConfigManager extends BaseManager { - - /** - * 获取关联的的支付宝配置 - */ - public Optional findByMchAppCode(String mchAppCOde) { - return findByField(AlipayConfig::getMchAppCode, mchAppCOde); - } - - /** - * 分页 - */ - public Page page(PageParam pageParam, AlipayConfigQuery param) { - Page mpPage = MpUtil.getMpPage(pageParam, AlipayConfig.class); - return lambdaQuery().select(AlipayConfig.class, MpUtil::excludeBigField) - .like(StrUtil.isNotBlank(param.getName()), AlipayConfig::getName, param.getName()) - .like(StrUtil.isNotBlank(param.getAppId()), AlipayConfig::getAppId, param.getAppId()) - .page(mpPage); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AlipayConfigMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AlipayConfigMapper.java deleted file mode 100644 index 0b359e9a..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/dao/AlipayConfigMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.dao; - -import cn.bootx.platform.daxpay.core.channel.alipay.entity.AlipayConfig; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface AlipayConfigMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/entity/AliPayment.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/entity/AliPayment.java deleted file mode 100644 index 85267aae..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/entity/AliPayment.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.daxpay.core.channel.base.entity.BasePayment; -import cn.bootx.platform.daxpay.dto.channel.alipay.AliPaymentDto; -import cn.hutool.core.bean.BeanUtil; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 支付宝支付记录 - * - * @author xxm - * @since 2021/2/26 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("pay_ali_payment") -public class AliPayment extends BasePayment implements EntityBaseFunction { - - /** 支付宝交易号 */ - private String tradeNo; - - @Override - public AliPaymentDto toDto() { - AliPaymentDto dto = new AliPaymentDto(); - BeanUtil.copyProperties(this, dto); - return dto; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/entity/AlipayConfig.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/entity/AlipayConfig.java deleted file mode 100644 index df811dbb..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/entity/AlipayConfig.java +++ /dev/null @@ -1,158 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.entity; - -import cn.bootx.platform.common.core.annotation.BigField; -import cn.bootx.platform.common.core.annotation.EncryptionField; -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.daxpay.code.paymodel.AliPayCode; -import cn.bootx.platform.daxpay.core.channel.alipay.convert.AlipayConvert; -import cn.bootx.platform.daxpay.dto.channel.alipay.AlipayConfigDto; -import cn.bootx.platform.daxpay.param.channel.alipay.AlipayConfigParam; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.annotation.DbTable; -import cn.bootx.table.modify.mysql.annotation.DbMySqlFieldType; -import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; -import cn.bootx.table.modify.mysql.constants.MySqlFieldTypeEnum; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 支付宝支付配置 - * - * @author xxm - * @since 2020/12/15 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@DbTable(comment = "支付宝支付配置") -@TableName("pay_alipay_config") -public class AlipayConfig extends MpBaseEntity implements EntityBaseFunction { - - /** 名称 */ - @DbColumn(comment = "名称") - private String name; - - /** 商户编码 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - @DbColumn(comment = "商户编码") - private String mchCode; - - /** 商户应用编码 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - @DbMySqlIndex(comment = "商户应用编码唯一索引") - @DbColumn(comment = "商户应用编码") - private String mchAppCode; - - /** 支付宝商户appId */ - @DbColumn(comment = "支付宝商户appId") - private String appId; - - /** 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 */ - @DbColumn(comment = "异步通知页面路径") - private String notifyUrl; - - /** - * 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址 - */ - @DbColumn(comment = "同步通知页面路径") - private String returnUrl; - - /** 请求网关地址 */ - @DbColumn(comment = "") - private String serverUrl; - - /** - * 认证类型 证书/公钥 - * @see AliPayCode#AUTH_TYPE_KEY - */ - @DbColumn(comment = "认证类型") - private String authType; - - /** 签名类型 RSA/RSA2 */ - @DbColumn(comment = "签名类型 RSA/RSA2") - public String signType; - - /** 支付宝公钥 */ - @BigField - @EncryptionField - @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) - @DbColumn(comment = "支付宝公钥") - public String alipayPublicKey; - - /** 私钥 */ - @BigField - @EncryptionField - @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) - @DbColumn(comment = "私钥") - private String privateKey; - - /** 应用公钥证书 */ - @BigField - @EncryptionField - @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) - @DbColumn(comment = "应用公钥证书") - private String appCert; - - /** 支付宝公钥证书 */ - @BigField - @EncryptionField - @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) - @DbColumn(comment = "支付宝公钥证书") - private String alipayCert; - - /** 支付宝CA根证书 */ - @BigField - @EncryptionField - @DbColumn(comment = "支付宝CA根证书") - @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) - private String alipayRootCert; - - /** 是否沙箱环境 */ - @DbColumn(comment = "是否沙箱环境") - private boolean sandbox; - - /** 超时配置 */ - @DbColumn(comment = "超时配置") - private Integer expireTime; - - /** 可用支付方式 */ - @TableField(updateStrategy = FieldStrategy.IGNORED) - @DbColumn(comment = "可用支付方式") - private String payWays; - - /** - * 状态 - * @see cn.bootx.platform.daxpay.code.MchAndAppCode#PAY_CONFIG_STATE_NORMAL - */ - @DbColumn(comment = "状态") - private String state; - - /** 备注 */ - @DbColumn(comment = "备注") - private String remark; - - @Override - public AlipayConfigDto toDto() { - AlipayConfigDto convert = AlipayConvert.CONVERT.convert(this); - if (StrUtil.isNotBlank(this.getPayWays())) { - convert.setPayWayList(StrUtil.split(this.getPayWays(), ',')); - } - return convert; - } - - public static AlipayConfig init(AlipayConfigParam in) { - AlipayConfig convert = AlipayConvert.CONVERT.convert(in); - if (CollUtil.isNotEmpty(in.getPayWayList())) { - convert.setPayWays(String.join(",", in.getPayWayList())); - } - return convert; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCallbackService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCallbackService.java deleted file mode 100644 index f02fb438..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCallbackService.java +++ /dev/null @@ -1,108 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.service; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.util.CertUtil; -import cn.bootx.platform.common.redis.RedisClient; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.code.paymodel.AliPayCode; -import cn.bootx.platform.daxpay.core.notify.dao.PayNotifyRecordManager; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayCallbackStrategy; -import cn.bootx.platform.daxpay.core.pay.service.PayCallbackService; -import cn.bootx.platform.daxpay.core.channel.alipay.dao.AlipayConfigManager; -import cn.bootx.platform.daxpay.core.channel.alipay.entity.AlipayConfig; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import com.alipay.api.AlipayApiException; -import com.alipay.api.AlipayConstants; -import com.alipay.api.internal.util.AlipaySignature; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Map; -import java.util.Objects; - -/** - * 支付宝回调处理 - * - * @author xxm - * @since 2021/2/28 - */ -@Slf4j -@Service -public class AliPayCallbackService extends AbsPayCallbackStrategy { - - private final AlipayConfigManager alipayConfigManager; - - public AliPayCallbackService(RedisClient redisClient, PayNotifyRecordManager payNotifyRecordManager, - PayCallbackService payCallbackService, AlipayConfigManager alipayConfigManager) { - super(redisClient, payNotifyRecordManager, payCallbackService); - this.alipayConfigManager = alipayConfigManager; - } - - @Override - public PayChannelEnum getPayChannel() { - return PayChannelEnum.ALI; - } - - @Override - public String getTradeStatus() { - Map params = PARAMS.get(); - String tradeStatus = params.get(AliPayCode.TRADE_STATUS); - if (Objects.equals(tradeStatus, AliPayCode.NOTIFY_TRADE_SUCCESS)) { - return PayStatusCode.NOTIFY_TRADE_SUCCESS; - } - return PayStatusCode.NOTIFY_TRADE_FAIL; - } - - /** - * 验证信息格式 - * @param mchAppCode 商户应用编码 - */ - @SneakyThrows - @Override - public boolean verifyNotify(String mchAppCode) { - Map params = PARAMS.get(); - String callReq = JSONUtil.toJsonStr(params); - String appId = params.get(AliPayCode.APP_ID); - if (StrUtil.isBlank(appId)) { - log.error("支付宝回调报文 appId 为空 {}", callReq); - return false; - } - AlipayConfig alipayConfig = alipayConfigManager.findByMchAppCode(mchAppCode) - .orElseThrow(DataNotExistException::new); - if (alipayConfig == null) { - log.error("支付宝支付配置不存在: {}", callReq); - return false; - } - - try { - if (Objects.equals(alipayConfig.getAuthType(), AliPayCode.AUTH_TYPE_KEY)) { - return AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipayPublicKey(), CharsetUtil.UTF_8, - AlipayConstants.SIGN_TYPE_RSA2); - } - else { - return AlipaySignature.verifyV1(params, CertUtil.getCertByContent(alipayConfig.getAlipayCert()), - CharsetUtil.UTF_8, AlipayConstants.SIGN_TYPE_RSA2); - } - } - catch (AlipayApiException e) { - log.error("支付宝验签失败", e); - return false; - } - } - - @Override - public Long getPaymentId() { - Map params = PARAMS.get(); - return Long.valueOf(params.get(AliPayCode.OUT_TRADE_NO)); - } - - @Override - public String getReturnMsg() { - return "success"; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCancelService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCancelService.java deleted file mode 100644 index de11e63f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayCancelService.java +++ /dev/null @@ -1,84 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.service; - -import cn.bootx.platform.common.spring.exception.RetryableException; -import cn.bootx.platform.daxpay.code.paymodel.AliPayCode; -import cn.bootx.platform.daxpay.core.refund.local.AsyncRefundLocal; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.hutool.core.util.IdUtil; -import com.alipay.api.AlipayApiException; -import com.alipay.api.domain.AlipayTradeCancelModel; -import com.alipay.api.domain.AlipayTradeRefundModel; -import com.alipay.api.response.AlipayTradeCancelResponse; -import com.alipay.api.response.AlipayTradeRefundResponse; -import com.ijpay.alipay.AliPayApi; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.retry.annotation.Retryable; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.util.Objects; - -/** - * 支付宝支付取消和退款 - * - * @author xxm - * @since 2021/4/20 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AliPayCancelService { - - /** - * 关闭支付 - */ - @Retryable(value = RetryableException.class) - public void cancelRemote(Payment payment) { - // 只有部分需要调用支付宝网关进行关闭 - AlipayTradeCancelModel model = new AlipayTradeCancelModel(); - model.setOutTradeNo(String.valueOf(payment.getId())); - - try { - AlipayTradeCancelResponse response = AliPayApi.tradeCancelToResponse(model); - if (!Objects.equals(AliPayCode.SUCCESS, response.getCode())) { - log.error("网关返回撤销失败: {}", response.getSubMsg()); - throw new PayFailureException(response.getSubMsg()); - } - } - catch (AlipayApiException e) { - log.error("关闭订单失败:", e); - throw new PayFailureException("关闭订单失败"); - } - } - - /** - * 退款 - */ - public void refund(Payment payment, BigDecimal amount) { - AlipayTradeRefundModel refundModel = new AlipayTradeRefundModel(); - refundModel.setOutTradeNo(String.valueOf(payment.getId())); - refundModel.setRefundAmount(amount.toPlainString()); - - // 设置退款号 - AsyncRefundLocal.set(IdUtil.getSnowflakeNextIdStr()); - refundModel.setOutRequestNo(AsyncRefundLocal.get()); - try { - AlipayTradeRefundResponse response = AliPayApi.tradeRefundToResponse(refundModel); - if (!Objects.equals(AliPayCode.SUCCESS, response.getCode())) { - AsyncRefundLocal.setErrorMsg(response.getSubMsg()); - AsyncRefundLocal.setErrorCode(response.getCode()); - log.error("网关返回退款失败: {}", response.getSubMsg()); - throw new PayFailureException(response.getSubMsg()); - } - } - catch (AlipayApiException e) { - log.error("订单退款失败:", e); - AsyncRefundLocal.setErrorMsg(e.getErrMsg()); - AsyncRefundLocal.setErrorCode(e.getErrCode()); - throw new PayFailureException("订单退款失败"); - } - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayService.java deleted file mode 100644 index 9939ac83..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPayService.java +++ /dev/null @@ -1,260 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.service; - -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.code.pay.PayWayEnum; -import cn.bootx.platform.daxpay.code.paymodel.AliPayCode; -import cn.bootx.platform.daxpay.code.paymodel.AliPayWay; -import cn.bootx.platform.daxpay.core.pay.local.AsyncPayInfoLocal; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.channel.alipay.entity.AlipayConfig; -import cn.bootx.platform.daxpay.dto.pay.AsyncPayInfo; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.bootx.platform.daxpay.param.channel.alipay.AliPayParam; -import cn.bootx.platform.daxpay.util.PayWayUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.Method; -import com.alipay.api.AlipayApiException; -import com.alipay.api.AlipayResponse; -import com.alipay.api.domain.*; -import com.alipay.api.request.AlipayTradePagePayRequest; -import com.alipay.api.request.AlipayTradeWapPayRequest; -import com.alipay.api.response.*; -import com.ijpay.alipay.AliPayApi; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -import static cn.bootx.platform.daxpay.code.paymodel.AliPayCode.BAR_CODE; -import static cn.bootx.platform.daxpay.code.paymodel.AliPayCode.QUICK_MSECURITY_PAY; - -/** - * 支付宝支付service - * - * @author xxm - * @since 2021/2/26 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AliPayService { - - /** - * 支付前检查支付方式是否可用 - */ - public void validation(PayWayParam payWayParam, AlipayConfig alipayConfig) { - List payWays = Optional.ofNullable(alipayConfig.getPayWays()) - .filter(StrUtil::isNotBlank) - .map(s -> StrUtil.split(s, ',')) - .orElse(new ArrayList<>(1)); - // 发起的支付类型是否在支持的范围内 - PayWayEnum payWayEnum = Optional.ofNullable(AliPayWay.findByCode(payWayParam.getPayWay())) - .orElseThrow(() -> new PayFailureException("非法的支付宝支付类型")); - if (!payWays.contains(payWayEnum.getCode())) { - throw new PayFailureException("该支付宝支付方式不可用"); - } - } - - /** - * 调起支付 - */ - public void pay(BigDecimal amount, Payment payment, AliPayParam aliPayParam, PayWayParam payWayParam, - AlipayConfig alipayConfig) { - String payBody = null; - // 线程存储 - AsyncPayInfo asyncPayInfo = Optional.ofNullable(AsyncPayInfoLocal.get()).orElse(new AsyncPayInfo()); - // wap支付 - if (Objects.equals(payWayParam.getPayWay(), PayWayEnum.WAP.getCode())) { - payBody = this.wapPay(amount, payment, alipayConfig, aliPayParam); - } - // 程序支付 - else if (Objects.equals(payWayParam.getPayWay(), PayWayEnum.APP.getCode())) { - payBody = this.appPay(amount, payment, alipayConfig); - } - // pc支付 - else if (Objects.equals(payWayParam.getPayWay(), PayWayEnum.WEB.getCode())) { - payBody = this.webPay(amount, payment, alipayConfig, aliPayParam); - } - // 二维码支付 - else if (Objects.equals(payWayParam.getPayWay(), PayWayEnum.QRCODE.getCode())) { - payBody = this.qrCodePay(amount, payment, alipayConfig); - } - // 付款码支付 - else if (Objects.equals(payWayParam.getPayWay(), PayWayEnum.BARCODE.getCode())) { - String tradeNo = this.barCode(amount, payment, aliPayParam, alipayConfig); - asyncPayInfo.setExpiredTime(false).setTradeNo(tradeNo); - } - // 通常是发起支付的参数 - asyncPayInfo.setPayBody(payBody); - AsyncPayInfoLocal.set(asyncPayInfo); - } - - /** - * wap支付 - */ - public String wapPay(BigDecimal amount, Payment payment, AlipayConfig alipayConfig, AliPayParam aliPayParam) { - - AlipayTradeWapPayModel model = new AlipayTradeWapPayModel(); - model.setSubject(payment.getTitle()); - model.setOutTradeNo(String.valueOf(payment.getId())); - model.setTotalAmount(amount.toPlainString()); - // 过期时间 - model.setTimeoutExpress(PayWayUtil.getAliExpiredTime(alipayConfig.getExpireTime())); - payment.setExpiredTime(PayWayUtil.getPaymentExpiredTime(alipayConfig.getExpireTime())); - model.setProductCode(AliPayCode.QUICK_WAP_PAY); - model.setQuitUrl(aliPayParam.getReturnUrl()); - - AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); - request.setBizModel(model); - request.setNotifyUrl(alipayConfig.getNotifyUrl()); - request.setReturnUrl(aliPayParam.getReturnUrl()); - - try { - // 通过GET方式的请求, 返回URL的响应, 默认是POST方式的请求, 返回的是表单响应 - AlipayTradeWapPayResponse response = AliPayApi.pageExecute(request, Method.GET.name()); - return response.getBody(); - } - catch (AlipayApiException e) { - log.error("支付宝手机支付失败", e); - throw new PayFailureException("支付宝手机支付失败"); - } - } - - /** - * app支付 - */ - public String appPay(BigDecimal amount, Payment payment, AlipayConfig alipayConfig) { - AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); - - model.setSubject(payment.getTitle()); - model.setProductCode(QUICK_MSECURITY_PAY); - model.setOutTradeNo(String.valueOf(payment.getId())); - // 过期时间 - model.setTimeoutExpress(PayWayUtil.getAliExpiredTime(alipayConfig.getExpireTime())); - payment.setExpiredTime(PayWayUtil.getPaymentExpiredTime(alipayConfig.getExpireTime())); - model.setTotalAmount(amount.toPlainString()); - - try { - AlipayTradeAppPayResponse response = AliPayApi.appPayToResponse(model, alipayConfig.getNotifyUrl()); - return response.getBody(); - } - catch (AlipayApiException e) { - log.error("支付宝APP支付失败", e); - throw new PayFailureException("支付宝APP支付失败"); - } - } - - /** - * PC支付 - */ - public String webPay(BigDecimal amount, Payment payment, AlipayConfig alipayConfig, AliPayParam aliPayParam) { - - AlipayTradePagePayModel model = new AlipayTradePagePayModel(); - - model.setSubject(payment.getTitle()); - model.setOutTradeNo(String.valueOf(payment.getId())); - // 过期时间 - model.setTimeoutExpress(PayWayUtil.getAliExpiredTime(alipayConfig.getExpireTime())); - payment.setExpiredTime(PayWayUtil.getPaymentExpiredTime(alipayConfig.getExpireTime())); - model.setTotalAmount(amount.toPlainString()); - // 目前仅支持FAST_INSTANT_TRADE_PAY - model.setProductCode(AliPayCode.FAST_INSTANT_TRADE_PAY); - - AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); - request.setBizModel(model); - request.setNotifyUrl(alipayConfig.getNotifyUrl()); - request.setReturnUrl(aliPayParam.getReturnUrl()); - try { - // 通过GET方式的请求, 返回URL的响应, 默认是POST方式的请求, 返回的是表单响应 - AlipayTradePagePayResponse response = AliPayApi.pageExecute(request, Method.GET.name()); - return response.getBody(); - } - catch (AlipayApiException e) { - log.error("支付宝PC支付失败", e); - throw new PayFailureException("支付宝PC支付失败"); - } - } - - /** - * 二维码支付(扫码支付) - */ - public String qrCodePay(BigDecimal amount, Payment payment, AlipayConfig alipayConfig) { - AlipayTradePrecreateModel model = new AlipayTradePrecreateModel(); - model.setSubject(payment.getTitle()); - model.setOutTradeNo(String.valueOf(payment.getId())); - model.setTotalAmount(amount.toPlainString()); - - // 过期时间 - model.setTimeoutExpress(PayWayUtil.getAliExpiredTime(alipayConfig.getExpireTime())); - payment.setExpiredTime(PayWayUtil.getPaymentExpiredTime(alipayConfig.getExpireTime())); - - try { - AlipayTradePrecreateResponse response = AliPayApi.tradePrecreatePayToResponse(model, - alipayConfig.getNotifyUrl()); - this.verifyErrorMsg(response); - return response.getQrCode(); - } - catch (AlipayApiException e) { - log.error("支付宝手机支付失败", e); - throw new PayFailureException("支付宝手机支付失败"); - } - } - - /** - * 付款码支付 - */ - public String barCode(BigDecimal amount, Payment payment, AliPayParam aliPayParam, AlipayConfig alipayConfig) { - AlipayTradePayModel model = new AlipayTradePayModel(); - - model.setSubject(payment.getTitle()); - model.setOutTradeNo(String.valueOf(payment.getId())); - model.setScene(BAR_CODE); - model.setAuthCode(aliPayParam.getAuthCode()); - - // 过期时间 - model.setTimeoutExpress(PayWayUtil.getAliExpiredTime(alipayConfig.getExpireTime())); - payment.setExpiredTime(PayWayUtil.getPaymentExpiredTime(alipayConfig.getExpireTime())); - model.setTotalAmount(amount.toPlainString()); - - try { - AlipayTradePayResponse response = AliPayApi.tradePayToResponse(model, alipayConfig.getNotifyUrl()); - - // 支付成功处理 金额2000以下免密支付 - if (Objects.equals(response.getCode(), AliPayCode.SUCCESS)) { - payment.setPayStatus(PayStatusCode.TRADE_SUCCESS).setPayTime(LocalDateTime.now()); - return response.getTradeNo(); - } - // 非支付中响应码, 进行错误处理 - if (!Objects.equals(response.getCode(), AliPayCode.INPROCESS)) { - this.verifyErrorMsg(response); - } - } - catch (AlipayApiException e) { - log.error("主动扫码支付失败", e); - throw new PayFailureException("主动扫码支付失败"); - } - return null; - } - - /** - * 验证错误信息 - */ - private void verifyErrorMsg(AlipayResponse alipayResponse) { - if (!Objects.equals(alipayResponse.getCode(), AliPayCode.SUCCESS)) { - String errorMsg = alipayResponse.getSubMsg(); - if (StrUtil.isBlank(errorMsg)) { - errorMsg = alipayResponse.getMsg(); - } - log.error("支付失败 {}", errorMsg); - throw new PayFailureException(errorMsg); - } - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPaymentService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPaymentService.java deleted file mode 100644 index b9fc0208..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AliPaymentService.java +++ /dev/null @@ -1,124 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.service; - -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.channel.alipay.dao.AliPaymentManager; -import cn.bootx.platform.daxpay.core.channel.alipay.entity.AliPayment; -import cn.bootx.platform.daxpay.core.pay.local.AsyncPayInfoLocal; -import cn.bootx.platform.daxpay.core.payment.dao.PaymentManager; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.dto.pay.AsyncPayInfo; -import cn.bootx.platform.daxpay.dto.payment.PayChannelInfo; -import cn.bootx.platform.daxpay.dto.payment.RefundableInfo; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -/** - * 支付宝支付记录 - * 1.创建: 支付调起并支付成功后才会创建 - * 2.撤销: 关闭本地支付记录 - * 3.退款: 发起退款时记录 - * - * @author xxm - * @since 2021/2/26 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AliPaymentService { - - private final AliPaymentManager aliPaymentManager; - - private final PaymentManager paymentManager; - - /** - * 支付调起成功 更新payment中异步支付类型信息, 如果支付完成, 创建支付宝支付单 - */ - public void updatePaySuccess(Payment payment, PayWayParam payWayParam) { - AsyncPayInfo asyncPayInfo = AsyncPayInfoLocal.get(); - payment.setAsyncPayMode(true).setAsyncPayChannel(PayChannelEnum.ALI.getCode()); - List payTypeInfos = payment.getPayChannelInfo(); - List refundableInfos = payment.getRefundableInfo(); - // 清除已有的异步支付类型信息 - payTypeInfos.removeIf(payTypeInfo -> PayChannelEnum.ASYNC_TYPE_CODE.contains(payTypeInfo.getPayChannel())); - refundableInfos.removeIf(payTypeInfo -> PayChannelEnum.ASYNC_TYPE_CODE.contains(payTypeInfo.getPayChannel())); - // 更新支付宝支付类型信息 - payTypeInfos.add(new PayChannelInfo().setPayChannel(PayChannelEnum.ALI.getCode()) - .setPayWay(payWayParam.getPayWay()) - .setAmount(payWayParam.getAmount()) - .setExtraParamsJson(payWayParam.getExtraParamsJson())); - payment.setPayChannelInfo(payTypeInfos); - // 更新支付宝可退款类型信息 - refundableInfos - .add(new RefundableInfo().setPayChannel(PayChannelEnum.ALI.getCode()).setAmount(payWayParam.getAmount())); - payment.setRefundableInfo(refundableInfos); - // 如果支付完成(付款码情况) 调用 updateSyncSuccess 创建支付宝支付记录 - if (Objects.equals(payment.getPayStatus(), PayStatusCode.TRADE_SUCCESS)) { - this.createAliPayment(payment, payWayParam, asyncPayInfo.getTradeNo()); - } - } - - /** - * 更新异步支付记录成功状态, 并创建支付宝支付记录 - */ - public void updateAsyncSuccess(Long id, PayWayParam payWayParam, String tradeNo) { - // 更新支付记录 - Payment payment = paymentManager.findById(id).orElseThrow(() -> new PayFailureException("支付记录不存在")); - this.createAliPayment(payment,payWayParam,tradeNo); - } - - /** - * 创建支付宝支付记录(支付调起成功后才会创建) - */ - private void createAliPayment(Payment payment, PayWayParam payWayParam, String tradeNo) { - // 创建支付宝支付记录 - AliPayment aliPayment = new AliPayment(); - aliPayment.setTradeNo(tradeNo) - .setPaymentId(payment.getId()) - .setAmount(payWayParam.getAmount()) - .setRefundableBalance(payWayParam.getAmount()) - .setBusinessId(payment.getBusinessId()) - .setPayStatus(PayStatusCode.TRADE_SUCCESS) - .setPayTime(LocalDateTime.now()); - aliPaymentManager.save(aliPayment); - } - - /** - * 取消状态 - */ - public void updateClose(Long paymentId) { - Optional aliPaymentOptional = aliPaymentManager.findByPaymentId(paymentId); - aliPaymentOptional.ifPresent(aliPayment -> { - aliPayment.setPayStatus(PayStatusCode.TRADE_CANCEL); - aliPaymentManager.updateById(aliPayment); - }); - } - - /** - * 更新退款 - */ - public void updatePayRefund(Long paymentId, BigDecimal amount) { - Optional aliPaymentOptional = aliPaymentManager.findByPaymentId(paymentId); - aliPaymentOptional.ifPresent(payment -> { - BigDecimal refundableBalance = payment.getRefundableBalance().subtract(amount); - payment.setRefundableBalance(refundableBalance); - if (BigDecimalUtil.compareTo(refundableBalance, BigDecimal.ZERO) == 0) { - payment.setPayStatus(PayStatusCode.TRADE_REFUNDED); - } - else { - payment.setPayStatus(PayStatusCode.TRADE_REFUNDING); - } - aliPaymentManager.updateById(payment); - }); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AlipayConfigService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AlipayConfigService.java deleted file mode 100644 index 19cdbec1..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AlipayConfigService.java +++ /dev/null @@ -1,163 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.dto.LabelValue; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.code.MchAndAppCode; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.paymodel.AliPayCode; -import cn.bootx.platform.daxpay.code.paymodel.AliPayWay; -import cn.bootx.platform.daxpay.core.channel.alipay.dao.AlipayConfigManager; -import cn.bootx.platform.daxpay.core.channel.alipay.entity.AlipayConfig; -import cn.bootx.platform.daxpay.core.merchant.entity.MchAppPayConfig; -import cn.bootx.platform.daxpay.core.merchant.service.MchAppPayConfigService; -import cn.bootx.platform.daxpay.core.merchant.service.MchAppService; -import cn.bootx.platform.daxpay.dto.channel.alipay.AlipayConfigDto; -import cn.bootx.platform.daxpay.param.channel.alipay.AlipayConfigParam; -import cn.bootx.platform.daxpay.param.channel.alipay.AlipayConfigQuery; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.CharsetUtil; -import com.ijpay.alipay.AliPayApiConfig; -import com.ijpay.alipay.AliPayApiConfigKit; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -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 2020/12/15 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AlipayConfigService { - - private final AlipayConfigManager alipayConfigManager; - - private final MchAppService mchAppService; - - private final MchAppPayConfigService appPayConfigService; - - /** - * 添加支付宝配置 - */ - @Transactional(rollbackFor = Exception.class) - public void add(AlipayConfigParam param) { - // 是否有管理关系判断 - if (!mchAppService.checkMatch(param.getMchCode(), param.getMchAppCode())) { - throw new BizException("应用信息与商户信息不匹配"); - } - AlipayConfig alipayConfig = AlipayConfig.init(param); - alipayConfig.setState(MchAndAppCode.PAY_CONFIG_STATE_NORMAL); - alipayConfigManager.save(alipayConfig); - - // 保存关联关系 - MchAppPayConfig mchAppPayConfig = new MchAppPayConfig().setAppCode(alipayConfig.getMchAppCode()) - .setConfigId(alipayConfig.getId()) - .setChannel(PayChannelEnum.ALI.getCode()) - .setState(alipayConfig.getState()); - appPayConfigService.add(mchAppPayConfig); - } - - /** - * 修改 - */ - @Transactional(rollbackFor = Exception.class) - public void update(AlipayConfigParam param) { - AlipayConfig alipayConfig = alipayConfigManager.findById(param.getId()).orElseThrow(DataNotExistException::new); - BeanUtil.copyProperties(param, alipayConfig, CopyOptions.create().ignoreNullValue()); - // 支付方式 - if (CollUtil.isNotEmpty(param.getPayWayList())) { - alipayConfig.setPayWays(String.join(",", param.getPayWayList())); - } - else { - alipayConfig.setPayWays(null); - } - alipayConfigManager.updateById(alipayConfig); - } - - /** - * 获取 - */ - public AlipayConfigDto findById(Long id) { - return alipayConfigManager.findById(id).map(AlipayConfig::toDto).orElseThrow(DataNotExistException::new); - } - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, AlipayConfigQuery param) { - return MpUtil.convert2DtoPageResult(alipayConfigManager.page(pageParam, param)); - } - - /** - * 支付宝支持支付方式 - */ - public List findPayWayList() { - return AliPayWay.getPayWays() - .stream() - .map(e -> new LabelValue(e.getName(),e.getCode())) - .collect(Collectors.toList()); - } - - /** - * 初始化IJPay服务,通过商户应用AppCode获取支付配置 - */ - public void initApiConfigByMchAppCode(String mchAppCode){ - val alipayConfig = alipayConfigManager.findByMchAppCode(mchAppCode) - .orElseThrow(() -> new DataNotExistException("支付配置不存在")); - this.initApiConfig(alipayConfig); - } - - /** - * 初始化IJPay服务 - */ - @SneakyThrows - public void initApiConfig(AlipayConfig alipayConfig) { - - AliPayApiConfig aliPayApiConfig; - // 公钥 - if (Objects.equals(alipayConfig.getAuthType(), AliPayCode.AUTH_TYPE_KEY)) { - aliPayApiConfig = AliPayApiConfig.builder() - .setAppId(alipayConfig.getAppId()) - .setPrivateKey(alipayConfig.getPrivateKey()) - .setAliPayPublicKey(alipayConfig.getAlipayPublicKey()) - .setCharset(CharsetUtil.UTF_8) - .setServiceUrl(alipayConfig.getServerUrl()) - .setSignType(alipayConfig.getSignType()) - .build(); - } - // 证书 - else if (Objects.equals(alipayConfig.getAuthType(), AliPayCode.AUTH_TYPE_CART)) { - aliPayApiConfig = AliPayApiConfig.builder() - .setAppId(alipayConfig.getAppId()) - .setPrivateKey(alipayConfig.getPrivateKey()) - .setAppCertContent(alipayConfig.getAppCert()) - .setAliPayCertContent(alipayConfig.getAlipayCert()) - .setAliPayRootCertContent(alipayConfig.getAlipayRootCert()) - .setCharset(CharsetUtil.UTF_8) - .setServiceUrl(alipayConfig.getServerUrl()) - .setSignType(alipayConfig.getSignType()) - .buildByCertContent(); - } - else { - throw new BizException("支付宝认证方式不可为空"); - } - AliPayApiConfigKit.setThreadLocalAliPayApiConfig(aliPayApiConfig); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AlipaySyncService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AlipaySyncService.java deleted file mode 100644 index 36aac15b..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/alipay/service/AlipaySyncService.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.alipay.service; - -import cn.bootx.platform.daxpay.code.pay.PaySyncStatus; -import cn.bootx.platform.daxpay.code.paymodel.AliPayCode; -import cn.bootx.platform.daxpay.core.sync.result.PaySyncResult; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.hutool.json.JSONUtil; -import com.alipay.api.AlipayApiException; -import com.alipay.api.domain.AlipayTradeQueryModel; -import com.alipay.api.response.AlipayTradeQueryResponse; -import com.ijpay.alipay.AliPayApi; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Objects; - -/** - * 支付宝同步 - * - * @author xxm - * @since 2021/5/17 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AlipaySyncService { - - /** - * 与支付宝网关同步状态 1 远程支付成功 2 交易创建,等待买家付款 3 超时关闭 4 查询不到 5 查询失败 - */ - public PaySyncResult syncPayStatus(Payment payment) { - PaySyncResult paySyncResult = new PaySyncResult().setPaySyncStatus(PaySyncStatus.FAIL); - - // 查询 - try { - AlipayTradeQueryModel queryModel = new AlipayTradeQueryModel(); - queryModel.setOutTradeNo(String.valueOf(payment.getId())); - // 查询退款参数 - AlipayTradeQueryResponse response = AliPayApi.tradeQueryToResponse(queryModel); - String tradeStatus = response.getTradeStatus(); - paySyncResult.setJson(JSONUtil.toJsonStr(response)); - // 支付完成 - if (Objects.equals(tradeStatus, AliPayCode.PAYMENT_TRADE_SUCCESS) - || Objects.equals(tradeStatus, AliPayCode.PAYMENT_TRADE_FINISHED)) { - - HashMap map = new HashMap<>(1); - map.put(AliPayCode.TRADE_NO, response.getTradeNo()); - return paySyncResult.setPaySyncStatus(PaySyncStatus.TRADE_SUCCESS).setMap(map); - } - // 待支付 - if (Objects.equals(tradeStatus, AliPayCode.PAYMENT_WAIT_BUYER_PAY)) { - return paySyncResult.setPaySyncStatus(PaySyncStatus.WAIT_BUYER_PAY); - } - // 已关闭 - if (Objects.equals(tradeStatus, AliPayCode.PAYMENT_TRADE_CLOSED)) { - return paySyncResult.setPaySyncStatus(PaySyncStatus.TRADE_CLOSED); - } - // 未找到 - if (Objects.equals(response.getSubCode(), AliPayCode.ACQ_TRADE_NOT_EXIST)) { - return paySyncResult.setPaySyncStatus(PaySyncStatus.NOT_FOUND); - } - // 退款 支付宝查不到 - - } - catch (AlipayApiException e) { - log.error("查询订单失败:", e); - paySyncResult.setMsg(e.getErrMsg()); - } - return paySyncResult; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/base/entity/BasePayment.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/base/entity/BasePayment.java deleted file mode 100644 index 81421d15..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/base/entity/BasePayment.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.base.entity; - -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 基础支付记录类 - * - * @author xxm - * @since 2021/2/25 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -public class BasePayment extends MpBaseEntity { - - /** 交易记录ID */ - @DbMySqlIndex(comment = "交易记录ID") - private Long paymentId; - - /** 交易金额 */ - @DbColumn(comment = "交易金额") - private BigDecimal amount; - - /** 可退款金额 */ - @DbColumn(comment = "可退款金额") - private BigDecimal refundableBalance; - - /** 关联的业务id */ - @DbMySqlIndex(comment = "业务id索引") - @DbColumn(comment = "关联的业务id") - private String businessId; - - /** - * 支付状态 - * @see PayStatusCode#TRADE_PROGRESS - */ - @DbColumn(comment = "支付状态") - private String payStatus; - - /** 支付时间 */ - @DbColumn(comment = "支付时间") - private LocalDateTime payTime; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/dao/CashPaymentManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/dao/CashPaymentManager.java deleted file mode 100644 index bc23d52a..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/dao/CashPaymentManager.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.cash.dao; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.channel.cash.entity.CashPayment; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 现金支付 - * - * @author xxm - * @since 2021/6/23 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class CashPaymentManager extends BaseManager { - - public Optional findByPaymentId(Long paymentId) { - return findByField(CashPayment::getPaymentId, paymentId); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/dao/CashPaymentMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/dao/CashPaymentMapper.java deleted file mode 100644 index 141b1138..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/dao/CashPaymentMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.cash.dao; - -import cn.bootx.platform.daxpay.core.channel.cash.entity.CashPayment; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 现金支付 - * - * @author xxm - * @since 2021/6/23 - */ -@Mapper -public interface CashPaymentMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/entity/CashPayment.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/entity/CashPayment.java deleted file mode 100644 index 7d8bfc42..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/entity/CashPayment.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.cash.entity; - -import cn.bootx.platform.daxpay.core.channel.base.entity.BasePayment; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 现金支付记录 - * - * @author xxm - * @since 2021/6/23 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("pay_cash_payment") -@Accessors(chain = true) -public class CashPayment extends BasePayment { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/service/CashService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/service/CashService.java deleted file mode 100644 index 0294f6cb..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/cash/service/CashService.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.cash.service; - -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.channel.cash.dao.CashPaymentManager; -import cn.bootx.platform.daxpay.core.channel.cash.entity.CashPayment; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.util.Optional; - -/** - * 现金支付 - * - * @author xxm - * @since 2021/6/23 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CashService { - - private final CashPaymentManager cashPaymentManager; - - /** - * 支付 - */ - public void pay(PayWayParam payMode, Payment payment, PayParam payParam) { - CashPayment walletPayment = new CashPayment(); - walletPayment.setPaymentId(payment.getId()) - .setBusinessId(payParam.getBusinessId()) - .setAmount(payMode.getAmount()) - .setRefundableBalance(payMode.getAmount()) - .setPayStatus(payment.getPayStatus()); - cashPaymentManager.save(walletPayment); - } - - /** - * 关闭 - */ - public void close(Long paymentId) { - Optional cashPaymentOpt = cashPaymentManager.findByPaymentId(paymentId); - cashPaymentOpt.ifPresent(cashPayment -> { - cashPayment.setPayStatus(PayStatusCode.TRADE_CANCEL); - cashPaymentManager.updateById(cashPayment); - }); - } - - /** - * 退款 - */ - public void refund(Long paymentId, BigDecimal amount) { - Optional cashPayment = cashPaymentManager.findByPaymentId(paymentId); - cashPayment.ifPresent(payment -> { - BigDecimal refundableBalance = payment.getRefundableBalance().subtract(amount); - if (BigDecimalUtil.compareTo(refundableBalance, BigDecimal.ZERO) == 0) { - payment.setPayStatus(PayStatusCode.TRADE_REFUNDED); - } - else { - payment.setPayStatus(PayStatusCode.TRADE_REFUNDING); - } - cashPaymentManager.updateById(payment); - }); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/convert/PayChannelConfigConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/convert/PayChannelConfigConvert.java deleted file mode 100644 index 5c6382a1..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/convert/PayChannelConfigConvert.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.config.convert; - -import cn.bootx.platform.daxpay.core.channel.config.entity.PayChannelConfig; -import cn.bootx.platform.daxpay.dto.channel.config.PayChannelConfigDto; -import cn.bootx.platform.daxpay.param.channel.config.PayChannelConfigParam; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 支付渠道配置 - * - * @author xxm - * @since 2023-05-24 - */ -@Mapper -public interface PayChannelConfigConvert { - - PayChannelConfigConvert CONVERT = Mappers.getMapper(PayChannelConfigConvert.class); - - PayChannelConfig convert(PayChannelConfigParam in); - - PayChannelConfigDto convert(PayChannelConfig in); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/dao/PayChannelConfigManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/dao/PayChannelConfigManager.java deleted file mode 100644 index c333b76b..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/dao/PayChannelConfigManager.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.config.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.common.query.generator.QueryGenerator; -import cn.bootx.platform.daxpay.core.channel.config.entity.PayChannelConfig; -import cn.bootx.platform.daxpay.param.channel.config.PayChannelConfigParam; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.List; - -/** - * 支付渠道配置 - * - * @author xxm - * @since 2023-05-24 - */ -@Repository -@RequiredArgsConstructor -public class PayChannelConfigManager extends BaseManager { - - /** - * 分页 - */ - public Page page(PageParam pageParam, PayChannelConfigParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, PayChannelConfig.class); - QueryWrapper wrapper = QueryGenerator.generator(param, this.getEntityClass()); - wrapper.select(this.getEntityClass(), MpUtil::excludeBigField) - .orderByDesc(MpUtil.getColumnName(PayChannelConfig::getId)); - return this.page(mpPage, wrapper); - } - - /** - * 查询全部并排序 - */ - public List findAllByOrder() { - return lambdaQuery().orderByAsc(PayChannelConfig::getSortNo).list(); - } - - public boolean existsByCode(String code) { - return existedByField(PayChannelConfig::getCode, code); - } - - public boolean existsByCode(String code, Long id) { - return lambdaQuery().eq(PayChannelConfig::getCode, code).ne(MpIdEntity::getId, id).exists(); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/dao/PayChannelConfigMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/dao/PayChannelConfigMapper.java deleted file mode 100644 index c5bfba0a..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/dao/PayChannelConfigMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.config.dao; - -import cn.bootx.platform.daxpay.core.channel.config.entity.PayChannelConfig; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 支付渠道配置 - * - * @author xxm - * @since 2023-05-24 - */ -@Mapper -public interface PayChannelConfigMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/entity/PayChannelConfig.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/entity/PayChannelConfig.java deleted file mode 100644 index fa0c0487..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/entity/PayChannelConfig.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.config.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.daxpay.core.channel.config.convert.PayChannelConfigConvert; -import cn.bootx.platform.daxpay.dto.channel.config.PayChannelConfigDto; -import cn.bootx.platform.daxpay.param.channel.config.PayChannelConfigParam; -import cn.bootx.table.modify.annotation.DbColumn; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 支付渠道配置 - * - * @author xxm - * @since 2023-05-24 - */ -@EqualsAndHashCode(callSuper = true) -@Data -//@DbTable(comment = "支付渠道配置") -@Accessors(chain = true) -@TableName("pay_channel_config") -public class PayChannelConfig extends MpBaseEntity implements EntityBaseFunction { - - /** 渠道编码 */ - @DbColumn(comment = "渠道编码") - private String code; - - /** 渠道名称 */ - @DbColumn(comment = "渠道名称") - private String name; - - /** 图片 */ - @DbColumn(comment = "图片") - private Long image; - - /** 排序 */ - @DbColumn(comment = "排序") - private Double sortNo; - - /** 创建对象 */ - public static PayChannelConfig init(PayChannelConfigParam in) { - return PayChannelConfigConvert.CONVERT.convert(in); - } - - /** 转换成dto */ - @Override - public PayChannelConfigDto toDto() { - return PayChannelConfigConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/service/PayChannelConfigService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/service/PayChannelConfigService.java deleted file mode 100644 index cd4ef7a0..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/config/service/PayChannelConfigService.java +++ /dev/null @@ -1,92 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.config.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.channel.config.dao.PayChannelConfigManager; -import cn.bootx.platform.daxpay.core.channel.config.entity.PayChannelConfig; -import cn.bootx.platform.daxpay.dto.channel.config.PayChannelConfigDto; -import cn.bootx.platform.daxpay.param.channel.config.PayChannelConfigParam; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * 支付渠道配置 - * - * @author xxm - * @since 2023-05-24 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayChannelConfigService { - - private final PayChannelConfigManager configManager; - - /** - * 添加 - */ - public void add(PayChannelConfigParam param) { - PayChannelConfig payChannelConfig = PayChannelConfig.init(param); - // 编码不能重复 - if (configManager.existedByField(PayChannelConfig::getCode, param.getCode())) { - throw new BizException("编码已存在"); - } - configManager.save(payChannelConfig); - } - - /** - * 修改 - */ - public void update(PayChannelConfigParam param) { - PayChannelConfig payChannelConfig = configManager.findById(param.getId()) - .orElseThrow(DataNotExistException::new); - // 编码不能重复 - if (configManager.existedByField(PayChannelConfig::getCode, param.getCode(), param.getId())) { - throw new BizException("编码已存在"); - } - BeanUtil.copyProperties(param, payChannelConfig, CopyOptions.create().ignoreNullValue()); - configManager.updateById(payChannelConfig); - } - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, PayChannelConfigParam payChannelConfigParam) { - return MpUtil.convert2DtoPageResult(configManager.page(pageParam, payChannelConfigParam)); - } - - /** - * 编码是否已经存在 - */ - public boolean existsByCode(String code) { - return configManager.existsByCode(code); - } - - /** - * 编码是否已经存在(不包含自身) - */ - public boolean existsByCode(String code, Long id) { - return configManager.existsByCode(code, id); - } - - /** - * 获取单条 - */ - public PayChannelConfigDto findById(Long id) { - return configManager.findById(id).map(PayChannelConfig::toDto).orElseThrow(DataNotExistException::new); - } - - /** - * 删除 - */ - public void delete(Long id) { - configManager.deleteById(id); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/convert/UnionPayConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/convert/UnionPayConvert.java deleted file mode 100644 index 4f697cb3..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/convert/UnionPayConvert.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.union.convert; - -import cn.bootx.platform.daxpay.core.channel.union.entity.UnionPayConfig; -import cn.bootx.platform.daxpay.dto.channel.union.UnionPayConfigDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * @author xxm - * @since 2022/3/11 - */ -@Mapper -public interface UnionPayConvert { - - UnionPayConvert CONVERT = Mappers.getMapper(UnionPayConvert.class); - - UnionPayConfigDto convert(UnionPayConfig in); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPayConfigManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPayConfigManager.java deleted file mode 100644 index 6bded1d8..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPayConfigManager.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.union.dao; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.channel.union.entity.UnionPayConfig; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -/** - * @author xxm - * @since 2022/3/11 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class UnionPayConfigManager extends BaseManager { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPayConfigMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPayConfigMapper.java deleted file mode 100644 index 9a65f795..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPayConfigMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.union.dao; - -import cn.bootx.platform.daxpay.core.channel.union.entity.UnionPayConfig; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author xxm - * @since 2022/3/11 - */ -@Mapper -public interface UnionPayConfigMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPaymentManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPaymentManager.java deleted file mode 100644 index 84e0af5b..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPaymentManager.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.union.dao; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.channel.union.entity.UnionPayment; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -/** - * @author xxm - * @since 2022/3/11 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class UnionPaymentManager extends BaseManager { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPaymentMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPaymentMapper.java deleted file mode 100644 index 455d9d77..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/dao/UnionPaymentMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.union.dao; - -import cn.bootx.platform.daxpay.core.channel.union.entity.UnionPayment; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author xxm - * @since 2022/3/11 - */ -@Mapper -public interface UnionPaymentMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/entity/UnionPayConfig.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/entity/UnionPayConfig.java deleted file mode 100644 index 3910dc7b..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/entity/UnionPayConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.union.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.daxpay.core.channel.union.convert.UnionPayConvert; -import cn.bootx.platform.daxpay.dto.channel.union.UnionPayConfigDto; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 云闪付 - * - * @author xxm - * @since 2022/3/11 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("pay_union_pay_config") -public class UnionPayConfig extends MpBaseEntity implements EntityBaseFunction { - - @Override - public UnionPayConfigDto toDto() { - return UnionPayConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/entity/UnionPayment.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/entity/UnionPayment.java deleted file mode 100644 index dcd7b1b6..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/entity/UnionPayment.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.union.entity; - -import cn.bootx.platform.daxpay.core.channel.base.entity.BasePayment; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * @author xxm - * @since 2022/3/11 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("pay_union_payment") -public class UnionPayment extends BasePayment { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/service/UnionPayConfigService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/service/UnionPayConfigService.java deleted file mode 100644 index 27d60b82..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/service/UnionPayConfigService.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.union.service; - -import cn.bootx.platform.daxpay.core.channel.union.dao.UnionPayConfigManager; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * @author xxm - * @since 2022/3/11 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class UnionPayConfigService { - - private final UnionPayConfigManager unionPayConfigManager; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/service/UnionPaymentService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/service/UnionPaymentService.java deleted file mode 100644 index 0305898f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/service/UnionPaymentService.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.union.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * @author xxm - * @since 2022/3/11 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class UnionPaymentService { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/convert/VoucherConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/convert/VoucherConvert.java deleted file mode 100644 index ae311033..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/convert/VoucherConvert.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.convert; - -import cn.bootx.platform.daxpay.core.channel.voucher.entity.Voucher; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherLog; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherPayment; -import cn.bootx.platform.daxpay.dto.channel.voucher.VoucherDto; -import cn.bootx.platform.daxpay.dto.channel.voucher.VoucherLogDto; -import cn.bootx.platform.daxpay.dto.channel.voucher.VoucherPaymentDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * @author xxm - * @since 2022/3/14 - */ -@Mapper -public interface VoucherConvert { - - VoucherConvert CONVERT = Mappers.getMapper(VoucherConvert.class); - - VoucherDto convert(Voucher in); - - VoucherLogDto convert(VoucherLog in); - - VoucherPaymentDto convert(VoucherPayment in); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherLogManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherLogManager.java deleted file mode 100644 index 927c120d..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherLogManager.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherLog; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -/** - * @author xxm - * @since 2022/3/19 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class VoucherLogManager extends BaseManager { - - /** - * 根据储值卡id进行分页 - */ - public Page pageByVoucherId(PageParam pageParam, Long voucherId) { - Page mpPage = MpUtil.getMpPage(pageParam,VoucherLog.class); - return lambdaQuery() - .eq(VoucherLog::getVoucherId, voucherId) - .orderByDesc(MpIdEntity::getId) - .page(mpPage); - - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherLogMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherLogMapper.java deleted file mode 100644 index 7c89a04c..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherLogMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.dao; - -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherLog; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author xxm - * @since 2022/3/19 - */ -@Mapper -public interface VoucherLogMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherManager.java deleted file mode 100644 index 82452839..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherManager.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpDelEntity; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.Voucher; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherParam; -import cn.bootx.platform.starter.auth.util.SecurityUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -/** - * @author xxm - * @since 2022/3/14 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class VoucherManager extends BaseManager { - - /** - * 分页 - */ - public Page page(PageParam pageParam, VoucherParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, Voucher.class); - return this.lambdaQuery() - .ge(Objects.nonNull(param.getStartTime()), Voucher::getStartTime, param.getStartTime()) - .le(Objects.nonNull(param.getEndTime()), Voucher::getEndTime, param.getEndTime()) - .eq(Objects.nonNull(param.getEnduring()), Voucher::isEnduring, param.getEnduring()) - .like(StrUtil.isNotBlank(param.getCardNo()), Voucher::getCardNo, param.getCardNo()) - .like(Objects.nonNull(param.getBatchNo()), Voucher::getBatchNo, param.getBatchNo()) - .orderByDesc(MpIdEntity::getId) - .page(mpPage); - } - - /** - * 根据卡号查询 - */ - public Optional findByCardNo(String cardNo) { - return this.findByField(Voucher::getCardNo, cardNo); - } - - /** - * 根据卡号查询 - */ - public List findByCardNoList(List cardNos) { - return this.findAllByFields(Voucher::getCardNo, cardNos); - } - - /** - * 更改状态 - */ - public void changeStatus(Long id, String status) { - Long userIdOrDefaultId = SecurityUtil.getUserIdOrDefaultId(); - this.lambdaUpdate().eq(MpIdEntity::getId, id) - .set(MpDelEntity::getLastModifiedTime, LocalDateTime.now()) - .set(MpDelEntity::getLastModifier,userIdOrDefaultId) - .set(Voucher::getStatus, status).update(); - - } - - /** - * 批量更改状态 - */ - public void changeStatusBatch(List ids, String status) { - Long userIdOrDefaultId = SecurityUtil.getUserIdOrDefaultId(); - this.lambdaUpdate().in(MpIdEntity::getId, ids) - .set(MpDelEntity::getLastModifiedTime, LocalDateTime.now()) - .set(MpDelEntity::getLastModifier,userIdOrDefaultId) - .set(Voucher::getStatus, status).update(); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherMapper.java deleted file mode 100644 index 63e52bc7..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.dao; - -import cn.bootx.platform.daxpay.core.channel.voucher.entity.Voucher; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author xxm - * @since 2022/3/14 - */ -@Mapper -public interface VoucherMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherPaymentManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherPaymentManager.java deleted file mode 100644 index d7fb54e9..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherPaymentManager.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.dao; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherPayment; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * @author xxm - * @since 2022/3/14 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class VoucherPaymentManager extends BaseManager { - - /** - * 根据支付id - */ - public Optional findByPaymentId(Long paymentId) { - return this.findByField(VoucherPayment::getPaymentId, paymentId); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherPaymentMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherPaymentMapper.java deleted file mode 100644 index dc337a69..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/dao/VoucherPaymentMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.dao; - -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherPayment; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author xxm - * @since 2022/3/14 - */ -@Mapper -public interface VoucherPaymentMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/Voucher.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/Voucher.java deleted file mode 100644 index 7743de48..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/Voucher.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.daxpay.code.paymodel.VoucherCode; -import cn.bootx.platform.daxpay.core.channel.voucher.convert.VoucherConvert; -import cn.bootx.platform.daxpay.dto.channel.voucher.VoucherDto; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.annotation.DbComment; -import cn.bootx.table.modify.annotation.DbTable; -import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 储值卡 - * - * @author xxm - * @since 2022/3/14 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@DbTable(comment = "储值卡") -@Accessors(chain = true) -@TableName("pay_voucher") -public class Voucher extends MpBaseEntity implements EntityBaseFunction { - - /** 商户编码 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - @DbColumn(comment = "商户编码") - private String mchCode; - - /** 商户应用编码 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - @DbColumn(comment = "商户应用编码") - private String mchAppCode; - - /** 卡号 */ - @DbComment("卡号") - @DbMySqlIndex(comment = "卡号索引") - private String cardNo; - - /** 生成批次号 */ - @DbComment("生成批次号") - private Long batchNo; - - /** 面值 */ - @DbComment("面值") - private BigDecimal faceValue; - - /** 余额 */ - @DbComment("余额") - private BigDecimal balance; - - /** 预冻结额度 */ - @DbColumn(comment = "预冻结额度") - private BigDecimal freezeBalance; - - - /** 是否长期有效 */ - @DbComment("是否长期有效") - private boolean enduring; - - /** 开始时间 */ - @DbComment("开始时间") - private LocalDateTime startTime; - - /** 结束时间 */ - @DbComment("结束时间") - private LocalDateTime endTime; - - /** - * 状态 - * @see VoucherCode#STATUS_FORBIDDEN - */ - @DbComment("状态") - private String status; - - @Override - public VoucherDto toDto() { - return VoucherConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/VoucherLog.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/VoucherLog.java deleted file mode 100644 index d39da81c..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/VoucherLog.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.daxpay.code.paymodel.VoucherCode; -import cn.bootx.platform.daxpay.core.channel.voucher.convert.VoucherConvert; -import cn.bootx.platform.daxpay.dto.channel.voucher.VoucherLogDto; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 储值卡日志 - * - * @author xxm - * @since 2022/3/17 - */ -@EqualsAndHashCode(callSuper = true) -@Data -//@DbTable(comment = "储值卡日志") -@Accessors(chain = true) -@TableName("pay_voucher_log") -public class VoucherLog extends MpBaseEntity implements EntityBaseFunction { - - /** 储值卡id */ - @DbMySqlIndex(comment = "储值卡ID") - @DbColumn(comment = "储值卡id") - private Long voucherId; - - /** 储值卡号 */ - @DbColumn(comment = "储值卡号") - private String voucherNo; - - /** 金额 */ - @DbColumn(comment = "金额") - private BigDecimal amount; - - /** - * 类型 - * @see VoucherCode#LOG_PAY - */ - @DbColumn(comment = "类型") - private String type; - - /** 交易记录ID */ - @DbColumn(comment = "交易记录ID") - private Long paymentId; - - /** 业务ID */ - @DbColumn(comment = "业务ID") - private String businessId; - - /** 备注 */ - @DbColumn(comment = "备注") - private String remark; - - /** - * 转换 - */ - @Override - public VoucherLogDto toDto() { - return VoucherConvert.CONVERT.convert(this); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/VoucherPayment.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/VoucherPayment.java deleted file mode 100644 index 64e41756..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/VoucherPayment.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.handler.JacksonRawTypeHandler; -import cn.bootx.platform.daxpay.core.channel.base.entity.BasePayment; -import cn.bootx.platform.daxpay.core.channel.voucher.convert.VoucherConvert; -import cn.bootx.platform.daxpay.dto.channel.voucher.VoucherPaymentDto; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.mysql.annotation.DbMySqlFieldType; -import cn.bootx.table.modify.mysql.constants.MySqlFieldTypeEnum; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.util.List; - -/** - * 储值卡支付记录 - * - * @author xxm - * @since 2022/3/14 - */ -@EqualsAndHashCode(callSuper = true) -@Data -//@DbTable(comment = "储值卡支付记录") -@Accessors(chain = true) -@TableName(value = "pay_voucher_payment",autoResultMap = true) -public class VoucherPayment extends BasePayment implements EntityBaseFunction { - - /** 储值卡扣款记录列表 */ - @DbColumn(comment = "储值卡扣款列表") - @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) - @TableField(typeHandler = JacksonRawTypeHandler.class) - private List voucherRecords; - - - @Override - public VoucherPaymentDto toDto() { - return VoucherConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/VoucherRecord.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/VoucherRecord.java deleted file mode 100644 index fec3c3c5..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/entity/VoucherRecord.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.entity; - -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 储值卡扣款记录列表 - * @author xxm - * @since 2023/6/29 - */ -@Data -@Accessors(chain = true) -public class VoucherRecord { - - /** 卡号 */ - private String cardNo; - - /** 扣款金额 */ - private BigDecimal amount; -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherLogService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherLogService.java deleted file mode 100644 index 378b8bea..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherLogService.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.service; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.channel.voucher.dao.VoucherLogManager; -import cn.bootx.platform.daxpay.dto.channel.voucher.VoucherLogDto; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * 储值卡日志 - * - * @author xxm - * @since 2022/3/19 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class VoucherLogService { - - private final VoucherLogManager voucherLogManager; - - /** - * 储值卡日志分页 - */ - public PageResult pageByVoucherId(PageParam pageParam, Long voucherId){ - return MpUtil.convert2DtoPageResult(voucherLogManager.pageByVoucherId(pageParam,voucherId)); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPayService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPayService.java deleted file mode 100644 index c0b3d9a5..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPayService.java +++ /dev/null @@ -1,388 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.service; - -import cn.bootx.platform.common.core.function.CollectorsFunction; -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.daxpay.code.paymodel.VoucherCode; -import cn.bootx.platform.daxpay.core.channel.voucher.dao.VoucherLogManager; -import cn.bootx.platform.daxpay.core.channel.voucher.dao.VoucherManager; -import cn.bootx.platform.daxpay.core.channel.voucher.dao.VoucherPaymentManager; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.Voucher; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherLog; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherPayment; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherRecord; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherPayParam; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherRefundParam; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONException; -import cn.hutool.json.JSONUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * 储值卡支付 - * - * @author xxm - * @since 2022/3/14 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class VoucherPayService { - - private final VoucherManager voucherManager; - - private final VoucherPaymentManager voucherPaymentManager; - - private final VoucherLogManager voucherLogManager; - - private final VoucherQueryService voucherQueryService; - - /** - * 获取并检查储值卡 - */ - public List getAndCheckVoucher(PayWayParam payWayParam) { - VoucherPayParam voucherPayParam; - try { - // 储值卡参数验证 - String extraParamsJson = payWayParam.getExtraParamsJson(); - if (StrUtil.isNotBlank(extraParamsJson)) { - voucherPayParam = JSONUtil.toBean(extraParamsJson, VoucherPayParam.class); - } else { - throw new PayFailureException("储值卡支付参数错误"); - } - } - catch (JSONException e) { - throw new PayFailureException("储值卡支付参数错误"); - } - - List cardNoList = voucherPayParam.getCardNoList(); - List vouchers = voucherManager.findByCardNoList(cardNoList); - - - // 判断是否有重复or无效的储值卡 - if (vouchers.size() != cardNoList.size()) { - throw new PayFailureException("储值卡支付参数错误"); - } - // 卡信息校验 - String timeCheck = voucherQueryService.check(vouchers); - if (StrUtil.isNotBlank(timeCheck)) { - throw new PayFailureException(timeCheck); - } - // 金额是否满足 - BigDecimal amount = vouchers.stream().map(Voucher::getBalance).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - if (BigDecimalUtil.compareTo(amount, payWayParam.getAmount()) < 0) { - throw new PayFailureException("储值卡余额不足"); - } - - return sort(vouchers); - } - - /** - * 支付前冻结余额 (异步组合支付环境下) - */ - public List freezeBalance(BigDecimal amount, Payment payment, List vouchers){ - List voucherLogs = new ArrayList<>(); - List voucherRecords = new ArrayList<>(); - for (Voucher voucher : vouchers) { - // 待支付余额为零, 不在处理后面的储值卡 - if (BigDecimalUtil.compareTo(amount, BigDecimal.ZERO) < 1) { - break; - } - BigDecimal balance = voucher.getBalance(); - // 日志 - VoucherLog voucherLog = new VoucherLog() - .setPaymentId(payment.getId()) - .setBusinessId(payment.getBusinessId()) - .setType(VoucherCode.LOG_FREEZE_BALANCE) - .setRemark(String.format("预冻结金额 %.2f ", amount)) - .setVoucherId(voucher.getId()) - .setVoucherNo(voucher.getCardNo()); - - // 待支付额大于储值卡余额. 储值卡的金额全冻结 - if (BigDecimalUtil.compareTo(amount, balance) == 1) { - voucher.setFreezeBalance(balance); - voucherLog.setAmount(balance); - // 剩余待支付的金额 - amount = amount.subtract(balance); - } - else { - // 待支付额小于或储值卡余额, 冻结待支付的金额 - voucher.setFreezeBalance(amount); - voucherLog.setAmount(amount); - // 待支付的金额扣减完毕, 值设置为零 - amount = BigDecimal.ZERO; - } - voucherRecords.add(new VoucherRecord().setCardNo(voucher.getCardNo()).setAmount(voucher.getFreezeBalance())); - voucherLogs.add(voucherLog); - } - voucherManager.updateAllById(vouchers); - voucherLogManager.saveAll(voucherLogs); - return voucherRecords; - } - - /** - * 支付成功, 对冻结的金额进行扣款 (异步组合支付环境下) - */ - public void paySuccess(Long paymentId){ - voucherPaymentManager.findByPaymentId(paymentId).ifPresent(voucherPayment -> { - List voucherRecords = voucherPayment.getVoucherRecords(); - - List cardNoList = voucherRecords.stream() - .map(VoucherRecord::getCardNo) - .collect(Collectors.toList()); - List vouchers = voucherManager.findByCardNoList(cardNoList); - List voucherLogs = new ArrayList<>(); - for (Voucher voucher : vouchers) { - // 余额扣减 - voucher.setBalance(voucher.getBalance().subtract(voucher.getFreezeBalance())) - .setFreezeBalance(BigDecimal.ZERO); - // 日志 - VoucherLog voucherLog = new VoucherLog() - .setPaymentId(voucherPayment.getPaymentId()) - .setBusinessId(voucherPayment.getBusinessId()) - .setType(VoucherCode.LOG_REDUCE_AND_UNFREEZE_BALANCE) - .setRemark(String.format("扣款金额 %.2f ", voucherPayment.getAmount())) - .setVoucherId(voucher.getId()) - .setAmount(voucher.getFreezeBalance()) - .setVoucherNo(voucher.getCardNo()); - voucherLogs.add(voucherLog); - } - voucherManager.updateAllById(vouchers); - voucherLogManager.saveAll(voucherLogs); - }); - } - - /** - * 直接支付 (同步支付方式下) - */ - @Transactional(rollbackFor = Exception.class) - public List pay(BigDecimal amount, Payment payment, List vouchers) { - List voucherLogs = new ArrayList<>(); - List voucherRecords = new ArrayList<>(); - for (Voucher voucher : vouchers) { - // 待支付余额为零, 不在处理后面的储值卡 - if (BigDecimalUtil.compareTo(amount, BigDecimal.ZERO) < 1) { - break; - } - BigDecimal balance = voucher.getBalance(); - // 日志 - VoucherLog voucherLog = new VoucherLog() - .setPaymentId(payment.getId()) - .setBusinessId(payment.getBusinessId()) - .setType(VoucherCode.LOG_PAY) - .setRemark(String.format("支付金额 %.2f ", amount)) - .setVoucherId(voucher.getId()) - .setVoucherNo(voucher.getCardNo()); - - // 记录当前卡扣了多少钱 - BigDecimal amountRecord; - // 待支付额大于储值卡余额. 储值卡金额全扣光 - if (BigDecimalUtil.compareTo(amount, balance) == 1) { - amountRecord = voucher.getBalance(); - voucher.setBalance(BigDecimal.ZERO); - voucherLog.setAmount(balance); - amount = amount.subtract(balance); - } - else { - // 待支付额小于或储值卡余额, 储值卡余额-待支付额 - amountRecord = balance.subtract(amount); - voucher.setBalance(balance.subtract(amount)); - voucherLog.setAmount(amount); - // 支付完毕, 待支付金额归零 - amount = BigDecimal.ZERO; - } - voucherLogs.add(voucherLog); - voucherRecords.add(new VoucherRecord().setCardNo(voucher.getCardNo()).setAmount(amountRecord)); - } - voucherManager.updateAllById(vouchers); - voucherLogManager.saveAll(voucherLogs); - return voucherRecords; - } - - - /** - * 取消支付,解除冻结的额度, 只有在异步支付中才会发生取消操作 - */ - public void close(Long paymentId) { - voucherPaymentManager.findByPaymentId(paymentId).ifPresent(voucherPayment -> { - List cardNoList = voucherPayment.getVoucherRecords().stream() - .map(VoucherRecord::getCardNo) - .collect(Collectors.toList()); - List vouchers = voucherManager.findByCardNoList(cardNoList); - // 解冻额度和记录日志 - List logs = new ArrayList<>(); - for (Voucher voucher : vouchers) { - VoucherLog log = new VoucherLog().setAmount(voucher.getFreezeBalance()) - .setPaymentId(paymentId) - .setBusinessId(voucherPayment.getBusinessId()) - .setVoucherId(voucher.getId()) - .setRemark(String.format("取消支付金额 %.2f ", voucher.getFreezeBalance())) - .setVoucherNo(voucher.getCardNo()) - .setType(VoucherCode.LOG_CLOSE_PAY); - logs.add(log); - } - voucherManager.updateAllById(vouchers); - voucherLogManager.saveAll(logs); - }); - } - - /** - * 退款 - * 全额退款支持分别退回到原有卡和统一退回到某张卡中, 默认退回到原有卡中 - * 部分退款, 会退到指定的一张卡上, 如果不指定, 则自动退到有效期最久的卡上 - */ - @Transactional(rollbackFor = Exception.class) - public void refund(Long paymentId, BigDecimal amount, VoucherRefundParam voucherRefundParam) { - VoucherPayment voucherPayment = voucherPaymentManager.findByPaymentId(paymentId) - .orElseThrow(() -> new PayFailureException("储值卡支付记录不存在")); - // 全部退款还是部分退款 - if (BigDecimalUtil.compareTo(amount,voucherPayment.getAmount())==0){ - // 是否全部退到一张卡中 - if (voucherRefundParam.isRefundToOne()){ - this.refundToOne(voucherPayment, voucherRefundParam.getRefundVoucherNo()); - } else { - // 退回到原有卡中 - this.refundToRaw(voucherPayment); - } - } else { - this.refundToOne(voucherPayment, voucherRefundParam.getRefundVoucherNo()); - } - } - - /** - * 全部退款到一张卡中 - */ - private void refundToOne(VoucherPayment voucherPayment, String refundVoucherNo){ - // 获取储值卡扣款信息 - List voucherRecords = voucherPayment.getVoucherRecords(); - Map voucherRecordMap = voucherRecords.stream() - .collect(Collectors.toMap(VoucherRecord::getCardNo, VoucherRecord::getAmount, CollectorsFunction::retainLatest)); - List cardNoList = voucherRecords.stream() - .map(VoucherRecord::getCardNo) - .collect(Collectors.toList()); - List vouchers = voucherManager.findByCardNoList(cardNoList); - // 如果未传入卡号, 默认退到最抗用的一张卡上 - if (StrUtil.isBlank(refundVoucherNo)){ - List sort = this.sort(vouchers); - refundVoucherNo = sort.get(sort.size()-1).getCardNo(); - } - - // 筛选出来要进行退款的卡 - String finalRefundVoucherNo = refundVoucherNo; - Voucher voucher = vouchers.stream() - .filter(vr -> Objects.equals(vr.getCardNo(), finalRefundVoucherNo)) - .findFirst() - .orElseThrow(() -> new PayFailureException("退款卡号不存在")); - // 将金额全部推到指定的卡上 - voucher.setBalance(voucher.getBalance().add(voucherPayment.getAmount())); - // 记录日志 - List voucherLogs = new ArrayList<>(); - for (Voucher v : vouchers) { - BigDecimal voucherAmount = voucherRecordMap.get(v.getCardNo()); - VoucherLog voucherLog = new VoucherLog() - .setType(VoucherCode.LOG_REFUND_SELF) - .setVoucherId(voucher.getId()) - .setVoucherNo(voucher.getCardNo()) - .setAmount(voucherAmount) - .setPaymentId(voucherPayment.getPaymentId()) - .setBusinessId(voucherPayment.getBusinessId()) - .setRemark(String.format("退款金额 %.2f, 退款到卡号: %s 储值卡中", voucherAmount, voucher.getCardNo())); - // 接收退款的卡 - if (Objects.equals(v,voucher)){ - voucherLog.setAmount(voucherPayment.getAmount()) - .setType(VoucherCode.LOG_REFUND_SELF) - .setRemark(String.format("退款金额 %.2f, 退款到卡号: %s 储值卡中", voucherAmount, voucher.getCardNo())); - } - } - voucherManager.updateById(voucher); - voucherLogManager.saveAll(voucherLogs); - } - - /** - * 退款到原有的卡中 - */ - private void refundToRaw(VoucherPayment voucherPayment){ - // 获取储值卡扣款信息 - List voucherRecords = voucherPayment.getVoucherRecords(); - List cardNoList = voucherRecords.stream() - .map(VoucherRecord::getCardNo) - .collect(Collectors.toList()); - Map voucherRecordMap = voucherRecords.stream() - .collect(Collectors.toMap(VoucherRecord::getCardNo, VoucherRecord::getAmount, CollectorsFunction::retainLatest)); - List vouchers = voucherManager.findByCardNoList(cardNoList); - - // 退款 和 记录日志 - List voucherLogs = new ArrayList<>(); - for (Voucher voucher : vouchers) { - BigDecimal voucherAmount = voucherRecordMap.get(voucher.getCardNo()); - voucher.setBalance(voucherAmount.add(voucher.getBalance())); - - voucherLogs.add(new VoucherLog() - .setType(VoucherCode.LOG_REFUND_SELF) - .setVoucherId(voucher.getId()) - .setVoucherNo(voucher.getCardNo()) - .setAmount(voucherAmount) - .setPaymentId(voucherPayment.getPaymentId()) - .setBusinessId(voucherPayment.getBusinessId()) - .setRemark(String.format("退款金额 %.2f ", voucherAmount))); - } - voucherManager.updateAllById(vouchers); - voucherLogManager.saveAll(voucherLogs); - } - - - /** - * 对储值卡进行排序 - * 有期限的在前面, 同样有期限到期时间短的在前面, 同样到期日余额小的在前面, 金额一样id小的前面 - */ - private List sort(List vouchers){ - vouchers.sort(this::compareTime); - return vouchers; - } - - /** - * 比较储值卡的期限 - */ - private int compareTime(Voucher v1,Voucher v2){ - // 期限对比, 都为长期 - if (v1.isEnduring()&&v2.isEnduring()){ - // 比较余额 - return compareBalance(v1,v2); - } - // 都不为长期, 且金额一致 - if (Objects.equals(v1.getEndTime(),v2.getEndTime())){ - // 比较余额 - return compareBalance(v1,v2); - } - // 期限对比 其中一个为长期 - if (v1.isEnduring()^v2.isEnduring()){ - return v1.isEnduring()?1:-1; - } - // 比较期限 - return v1.getEndTime().compareTo(v2.getEndTime()); - } - - /** - * 比较储值卡的余额, 余额一致比较主键 - */ - private int compareBalance(Voucher v1,Voucher v2) { - int i = BigDecimalUtil.compareTo(v1.getBalance(), v2.getBalance()); - if (i==0){ - return Long.compare(v1.getId(),v2.getId()); - } - return i; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPaymentService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPaymentService.java deleted file mode 100644 index 6db4bbb4..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherPaymentService.java +++ /dev/null @@ -1,87 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.channel.voucher.dao.VoucherPaymentManager; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherPayment; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherRecord; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; - -/** - * 储值卡支付记录 - * - * @author xxm - * @since 2022/3/14 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class VoucherPaymentService { - - private final VoucherPaymentManager voucherPaymentManager; - - /** - * 添加支付记录 - */ - public void savePayment(Payment payment, PayParam payParam, PayWayParam payMode, List voucherRecords) { - VoucherPayment voucherPayment = new VoucherPayment().setVoucherRecords(voucherRecords); - voucherPayment.setPaymentId(payment.getId()) - .setBusinessId(payParam.getBusinessId()) - .setAmount(payMode.getAmount()) - .setRefundableBalance(payMode.getAmount()) - .setPayStatus(payment.getPayStatus()); - voucherPaymentManager.save(voucherPayment); - } - - /** - * 更新成功状态 - */ - public void updateSuccess(Long paymentId) { - Optional payment = voucherPaymentManager.findByPaymentId(paymentId); - if (payment.isPresent()) { - VoucherPayment voucherPayment = payment.get(); - voucherPayment.setPayStatus(PayStatusCode.TRADE_SUCCESS).setPayTime(LocalDateTime.now()); - voucherPaymentManager.updateById(voucherPayment); - } - } - - /** - * 关闭操作 - */ - public void updateClose(Long paymentId) { - VoucherPayment payment = voucherPaymentManager.findByPaymentId(paymentId) - .orElseThrow(() -> new BizException("未查询到查询交易记录")); - payment.setPayStatus(PayStatusCode.TRADE_CANCEL); - voucherPaymentManager.updateById(payment); - } - - /** - * 更新退款 - */ - public void updateRefund(Long paymentId, BigDecimal amount) { - Optional voucherPayment = voucherPaymentManager.findByPaymentId(paymentId); - voucherPayment.ifPresent(payment -> { - BigDecimal refundableBalance = payment.getRefundableBalance().subtract(amount); - payment.setRefundableBalance(refundableBalance); - if (BigDecimalUtil.compareTo(refundableBalance, BigDecimal.ZERO) == 0) { - payment.setPayStatus(PayStatusCode.TRADE_REFUNDED); - } - else { - payment.setPayStatus(PayStatusCode.TRADE_REFUNDING); - } - voucherPaymentManager.updateById(payment); - }); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherQueryService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherQueryService.java deleted file mode 100644 index 63480e0d..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherQueryService.java +++ /dev/null @@ -1,117 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.service; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.code.paymodel.VoucherCode; -import cn.bootx.platform.daxpay.core.channel.voucher.dao.VoucherManager; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.Voucher; -import cn.bootx.platform.daxpay.core.merchant.service.MchAppService; -import cn.bootx.platform.daxpay.dto.channel.voucher.VoucherDto; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherParam; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * 储值卡查询 - * - * @author xxm - * @since 2022/3/14 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class VoucherQueryService { - - private final VoucherManager voucherManager; - - private final MchAppService mchAppService; - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, VoucherParam param) { - return MpUtil.convert2DtoPageResult(voucherManager.page(pageParam, param)); - } - - /** - * 根据id查询 - */ - public VoucherDto findById(Long id) { - return voucherManager.findById(id).map(Voucher::toDto).orElseThrow(() -> new DataNotExistException("储值卡不存在")); - } - - /** - * 根据卡号查询 - */ - public VoucherDto findByCardNo(String cardNo) { - return voucherManager.findByCardNo(cardNo) - .map(Voucher::toDto) - .orElseThrow(() -> new DataNotExistException("储值卡不存在")); - } - - /** - * 获取并判断卡状态 - */ - public VoucherDto getAndJudgeVoucher(String cardNo){ - Voucher voucher = voucherManager.findByCardNo(cardNo) - .orElseThrow(() -> new DataNotExistException("储值卡不存在")); - // 过期 - String checkMsg = check(Collections.singletonList(voucher)); - if (StrUtil.isNotBlank(checkMsg)){ - throw new PayFailureException(checkMsg); - } - return voucher.toDto(); - } - - /** - * 卡信息检查 - */ - public String check(List vouchers) { - // 判断有效期 - boolean timeCheck = vouchers.stream() - .filter(voucher -> !Objects.equals(voucher.isEnduring(), true)) - .allMatch(voucher -> LocalDateTimeUtil.between(LocalDateTime.now(), voucher.getStartTime(), - voucher.getEndTime())); - if (!timeCheck) { - return "储值卡不再有效期内"; - } - // 判断状态 - boolean statusCheck = vouchers.stream() - .allMatch(voucher -> Objects.equals(voucher.getStatus(), VoucherCode.STATUS_NORMAL)); - if (!statusCheck){ - return "储值卡不是启用状态"; - } - // 判断是否是同一个商户应用下的储值卡 - List mchCodes = vouchers.stream() - .map(Voucher::getMchCode) - .distinct() - .collect(Collectors.toList()); - List mchAppCodes = vouchers.stream() - .map(Voucher::getMchAppCode) - .distinct() - .collect(Collectors.toList()); - if (mchAppCodes.size()!=1 || mchCodes.size()!=1){ - return "这些储值卡不止属于一个商户应用"; - } - String mchCode = mchCodes.get(0); - String mchAppCode = mchAppCodes.get(0); - // 是否有关联关系判断 - if (!mchAppService.checkMatch(mchCode, mchAppCode)) { - return "应用信息与商户信息不匹配"; - } - return null; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherService.java deleted file mode 100644 index f115da1e..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/voucher/service/VoucherService.java +++ /dev/null @@ -1,166 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.voucher.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.daxpay.code.paymodel.VoucherCode; -import cn.bootx.platform.daxpay.core.channel.voucher.dao.VoucherLogManager; -import cn.bootx.platform.daxpay.core.channel.voucher.dao.VoucherManager; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.Voucher; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherLog; -import cn.bootx.platform.daxpay.core.merchant.service.MchAppService; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherChangeParam; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherGenerationParam; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherImportParam; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.IdUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * 储值卡 - * - * @author xxm - * @since 2022/3/14 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class VoucherService { - - private final VoucherManager voucherManager; - - private final VoucherLogManager voucherLogManager; - - private final MchAppService mchAppService; - - /** - * 批量生成 - */ - @Transactional(rollbackFor = Exception.class) - public void generationBatch(VoucherGenerationParam param) { - // 是否有管理关系判断 - if (!mchAppService.checkMatch(param.getMchCode(), param.getMchAppCode())) { - throw new BizException("应用信息与商户信息不匹配"); - } - - Integer count = param.getCount(); - List vouchers = new ArrayList<>(count); - long batchNo = IdUtil.getSnowflakeNextId(); - for (int i = 0; i < count; i++) { - Voucher voucher = new Voucher() - .setCardNo('V' + IdUtil.getSnowflakeNextIdStr()) - .setMchCode(param.getMchCode()) - .setMchAppCode(param.getMchAppCode()) - .setBatchNo(batchNo) - .setBalance(param.getFaceValue()) - .setFaceValue(param.getFaceValue()) - .setEnduring(param.getEnduring()) - .setStatus(param.getStatus()); - if (Objects.equals(param.getEnduring(), Boolean.FALSE)) { - voucher.setStartTime(param.getStartTime()).setEndTime(param.getEndTime()); - } - vouchers.add(voucher); - } - voucherManager.saveAll(vouchers); - // 日志 - List voucherLogs = vouchers.stream() - .map(voucher -> new VoucherLog().setType(VoucherCode.LOG_ACTIVE) - .setAmount(voucher.getBalance()) - .setVoucherId(voucher.getId()) - .setVoucherNo(voucher.getCardNo())) - .collect(Collectors.toList()); - voucherLogManager.saveAll(voucherLogs); - } - - /** - * 批量导入 - * @param skip 是否跳过已经导入的储值卡,false时将会异常 - */ - @Transactional(rollbackFor = Exception.class) - public void importBatch(Boolean skip, String mchCode, String mchAppCode,List voucherImports) { - // 是否有关联关系判断 - if (!mchAppService.checkMatch(mchCode, mchAppCode)) { - throw new BizException("应用信息与商户信息不匹配"); - } - List cardNoList = voucherImports.stream() - .map(VoucherImportParam::getCardNo) - .distinct() - .collect(Collectors.toList()); - // 卡号不能重复 - if (voucherImports.size()!=cardNoList.size()){ - throw new BizException("卡号不能重复"); - } - // 查询库中是否已经有对应的储值卡号 - List vouchersByDB = voucherManager.findByCardNoList(cardNoList); - // 不跳过已经导入的储值卡且存在数据, 抛出异常 - if (Objects.equals(skip,true)&& CollUtil.isNotEmpty(vouchersByDB)){ - log.warn("数据库中已经存在的卡号:{}",vouchersByDB.stream().map(Voucher::getCardNo).collect(Collectors.toList())); - throw new BizException("要导入的卡号在数据中已经存在"); - } - // 导入对应储值卡 - List cardNoListByDb = vouchersByDB.stream() - .map(Voucher::getCardNo) - .distinct() - .collect(Collectors.toList()); - long batchNo = IdUtil.getSnowflakeNextId(); - List vouchers = voucherImports.stream() - .filter(o -> !cardNoListByDb.contains(o.getCardNo())) - .map(o -> { - Voucher voucher = new Voucher(); - BeanUtil.copyProperties(o, voucher); - return voucher.setMchCode(mchCode) - .setMchAppCode(mchAppCode) - .setBatchNo(batchNo); - }) - .collect(Collectors.toList()); - voucherManager.saveAll(vouchers); - // TODO 记录日志 - - } - - /** - * 启用 - */ - public void unlock(Long id) { - voucherManager.changeStatus(id, VoucherCode.STATUS_NORMAL); - } - - /** - * 冻结 - */ - public void lock(Long id) { - voucherManager.changeStatus(id, VoucherCode.STATUS_FORBIDDEN); - } - - /** - * 批量启用 - */ - public void unlockBatch(List ids) { - voucherManager.changeStatusBatch(ids, VoucherCode.STATUS_NORMAL); - } - - /** - * 批量冻结 - */ - public void lockBatch(List ids) { - voucherManager.changeStatusBatch(ids, VoucherCode.STATUS_FORBIDDEN); - } - - /** - * 更改储值卡信息 - */ - public void changeInfo(VoucherChangeParam voucherChangeParam) { - // 查询对应的卡 - Voucher voucher = voucherManager.findByCardNo(voucherChangeParam.getCardNo()) - .orElseThrow(DataNotExistException::new); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/convert/WalletConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/convert/WalletConvert.java deleted file mode 100644 index f91ebfd0..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/convert/WalletConvert.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.convert; - -import cn.bootx.platform.daxpay.core.channel.wallet.entity.Wallet; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletConfig; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletLog; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletPayment; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletConfigDto; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletDto; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletLogDto; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletPaymentDto; -import cn.bootx.platform.daxpay.param.channel.wechat.WalletConfigParam; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 转换 - * - * @author xxm - * @since 2021/8/20 - */ -@Mapper -public interface WalletConvert { - - WalletConvert CONVERT = Mappers.getMapper(WalletConvert.class); - - WalletDto convert(Wallet in); - - WalletPaymentDto convert(WalletPayment in); - - WalletLogDto convert(WalletLog in); - - WalletConfigDto convert(WalletConfig in); - - WalletConfig convert(WalletConfigParam in); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletConfigManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletConfigManager.java deleted file mode 100644 index 1867aeaa..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletConfigManager.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.dao; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletConfig; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 钱包配置 - * @author xxm - * @since 2023/7/14 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class WalletConfigManager extends BaseManager { - - public Optional findByMchCode(String mchCode){ - return this.findByField(WalletConfig::getMchCode,mchCode); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletConfigMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletConfigMapper.java deleted file mode 100644 index 27ada2c2..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletConfigMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.dao; - -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletConfig; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 钱包配置 - * @author xxm - * @since 2023/7/14 - */ -@Mapper -public interface WalletConfigMapper extends BaseMapper { -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletLogManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletLogManager.java deleted file mode 100644 index 53f28e5f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletLogManager.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletLog; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletLogQueryParam; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.Objects; - -/** - * 钱包日志 - * - * @author xxm - * @since 2020/12/8 - */ -@Repository -@RequiredArgsConstructor -public class WalletLogManager extends BaseManager { - - /** - * 分页查询指定用户的钱包日志 - */ - public Page pageByUserId(PageParam pageParam, WalletLogQueryParam param, Long userId) { - Page mpPage = MpUtil.getMpPage(pageParam, WalletLog.class); - return this.lambdaQuery().orderByDesc(MpIdEntity::getId).eq(WalletLog::getUserId, userId).page(mpPage); - } - - /** - * 分页查询 - */ - public Page page(PageParam pageParam, WalletLogQueryParam query) { - Page mpPage = MpUtil.getMpPage(pageParam, WalletLog.class); - return this.lambdaQuery() - .orderByDesc(MpIdEntity::getId) - .like(Objects.nonNull(query.getUserId()), WalletLog::getUserId, query.getUserId()) - .like(Objects.nonNull(query.getWalletId()), WalletLog::getWalletId, query.getWalletId()) - .page(mpPage); - } - - /** - * 分页查询 根据钱包id - */ - public Page pageByWalletId(PageParam pageParam, WalletLogQueryParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, WalletLog.class); - return this.lambdaQuery() - .orderByDesc(MpIdEntity::getId) - .eq(WalletLog::getWalletId, param.getWalletId()) - .page(mpPage); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletLogMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletLogMapper.java deleted file mode 100644 index 9fabe6ed..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletLogMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.dao; - -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletLog; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 钱包日志 - * - * @author xxm - * @since 2020/12/8 - */ -@Mapper -public interface WalletLogMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletManager.java deleted file mode 100644 index 10cfc89d..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletManager.java +++ /dev/null @@ -1,161 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.common.query.generator.QueryGenerator; -import cn.bootx.platform.daxpay.core.channel.config.entity.PayChannelConfig; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.Wallet; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletQueryParam; -import cn.bootx.platform.iam.core.user.entity.UserInfo; -import cn.bootx.platform.iam.param.user.UserInfoParam; -import cn.bootx.platform.starter.auth.util.SecurityUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * 钱包管理 - * - * @author xxm - * @since 2020/12/8 - */ -@Repository -@RequiredArgsConstructor -public class WalletManager extends BaseManager { - - private final WalletMapper walletMapper; - - /** - * 预占额度 - * @param walletId 钱包ID - * @param amount 金额 - * @return 更新数量 - */ - public int freezeBalance(Long walletId, BigDecimal amount){ - Long userId = SecurityUtil.getUserIdOrDefaultId(); - return walletMapper.freezeBalance(walletId, amount, userId, LocalDateTime.now()); - } - - /** - * 解冻金额 - * @param walletId 钱包ID - * @param amount 金额 - * @return 更新数量 - */ - public int unfreezeBalance(Long walletId, BigDecimal amount){ - Long userId = SecurityUtil.getUserIdOrDefaultId(); - return walletMapper.unfreezeBalance(walletId, amount, userId, LocalDateTime.now()); - } - - /** - * 扣减余额 - * @param walletId 钱包ID - * @param amount 扣减金额 - * @return 操作条数 - */ - public int reduceBalance(Long walletId, BigDecimal amount) { - Long userId = SecurityUtil.getUserIdOrDefaultId(); - return walletMapper.reduceBalance(walletId, amount, userId, LocalDateTime.now()); - } - - /** - * 扣减余额同时解除预冻结的额度 - * @param walletId 钱包ID - * @param amount 扣减金额 - * @return 操作条数 - */ - public int reduceAndUnfreezeBalance(Long walletId, BigDecimal amount) { - Long userId = SecurityUtil.getUserIdOrDefaultId(); - return walletMapper.reduceAndUnfreezeBalance(walletId, amount, userId, LocalDateTime.now()); - } - - /** - * 增加余额 - * @param walletId 钱包 - * @param amount 金额 - * @return 更新数量 - */ - public int increaseBalance(Long walletId, BigDecimal amount) { - Long userId = SecurityUtil.getUserIdOrDefaultId(); - return walletMapper.increaseBalance(walletId, amount, userId, LocalDateTime.now()); - } - - /** - * 更改余额-允许扣成负数 - * @param walletId 钱包ID - * @param amount 更改的额度, 正数增加,负数减少 - * @return 剩余条数 - */ - public int reduceBalanceUnlimited(Long walletId, BigDecimal amount) { - Long userId = SecurityUtil.getUserIdOrDefaultId(); - return walletMapper.reduceBalanceUnlimited(walletId, amount, userId, LocalDateTime.now()); - } - - /** - * 用户钱包是否存在 - */ - public boolean existsByUser(Long userId,String mchAppCode) { - return lambdaQuery() - .eq(Wallet::getUserId,userId) - .eq(Wallet::getMchAppCode,mchAppCode) - .exists(); - } - - /** - * 查询用户的钱包 - */ - public Optional findByUser(Long userId,String mchAppCode) { - return lambdaQuery() - .eq(Wallet::getUserId,userId) - .eq(Wallet::getMchAppCode,mchAppCode) - .oneOpt(); - } - - /** - * 分页查询 - */ - public Page page(PageParam pageParam, WalletQueryParam param) { - QueryWrapper wrapper = QueryGenerator.generator(param); - Page mpPage = MpUtil.getMpPage(pageParam, Wallet.class); - wrapper.select(this.getEntityClass(), MpUtil::excludeBigField) - .orderByDesc(MpUtil.getColumnName(PayChannelConfig::getId)); - return this.page(mpPage, wrapper); - } - - /** - * 待开通钱包的用户列表 - */ - public Page pageByNotWallet(PageParam pageParam, String mchCode, UserInfoParam userInfoParam) { - Page mpPage = MpUtil.getMpPage(pageParam, UserInfo.class); - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.orderByDesc("w.id") - .and(o->o.ne("w.mch_code",mchCode).or().isNull("w.mch_code")) - .like(StrUtil.isNotBlank(userInfoParam.getUsername()), "u.username", userInfoParam.getUsername()) - .like(StrUtil.isNotBlank(userInfoParam.getName()), "u.name", userInfoParam.getName()); - return walletMapper.pageByNotWallet(mpPage, wrapper); - } - - /** - * 查询已经存在钱包的用户id - */ - public List findExistUserIds(List userIds) { - return this.lambdaQuery() - .select(Wallet::getUserId) - .in(Wallet::getUserId, userIds) - .list() - .stream() - .map(Wallet::getUserId) - .collect(Collectors.toList()); - - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletMapper.java deleted file mode 100644 index 20958eec..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletMapper.java +++ /dev/null @@ -1,96 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.dao; - -import cn.bootx.platform.daxpay.core.channel.wallet.entity.Wallet; -import cn.bootx.platform.iam.core.user.entity.UserInfo; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 钱包 - * - * @author xxm - * @since 2021/2/24 - */ -@Mapper -public interface WalletMapper extends BaseMapper { - - /** - * 预冻结余额 - * @param walletId 钱包ID - * @param amount 冻结的额度 - * @param operator 操作人 - * @param date 时间 - * @return 更新数量 - */ - int freezeBalance(@Param("walletId") Long walletId, @Param("amount") BigDecimal amount, - @Param("operator") Long operator, @Param("date") LocalDateTime date); - - /** - * 解冻金额 - * @param walletId 钱包ID - * @param amount 冻结的额度 - * @param operator 操作人 - * @param date 时间 - * @return 更新数量 - */ - int unfreezeBalance(@Param("walletId") Long walletId, @Param("amount") BigDecimal amount, - @Param("operator") Long operator, @Param("date") LocalDateTime date); - - /** - * 释放预占额度 - * @param walletId 钱包ID - * @param amount 要释放的额度 - * @param operator 操作人 - * @param date 操作时间 - * @return 操作条数 - */ - int reduceBalance(@Param("walletId") Long walletId, @Param("amount") BigDecimal amount, - @Param("operator") Long operator, @Param("date") LocalDateTime date); - - /** - * 扣减余额同时解除预冻结的额度 - * @param walletId 钱包ID - * @param amount 减少的额度 - * @param operator 操作人 - * @param date 操作时间 - * @return 操作条数 - */ - int reduceAndUnfreezeBalance(@Param("walletId") Long walletId, @Param("amount") BigDecimal amount, - @Param("operator") Long operator, @Param("date") LocalDateTime date); - - - /** - * 增加余额 - * @param walletId 钱包ID - * @param amount 增加的额度 - * @param operator 操作人 - * @param date 时间 - * @return 更新数量 - */ - int increaseBalance(@Param("walletId") Long walletId, @Param("amount") BigDecimal amount, - @Param("operator") Long operator, @Param("date") LocalDateTime date); - - /** - * 扣减余额,允许扣成负数 - * @param walletId 钱包ID - * @param amount 更改的额度, 正数增加,负数减少 - * @param operator 操作人 - * @param date 操作时间 - * @return 操作条数 - */ - int reduceBalanceUnlimited(@Param("walletId") Long walletId, @Param("amount") BigDecimal amount, - @Param("operator") Long operator, @Param("date") LocalDateTime date); - - /** - * 待开通钱包的用户列表 - */ - Page pageByNotWallet(Page mpPage, @Param(Constants.WRAPPER) Wrapper wrapper); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletPaymentManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletPaymentManager.java deleted file mode 100644 index cd3c3729..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletPaymentManager.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.dao; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletPayment; -import cn.bootx.platform.daxpay.core.channel.base.entity.BasePayment; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -@RequiredArgsConstructor -public class WalletPaymentManager extends BaseManager { - - public Optional findByPaymentId(Long paymentId) { - return findByField(BasePayment::getPaymentId, paymentId); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletPaymentMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletPaymentMapper.java deleted file mode 100644 index 291064b5..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/dao/WalletPaymentMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.dao; - -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletPayment; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface WalletPaymentMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/Wallet.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/Wallet.java deleted file mode 100644 index 50445b98..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/Wallet.java +++ /dev/null @@ -1,75 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.daxpay.code.paymodel.WalletCode; -import cn.bootx.platform.daxpay.core.channel.wallet.convert.WalletConvert; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletDto; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.annotation.DbTable; -import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; -import cn.bootx.table.modify.mysql.constants.MySqlIndexType; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import lombok.experimental.FieldNameConstants; - -import java.math.BigDecimal; - -import static cn.bootx.platform.daxpay.core.channel.wallet.entity.Wallet.Fields.mchAppCode; -import static cn.bootx.platform.daxpay.core.channel.wallet.entity.Wallet.Fields.userId; - -/** - * 钱包 - * - * @author xxm - * @since 2020/12/8 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@DbMySqlIndex(comment = "用户和应用编码联合唯一索引",fields = {userId,mchAppCode},type = MySqlIndexType.UNIQUE) -@DbTable(comment = "钱包") -@Accessors(chain = true) -@TableName("pay_wallet") -@FieldNameConstants -public class Wallet extends MpBaseEntity implements EntityBaseFunction { - - /** 商户编码 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - @DbColumn(comment = "商户编码") - private String mchCode; - - /** 商户应用编码 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - @DbColumn(comment = "商户应用编码") - private String mchAppCode; - - /** 关联用户id */ - @TableField(updateStrategy = FieldStrategy.NEVER) - @DbColumn(comment = "关联用户id") - private Long userId; - - /** 余额 */ - @DbColumn(comment = "余额") - private BigDecimal balance; - - /** 预冻结额度 */ - @DbColumn(comment = "预冻结额度") - private BigDecimal freezeBalance; - - /** - * 状态 - * @see WalletCode#STATUS_FORBIDDEN - */ - @DbColumn(comment = "状态") - private String status; - - @Override - public WalletDto toDto() { - return WalletConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/WalletConfig.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/WalletConfig.java deleted file mode 100644 index 971fc3d1..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/WalletConfig.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.daxpay.core.channel.wallet.convert.WalletConvert; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletConfigDto; -import cn.bootx.platform.daxpay.param.channel.wechat.WalletConfigParam; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.annotation.DbTable; -import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 钱包配置 - * @author xxm - * @since 2023/7/14 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@DbTable(comment = "钱包配置") -@Accessors(chain = true) -@TableName("pay_wallet_config") -public class WalletConfig extends MpBaseEntity implements EntityBaseFunction { - - /** 商户编码 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - @DbColumn(comment = "商户编码") - private String mchCode; - - /** 商户应用编码 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - @DbMySqlIndex(comment = "商户应用编码唯一索引") - @DbColumn(comment = "商户应用编码") - private String mchAppCode; - - /** 默认余额 */ - @DbColumn(comment = "默认余额") - private BigDecimal defaultBalance; - - /** 状态 */ - @DbColumn(comment = "状态") - private String state; - - /** 备注 */ - @DbColumn(comment = "备注") - private String remark; - - /** - * 转换 - */ - @Override - public WalletConfigDto toDto() { - return WalletConvert.CONVERT.convert(this); - } - - public static WalletConfig init(WalletConfigParam in){ - return WalletConvert.CONVERT.convert(in); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/WalletLog.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/WalletLog.java deleted file mode 100644 index d02743a6..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/WalletLog.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.entity; - - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.daxpay.core.channel.wallet.convert.WalletConvert; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletLogDto; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 钱包日志 - * - * @author xxm - * @since 2020/12/8 - */ -@EqualsAndHashCode(callSuper = true) -@Data -//@DbTable(comment = "钱包日志") -@Accessors(chain = true) -@TableName("pay_wallet_log") -public class WalletLog extends MpBaseEntity implements EntityBaseFunction { - - /** 钱包id */ - @DbMySqlIndex(comment = "钱包索引ID") - @DbColumn(comment = "钱包id") - private Long walletId; - - /** 用户id */ - @DbColumn(comment = "用户id") - private Long userId; - - /** 类型 */ - @DbColumn(comment = "类型") - private String type; - - /** 交易记录ID */ - @DbColumn(comment = "交易记录ID") - private Long paymentId; - - /** 业务ID */ - @DbColumn(comment = "业务ID") - private String businessId; - - /** - * 操作类型 - * @see cn.bootx.platform.daxpay.code.paymodel.WalletCode#OPERATION_SOURCE_USER - */ - @DbColumn(comment = "操作类型") - private String operationSource; - - /** 金额 */ - @DbColumn(comment = "金额") - private BigDecimal amount; - - /** 备注 */ - @DbColumn(comment = "备注") - private String remark; - - - @Override - public WalletLogDto toDto() { - return WalletConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/WalletPayment.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/WalletPayment.java deleted file mode 100644 index 51a6f235..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/entity/WalletPayment.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.daxpay.core.channel.base.entity.BasePayment; -import cn.bootx.platform.daxpay.core.channel.wallet.convert.WalletConvert; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletPaymentDto; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 钱包交易记录表 - * - * @author xxm - * @since 2020/12/8 - */ -@EqualsAndHashCode(callSuper = true) -@Data -//@DbTable(comment = "钱包交易记录") -@Accessors(chain = true) -@TableName("pay_wallet_payment") -public class WalletPayment extends BasePayment implements EntityBaseFunction { - - /** 钱包ID */ - private Long walletId; - - @Override - public WalletPaymentDto toDto() { - return WalletConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletConfigService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletConfigService.java deleted file mode 100644 index fd195b69..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletConfigService.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.daxpay.code.MchAndAppCode; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.channel.wallet.dao.WalletConfigManager; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletConfig; -import cn.bootx.platform.daxpay.core.merchant.entity.MchAppPayConfig; -import cn.bootx.platform.daxpay.core.merchant.service.MchAppPayConfigService; -import cn.bootx.platform.daxpay.core.merchant.service.MchAppService; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletConfigDto; -import cn.bootx.platform.daxpay.param.channel.wechat.WalletConfigParam; -import cn.hutool.core.bean.BeanUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * 钱包配置 - * @author xxm - * @since 2023/7/14 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WalletConfigService { - private final WalletConfigManager walletConfigManager; - private final MchAppPayConfigService mchAppPayConfigService; - private final MchAppService mchAppService; - - /** - * 根据应用编码获取钱包配置 - */ - public WalletConfigDto findByMchCode(String mchCode){ - return walletConfigManager.findByMchCode(mchCode) - .map(WalletConfig::toDto) - .orElse(new WalletConfigDto()); - } - - /** - * 新增或更新 - */ - public void add(WalletConfigParam param){ - // 是否有管理关系判断 - if (!mchAppService.checkMatch(param.getMchCode(), param.getMchAppCode())) { - throw new BizException("应用信息与商户信息不匹配"); - } - WalletConfig walletConfig = WalletConfig.init(param); - walletConfig.setState(MchAndAppCode.PAY_CONFIG_STATE_NORMAL); - walletConfigManager.save(walletConfig); - // 保存关联关系 - MchAppPayConfig mchAppPayConfig = new MchAppPayConfig().setAppCode(walletConfig.getMchAppCode()) - .setConfigId(walletConfig.getId()) - .setChannel(PayChannelEnum.WALLET.getCode()) - .setState(walletConfig.getState()); - mchAppPayConfigService.add(mchAppPayConfig); - } - - /** - * 更新 - */ - public void update(WalletConfigParam param){ - WalletConfig walletConfig = walletConfigManager.findById(param.getId()) - .orElseThrow(DataNotExistException::new); - BeanUtil.copyProperties(param,walletConfig); - walletConfigManager.updateById(walletConfig); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletLogService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletLogService.java deleted file mode 100644 index f813aa8e..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletLogService.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.service; - -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.channel.wallet.dao.WalletLogManager; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletLogDto; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletLogQueryParam; -import cn.bootx.platform.starter.auth.util.SecurityUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * 钱包日志 - * - * @author xxm - * @since 2020/12/8 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WalletLogService { - - private final WalletLogManager walletLogManager; - - /** - * 个人钱包日志分页 - */ - public PageResult pageByPersonal(PageParam pageParam, WalletLogQueryParam param) { - Long userId = SecurityUtil.getUserId(); - return MpUtil.convert2DtoPageResult(walletLogManager.pageByUserId(pageParam, param, userId)); - } - - /** - * 钱包日志分页 - */ - public PageResult page(PageParam pageParam, WalletLogQueryParam param) { - return MpUtil.convert2DtoPageResult(walletLogManager.page(pageParam, param)); - } - - /** - * 根据钱包id查询钱包日志(分页) - */ - public PageResult pageByWalletId(PageParam pageParam, WalletLogQueryParam param) { - return MpUtil.convert2DtoPageResult(walletLogManager.pageByWalletId(pageParam, param)); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPayService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPayService.java deleted file mode 100644 index abe933fa..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPayService.java +++ /dev/null @@ -1,176 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.code.paymodel.WalletCode; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.channel.wallet.dao.WalletLogManager; -import cn.bootx.platform.daxpay.core.channel.wallet.dao.WalletManager; -import cn.bootx.platform.daxpay.core.channel.wallet.dao.WalletPaymentManager; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.Wallet; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletLog; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletPayment; -import cn.bootx.platform.daxpay.exception.waller.WalletLackOfBalanceException; -import cn.bootx.platform.daxpay.exception.waller.WalletNotExistsException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.util.Optional; - -/** - * 钱包支付操作 - * - * @author xxm - * @since 2021/2/27 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WalletPayService { - - private final WalletManager walletManager; - - private final WalletPaymentManager walletPaymentManager; - - private final WalletLogManager walletLogManager; - - /** - * 支付前冻结余额 - * @param amount 付款金额 - * @param payment 支付记录 - * @param wallet 钱包 - */ - public void freezeBalance(BigDecimal amount, Payment payment, Wallet wallet) { - // 冻结余额 - int i = walletManager.freezeBalance(wallet.getId(), amount); - // 判断操作结果 - if (i < 1) { - throw new WalletLackOfBalanceException(); - } - // 日志 - WalletLog walletLog = new WalletLog().setWalletId(wallet.getId()) - .setUserId(wallet.getUserId()) - .setPaymentId(payment.getId()) - .setAmount(amount) - .setType(WalletCode.LOG_FREEZE_BALANCE) - .setRemark(String.format("钱包预冻结金额 %.2f ", amount)) - .setOperationSource(WalletCode.OPERATION_SOURCE_USER) - .setBusinessId(payment.getBusinessId()); - walletLogManager.save(walletLog); - } - - /** - * 支付成功, 进行扣款 - */ - public void paySuccess(Long paymentId){ - // 钱包支付记录 - walletPaymentManager.findByPaymentId(paymentId).ifPresent(walletPayment -> { - Optional walletOpt = walletManager.findById(walletPayment.getWalletId()); - if (!walletOpt.isPresent()) { - log.error("钱包出现恶性问题,需要人工排查"); - return; - } - Wallet wallet = walletOpt.get(); - walletPayment.setPayStatus(PayStatusCode.TRADE_CANCEL); - walletPaymentManager.save(walletPayment); - // 支付余额 - int i = walletManager.reduceAndUnfreezeBalance(wallet.getId(), walletPayment.getAmount()); - // 判断操作结果 - if (i < 1) { - throw new WalletLackOfBalanceException(); - } - // 日志 - WalletLog walletLog = new WalletLog().setWalletId(wallet.getId()) - .setUserId(wallet.getUserId()) - .setPaymentId(walletPayment.getPaymentId()) - .setAmount(walletPayment.getAmount()) - .setType(WalletCode.LOG_REDUCE_AND_UNFREEZE_BALANCE) - .setRemark(String.format("钱包扣款金额 %.2f ", walletPayment.getAmount())) - .setOperationSource(WalletCode.OPERATION_SOURCE_USER) - .setBusinessId(walletPayment.getBusinessId()); - walletLogManager.save(walletLog); - }); - } - - /** - * 直接进行支付 - */ - public void pay(BigDecimal amount, Payment payment, Wallet wallet){ - // 直接扣减余额 - int i = walletManager.reduceBalance(wallet.getId(), amount); - - // 判断操作结果 - if (i < 1) { - throw new WalletLackOfBalanceException(); - } - // 日志 - WalletLog walletLog = new WalletLog().setWalletId(wallet.getId()) - .setUserId(wallet.getUserId()) - .setPaymentId(payment.getId()) - .setAmount(amount) - .setType(WalletCode.LOG_PAY) - .setRemark(String.format("钱包支付金额 %.2f ", amount)) - .setOperationSource(WalletCode.OPERATION_SOURCE_USER) - .setBusinessId(payment.getBusinessId()); - walletLogManager.save(walletLog); - } - - /** - * 取消支付,解除冻结的额度, 只有在异步支付中才会发生取消操作 - */ - public void close(Long paymentId) { - // 钱包支付记录 - walletPaymentManager.findByPaymentId(paymentId).ifPresent(walletPayment -> { - Optional walletOpt = walletManager.findById(walletPayment.getWalletId()); - if (!walletOpt.isPresent()) { - log.error("钱包出现恶性问题,需要人工排查"); - return; - } - Wallet wallet = walletOpt.get(); - walletPayment.setPayStatus(PayStatusCode.TRADE_CANCEL); - walletPaymentManager.save(walletPayment); - - // 金额返还 - walletManager.increaseBalance(wallet.getId(), walletPayment.getAmount()); - // 记录日志 - WalletLog walletLog = new WalletLog().setAmount(walletPayment.getAmount()) - .setPaymentId(walletPayment.getPaymentId()) - .setWalletId(wallet.getId()) - .setUserId(wallet.getUserId()) - .setType(WalletCode.LOG_CLOSE_PAY) - .setRemark(String.format("取消支付金额 %.2f ", walletPayment.getAmount())) - .setOperationSource(WalletCode.OPERATION_SOURCE_SYSTEM) - .setBusinessId(walletPayment.getBusinessId()); - // save log - walletLogManager.save(walletLog); - }); - } - - /** - * 退款 - */ - @Transactional(rollbackFor = Exception.class) - public void refund(Long paymentId, BigDecimal amount) { - // 钱包支付记录 - WalletPayment walletPayment = walletPaymentManager.findByPaymentId(paymentId) - .orElseThrow(() -> new BizException("钱包支付记录不存在")); - // 获取钱包 - Wallet wallet = walletManager.findById(walletPayment.getWalletId()).orElseThrow(WalletNotExistsException::new); - walletManager.increaseBalance(wallet.getId(), amount); - - WalletLog walletLog = new WalletLog().setAmount(amount) - .setPaymentId(walletPayment.getPaymentId()) - .setWalletId(wallet.getId()) - .setUserId(wallet.getUserId()) - .setType(WalletCode.LOG_REFUND) - .setRemark(String.format("钱包退款金额 %.2f ", amount)) - .setOperationSource(WalletCode.OPERATION_SOURCE_ADMIN) - .setBusinessId(walletPayment.getBusinessId()); - // save log - walletLogManager.save(walletLog); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPaymentService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPaymentService.java deleted file mode 100644 index 892a810f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletPaymentService.java +++ /dev/null @@ -1,86 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.channel.wallet.dao.WalletPaymentManager; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.Wallet; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletPayment; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.Optional; - -/** - * 钱包交易记录的相关操作 - * - * @author xxm - * @since 2020/12/8 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WalletPaymentService { - - private final WalletPaymentManager walletPaymentManager; - - /** - * 保存钱包支付记录 - */ - public void savePayment(Payment payment, PayParam payParam, PayWayParam payMode, Wallet wallet) { - WalletPayment walletPayment = new WalletPayment().setWalletId(wallet.getId()); - walletPayment.setPaymentId(payment.getId()) - .setBusinessId(payParam.getBusinessId()) - .setAmount(payMode.getAmount()) - .setRefundableBalance(payMode.getAmount()) - .setPayStatus(payment.getPayStatus()); - walletPaymentManager.save(walletPayment); - } - - /** - * 更新成功状态 - */ - public void updateSuccess(Long paymentId) { - Optional payment = walletPaymentManager.findByPaymentId(paymentId); - if (payment.isPresent()) { - WalletPayment walletPayment = payment.get(); - walletPayment.setPayStatus(PayStatusCode.TRADE_SUCCESS).setPayTime(LocalDateTime.now()); - walletPaymentManager.updateById(walletPayment); - } - } - - /** - * 关闭操作 - */ - public void updateClose(Long paymentId) { - WalletPayment walletPayment = walletPaymentManager.findByPaymentId(paymentId) - .orElseThrow(() -> new BizException("未查询到查询交易记录")); - walletPayment.setPayStatus(PayStatusCode.TRADE_CANCEL); - walletPaymentManager.updateById(walletPayment); - } - - /** - * 更新退款 - */ - public void updateRefund(Long paymentId, BigDecimal amount) { - Optional walletPayment = walletPaymentManager.findByPaymentId(paymentId); - walletPayment.ifPresent(payment -> { - BigDecimal refundableBalance = payment.getRefundableBalance().subtract(amount); - payment.setRefundableBalance(refundableBalance); - if (BigDecimalUtil.compareTo(refundableBalance, BigDecimal.ZERO) == 0) { - payment.setPayStatus(PayStatusCode.TRADE_REFUNDED); - } - else { - payment.setPayStatus(PayStatusCode.TRADE_REFUNDING); - } - walletPaymentManager.updateById(payment); - }); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletQueryService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletQueryService.java deleted file mode 100644 index 0c95d25d..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletQueryService.java +++ /dev/null @@ -1,106 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.service; - -import cn.bootx.platform.common.core.entity.UserDetail; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.channel.wallet.dao.WalletManager; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.Wallet; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletDto; -import cn.bootx.platform.daxpay.dto.channel.wallet.WalletInfoDto; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletPayParam; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletQueryParam; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import cn.bootx.platform.iam.core.user.service.UserQueryService; -import cn.bootx.platform.iam.dto.user.UserInfoDto; -import cn.bootx.platform.iam.param.user.UserInfoParam; -import cn.bootx.platform.starter.auth.util.SecurityUtil; -import cn.hutool.core.bean.BeanUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Objects; - -/** - * 钱包 - * - * @author xxm - * @since 2022/3/11 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WalletQueryService { - - private final WalletManager walletManager; - - private final UserQueryService userQueryService; - - /** - * 根据钱包ID查询Wallet - */ - public WalletDto findById(Long walletId) { - return walletManager.findById(walletId).map(Wallet::toDto).orElseThrow(DataNotExistException::new); - } - - - /** - * 根据用户ID查询钱包 - */ - public WalletDto findByUser(String mchAppCode) { - Long userId = SecurityUtil.getUserId(); - return walletManager.findByUser(userId,mchAppCode).map(Wallet::toDto).orElse(null); - } - - /** - * 获取钱包综合信息 - */ - public WalletInfoDto getWalletInfo(Long walletId) { - Wallet wallet = walletManager.findById(walletId).orElseThrow(DataNotExistException::new); - UserInfoDto userInfoDto = userQueryService.findById(wallet.getUserId()); - WalletInfoDto walletInfoDto = new WalletInfoDto(); - BeanUtil.copyProperties(wallet, walletInfoDto); - walletInfoDto.setUserName(userInfoDto.getName()); - return walletInfoDto; - } - - /** - * 查询用户 分页 - */ - public PageResult page(PageParam pageParam, WalletQueryParam param) { - return MpUtil.convert2DtoPageResult(walletManager.page(pageParam, param)); - } - - /** - * 待开通钱包的用户列表 - */ - public PageResult pageByNotWallet(PageParam pageParam,String mchCode, UserInfoParam userInfoParam) { - return MpUtil.convert2DtoPageResult(walletManager.pageByNotWallet(pageParam,mchCode ,userInfoParam)); - } - - - /** - * 获取钱包, 获取顺序: 1. 显式传入的钱包ID 2. 显式传入的用户ID 3. 从系统中获取到的用户ID - * - */ - public Wallet getWallet(WalletPayParam walletPayParam, PayParam payParam){ - - Wallet wallet = null; - Long userId = null; - // 首先根据钱包ID查询 - if (Objects.nonNull(walletPayParam.getWalletId())) { - wallet = walletManager.findById(walletPayParam.getWalletId()).orElseThrow(null); - } - if (Objects.nonNull(wallet)){ - return wallet; - } - // 根据用户id查询 - if (Objects.isNull(walletPayParam.getUserId())){ - userId = SecurityUtil.getCurrentUser().map(UserDetail::getId).orElse(null); - } - return walletManager.findByUser(userId,payParam.getMchAppCode()).orElse(null); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletService.java deleted file mode 100644 index e566759e..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wallet/service/WalletService.java +++ /dev/null @@ -1,170 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wallet.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.daxpay.code.paymodel.WalletCode; -import cn.bootx.platform.daxpay.core.channel.wallet.dao.WalletConfigManager; -import cn.bootx.platform.daxpay.core.channel.wallet.dao.WalletLogManager; -import cn.bootx.platform.daxpay.core.channel.wallet.dao.WalletManager; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.Wallet; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletConfig; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.WalletLog; -import cn.bootx.platform.daxpay.core.merchant.service.MchAppService; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletRechargeParam; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.util.List; -import java.util.stream.Collectors; - -/** - * - * @author xxm - * @since 2023/6/26 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WalletService { - - private final WalletManager walletManager; - - private final WalletConfigManager walletConfigManager; - - private final WalletLogManager walletLogManager; - - private final MchAppService mchAppService; - - /** - * 开通操作 创建 - */ - @Transactional(rollbackFor = Exception.class) - public void createWallet(Long userId, String mchCode, String mchAppCode) { - - // 是否有管理关系判断 - if (!mchAppService.checkMatch(mchCode, mchAppCode)) { - throw new BizException("应用信息与商户信息不匹配"); - } - - // 钱包配置 - BigDecimal defaultBalance = walletConfigManager.findByMchCode(mchAppCode) - .map(WalletConfig::getDefaultBalance) - .orElse(BigDecimal.ZERO); - - // 判断钱包是否已开通 - if (walletManager.existsByUser(userId, mchAppCode)) { - throw new BizException("钱包已经开通"); - } - Wallet wallet = new Wallet().setUserId(userId) - .setBalance(defaultBalance) - .setMchCode(mchCode) - .setMchAppCode(mchAppCode) - .setFreezeBalance(BigDecimal.ZERO) - .setStatus(WalletCode.STATUS_NORMAL); - walletManager.save(wallet); - // 激活 log - WalletLog activeLog = new WalletLog().setWalletId(wallet.getId()) - .setUserId(wallet.getUserId()) - .setType(WalletCode.LOG_ACTIVE) - .setAmount(defaultBalance) - .setRemark("激活钱包") - .setOperationSource(WalletCode.OPERATION_SOURCE_USER); - walletLogManager.save(activeLog); - } - - /** - * 批量开通 - */ - @Transactional(rollbackFor = Exception.class) - public void createWalletBatch(List userIds,String mchCode, String mchAppCode) { - // 是否有管理关系判断 - if (!mchAppService.checkMatch(mchCode, mchAppCode)) { - throw new BizException("应用信息与商户信息不匹配"); - } - // 钱包配置 - BigDecimal defaultBalance = walletConfigManager.findByMchCode(mchAppCode) - .map(WalletConfig::getDefaultBalance) - .orElse(BigDecimal.ZERO); - // 查询出已经开通钱包的id - List existUserIds = walletManager.findExistUserIds(userIds); - userIds.removeAll(existUserIds); - List wallets = userIds.stream() - .map(userId -> new Wallet().setUserId(userId) - .setStatus(WalletCode.STATUS_NORMAL) - .setFreezeBalance(BigDecimal.ZERO) - .setBalance(defaultBalance)) - .collect(Collectors.toList()); - walletManager.saveAll(wallets); - List walletLogs = wallets.stream() - .map(wallet -> new WalletLog().setWalletId(wallet.getId()) - .setUserId(wallet.getUserId()) - .setAmount(defaultBalance) - .setType(WalletCode.LOG_ACTIVE) - .setRemark("批量开通钱包") - .setOperationSource(WalletCode.OPERATION_SOURCE_ADMIN)) - .collect(Collectors.toList()); - walletLogManager.saveAll(walletLogs); - } - - /** - * 锁定钱包 - */ - @Transactional(rollbackFor = Exception.class) - public void lock(Long walletId) { - Wallet wallet = walletManager.findById(walletId).orElseThrow(DataNotExistException::new); - wallet.setStatus(WalletCode.STATUS_FORBIDDEN); - walletManager.updateById(wallet); - // 激活 log - WalletLog log = new WalletLog().setWalletId(wallet.getId()) - .setUserId(wallet.getUserId()) - .setType(WalletCode.LOG_LOCK) - .setRemark("锁定钱包") - .setOperationSource(WalletCode.OPERATION_SOURCE_ADMIN); - walletLogManager.save(log); - } - - /** - * 解锁钱包 - */ - @Transactional(rollbackFor = Exception.class) - public void unlock(Long walletId) { - Wallet wallet = walletManager.findById(walletId).orElseThrow(DataNotExistException::new); - wallet.setStatus(WalletCode.STATUS_NORMAL); - walletManager.updateById(wallet); - // 激活 log - WalletLog log = new WalletLog().setWalletId(wallet.getId()) - .setUserId(wallet.getUserId()) - .setType(WalletCode.LOG_UNLOCK) - .setRemark("解锁钱包") - .setOperationSource(WalletCode.OPERATION_SOURCE_ADMIN); - walletLogManager.save(log); - } - - /** - * 更改余额 也可以扣款 - */ - @Transactional(rollbackFor = Exception.class) - public void changerBalance(WalletRechargeParam param) { - if (BigDecimalUtil.compareTo(param.getAmount(), BigDecimal.ZERO) == 1) { - walletManager.increaseBalance(param.getWalletId(), param.getAmount()); - } - else if (BigDecimalUtil.compareTo(param.getAmount(), BigDecimal.ZERO) == -1) { - walletManager.reduceBalanceUnlimited(param.getWalletId(), param.getAmount()); - } - else { - return; - } - Wallet wallet = walletManager.findById(param.getWalletId()).orElseThrow(DataNotExistException::new); - WalletLog walletLog = new WalletLog().setAmount(param.getAmount()) - .setWalletId(wallet.getId()) - .setType(WalletCode.LOG_ADMIN_CHANGER) - .setUserId(wallet.getUserId()) - .setRemark(String.format("系统变动余额 %.2f ", param.getAmount())) - .setOperationSource(WalletCode.OPERATION_SOURCE_ADMIN); - walletLogManager.save(walletLog); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/convert/WeChatConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/convert/WeChatConvert.java deleted file mode 100644 index d6e19e03..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/convert/WeChatConvert.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.convert; - -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayment; -import cn.bootx.platform.daxpay.dto.channel.wechat.WeChatPayConfigDto; -import cn.bootx.platform.daxpay.dto.channel.wechat.WeChatPaymentDto; -import cn.bootx.platform.daxpay.param.channel.wechat.WeChatPayConfigParam; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 微信转换类 - * - * @author xxm - * @since 2021/6/21 - */ -@Mapper -public interface WeChatConvert { - - WeChatConvert CONVERT = Mappers.getMapper(WeChatConvert.class); - - WeChatPayConfig convert(WeChatPayConfigParam in); - - WeChatPayConfigDto convert(WeChatPayConfig in); - - WeChatPaymentDto convert(WeChatPayment in); - - WeChatPayment convert(WeChatPaymentDto in); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPayConfigManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPayConfigManager.java deleted file mode 100644 index 43b88ca3..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPayConfigManager.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.common.query.generator.QueryGenerator; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.bootx.platform.daxpay.param.channel.wechat.WeChatPayConfigParam; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 微信支付配置 - * - * @author xxm - * @since 2021/3/19 - */ -@Repository -@RequiredArgsConstructor -public class WeChatPayConfigManager extends BaseManager { - - - public Optional findByMchAppCode(String mchAppCode){ - return findByField(WeChatPayConfig::getMchAppCode,mchAppCode); - } - /** - * 分页 - */ - public Page page(PageParam pageParam, WeChatPayConfigParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, WeChatPayConfig.class); - QueryWrapper wrapper = QueryGenerator.generator(param); - wrapper.orderByDesc(MpIdEntity.Id.id); - return this.page(mpPage,wrapper); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPayConfigMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPayConfigMapper.java deleted file mode 100644 index fb61adec..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPayConfigMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.dao; - -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 微信支付配置 - * - * @author xxm - * @since 2021/3/19 - */ -@Mapper -public interface WeChatPayConfigMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPaymentManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPaymentManager.java deleted file mode 100644 index c1503af0..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPaymentManager.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.dao; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayment; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 微信支付记录 - * - * @author xxm - * @since 2021/6/21 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class WeChatPaymentManager extends BaseManager { - - public Optional findByPaymentId(Long paymentId) { - return findByField(WeChatPayment::getPaymentId, paymentId); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPaymentMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPaymentMapper.java deleted file mode 100644 index 113f9af1..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/dao/WeChatPaymentMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.dao; - -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayment; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface WeChatPaymentMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/entity/WeChatPayConfig.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/entity/WeChatPayConfig.java deleted file mode 100644 index e909030c..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/entity/WeChatPayConfig.java +++ /dev/null @@ -1,144 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.entity; - -import cn.bootx.platform.common.core.annotation.BigField; -import cn.bootx.platform.common.core.annotation.EncryptionField; -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.daxpay.code.paymodel.WeChatPayCode; -import cn.bootx.platform.daxpay.core.channel.wechat.convert.WeChatConvert; -import cn.bootx.platform.daxpay.dto.channel.wechat.WeChatPayConfigDto; -import cn.bootx.platform.daxpay.param.channel.wechat.WeChatPayConfigParam; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.mysql.annotation.DbMySqlFieldType; -import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; -import cn.bootx.table.modify.mysql.constants.MySqlFieldTypeEnum; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 微信支付配置 - * - * @author xxm - * @since 2021/3/1 - */ -@EqualsAndHashCode(callSuper = true) -@Data -//@DbTable(comment = "微信支付配置") -@Accessors(chain = true) -@TableName("pay_wechat_pay_config") -public class WeChatPayConfig extends MpBaseEntity implements EntityBaseFunction { - - /** 名称 */ - @DbColumn(comment = "名称") - private String name; - - /** 商户编码 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - @DbColumn(comment = "商户编码") - private String mchCode; - - /** 商户应用编码 */ - @TableField(updateStrategy = FieldStrategy.NEVER) - @DbMySqlIndex(comment = "商户应用编码唯一索引") - @DbColumn(comment = "商户应用编码") - private String mchAppCode; - - /** 微信商户Id */ - @DbColumn(comment = "微信商户号") - private String wxMchId; - - /** 微信应用appId */ - @DbColumn(comment = "微信应用appId") - private String wxAppId; - - /** - * api版本 - * @see WeChatPayCode#API_V2 - */ - @DbColumn(comment = "api版本") - private String apiVersion; - - /** 商户平台「API安全」中的 APIv2 密钥 */ - @TableField(updateStrategy = FieldStrategy.IGNORED) - @BigField - @EncryptionField - @DbColumn(comment = "APIv2 密钥") - private String apiKeyV2; - - /** 商户平台「API安全」中的 APIv3 密钥 */ - @TableField(updateStrategy = FieldStrategy.IGNORED) - @BigField - @EncryptionField - @DbColumn(comment = "APIv3 密钥") - private String apiKeyV3; - - /** APPID对应的接口密码,用于获取微信公众号jsapi支付时使用 */ - @TableField(updateStrategy = FieldStrategy.IGNORED) - @EncryptionField - @DbColumn(comment = "APPID对应的接口密码") - private String appSecret; - - /** API证书中p12证书Base64 */ - @TableField(updateStrategy = FieldStrategy.IGNORED) - @BigField - @EncryptionField - @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) - @DbColumn(comment = "API证书中p12证书Base64") - private String p12; - - /** 服务器异步通知页面路径 通知url必须为直接可访问的url,不能携带参数。公网域名必须为https */ - @DbColumn(comment = "异步通知页面") - private String notifyUrl; - - /** 页面跳转同步通知页面路径 */ - @DbColumn(comment = "同步通知页面") - private String returnUrl; - - /** 是否沙箱环境 */ - @DbColumn(comment = "是否沙箱环境") - private boolean sandbox; - - /** 超时时间(分钟) */ - @DbColumn(comment = "超时时间(分钟)") - private Integer expireTime; - - /** 可用支付方式 */ - @TableField(updateStrategy = FieldStrategy.IGNORED) - @DbColumn(comment = "可用支付方式") - private String payWays; - - /** - * 状态 - * @see cn.bootx.platform.daxpay.code.MchAndAppCode#PAY_CONFIG_STATE_NORMAL - */ - @DbColumn(comment = "状态") - private String state; - - /** 备注 */ - @DbColumn(comment = "备注") - private String remark; - - @Override - public WeChatPayConfigDto toDto() { - WeChatPayConfigDto convert = WeChatConvert.CONVERT.convert(this); - if (StrUtil.isNotBlank(this.getPayWays())) { - convert.setPayWayList(StrUtil.split(this.getPayWays(), ',')); - } - return convert; - } - - public static WeChatPayConfig init(WeChatPayConfigParam in) { - WeChatPayConfig convert = WeChatConvert.CONVERT.convert(in); - if (CollUtil.isNotEmpty(in.getPayWayList())) { - convert.setPayWays(String.join(",", in.getPayWayList())); - } - return convert; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/entity/WeChatPayment.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/entity/WeChatPayment.java deleted file mode 100644 index 4a7d68e0..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/entity/WeChatPayment.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.daxpay.core.channel.wechat.convert.WeChatConvert; -import cn.bootx.platform.daxpay.core.channel.base.entity.BasePayment; -import cn.bootx.platform.daxpay.dto.channel.wechat.WeChatPaymentDto; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * @author xxm - * @since 2021/6/21 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName("pay_wechat_payment") -public class WeChatPayment extends BasePayment implements EntityBaseFunction { - - /** - * 微信交易号 - */ - private String tradeNo; - - @Override - public WeChatPaymentDto toDto() { - return WeChatConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCallbackService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCallbackService.java deleted file mode 100644 index f86de3ef..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCallbackService.java +++ /dev/null @@ -1,103 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.service; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.redis.RedisClient; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.code.paymodel.WeChatPayCode; -import cn.bootx.platform.daxpay.core.notify.dao.PayNotifyRecordManager; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayCallbackStrategy; -import cn.bootx.platform.daxpay.core.pay.service.PayCallbackService; -import cn.bootx.platform.daxpay.core.channel.wechat.dao.WeChatPayConfigManager; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import com.ijpay.core.enums.SignType; -import com.ijpay.core.kit.WxPayKit; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -import static cn.bootx.platform.daxpay.code.paymodel.WeChatPayCode.APPID; - -/** - * 微信支付回调 - * - * @author xxm - * @since 2021/6/21 - */ -@Slf4j -@Service -public class WeChatPayCallbackService extends AbsPayCallbackStrategy { - - private final WeChatPayConfigManager weChatPayConfigManager; - - public WeChatPayCallbackService(RedisClient redisClient, PayNotifyRecordManager payNotifyRecordManager, - PayCallbackService payCallbackService, WeChatPayConfigManager weChatPayConfigManager) { - super(redisClient, payNotifyRecordManager, payCallbackService); - this.weChatPayConfigManager = weChatPayConfigManager; - } - - @Override - public PayChannelEnum getPayChannel() { - return PayChannelEnum.WECHAT; - } - - /** - * 获取支付单id - */ - @Override - public Long getPaymentId() { - Map params = PARAMS.get(); - String paymentId = params.get(WeChatPayCode.OUT_TRADE_NO); - return Long.valueOf(paymentId); - } - - /** - * 获取支付状态 - */ - @Override - public String getTradeStatus() { - Map params = PARAMS.get(); - if (WxPayKit.codeIsOk(params.get(WeChatPayCode.RESULT_CODE))) { - return PayStatusCode.NOTIFY_TRADE_SUCCESS; - } - else { - return PayStatusCode.NOTIFY_TRADE_FAIL; - } - } - - /** - * 验证回调消息 - */ - @Override - public boolean verifyNotify(String mchAppCode) { - Map params = PARAMS.get(); - String callReq = JSONUtil.toJsonStr(params); - log.info("微信发起回调 报文: {}", callReq); - String appId = params.get(APPID); - - if (StrUtil.isBlank(appId)) { - log.warn("微信回调报文 appId 为空 {}", callReq); - return false; - } - - WeChatPayConfig weChatPayConfig = weChatPayConfigManager.findByMchAppCode(mchAppCode).orElseThrow(DataNotExistException::new); - if (weChatPayConfig == null) { - log.warn("微信支付配置不存在: {}", callReq); - return false; - } - return WxPayKit.verifyNotify(params, weChatPayConfig.getApiKeyV2(), SignType.HMACSHA256, null); - } - - @Override - public String getReturnMsg() { - Map xml = new HashMap<>(4); - xml.put(WeChatPayCode.RETURN_CODE, "SUCCESS"); - xml.put(WeChatPayCode.RETURN_MSG, "OK"); - return WxPayKit.toXml(xml); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCancelService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCancelService.java deleted file mode 100644 index 15fb74ec..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayCancelService.java +++ /dev/null @@ -1,118 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.service; - -import cn.bootx.platform.common.spring.exception.RetryableException; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.paymodel.WeChatPayCode; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.refund.local.AsyncRefundLocal; -import cn.bootx.platform.daxpay.dto.payment.RefundableInfo; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import com.ijpay.core.enums.SignType; -import com.ijpay.core.kit.WxPayKit; -import com.ijpay.wxpay.WxPayApi; -import com.ijpay.wxpay.model.CloseOrderModel; -import com.ijpay.wxpay.model.RefundModel; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.retry.annotation.Retryable; -import org.springframework.stereotype.Service; - -import java.io.ByteArrayInputStream; -import java.math.BigDecimal; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -import static cn.bootx.platform.daxpay.code.pay.PayStatusCode.REFUND_PROCESS_FAIL; - -/** - * 微信支付关闭和退款 - * - * @author xxm - * @since 2021/6/21 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatPayCancelService { - - /** - * 关闭支付 - */ - @Retryable(value = RetryableException.class) - public void cancelRemote(Payment payment, WeChatPayConfig weChatPayConfig) { - // 只有部分需要调用微信网关进行关闭 - Map params = CloseOrderModel.builder() - .appid(weChatPayConfig.getWxAppId()) - .mch_id(weChatPayConfig.getWxMchId()) - .out_trade_no(String.valueOf(payment.getId())) - .nonce_str(WxPayKit.generateStr()) - .build() - .createSign(weChatPayConfig.getApiKeyV2(), SignType.HMACSHA256); - String xmlResult = WxPayApi.closeOrder(params); - - Map result = WxPayKit.xmlToMap(xmlResult); - this.verifyErrorMsg(result); - } - - /** - * 退款 - */ - public void refund(Payment payment, BigDecimal amount, - WeChatPayConfig weChatPayConfig) { - RefundableInfo refundableInfo = payment.getRefundableInfo().stream() - .filter(o -> Objects.equals(o.getPayChannel(), PayChannelEnum.WECHAT.getCode())) - .findFirst() - .orElseThrow(() -> new PayFailureException("未找到微信支付的详细信息")); - String refundFee = amount.multiply(BigDecimal.valueOf(100)).toBigInteger().toString(); - String totalFee = refundableInfo.getAmount().multiply(BigDecimal.valueOf(100)).toBigInteger().toString(); - // 设置退款号 - AsyncRefundLocal.set(IdUtil.getSnowflakeNextIdStr()); - Map params = RefundModel.builder() - .appid(weChatPayConfig.getWxAppId()) - .mch_id(weChatPayConfig.getWxMchId()) - .out_trade_no(String.valueOf(payment.getId())) - .out_refund_no(AsyncRefundLocal.get()) - .total_fee(totalFee) - .refund_fee(refundFee) - .nonce_str(WxPayKit.generateStr()) - .build() - .createSign(weChatPayConfig.getApiKeyV2(), SignType.HMACSHA256); - // 获取证书文件 - if (StrUtil.isBlank(weChatPayConfig.getP12())){ - String errorMsg = "微信p.12证书未配置,无法进行退款"; - AsyncRefundLocal.setErrorMsg(errorMsg); - AsyncRefundLocal.setErrorCode(REFUND_PROCESS_FAIL); - throw new PayFailureException(errorMsg); - } - byte[] fileBytes = Base64.decode(weChatPayConfig.getP12()); - ByteArrayInputStream inputStream = new ByteArrayInputStream(fileBytes); - // 证书密码为 微信商户号 - String xmlResult = WxPayApi.orderRefund(false, params, inputStream, weChatPayConfig.getWxMchId()); - Map result = WxPayKit.xmlToMap(xmlResult); - this.verifyErrorMsg(result); - } - - /** - * 验证错误信息 - */ - private void verifyErrorMsg(Map result) { - String returnCode = result.get(WeChatPayCode.RETURN_CODE); - String resultCode = result.get(WeChatPayCode.RESULT_CODE); - if (!WxPayKit.codeIsOk(returnCode) || !WxPayKit.codeIsOk(resultCode)) { - String errorMsg = result.get(WeChatPayCode.ERR_CODE_DES); - if (StrUtil.isBlank(errorMsg)) { - errorMsg = result.get(WeChatPayCode.RETURN_MSG); - } - log.error("订单退款/关闭失败 {}", errorMsg); - AsyncRefundLocal.setErrorMsg(errorMsg); - AsyncRefundLocal.setErrorCode(Optional.ofNullable(resultCode).orElse(returnCode)); - throw new PayFailureException(errorMsg); - } - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayConfigService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayConfigService.java deleted file mode 100644 index a24a5f05..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayConfigService.java +++ /dev/null @@ -1,110 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.dto.LabelValue; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.code.MchAndAppCode; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.paymodel.WeChatPayWay; -import cn.bootx.platform.daxpay.core.channel.wechat.dao.WeChatPayConfigManager; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.bootx.platform.daxpay.core.merchant.entity.MchAppPayConfig; -import cn.bootx.platform.daxpay.core.merchant.service.MchAppPayConfigService; -import cn.bootx.platform.daxpay.core.merchant.service.MchAppService; -import cn.bootx.platform.daxpay.dto.channel.wechat.WeChatPayConfigDto; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.param.channel.wechat.WeChatPayConfigParam; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 微信支付配置 - * - * @author xxm - * @since 2021/3/5 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatPayConfigService { - - private final WeChatPayConfigManager weChatPayConfigManager; - private final MchAppService mchAppService; - private final MchAppPayConfigService appPayConfigService; - - /** - * 添加微信支付配置 - */ - @Transactional(rollbackFor = Exception.class) - public void add(WeChatPayConfigParam param) { - // 是否有管理关系判断 - if (!mchAppService.checkMatch(param.getMchCode(), param.getMchAppCode())) { - throw new BizException("应用信息与商户信息不匹配"); - } - - WeChatPayConfig weChatPayConfig = WeChatPayConfig.init(param); - weChatPayConfig.setState(MchAndAppCode.PAY_CONFIG_STATE_NORMAL); - weChatPayConfigManager.save(weChatPayConfig); - // 保存关联关系 - MchAppPayConfig mchAppPayConfig = new MchAppPayConfig().setAppCode(weChatPayConfig.getMchAppCode()) - .setConfigId(weChatPayConfig.getId()) - .setChannel(PayChannelEnum.WECHAT.getCode()) - .setState(weChatPayConfig.getState()); - appPayConfigService.add(mchAppPayConfig); - } - - /** - * 修改 - */ - @Transactional(rollbackFor = Exception.class) - public void update(WeChatPayConfigParam param) { - WeChatPayConfig weChatPayConfig = weChatPayConfigManager.findById(param.getId()) - .orElseThrow(() -> new PayFailureException("微信支付配置不存在")); - param.setActivity(null); - BeanUtil.copyProperties(param, weChatPayConfig, CopyOptions.create().ignoreNullValue()); - // 支付方式 - if (CollUtil.isNotEmpty(param.getPayWayList())) { - weChatPayConfig.setPayWays(String.join(",", param.getPayWayList())); - } - else { - weChatPayConfig.setPayWays(null); - } - weChatPayConfigManager.updateById(weChatPayConfig); - } - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, WeChatPayConfigParam param) { - return MpUtil.convert2DtoPageResult(weChatPayConfigManager.page(pageParam, param)); - } - - /** - * 获取 - */ - public WeChatPayConfigDto findById(Long id) { - return weChatPayConfigManager.findById(id).map(WeChatPayConfig::toDto).orElseThrow(DataNotExistException::new); - } - - /** - * 微信支持支付方式 - */ - public List findPayWayList() { - return WeChatPayWay.getPayWays() - .stream() - .map(e -> new LabelValue(e.getName(),e.getCode())) - .collect(Collectors.toList()); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayService.java deleted file mode 100644 index 5b58bdd8..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPayService.java +++ /dev/null @@ -1,281 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.service; - -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import cn.bootx.platform.common.jackson.util.JacksonUtil; -import cn.bootx.platform.common.spring.exception.RetryableException; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.code.pay.PayWayEnum; -import cn.bootx.platform.daxpay.code.paymodel.WeChatPayCode; -import cn.bootx.platform.daxpay.code.paymodel.WeChatPayWay; -import cn.bootx.platform.daxpay.core.pay.local.AsyncPayInfoLocal; -import cn.bootx.platform.daxpay.core.sync.result.PaySyncResult; -import cn.bootx.platform.daxpay.core.sync.service.PaySyncService; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.bootx.platform.daxpay.dto.pay.AsyncPayInfo; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.bootx.platform.daxpay.param.channel.wechat.WeChatPayParam; -import cn.bootx.platform.daxpay.util.PayWayUtil; -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.net.NetUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.spring.SpringUtil; -import com.ijpay.core.enums.SignType; -import com.ijpay.core.enums.TradeType; -import com.ijpay.core.kit.WxPayKit; -import com.ijpay.wxpay.WxPayApi; -import com.ijpay.wxpay.model.MicroPayModel; -import com.ijpay.wxpay.model.UnifiedOrderModel; -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; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.*; - -import static cn.bootx.platform.daxpay.code.pay.PaySyncStatus.WAIT_BUYER_PAY; - -/** - * 微信支付 - * - * @author xxm - * @since 2021/3/2 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatPayService { - - private final PaySyncService paySyncService; - - private final WeChatPaySyncService weChatPaySyncService; - - /** - * 校验 - */ - public void validation(PayWayParam payWayParam, WeChatPayConfig weChatPayConfig) { - List payWays = Optional.ofNullable(weChatPayConfig.getPayWays()) - .filter(StrUtil::isNotBlank) - .map(s -> StrUtil.split(s, ',')) - .orElse(new ArrayList<>(1)); - - PayWayEnum payWayEnum = Optional.ofNullable(WeChatPayWay.findByCode(payWayParam.getPayWay())) - .orElseThrow(() -> new PayFailureException("非法的微信支付类型")); - if (!payWays.contains(payWayEnum.getCode())) { - throw new PayFailureException("该微信支付方式不可用"); - } - } - - /** - * 支付 - */ - public void pay(BigDecimal amount, Payment payment, WeChatPayParam weChatPayParam, PayWayParam payWayParam, - WeChatPayConfig weChatPayConfig) { - // 微信传入的是分, 将元转换为分 - String totalFee = String.valueOf(amount.multiply(new BigDecimal(100)).longValue()); - AsyncPayInfo asyncPayInfo = Optional.ofNullable(AsyncPayInfoLocal.get()).orElse(new AsyncPayInfo()); - String payBody = null; - PayWayEnum payWayEnum = PayWayEnum.findByCode(payWayParam.getPayWay()); - - // wap支付 - if (payWayEnum == PayWayEnum.WAP) { - payBody = this.wapPay(totalFee, payment, weChatPayConfig); - } - // APP支付 - else if (payWayEnum == PayWayEnum.APP) { - payBody = this.appPay(totalFee, payment, weChatPayConfig); - } - // 微信公众号支付或者小程序支付 - else if (payWayEnum == PayWayEnum.JSAPI) { - payBody = this.jsPay(totalFee, payment, weChatPayParam.getOpenId(), weChatPayConfig); - } - // 二维码支付 - else if (payWayEnum == PayWayEnum.QRCODE) { - payBody = this.qrCodePay(totalFee, payment, weChatPayConfig); - } - // 付款码支付 - else if (payWayEnum == PayWayEnum.BARCODE) { - String tradeNo = this.barCode(totalFee, payment, weChatPayParam.getAuthCode(), weChatPayConfig); - asyncPayInfo.setTradeNo(tradeNo).setExpiredTime(false); - } - asyncPayInfo.setPayBody(payBody); - AsyncPayInfoLocal.set(asyncPayInfo); - } - - /** - * wap支付 - */ - private String wapPay(String amount, Payment payment, WeChatPayConfig weChatPayConfig) { - Map params = this.buildParams(amount, payment, weChatPayConfig, TradeType.MWEB.getTradeType()) - .build() - .createSign(weChatPayConfig.getApiKeyV2(), SignType.HMACSHA256); - - String xmlResult = WxPayApi.pushOrder(false, params); - Map result = WxPayKit.xmlToMap(xmlResult); - this.verifyErrorMsg(result); - return result.get(WeChatPayCode.MWEB_URL); - } - - /** - * 程序支付 - */ - private String appPay(String amount, Payment payment, WeChatPayConfig weChatPayConfig) { - Map params = this.buildParams(amount, payment, weChatPayConfig, TradeType.APP.getTradeType()) - .build() - .createSign(weChatPayConfig.getApiKeyV2(), SignType.HMACSHA256); - - String xmlResult = WxPayApi.pushOrder(false, params); - Map result = WxPayKit.xmlToMap(xmlResult); - this.verifyErrorMsg(result); - return result.get(WeChatPayCode.PREPAY_ID); - } - - /** - * 微信公众号支付或者小程序支付 - */ - private String jsPay(String amount, Payment payment, String openId, WeChatPayConfig weChatPayConfig) { - Map params = this.buildParams(amount, payment, weChatPayConfig, TradeType.JSAPI.getTradeType()) - .openid(openId) - .build() - .createSign(weChatPayConfig.getApiKeyV2(), SignType.HMACSHA256); - - String xmlResult = WxPayApi.pushOrder(false, params); - Map result = WxPayKit.xmlToMap(xmlResult); - this.verifyErrorMsg(result); - String prepayId = result.get(WeChatPayCode.PREPAY_ID); - Map packageParams = WxPayKit.miniAppPrepayIdCreateSign(weChatPayConfig.getWxAppId(), prepayId, - weChatPayConfig.getApiKeyV2(), SignType.HMACSHA256); - String jsonStr = JacksonUtil.toJson(packageParams); - log.info("小程序支付的参数:" + jsonStr); - return jsonStr ; - } - - /** - * 二维码支付 - */ - private String qrCodePay(String amount, Payment payment, WeChatPayConfig weChatPayConfig) { - - Map params = this.buildParams(amount, payment, weChatPayConfig, TradeType.NATIVE.getTradeType()) - .build() - .createSign(weChatPayConfig.getApiKeyV2(), SignType.HMACSHA256); - - String xmlResult = WxPayApi.pushOrder(false, params); - Map result = WxPayKit.xmlToMap(xmlResult); - this.verifyErrorMsg(result); - return result.get(WeChatPayCode.CODE_URL); - } - - /** - * 付款码支付 - */ - private String barCode(String amount, Payment payment, String authCode, WeChatPayConfig weChatPayConfig) { - Map params = MicroPayModel.builder() - .appid(weChatPayConfig.getWxAppId()) - .mch_id(weChatPayConfig.getWxMchId()) - .nonce_str(WxPayKit.generateStr()) - .body(payment.getTitle()) - .auth_code(authCode) - .out_trade_no(String.valueOf(payment.getId())) - .total_fee(amount) - .spbill_create_ip(NetUtil.getLocalhostStr()) - .build() - .createSign(weChatPayConfig.getApiKeyV2(), SignType.HMACSHA256); - - String xmlResult = WxPayApi.microPay(false, params); - Map result = WxPayKit.xmlToMap(xmlResult); - - String returnCode = result.get(WeChatPayCode.RETURN_CODE); - // 支付失败 - if (!WxPayKit.codeIsOk(returnCode)) { - String errorMsg = result.get(WeChatPayCode.ERR_CODE_DES); - throw new PayFailureException(errorMsg); - } - - String resultCode = result.get(WeChatPayCode.RESULT_CODE); - String errCode = result.get(WeChatPayCode.ERR_CODE); - // 支付成功处理 - if (Objects.equals(resultCode, WeChatPayCode.TRADE_SUCCESS)) { - payment.setPayStatus(PayStatusCode.TRADE_SUCCESS).setPayTime(LocalDateTime.now()); - return result.get(WeChatPayCode.TRANSACTION_ID); - } - // 支付中, 发起轮训同步 - if (Objects.equals(resultCode, WeChatPayCode.TRADE_FAIL) - && Objects.equals(errCode, WeChatPayCode.TRADE_USERPAYING)) { - SpringUtil.getBean(this.getClass()).rotationSync(payment, weChatPayConfig); - return result.get(WeChatPayCode.TRANSACTION_ID); - } - - // 支付撤销 - if (Objects.equals(resultCode, WeChatPayCode.TRADE_REVOKED)) { - throw new PayFailureException("用户已撤销支付"); - } - - // 支付失败 - if (Objects.equals(resultCode, WeChatPayCode.TRADE_PAYERROR) - || Objects.equals(resultCode, WeChatPayCode.TRADE_FAIL)) { - String errorMsg = result.get(WeChatPayCode.ERR_CODE_DES); - throw new PayFailureException(errorMsg); - } - return null; - } - - /** - * 构建参数 - */ - private UnifiedOrderModel.UnifiedOrderModelBuilder buildParams(String amount, Payment payment, - WeChatPayConfig weChatPayConfig, String tradeType) { - // 过期时间 - payment.setExpiredTime(PayWayUtil.getPaymentExpiredTime(weChatPayConfig.getExpireTime())); - return UnifiedOrderModel.builder() - .appid(weChatPayConfig.getWxAppId()) - .mch_id(weChatPayConfig.getWxMchId()) - .nonce_str(WxPayKit.generateStr()) - .time_start(LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN)) - // 反正v2版本的超时时间无效 - .time_expire(PayWayUtil.getWxExpiredTime(weChatPayConfig.getExpireTime())) - .body(payment.getTitle()) - .out_trade_no(String.valueOf(payment.getId())) - .total_fee(amount) - .spbill_create_ip(NetUtil.getLocalhostStr()) - .notify_url(weChatPayConfig.getNotifyUrl()) - .trade_type(tradeType); - } - - /** - * 验证错误信息 - */ - private void verifyErrorMsg(Map result) { - String returnCode = result.get(WeChatPayCode.RETURN_CODE); - String resultCode = result.get(WeChatPayCode.RESULT_CODE); - if (!WxPayKit.codeIsOk(returnCode) || !WxPayKit.codeIsOk(resultCode)) { - String errorMsg = result.get(WeChatPayCode.ERR_CODE_DES); - if (StrUtil.isBlank(errorMsg)) { - errorMsg = result.get(WeChatPayCode.RETURN_MSG); - } - log.error("支付失败 {}", errorMsg); - throw new PayFailureException(errorMsg); - } - } - - /** - * 重试同步支付状态, 最多10次, 30秒不操作微信会自动关闭 - */ - @Async("bigExecutor") - @Retryable(value = RetryableException.class, maxAttempts = 10, backoff = @Backoff(value = 5000L)) - public void rotationSync(Payment payment, WeChatPayConfig weChatPayConfig) { - PaySyncResult paySyncResult = weChatPaySyncService.syncPayStatus(payment.getId(), weChatPayConfig); - // 不为支付中状态后, 调用系统同步更新状态, 支付状态则继续重试 - if (Objects.equals(WAIT_BUYER_PAY, paySyncResult.getPaySyncStatus())) { - throw new RetryableException(); - } - else { - paySyncService.syncPayment(payment); - } - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPaySyncService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPaySyncService.java deleted file mode 100644 index 101ae3f6..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPaySyncService.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.service; - -import cn.bootx.platform.daxpay.code.pay.PaySyncStatus; -import cn.bootx.platform.daxpay.code.paymodel.WeChatPayCode; -import cn.bootx.platform.daxpay.core.sync.result.PaySyncResult; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.hutool.json.JSONUtil; -import com.ijpay.core.enums.SignType; -import com.ijpay.core.kit.WxPayKit; -import com.ijpay.wxpay.WxPayApi; -import com.ijpay.wxpay.model.UnifiedOrderModel; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.Map; -import java.util.Objects; - -/** - * 微信支付同步服务 - * - * @author xxm - * @since 2021/6/21 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatPaySyncService { - - /** - * 同步查询 - */ - public PaySyncResult syncPayStatus(Long paymentId, WeChatPayConfig weChatPayConfig) { - PaySyncResult paySyncResult = new PaySyncResult().setPaySyncStatus(PaySyncStatus.FAIL); - Map params = UnifiedOrderModel.builder() - .appid(weChatPayConfig.getWxAppId()) - .mch_id(weChatPayConfig.getWxMchId()) - .nonce_str(WxPayKit.generateStr()) - .out_trade_no(String.valueOf(paymentId)) - .build() - .createSign(weChatPayConfig.getApiKeyV2(), SignType.HMACSHA256); - try { - String xmlResult = WxPayApi.orderQuery(params); - Map result = WxPayKit.xmlToMap(xmlResult); - paySyncResult.setJson(JSONUtil.toJsonStr(result)); - // 查询失败 - if (!WxPayKit.codeIsOk(result.get(WeChatPayCode.RETURN_CODE))) { - log.warn("查询微信订单失败:{}", result); - return paySyncResult; - } - - // 未查到订单 - if (!WxPayKit.codeIsOk(result.get(WeChatPayCode.RESULT_CODE))) { - log.warn("疑似未查询到订单:{}", result); - return paySyncResult.setPaySyncStatus(PaySyncStatus.NOT_FOUND); - } - String tradeStatus = result.get(WeChatPayCode.TRADE_STATE); - // 支付完成 - if (Objects.equals(tradeStatus, WeChatPayCode.TRADE_SUCCESS) - || Objects.equals(tradeStatus, WeChatPayCode.TRADE_ACCEPT)) { - return paySyncResult.setPaySyncStatus(PaySyncStatus.TRADE_SUCCESS).setMap(result); - } - // 待支付 - if (Objects.equals(tradeStatus, WeChatPayCode.TRADE_NOTPAY) - || Objects.equals(tradeStatus, WeChatPayCode.TRADE_USERPAYING)) { - return paySyncResult.setPaySyncStatus(PaySyncStatus.WAIT_BUYER_PAY); - } - - // 已退款/退款中 - if (Objects.equals(tradeStatus, WeChatPayCode.TRADE_REFUND)) { - return paySyncResult.setPaySyncStatus(PaySyncStatus.TRADE_REFUND); - } - // 已关闭 - if (Objects.equals(tradeStatus, WeChatPayCode.TRADE_CLOSED) - || Objects.equals(tradeStatus, WeChatPayCode.TRADE_REVOKED) - || Objects.equals(tradeStatus, WeChatPayCode.TRADE_PAYERROR)) { - return paySyncResult.setPaySyncStatus(PaySyncStatus.TRADE_CLOSED); - } - - } - catch (RuntimeException e) { - log.error("查询订单失败:", e); - paySyncResult.setMsg(e.getMessage()); - } - return paySyncResult; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPaymentService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPaymentService.java deleted file mode 100644 index 5981430d..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/wechat/service/WeChatPaymentService.java +++ /dev/null @@ -1,122 +0,0 @@ -package cn.bootx.platform.daxpay.core.channel.wechat.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.channel.wechat.dao.WeChatPaymentManager; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayment; -import cn.bootx.platform.daxpay.core.pay.local.AsyncPayInfoLocal; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.dto.pay.AsyncPayInfo; -import cn.bootx.platform.daxpay.dto.payment.PayChannelInfo; -import cn.bootx.platform.daxpay.dto.payment.RefundableInfo; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -/** - * 微信支付记录单 - * - * @author xxm - * @since 2021/6/21 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WeChatPaymentService { - - private final PaymentService paymentService; - - private final WeChatPaymentManager weChatPaymentManager; - - /** - * 支付调起成功 更新payment中异步支付类型信息, 如果支付完成, 创建微信支付单 - */ - public void updatePaySuccess(Payment payment, PayWayParam payWayParam) { - AsyncPayInfo asyncPayInfo = AsyncPayInfoLocal.get(); - payment.setAsyncPayMode(true).setAsyncPayChannel(PayChannelEnum.WECHAT.getCode()); - - List payTypeInfos = payment.getPayChannelInfo(); - List refundableInfos = payment.getRefundableInfo(); - // 清除已有的异步支付类型信息 - payTypeInfos.removeIf(payTypeInfo -> PayChannelEnum.ASYNC_TYPE_CODE.contains(payTypeInfo.getPayChannel())); - refundableInfos.removeIf(payTypeInfo -> PayChannelEnum.ASYNC_TYPE_CODE.contains(payTypeInfo.getPayChannel())); - // 添加微信支付类型信息 - payTypeInfos.add(new PayChannelInfo().setPayChannel(PayChannelEnum.WECHAT.getCode()) - .setPayWay(payWayParam.getPayWay()) - .setAmount(payWayParam.getAmount()) - .setExtraParamsJson(payWayParam.getExtraParamsJson())); - payment.setPayChannelInfo(payTypeInfos); - // 更新微信可退款类型信息 - refundableInfos.add( - new RefundableInfo().setPayChannel(PayChannelEnum.WECHAT.getCode()).setAmount(payWayParam.getAmount())); - payment.setRefundableInfo(refundableInfos); - // 如果支付完成(付款码情况) 调用 updateSyncSuccess 创建微信支付记录 - if (Objects.equals(payment.getPayStatus(), PayStatusCode.TRADE_SUCCESS)) { - this.createWeChatPayment(payment, payWayParam, asyncPayInfo.getTradeNo()); - } - } - - /** - * 异步支付成功, 更新支付记录成功状态, 并创建微信支付记录 - */ - public void updateAsyncSuccess(Long id, PayWayParam payWayParam, String tradeNo) { - Payment payment = paymentService.findById(id).orElseThrow(() -> new BizException("支付记录不存在")); - this.createWeChatPayment(payment, payWayParam, tradeNo); - } - - /** - * 并创建微信支付记录 - */ - private void createWeChatPayment(Payment payment, PayWayParam payWayParam, String tradeNo) { - // 创建微信支付记录 - WeChatPayment wechatPayment = new WeChatPayment(); - wechatPayment.setTradeNo(tradeNo) - .setPaymentId(payment.getId()) - .setAmount(payWayParam.getAmount()) - .setRefundableBalance(payWayParam.getAmount()) - .setBusinessId(payment.getBusinessId()) - .setPayStatus(PayStatusCode.TRADE_SUCCESS) - .setPayTime(LocalDateTime.now()); - weChatPaymentManager.save(wechatPayment); - } - - /** - * 取消状态 - */ - public void updateClose(Long paymentId) { - Optional weChatPaymentOptional = weChatPaymentManager.findByPaymentId(paymentId); - weChatPaymentOptional.ifPresent(weChatPayment -> { - weChatPayment.setPayStatus(PayStatusCode.TRADE_CANCEL); - weChatPaymentManager.updateById(weChatPayment); - }); - } - - /** - * 更新退款 - */ - public void updatePayRefund(Long paymentId, BigDecimal amount) { - Optional weChatPayment = weChatPaymentManager.findByPaymentId(paymentId); - weChatPayment.ifPresent(payment -> { - BigDecimal refundableBalance = payment.getRefundableBalance().subtract(amount); - payment.setRefundableBalance(refundableBalance); - if (BigDecimalUtil.compareTo(refundableBalance, BigDecimal.ZERO) == 0) { - payment.setPayStatus(PayStatusCode.TRADE_REFUNDED); - } - else { - payment.setPayStatus(PayStatusCode.TRADE_REFUNDING); - } - weChatPaymentManager.updateById(payment); - }); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/convert/MchApplicationConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/convert/MchApplicationConvert.java deleted file mode 100644 index d7fd3dd2..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/convert/MchApplicationConvert.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.convert; - -import cn.bootx.platform.daxpay.core.merchant.entity.MchApplication; -import cn.bootx.platform.daxpay.dto.merchant.MchApplicationDto; -import cn.bootx.platform.daxpay.param.merchant.MchApplicationParam; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 商户应用 - * - * @author xxm - * @since 2023-05-19 - */ -@Mapper -public interface MchApplicationConvert { - - MchApplicationConvert CONVERT = Mappers.getMapper(MchApplicationConvert.class); - - MchApplication convert(MchApplicationParam in); - - MchApplicationDto convert(MchApplication in); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/convert/MerchantInfoConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/convert/MerchantInfoConvert.java deleted file mode 100644 index d7e8c6a3..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/convert/MerchantInfoConvert.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.convert; - -import cn.bootx.platform.daxpay.core.merchant.entity.MerchantInfo; -import cn.bootx.platform.daxpay.dto.merchant.MerchantInfoDto; -import cn.bootx.platform.daxpay.param.merchant.MerchantInfoParam; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 商户 - * - * @author xxm - * @since 2023-05-17 - */ -@Mapper -public interface MerchantInfoConvert { - - MerchantInfoConvert CONVERT = Mappers.getMapper(MerchantInfoConvert.class); - - MerchantInfo convert(MerchantInfoParam in); - - MerchantInfoDto convert(MerchantInfo in); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchAppManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchAppManager.java deleted file mode 100644 index 9f80b910..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchAppManager.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.common.query.generator.QueryGenerator; -import cn.bootx.platform.daxpay.core.merchant.entity.MchApplication; -import cn.bootx.platform.daxpay.param.merchant.MchApplicationParam; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -/** - * 商户应用 - * - * @author xxm - * @since 2023-05-23 - */ -@Repository -@RequiredArgsConstructor -public class MchAppManager extends BaseManager { - - /** - * 根据编码查询 - */ - public Optional findByCode(String code) { - return findByField(MchApplication::getCode, code); - } - - /** - * 分页 - */ - public Page page(PageParam pageParam, MchApplicationParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, MchApplication.class); - QueryWrapper wrapper = QueryGenerator.generator(param, this.getEntityClass()); - wrapper.select(this.getEntityClass(), MpUtil::excludeBigField).orderByDesc(MpUtil.getColumnName(MchApplication::getId)); - return this.page(mpPage, wrapper); - } - - /** - * 根据商户编码查询 - */ - public List findAllByMchCode(String mchCode) { - return findAllByField(MchApplication::getMchCode,mchCode); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchAppPayConfigManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchAppPayConfigManager.java deleted file mode 100644 index 175fbcb9..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchAppPayConfigManager.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.dao; - -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.daxpay.core.merchant.entity.MchAppPayConfig; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -/** - * 商户应用支付配置 - * - * @author xxm - * @since 2023-05-19 - */ -@Repository -@RequiredArgsConstructor -public class MchAppPayConfigManager extends BaseManager { - - /** - * 该商户应用的指定类型的支付配置是否已经存在 - */ - public boolean existsByAppCodeAndChannel(String mchAppCode, String channel){ - return lambdaQuery() - .eq(MchAppPayConfig::getAppCode,mchAppCode) - .eq(MchAppPayConfig::getChannel,channel) - .exists(); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchAppPayConfigMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchAppPayConfigMapper.java deleted file mode 100644 index 35436aea..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchAppPayConfigMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.dao; - -import cn.bootx.platform.daxpay.core.merchant.entity.MchAppPayConfig; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 商户应用支付配置 - * - * @author xxm - * @since 2023-05-19 - */ -@Mapper -public interface MchAppPayConfigMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchApplicationMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchApplicationMapper.java deleted file mode 100644 index 6854f7c9..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MchApplicationMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.dao; - -import cn.bootx.platform.daxpay.core.merchant.entity.MchApplication; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 商户应用 - * - * @author xxm - * @since 2023-05-19 - */ -@Mapper -public interface MchApplicationMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MerchantInfoManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MerchantInfoManager.java deleted file mode 100644 index 806f840a..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MerchantInfoManager.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.common.query.generator.QueryGenerator; -import cn.bootx.platform.daxpay.core.merchant.entity.MerchantInfo; -import cn.bootx.platform.daxpay.param.merchant.MerchantInfoParam; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -/** - * 商户 - * - * @author xxm - * @since 2023-05-17 - */ -@Repository -@RequiredArgsConstructor -public class MerchantInfoManager extends BaseManager { - - /** - * 根据编码查询 - */ - public Optional findByCode(String code) { - return findByField(MerchantInfo::getCode, code); - } - - /** - * 分页 - */ - public Page page(PageParam pageParam, MerchantInfoParam param) { - Page mpPage = MpUtil.getMpPage(pageParam, MerchantInfo.class); - QueryWrapper wrapper = QueryGenerator.generator(param, this.getEntityClass()); - wrapper.select(this.getEntityClass(), MpUtil::excludeBigField) - .orderByDesc(MpUtil.getColumnName(MerchantInfo::getId)); - return this.page(mpPage, wrapper); - } - - /** - * 下拉列表 正常可用的 - */ - public List findAllByState(String state) { - return lambdaQuery() - .eq(MerchantInfo::getState,state) - .list(); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MerchantInfoMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MerchantInfoMapper.java deleted file mode 100644 index 58fdd010..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/dao/MerchantInfoMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.dao; - -import cn.bootx.platform.daxpay.core.merchant.entity.MerchantInfo; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 商户 - * - * @author xxm - * @since 2023-05-17 - */ -@Mapper -public interface MerchantInfoMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/entity/MchAppPayConfig.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/entity/MchAppPayConfig.java deleted file mode 100644 index 7929a0e8..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/entity/MchAppPayConfig.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.entity; - -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 商户应用支付配置 - * - * @author xxm - * @since 2023-05-19 - */ -@EqualsAndHashCode(callSuper = true) -@Data -//@DbTable(comment = "商户应用支付配置") -@Accessors(chain = true) -@TableName("pay_mch_app_config") -public class MchAppPayConfig extends MpBaseEntity { - - /** 关联应用编码 */ - @DbMySqlIndex(comment = "关联商户应用编码索引") - @DbColumn(comment = "关联商户应用编码") - @TableField(updateStrategy = FieldStrategy.NEVER) - private String appCode; - - /** 关联配置ID */ - @DbColumn(comment = "关联配置ID") - @TableField(updateStrategy = FieldStrategy.NEVER) - private Long configId; - - /** 支付渠道编码 */ - @DbColumn(comment = "支付渠道编码") - @TableField(updateStrategy = FieldStrategy.NEVER) - private String channel; - - /** 状态 */ - @DbColumn(comment = "状态") - private String state; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/entity/MchApplication.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/entity/MchApplication.java deleted file mode 100644 index bd4a0cf6..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/entity/MchApplication.java +++ /dev/null @@ -1,70 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.daxpay.core.merchant.convert.MchApplicationConvert; -import cn.bootx.platform.daxpay.dto.merchant.MchApplicationDto; -import cn.bootx.platform.daxpay.param.merchant.MchApplicationParam; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; -import cn.bootx.table.modify.mysql.constants.MySqlIndexType; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import lombok.experimental.FieldNameConstants; - -/** - * 商户应用 - * - * @author xxm - * @since 2023-05-19 - */ -//@DbTable(comment = "商户应用") -@EqualsAndHashCode(callSuper = true) -@DbMySqlIndex(fields = MchApplication.Fields.code, type = MySqlIndexType.UNIQUE, comment = "应用编码唯一索引") -@Data -@FieldNameConstants -@Accessors(chain = true) -@TableName("pay_mch_app") -public class MchApplication extends MpBaseEntity implements EntityBaseFunction { - - /** 应用编码 */ - @DbColumn(comment = "应用编码") - @TableField(updateStrategy = FieldStrategy.NEVER) - private String code; - - /** 名称 */ - @DbColumn(comment = "名称") - private String name; - - /** 商户号 */ - @DbColumn(comment = "商户号") - @TableField(updateStrategy = FieldStrategy.NEVER) - private String mchCode; - - /** - * 状态 - * @see cn.bootx.platform.daxpay.code.MchAndAppCode - */ - @DbColumn(comment = "状态") - private String state; - - /** 备注 */ - @DbColumn(comment = "备注") - private String remark; - - /** 创建对象 */ - public static MchApplication init(MchApplicationParam in) { - return MchApplicationConvert.CONVERT.convert(in); - } - - /** 转换成dto */ - @Override - public MchApplicationDto toDto() { - return MchApplicationConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/entity/MerchantInfo.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/entity/MerchantInfo.java deleted file mode 100644 index 8eca7228..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/entity/MerchantInfo.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.daxpay.core.merchant.convert.MerchantInfoConvert; -import cn.bootx.platform.daxpay.dto.merchant.MerchantInfoDto; -import cn.bootx.platform.daxpay.param.merchant.MerchantInfoParam; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; -import cn.bootx.table.modify.mysql.constants.MySqlIndexType; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import lombok.experimental.FieldNameConstants; - -import static cn.bootx.platform.daxpay.core.merchant.entity.MerchantInfo.Fields.code; - -/** - * 商户 - * - * @author xxm - * @since 2023-05-17 - */ -@DbMySqlIndex(fields = code, type = MySqlIndexType.UNIQUE, comment = "商户号唯一索引") -@EqualsAndHashCode(callSuper = true) -@FieldNameConstants -@Data -//@DbTable(comment = "商户") -@Accessors(chain = true) -@TableName("pay_merchant") -public class MerchantInfo extends MpBaseEntity implements EntityBaseFunction { - - /** 商户号 */ - @DbColumn(comment = "商户号") - @TableField(updateStrategy = FieldStrategy.IGNORED) - private String code; - - /** 商户名称 */ - @DbColumn(comment = "商户名称") - private String name; - - /** 商户简称 */ - @DbColumn(comment = "商户简称") - private String shortName; - - /** 类型 */ - @DbColumn(comment = "类型") - private String type; - - /** 联系人姓名 */ - @DbColumn(comment = "联系人姓名") - private String contactName; - - /** 联系人手机号 */ - @DbColumn(comment = "联系人手机号") - private String contactTel; - - /** - * 状态类型 - * @see cn.bootx.platform.daxpay.code.MchAndAppCode - */ - @DbColumn(comment = "状态类型") - private String state; - - /** 商户备注 */ - @DbColumn(comment = "商户备注") - private String remark; - - /** 创建对象 */ - public static MerchantInfo init(MerchantInfoParam in) { - return MerchantInfoConvert.CONVERT.convert(in); - } - - /** 转换成dto */ - @Override - public MerchantInfoDto toDto() { - return MerchantInfoConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/service/MchAppPayConfigService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/service/MchAppPayConfigService.java deleted file mode 100644 index 031222cc..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/service/MchAppPayConfigService.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.daxpay.core.channel.config.dao.PayChannelConfigManager; -import cn.bootx.platform.daxpay.core.channel.config.entity.PayChannelConfig; -import cn.bootx.platform.daxpay.core.merchant.dao.MchAppPayConfigManager; -import cn.bootx.platform.daxpay.core.merchant.entity.MchAppPayConfig; -import cn.bootx.platform.daxpay.dto.merchant.MchAppPayConfigResult; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Objects; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - * 商户应用支付配置 - * - * @author xxm - * @since 2023-05-19 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class MchAppPayConfigService { - - private final MchAppPayConfigManager mchAppPayConfigManager; - - private final PayChannelConfigManager channelConfigManager; - - /** - * 添加 - */ - public void add(MchAppPayConfig config){ - // 是否重复 - if (mchAppPayConfigManager.existsByAppCodeAndChannel(config.getAppCode(),config.getChannel())){ - throw new BizException("该商户应用的支付渠道已经进行配置, 请勿重新配置"); - } - mchAppPayConfigManager.save(config); - } - - /** - * 根据应用ID删除 - */ - public void deleteByAppId(Long appId) { - mchAppPayConfigManager.deleteByField(MchAppPayConfig::getAppCode, appId); - } - - /** - * 支付渠道配置列表 - */ - public List ListByAppId(String appCode) { - // 首先查询系统中配置的支付渠道进行排序 - List channels = channelConfigManager.findAllByOrder(); - // 查询当前应用所拥有的配置, 进行合并生成相关信息 - - val mchAppPayConfigMap = mchAppPayConfigManager.findAllByField(MchAppPayConfig::getAppCode, appCode) - .stream() - .collect(Collectors.toMap(MchAppPayConfig::getChannel, Function.identity())); - // 进行排序并返回 - return channels.stream().map(channel -> { - MchAppPayConfig config = mchAppPayConfigMap.get(channel.getCode()); - MchAppPayConfigResult result = new MchAppPayConfigResult().setImg(channel.getImage()) - .setChannelCode(channel.getCode()) - .setChannelName(channel.getName()); - if (Objects.nonNull(config)) { - result.setConfigId(config.getConfigId()).setState(config.getState()); - } - return result; - }).collect(Collectors.toList()); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/service/MchAppService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/service/MchAppService.java deleted file mode 100644 index 895ef843..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/service/MchAppService.java +++ /dev/null @@ -1,115 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.service; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.dto.LabelValue; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.ResultConvertUtil; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.merchant.dao.MchAppManager; -import cn.bootx.platform.daxpay.core.merchant.dao.MerchantInfoManager; -import cn.bootx.platform.daxpay.core.merchant.entity.MchApplication; -import cn.bootx.platform.daxpay.core.merchant.entity.MerchantInfo; -import cn.bootx.platform.daxpay.dto.merchant.MchApplicationDto; -import cn.bootx.platform.daxpay.param.merchant.MchApplicationParam; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.util.IdUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -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 2023-05-19 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class MchAppService { - - private final MchAppManager mchAppManager; - - private final MerchantInfoManager mchManager; - - private final MchAppPayConfigService appPayConfigService; - - /** - * 添加 - */ - public void add(MchApplicationParam param) { - MchApplication mchApp = MchApplication.init(param); - mchApp.setCode(IdUtil.getSnowflakeNextIdStr()); - mchAppManager.save(mchApp); - } - - /** - * 修改 - */ - public void update(MchApplicationParam param) { - MchApplication mchApp = mchAppManager.findById(param.getId()).orElseThrow(DataNotExistException::new); - BeanUtil.copyProperties(param, mchApp, CopyOptions.create().ignoreNullValue()); - mchAppManager.updateById(mchApp); - } - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, MchApplicationParam mchApplicationParam) { - return MpUtil.convert2DtoPageResult(mchAppManager.page(pageParam, mchApplicationParam)); - } - - /** - * 获取单条 - */ - public MchApplicationDto findById(Long id) { - return mchAppManager.findById(id).map(MchApplication::toDto).orElseThrow(DataNotExistException::new); - } - - /** - * 下拉列表 - */ - public List dropdown(String mchCode){ - return mchAppManager.findAllByMchCode(mchCode).stream() - .map(o->new LabelValue(o.getName(),o.getCode())) - .collect(Collectors.toList()); - } - - /** - * 获取全部 - */ - public List findAll() { - return ResultConvertUtil.dtoListConvert(mchAppManager.findAll()); - } - - /** - * 删除 - */ - @Transactional(rollbackFor = Exception.class) - public void delete(Long id) { - appPayConfigService.deleteByAppId(id); - mchAppManager.deleteById(id); - } - - /** - * 验证商户号和商户应用是否匹配 - */ - public boolean checkMatch(String mchCode, String mchAppCode) { - MerchantInfo merchantInfo = mchManager.findByCode(mchCode).orElseThrow(DataNotExistException::new); - MchApplication mchApp = mchAppManager.findByCode(mchAppCode).orElseThrow(DataNotExistException::new); - - // 商户与应用是否有关联关系 - if (!Objects.equals(mchApp.getMchCode(), merchantInfo.getCode())) { - return false; - } - return true; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/service/MerchantInfoService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/service/MerchantInfoService.java deleted file mode 100644 index 78e210d3..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/merchant/service/MerchantInfoService.java +++ /dev/null @@ -1,99 +0,0 @@ -package cn.bootx.platform.daxpay.core.merchant.service; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.dto.LabelValue; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.core.util.ResultConvertUtil; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.code.MchAndAppCode; -import cn.bootx.platform.daxpay.core.merchant.dao.MerchantInfoManager; -import cn.bootx.platform.daxpay.core.merchant.entity.MerchantInfo; -import cn.bootx.platform.daxpay.dto.merchant.MerchantInfoDto; -import cn.bootx.platform.daxpay.param.merchant.MerchantInfoParam; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 商户 - * - * @author xxm - * @since 2023-05-17 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class MerchantInfoService { - - private final MerchantInfoManager merchantInfoManager; - - /** - * 添加 - */ - public void add(MerchantInfoParam param) { - MerchantInfo merchantInfo = MerchantInfo.init(param); - merchantInfo.setCode("M" + System.currentTimeMillis()); - merchantInfoManager.save(merchantInfo); - } - - /** - * 修改 - */ - public void update(MerchantInfoParam param) { - MerchantInfo merchantInfo = merchantInfoManager.findById(param.getId()).orElseThrow(DataNotExistException::new); - BeanUtil.copyProperties(param, merchantInfo, CopyOptions.create().ignoreNullValue()); - merchantInfoManager.updateById(merchantInfo); - } - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, MerchantInfoParam merchantInfoParam) { - return MpUtil.convert2DtoPageResult(merchantInfoManager.page(pageParam, merchantInfoParam)); - } - - /** - * 获取单条 - */ - public MerchantInfoDto findById(Long id) { - return merchantInfoManager.findById(id).map(MerchantInfo::toDto).orElseThrow(DataNotExistException::new); - } - - /** - * 获取全部 - */ - public List findAll() { - return ResultConvertUtil.dtoListConvert(merchantInfoManager.findAll()); - } - - /** - * 下拉框 - */ - public List dropdown() { - return merchantInfoManager.findAll().stream() - .map(mch -> new LabelValue(mch.getName(),mch.getCode())) - .collect(Collectors.toList()); - } - /** - * 下拉框(正常商户) - */ - public List dropdownNormal() { - return merchantInfoManager.findAllByState(MchAndAppCode.MCH_STATE_NORMAL).stream() - .map(mch -> new LabelValue(mch.getName(),mch.getCode())) - .collect(Collectors.toList()); - } - - /** - * 删除 - */ - public void delete(Long id) { - merchantInfoManager.deleteById(id); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/convert/PayNotifyConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/convert/PayNotifyConvert.java deleted file mode 100644 index a5bacce7..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/convert/PayNotifyConvert.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.bootx.platform.daxpay.core.notify.convert; - -import cn.bootx.platform.daxpay.core.notify.entity.PayNotifyRecord; -import cn.bootx.platform.daxpay.dto.notify.PayNotifyRecordDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 转换 - * - * @author xxm - * @since 2021/6/22 - */ -@Mapper -public interface PayNotifyConvert { - - PayNotifyConvert CONVERT = Mappers.getMapper(PayNotifyConvert.class); - - PayNotifyRecordDto convert(PayNotifyRecord in); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/dao/PayNotifyRecordManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/dao/PayNotifyRecordManager.java deleted file mode 100644 index 0715a5d0..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/dao/PayNotifyRecordManager.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.bootx.platform.daxpay.core.notify.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.notify.entity.PayNotifyRecord; -import cn.bootx.platform.daxpay.dto.notify.PayNotifyRecordDto; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Objects; - -/** - * 支付消息通知回调 - * - * @author xxm - * @since 2021/6/22 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class PayNotifyRecordManager extends BaseManager { - - public Page page(PageParam pageParam, PayNotifyRecordDto param) { - Page mpPage = MpUtil.getMpPage(pageParam, PayNotifyRecord.class); - return lambdaQuery().orderByDesc(MpIdEntity::getId) - .like(Objects.nonNull(param.getPaymentId()), PayNotifyRecord::getPaymentId, param.getPaymentId()) - .eq(Objects.nonNull(param.getPayChannel()), PayNotifyRecord::getPayChannel, param.getPayChannel()) - .eq(Objects.nonNull(param.getStatus()), PayNotifyRecord::getStatus, param.getStatus()) - .page(mpPage); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/dao/PayNotifyRecordMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/dao/PayNotifyRecordMapper.java deleted file mode 100644 index eb78f07d..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/dao/PayNotifyRecordMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.bootx.platform.daxpay.core.notify.dao; - -import cn.bootx.platform.daxpay.core.notify.entity.PayNotifyRecord; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface PayNotifyRecordMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/entity/PayNotifyRecord.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/entity/PayNotifyRecord.java deleted file mode 100644 index 6d1b211d..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/entity/PayNotifyRecord.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.bootx.platform.daxpay.core.notify.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.notify.convert.PayNotifyConvert; -import cn.bootx.platform.daxpay.dto.notify.PayNotifyRecordDto; -import cn.bootx.table.modify.annotation.DbComment; -import cn.bootx.table.modify.mysql.annotation.DbMySqlFieldType; -import cn.bootx.table.modify.mysql.constants.MySqlFieldTypeEnum; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - * 回调记录 - * - * @author xxm - * @since 2021/6/22 - */ -@EqualsAndHashCode(callSuper = true) -@Data -//@DbTable(comment = "回调记录") -@Accessors(chain = true) -@TableName("pay_pay_notify_record") -public class PayNotifyRecord extends MpCreateEntity implements EntityBaseFunction { - - /** 支付记录id */ - @DbComment("支付记录id") - private Long paymentId; - - /** 商户编码 */ - @DbComment("商户编码") - private String mchCode; - - /** 商户应用编码 */ - @DbComment("商户应用编码") - private String mchAppCode; - - /** - * 支付渠道 - * @see PayChannelEnum#getCode() - */ - @DbComment("支付渠道") - private String payChannel; - - /** 通知消息 */ - @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) - @DbComment("通知消息") - private String notifyInfo; - - /** - * 处理状态 - * @see PayStatusCode#NOTIFY_PROCESS_SUCCESS - */ - @DbComment("处理状态") - private String status; - - /** 提示信息 */ - @DbComment("提示信息") - private String msg; - - /** 回调时间 */ - @DbComment("回调时间") - private LocalDateTime notifyTime; - - @Override - public PayNotifyRecordDto toDto() { - return PayNotifyConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/service/PayNotifyRecordService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/service/PayNotifyRecordService.java deleted file mode 100644 index feb90009..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/notify/service/PayNotifyRecordService.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.bootx.platform.daxpay.core.notify.service; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.notify.dao.PayNotifyRecordManager; -import cn.bootx.platform.daxpay.core.notify.entity.PayNotifyRecord; -import cn.bootx.platform.daxpay.dto.notify.PayNotifyRecordDto; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * 回调记录 - * - * @author xxm - * @since 2021/7/5 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayNotifyRecordService { - - private final PayNotifyRecordManager payNotifyRecordManager; - - /** - * 分页查询 - */ - public PageResult page(PageParam pageParam, PayNotifyRecordDto param) { - Page page = payNotifyRecordManager.page(pageParam, param); - return MpUtil.convert2DtoPageResult(page); - } - - /** - * 根据id查询 - */ - public PayNotifyRecordDto findById(Long id) { - return payNotifyRecordManager.findById(id).map(PayNotifyRecord::toDto).orElseThrow(DataNotExistException::new); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/builder/PayEventBuilder.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/builder/PayEventBuilder.java deleted file mode 100644 index 07922bc0..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/builder/PayEventBuilder.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.builder; - -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.event.domain.*; -import lombok.experimental.UtilityClass; - -/** - * 支付事件生成器 - * - * @author xxm - * @since 2022/7/11 - */ -@UtilityClass -public class PayEventBuilder { - - /** - * 支付完成 - */ - public PayCompleteEvent buildPayComplete(Payment payment) { - return new PayCompleteEvent().setPaymentId(payment.getId()) - .setBusinessId(payment.getBusinessId()); - } - - /** - * 支付撤销/关闭 - */ - public PayCancelEvent buildPayCancel(Payment payment) { - return new PayCancelEvent().setPaymentId(payment.getId()) - .setBusinessId(payment.getBusinessId()); - } - - /** - * 支付超时 - */ - public PayExpiredTimeEvent buildPayExpiredTime(Payment payment) { - return new PayExpiredTimeEvent().setPaymentId(payment.getId()) - .setBusinessId(payment.getBusinessId()); - } - - /** - * 支付退款 - */ - public PayRefundEvent buildPayRefund(Payment payment) { - return new PayRefundEvent().setPaymentId(payment.getId()) - .setBusinessId(payment.getBusinessId()); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/builder/PaymentBuilder.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/builder/PaymentBuilder.java deleted file mode 100644 index b15f8453..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/builder/PaymentBuilder.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.builder; - -import cn.bootx.platform.common.spring.util.WebServletUtil; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.pay.local.AsyncPayInfoLocal; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.dto.pay.PayResult; -import cn.bootx.platform.daxpay.dto.payment.PayChannelInfo; -import cn.bootx.platform.daxpay.dto.payment.RefundableInfo; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.extra.servlet.ServletUtil; -import lombok.experimental.UtilityClass; - -import javax.servlet.http.HttpServletRequest; -import java.math.BigDecimal; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * 支付对象构建器 - * - * @author xxm - * @since 2021/2/25 - */ -@UtilityClass -public class PaymentBuilder { - - /** - * 构建payment记录 - */ - public Payment buildPayment(PayParam payParam) { - Payment payment = new Payment(); - - HttpServletRequest request = WebServletUtil.getRequest(); - String ip = ServletUtil.getClientIP(request); - // 基础信息 - payment.setBusinessId(payParam.getBusinessId()) - .setMchCode(payParam.getMchCode()) - .setMchAppCode(payParam.getMchAppCode()) - .setTitle(payParam.getTitle()) - .setDescription(payParam.getDescription()); - - // 支付方式和状态 - List payTypeInfos = buildPayTypeInfo(payParam.getPayWayList()); - List refundableInfos = buildRefundableInfo(payParam.getPayWayList()); - // 计算总价 - BigDecimal sumAmount = payTypeInfos.stream() - .map(PayChannelInfo::getAmount) - .filter(Objects::nonNull) - .reduce(BigDecimal::add) - .orElse(BigDecimal.ZERO); - // 支付渠道信息 - payment.setPayChannelInfo(payTypeInfos) - .setRefundableInfo(refundableInfos) - .setPayStatus(PayStatusCode.TRADE_PROGRESS) - .setAmount(sumAmount) - .setCombinationPayMode(payTypeInfos.size()>1) - .setClientIp(ip) - .setRefundableBalance(sumAmount); - return payment; - } - - /** - * 构建PayTypeInfo - */ - private List buildPayTypeInfo(List payWayParamList) { - return CollectionUtil.isEmpty(payWayParamList) ? Collections.emptyList() - : payWayParamList.stream().map(PayWayParam::toPayTypeInfo).collect(Collectors.toList()); - } - - /** - * 构建RefundableInfo - */ - private List buildRefundableInfo(List payWayParamList) { - return CollectionUtil.isEmpty(payWayParamList) ? Collections.emptyList() - : payWayParamList.stream().map(PayWayParam::toRefundableInfo).collect(Collectors.toList()); - } - - /** - * 根据Payment构建PayParam支付参数 - */ - public PayParam buildPayParamByPayment(Payment payment) { - PayParam payParam = new PayParam(); - // 恢复 payModeList - List payWayParams = payment.getPayChannelInfo() - .stream() - .map(payTypeInfo -> new PayWayParam().setAmount(payTypeInfo.getAmount()) - .setPayChannel(payTypeInfo.getPayChannel()) - .setExtraParamsJson(payTypeInfo.getExtraParamsJson())) - .collect(Collectors.toList()); - payParam.setPayWayList(payWayParams) - .setBusinessId(payment.getBusinessId()) - .setTitle(payment.getTitle()) - .setMchCode(payment.getMchCode()) - .setMchAppCode(payment.getMchAppCode()) - .setDescription(payment.getDescription()); - return payParam; - } - - /** - * 根据Payment构建PaymentResult - * @param payment payment - * @return paymentVO - */ - public PayResult buildResultByPayment(Payment payment) { - PayResult paymentResult; - try { - paymentResult = new PayResult(); - // 异步支付信息 - paymentResult.setAsyncPayChannel(payment.getAsyncPayChannel()) - .setAsyncPayMode(payment.isAsyncPayMode()) - .setPayStatus(payment.getPayStatus()); - - List channelInfos = payment.getPayChannelInfo(); - - // 设置异步支付参数 - List moneyPayTypeInfos = channelInfos.stream() - .filter(payTypeInfo -> PayChannelEnum.ASYNC_TYPE_CODE.contains(payTypeInfo.getPayChannel())) - .collect(Collectors.toList()); - if (!CollUtil.isEmpty(moneyPayTypeInfos)) { - paymentResult.setAsyncPayInfo(AsyncPayInfoLocal.get()); - } - } - finally { - // 清空线程变量 - AsyncPayInfoLocal.clear(); - } - return paymentResult; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/convert/PayConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/convert/PayConvert.java deleted file mode 100644 index 3f77f810..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/convert/PayConvert.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.convert; - -import cn.bootx.platform.daxpay.dto.payment.PayChannelInfo; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 支付对象转换 - * - * @author xxm - * @since 2022/3/2 - */ -@Mapper -public interface PayConvert { - - PayConvert CONVERT = Mappers.getMapper(PayConvert.class); - - PayChannelInfo convert(PayWayParam in); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/exception/BaseException.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/exception/BaseException.java deleted file mode 100644 index 2e3f77c1..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/exception/BaseException.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.exception; - -/** - * 支付异常信息 - * - * @author xxm - * @since 2020/12/9 - */ -public interface BaseException { - - /** - * 获取错误信息 - */ - ExceptionInfo getExceptionInfo(); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/exception/ExceptionInfo.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/exception/ExceptionInfo.java deleted file mode 100644 index caca086d..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/exception/ExceptionInfo.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.exception; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * @author xxm - * @since 2021/5/24 - */ -@Data -@Accessors(chain = true) -@Schema(title = "异常信息") -public class ExceptionInfo { - - /** 错误码 */ - private String errorCode; - - /** 错误信息 */ - private String errorMsg; - - public ExceptionInfo(String errorCode, String errorMsg) { - this.errorCode = errorCode; - this.errorMsg = errorMsg; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/factory/PayStrategyFactory.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/factory/PayStrategyFactory.java deleted file mode 100644 index 64cb8912..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/factory/PayStrategyFactory.java +++ /dev/null @@ -1,121 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.factory; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayStrategy; -import cn.bootx.platform.daxpay.core.pay.strategy.*; -import cn.bootx.platform.daxpay.exception.payment.PayUnsupportedMethodException; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.extra.spring.SpringUtil; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -import static cn.bootx.platform.daxpay.code.pay.PayChannelEnum.*; - -/** - * 支付策略工厂 - * - * @author xxm - * @since 2020/12/11 - */ -public class PayStrategyFactory { - - /** - * 根据传入的支付渠道创建策略 - * @param payWayParam 支付类型 - * @return 支付策略 - */ - public static AbsPayStrategy create(PayWayParam payWayParam) { - - AbsPayStrategy strategy = null; - PayChannelEnum channelEnum = PayChannelEnum.findByCode(payWayParam.getPayChannel()); - switch (channelEnum) { - case ALI: - strategy = SpringUtil.getBean(AliPayStrategy.class); - break; - case WECHAT: - strategy = SpringUtil.getBean(WeChatPayStrategy.class); - break; - case UNION_PAY: - strategy = SpringUtil.getBean(UnionPayStrategy.class); - break; - case CASH: - strategy = SpringUtil.getBean(CashPayStrategy.class); - break; - case WALLET: - strategy = SpringUtil.getBean(WalletPayStrategy.class); - break; - case VOUCHER: - strategy = SpringUtil.getBean(VoucherPayStrategy.class); - break; - case CREDIT_CARD: - break; - case APPLE_PAY: - break; - default: - throw new PayUnsupportedMethodException(); - } - // noinspection ConstantConditions - strategy.setPayWayParam(payWayParam); - return strategy; - } - - /** - * 根据传入的支付类型批量创建策略, 异步支付在后面 - */ - public static List createDesc(List payWayParamList) { - return create(payWayParamList, true); - } - - /** - * 根据传入的支付类型批量创建策略, 默认异步支付在前面 - */ - public static List create(List payWayParamList) { - return create(payWayParamList, false); - } - - /** - * 根据传入的支付类型批量创建策略 - * @param payWayParamList 支付类型 - * @return 支付策略 - */ - private static List create(List payWayParamList, boolean description) { - if (CollectionUtil.isEmpty(payWayParamList)) { - return Collections.emptyList(); - } - List list = new ArrayList<>(payWayParamList.size()); - - // 同步支付 - List syncPayWayParamList = payWayParamList.stream() - .filter(Objects::nonNull) - .filter(payModeParam -> !ASYNC_TYPE_CODE.contains(payModeParam.getPayChannel())) - .collect(Collectors.toList()); - - // 异步支付 - List asyncPayWayParamList = payWayParamList.stream() - .filter(Objects::nonNull) - .filter(payModeParam -> ASYNC_TYPE_CODE.contains(payModeParam.getPayChannel())) - .collect(Collectors.toList()); - - List sortList = new ArrayList<>(payWayParamList.size()); - - // 异步在后面 - if (description) { - sortList.addAll(syncPayWayParamList); - sortList.addAll(asyncPayWayParamList); - } - else { - sortList.addAll(asyncPayWayParamList); - sortList.addAll(syncPayWayParamList); - } - - // 此处有一个根据Type的反转排序, - sortList.stream().filter(Objects::nonNull).forEach(payMode -> list.add(create(payMode))); - return list; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/func/AbsPayCallbackStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/func/AbsPayCallbackStrategy.java deleted file mode 100644 index 4e249a0f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/func/AbsPayCallbackStrategy.java +++ /dev/null @@ -1,115 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.func; - -import cn.bootx.platform.common.redis.RedisClient; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.notify.dao.PayNotifyRecordManager; -import cn.bootx.platform.daxpay.core.notify.entity.PayNotifyRecord; -import cn.bootx.platform.daxpay.core.pay.result.PayCallbackResult; -import cn.bootx.platform.daxpay.core.pay.service.PayCallbackService; -import cn.hutool.json.JSONUtil; -import com.alibaba.ttl.TransmittableThreadLocal; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.time.LocalDateTime; -import java.util.Map; - -/** - * 支付回调处理抽象接口 - * - * @author xxm - * @since 2021/6/21 - */ -@Slf4j -@RequiredArgsConstructor -public abstract class AbsPayCallbackStrategy { - - protected static final ThreadLocal> PARAMS = new TransmittableThreadLocal<>(); - - private final RedisClient redisClient; - - private final PayNotifyRecordManager payNotifyRecordManager; - - private final PayCallbackService payCallbackService; - - /** - * 支付回调 - */ - public String payCallback(String mchCode,String appCode, Map params) { - PARAMS.set(params); - try { - log.info("支付回调处理: {}", params); - // 验证消息 - if (!this.verifyNotify(appCode)) { - return null; - } - // 去重处理 - if (!this.duplicateChecker()) { - return this.getReturnMsg(); - } - // 调用统一回调处理 - PayCallbackResult result = payCallbackService.callback(this.getPaymentId(), this.getTradeStatus(), - params); - // 记录回调记录 - this.saveNotifyRecord(mchCode,appCode, result); - } - finally { - PARAMS.remove(); - } - return this.getReturnMsg(); - } - - /** - * 支付类型 - * @see PayChannelEnum - */ - public abstract PayChannelEnum getPayChannel(); - - /** - * 去重处理 - */ - public boolean duplicateChecker() { - // 判断10秒内是否已经回调处理 - String key = "payment:callback:duplicate:" + this.getPaymentId(); - return redisClient.setIfAbsent(key, "", 10 * 1000); - } - - /** - * 验证信息格式 - * @param mchAppCode 商户应用编码 - */ - public abstract boolean verifyNotify(String mchAppCode); - - /** - * 获取paymentId - */ - public abstract Long getPaymentId(); - - /** - * 获取支付状态 - * @see PayStatusCode - */ - public abstract String getTradeStatus(); - - /** - * 返回响应结果 - */ - public abstract String getReturnMsg(); - - /** - * 保存回调记录 - */ - public void saveNotifyRecord(String mchCode,String appCode, PayCallbackResult result) { - PayNotifyRecord payNotifyRecord = new PayNotifyRecord().setNotifyInfo(JSONUtil.toJsonStr(PARAMS.get())) - .setNotifyTime(LocalDateTime.now()) - .setPaymentId(this.getPaymentId()) - .setMchAppCode(appCode) - .setMchCode(mchCode) - .setPayChannel(this.getPayChannel().getCode()) - .setStatus(result.getCode()) - .setMsg(result.getMsg()); - payNotifyRecordManager.save(payNotifyRecord); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/func/AbsPayStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/func/AbsPayStrategy.java deleted file mode 100644 index 1c23d19f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/func/AbsPayStrategy.java +++ /dev/null @@ -1,94 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.func; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.pay.exception.ExceptionInfo; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import lombok.Getter; -import lombok.Setter; - -import java.util.Map; - -/** - * 抽象支付策略基类 同步支付 异步支付 错误处理 关闭支付 撤销支付 支付网关同步 退款 - * - * @author xxm - * @since 2020/12/11 - */ -@Getter -@Setter -public abstract class AbsPayStrategy { - - /** 支付对象 */ - private Payment payment = null; - - /** 支付参数 */ - private PayParam payParam = null; - - /** 支付方式参数 支付参数中的与这个不一致, 以这个为准 */ - private PayWayParam payWayParam = null; - - /** - * 策略标示 - * @see PayChannelEnum - */ - public abstract PayChannelEnum getType(); - - /** - * 初始化支付的参数 - */ - public void initPayParam(Payment payment, PayParam payParam) { - this.payment = payment; - this.payParam = payParam; - } - - /** - * 支付前对处理 包含必要的校验以及对Payment对象的创建和保存操作 - */ - public void doBeforePayHandler() { - } - - /** - * 支付操作 - */ - public abstract void doPayHandler(); - - /** - * 支付成功的处理方式 - */ - public void doSuccessHandler() { - } - - /** - * 支付失败的处理方式 - */ - public void doErrorHandler(ExceptionInfo exceptionInfo) { - } - - /** - * 异步支付成功的处理方式 - */ - public void doAsyncSuccessHandler(Map map) { - } - - /** - * 异步支付失败的处理方式, 默认使用支付失败的处理方式 同步支付方式调用时同 this#doErrorHandler - */ - public void doAsyncErrorHandler(ExceptionInfo exceptionInfo) { - this.doErrorHandler(exceptionInfo); - } - - /** - * 撤销支付操作,支付交易返回失败或支付系统超时,调用该接口撤销交易 默认为关闭本地支付记录 - */ - public void doCancelHandler() { - this.doCloseHandler(); - } - - /** - * 关闭本地支付记录 - */ - public abstract void doCloseHandler(); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/func/PayStrategyConsumer.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/func/PayStrategyConsumer.java deleted file mode 100644 index 8705016c..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/func/PayStrategyConsumer.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.func; - -import cn.bootx.platform.daxpay.core.payment.entity.Payment; - -import java.util.List; - -/** - * 支付策略接口 - * - * @author xxm - * @since 2020/12/9 - */ -@FunctionalInterface -public interface PayStrategyConsumer, S extends Payment> { - - void accept(T t, S s); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/local/AsyncPayInfoLocal.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/local/AsyncPayInfoLocal.java deleted file mode 100644 index e801eeec..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/local/AsyncPayInfoLocal.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.local; - -import cn.bootx.platform.daxpay.dto.pay.AsyncPayInfo; -import com.alibaba.ttl.TransmittableThreadLocal; - -/** - * 异步支付线程变量 - * - * @author xxm - * @since 2021/4/21 - */ -public final class AsyncPayInfoLocal { - - private static final ThreadLocal THREAD_LOCAL = new TransmittableThreadLocal<>(); - - /** - * 设置 - */ - public static void set(AsyncPayInfo asyncPayInfo) { - THREAD_LOCAL.set(asyncPayInfo); - } - - /** - * 获取 - */ - public static AsyncPayInfo get() { - return THREAD_LOCAL.get(); - } - - /** - * 清除 - */ - public static void clear() { - THREAD_LOCAL.remove(); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/result/PayCallbackResult.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/result/PayCallbackResult.java deleted file mode 100644 index 229e115b..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/result/PayCallbackResult.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.result; - -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 支付回调处理结果 - * - * @author xxm - * @since 2021/6/22 - */ -@Data -@Accessors(chain = true) -public class PayCallbackResult { - - /** - * 处理状态 - * @see PayStatusCode#NOTIFY_PROCESS_SUCCESS - */ - private String code; - - /** 提示信息 */ - private String msg; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayCallbackService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayCallbackService.java deleted file mode 100644 index 41c79f28..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayCallbackService.java +++ /dev/null @@ -1,224 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.service; - -import cn.bootx.platform.common.core.exception.ErrorCodeRuntimeException; -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.pay.builder.PayEventBuilder; -import cn.bootx.platform.daxpay.core.pay.builder.PaymentBuilder; -import cn.bootx.platform.daxpay.core.pay.exception.BaseException; -import cn.bootx.platform.daxpay.core.pay.exception.ExceptionInfo; -import cn.bootx.platform.daxpay.core.pay.factory.PayStrategyFactory; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayStrategy; -import cn.bootx.platform.daxpay.core.pay.func.PayStrategyConsumer; -import cn.bootx.platform.daxpay.core.pay.result.PayCallbackResult; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.event.PayEventSender; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import cn.hutool.core.collection.CollectionUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * 支付回调处理 - * - * @author xxm - * @since 2021/2/27 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayCallbackService { - - private final PaymentService paymentService; - - private final PayEventSender eventSender; - - /** - * 统一回调处理 - * @param tradeStatus 支付状态 - * @see PayStatusCode - */ - public PayCallbackResult callback(Long paymentId, String tradeStatus, Map map) { - - // 获取payment和paymentParam数据 - Payment payment = paymentService.findById(paymentId).orElse(null); - - // 支付单不存在,记录回调记录 - if (Objects.isNull(payment)) { - return new PayCallbackResult().setCode(PayStatusCode.NOTIFY_PROCESS_FAIL).setMsg("支付单不存在,记录回调记录"); - } - - // 回调时间超出了支付单超时时间, 记录一下, 不做处理 - if (Objects.nonNull(payment.getExpiredTime()) - && LocalDateTimeUtil.ge(LocalDateTime.now(), payment.getExpiredTime())) { - return new PayCallbackResult().setCode(PayStatusCode.NOTIFY_PROCESS_FAIL).setMsg("回调时间超出了支付单支付有效时间"); - } - - // 成功状态 - if (Objects.equals(PayStatusCode.NOTIFY_TRADE_SUCCESS, tradeStatus)) { - return this.success(payment, map); - } - else { - // 失败状态 - return this.fail(payment, map); - } - } - - /** - * 成功处理 - */ - private PayCallbackResult success(Payment payment, Map map) { - PayCallbackResult result = new PayCallbackResult().setCode(PayStatusCode.NOTIFY_PROCESS_SUCCESS); - - // payment已经被支付,不需要重复处理 - if (Objects.equals(payment.getPayStatus(), PayStatusCode.TRADE_SUCCESS)) { - return result.setCode(PayStatusCode.NOTIFY_PROCESS_IGNORE).setMsg("支付单已经是支付成功状态,不进行处理"); - } - - // payment已被取消,记录回调记录 - if (!Objects.equals(payment.getPayStatus(), PayStatusCode.TRADE_PROGRESS)) { - return result.setCode(PayStatusCode.NOTIFY_PROCESS_FAIL).setMsg("支付单不是待支付状态,记录回调记录"); - } - - // 2.通过工厂生成对应的策略组 - PayParam payParam = PaymentBuilder.buildPayParamByPayment(payment); - - List paymentStrategyList = PayStrategyFactory.create(payParam.getPayWayList()); - if (CollectionUtil.isEmpty(paymentStrategyList)) { - return result.setCode(PayStatusCode.NOTIFY_PROCESS_FAIL).setMsg("支付单数据非法,未找到对应的支付方式"); - } - - // 3.初始化支付的参数 - for (AbsPayStrategy paymentStrategy : paymentStrategyList) { - paymentStrategy.initPayParam(payment, payParam); - } - // 4.处理方法, 支付时只有一种payModel(异步支付), 失败时payment的所有payModel都会生效 - boolean handlerFlag = this.doHandler(payment, paymentStrategyList, (strategyList, paymentObj) -> { - // 执行异步支付方式的成功回调(不会有同步payModel) - strategyList.forEach(absPaymentStrategy -> absPaymentStrategy.doAsyncSuccessHandler(map)); - - // 修改payment支付状态为成功 - paymentObj.setPayStatus(PayStatusCode.TRADE_SUCCESS); - paymentObj.setPayTime(LocalDateTime.now()); - paymentService.updateById(paymentObj); - }); - - if (handlerFlag) { - // 5. 发送成功事件 - eventSender.sendPayComplete(PayEventBuilder.buildPayComplete(payment)); - } - else { - return result.setCode(PayStatusCode.NOTIFY_PROCESS_FAIL).setMsg("回调处理过程报错"); - } - return result; - } - - /** - * 失败处理, 关闭并退款 按说这块不会发生 - */ - private PayCallbackResult fail(Payment payment, Map map) { - PayCallbackResult result = new PayCallbackResult().setCode(PayStatusCode.NOTIFY_PROCESS_SUCCESS); - - // payment已被取消,记录回调记录,后期处理 - if (!Objects.equals(payment.getPayStatus(), PayStatusCode.TRADE_PROGRESS)) { - return result.setCode(PayStatusCode.NOTIFY_PROCESS_IGNORE).setMsg("支付单已经取消,记录回调记录"); - } - - // payment支付成功, 状态非法 - if (!Objects.equals(payment.getPayStatus(), PayStatusCode.TRADE_SUCCESS)) { - return result.setCode(PayStatusCode.NOTIFY_PROCESS_FAIL).setMsg("支付单状态非法,支付网关状态为失败,但支付单状态为已完成"); - } - - // 2.通过工厂生成对应的策略组 - PayParam payParam = PaymentBuilder.buildPayParamByPayment(payment); - List paymentStrategyList = PayStrategyFactory.create(payParam.getPayWayList()); - if (CollectionUtil.isEmpty(paymentStrategyList)) { - return result.setCode(PayStatusCode.NOTIFY_PROCESS_FAIL).setMsg("支付单数据非法,未找到对应的支付方式"); - } - // 3.初始化支付关闭的参数 - for (AbsPayStrategy paymentStrategy : paymentStrategyList) { - paymentStrategy.initPayParam(payment, payParam); - } - // 4.处理方法, 支付时只有一种payModel(异步支付), 失败时payment的所有payModel都会生效 - boolean handlerFlag = this.doHandler(payment, paymentStrategyList, (strategyList, paymentObj) -> { - // 执行异步支付方式的成功回调(不会有同步payModel) - strategyList.forEach(AbsPayStrategy::doCancelHandler); - - // 修改payment支付状态为成功 - paymentObj.setPayStatus(PayStatusCode.TRADE_CANCEL); - paymentService.updateById(paymentObj); - }); - - if (handlerFlag) { - // 5. 发送退款事件 - eventSender.sendPayRefund(PayEventBuilder.buildPayRefund(payment)); - } - else { - return result.setCode(PayStatusCode.NOTIFY_PROCESS_FAIL).setMsg("回调处理过程报错"); - } - - return result; - } - - /** - * 处理方法 - * @param payment 支付记录 - * @param strategyList 支付策略 - * @param successCallback 成功操作 - */ - private boolean doHandler(Payment payment, List strategyList, - PayStrategyConsumer, Payment> successCallback) { - - try { - // 1.获取异步支付方式,通过工厂生成对应的策略组 - List syncPaymentStrategyList = strategyList.stream() - .filter(paymentStrategy -> PayChannelEnum.ASYNC_TYPE_CODE.contains(paymentStrategy.getType())) - .collect(Collectors.toList()); - // 执行成功方法 - successCallback.accept(syncPaymentStrategyList, payment); - } - catch (Exception e) { - // error事件的处理 - this.asyncErrorHandler(payment, strategyList, e); - return false; - } - return true; - } - - /** - * 对Error的处理 - */ - private void asyncErrorHandler(Payment payment, List strategyList, Exception e) { - - // 默认的错误信息 - ExceptionInfo exceptionInfo = new ExceptionInfo(PayStatusCode.TRADE_FAIL, e.getMessage()); - if (e instanceof BaseException) { - exceptionInfo = ((BaseException) e).getExceptionInfo(); - } - else if (e instanceof ErrorCodeRuntimeException) { - ErrorCodeRuntimeException ex = (ErrorCodeRuntimeException) e; - exceptionInfo = new ExceptionInfo(String.valueOf(ex.getCode()), ex.getMessage()); - } - - // 更新Payment的状态 - payment.setErrorCode(String.valueOf(exceptionInfo.getErrorCode())); - payment.setErrorMsg(String.valueOf(exceptionInfo.getErrorMsg())); - payment.setPayStatus(PayStatusCode.TRADE_FAIL); - paymentService.updateById(payment); - - // 调用失败处理 - for (AbsPayStrategy paymentStrategy : strategyList) { - paymentStrategy.doAsyncErrorHandler(exceptionInfo); - } - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayCancelService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayCancelService.java deleted file mode 100644 index e84a6601..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayCancelService.java +++ /dev/null @@ -1,121 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.service; - -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.pay.builder.PayEventBuilder; -import cn.bootx.platform.daxpay.core.pay.builder.PaymentBuilder; -import cn.bootx.platform.daxpay.core.pay.factory.PayStrategyFactory; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayStrategy; -import cn.bootx.platform.daxpay.core.pay.func.PayStrategyConsumer; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.exception.payment.PayNotExistedException; -import cn.bootx.platform.daxpay.exception.payment.PayUnsupportedMethodException; -import cn.bootx.platform.daxpay.event.PayEventSender; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import cn.hutool.core.collection.CollectionUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Arrays; -import java.util.List; - -import static cn.bootx.platform.daxpay.code.pay.PayStatusCode.*; - -/** - * 取消订单处理 - * - * @author xxm - * @since 2021/3/2 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayCancelService { - - private final PaymentService paymentService; - - private final PayEventSender payEventSender; - - /** - * 根据业务id取消支付记录 - */ - @Transactional(rollbackFor = Exception.class) - public void cancelByBusinessId(String businessId) { - Payment payment = paymentService.findByBusinessId(businessId) - .orElseThrow(() -> new PayFailureException("未找到支付单")); - this.cancelPayment(payment); - } - - /** - * 根据paymentId取消支付记录 - */ - @Transactional(rollbackFor = Exception.class) - public void cancelByPaymentId(Long paymentId) { - Payment payment = paymentService.findById(paymentId).orElseThrow(() -> new PayFailureException("未找到支付单")); - this.cancelPayment(payment); - } - - /** - * 取消支付记录 - */ - private void cancelPayment(Payment payment) { - // 状态检查, 成功/退款/退款中 不处理 - List trades = Arrays.asList(TRADE_SUCCESS, TRADE_REFUNDING, TRADE_REFUNDED); - if (trades.contains(payment.getPayStatus())) { - throw new PayFailureException("支付已完成, 无法撤销"); - } - - // 获取 paymentParam - PayParam payParam = PaymentBuilder.buildPayParamByPayment(payment); - - // 1.获取支付方式,通过工厂生成对应的策略组 - List paymentStrategyList = PayStrategyFactory.create(payParam.getPayWayList()); - if (CollectionUtil.isEmpty(paymentStrategyList)) { - throw new PayUnsupportedMethodException(); - } - - // 2.初始化支付的参数 - for (AbsPayStrategy paymentStrategy : paymentStrategyList) { - paymentStrategy.initPayParam(payment, payParam); - } - - // 3.执行取消订单 - this.doHandler(payment, paymentStrategyList, (strategyList, paymentObj) -> { - // 发起取消进行的执行方法 - strategyList.forEach(AbsPayStrategy::doCancelHandler); - // 取消订单 - paymentObj.setPayStatus(PayStatusCode.TRADE_CANCEL); - paymentService.updateById(paymentObj); - }); - - // 4. 获取支付记录信息 - payment = paymentService.findById(payment.getId()).orElseThrow(PayNotExistedException::new); - - // 5. 发布撤销事件 - payEventSender.sendPayCancel(PayEventBuilder.buildPayCancel(payment)); - } - - /** - * 处理方法 - * @param payment 支付记录 - * @param strategyList 支付策略 - * @param successCallback 成功操作 - */ - private void doHandler(Payment payment, List strategyList, - PayStrategyConsumer, Payment> successCallback) { - - try { - // 执行 - successCallback.accept(strategyList, payment); - } - catch (Exception e) { - // error事件的处理 - log.warn("取消订单失败"); - throw e; - } - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayService.java deleted file mode 100644 index f3f86c52..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayService.java +++ /dev/null @@ -1,288 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import cn.bootx.platform.common.core.util.ValidationUtil; -import cn.bootx.platform.daxpay.code.MchAndAppCode; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.merchant.dao.MchAppManager; -import cn.bootx.platform.daxpay.core.merchant.dao.MerchantInfoManager; -import cn.bootx.platform.daxpay.core.merchant.entity.MchApplication; -import cn.bootx.platform.daxpay.core.merchant.entity.MerchantInfo; -import cn.bootx.platform.daxpay.core.pay.builder.PayEventBuilder; -import cn.bootx.platform.daxpay.core.pay.builder.PaymentBuilder; -import cn.bootx.platform.daxpay.core.pay.factory.PayStrategyFactory; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayStrategy; -import cn.bootx.platform.daxpay.core.pay.func.PayStrategyConsumer; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.dto.pay.PayResult; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.exception.payment.PayNotExistedException; -import cn.bootx.platform.daxpay.exception.payment.PayUnsupportedMethodException; -import cn.bootx.platform.daxpay.event.PayEventSender; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.bootx.platform.daxpay.util.PayWayUtil; -import cn.hutool.core.collection.CollectionUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.*; -import java.util.function.Consumer; - -import static cn.bootx.platform.daxpay.code.pay.PayStatusCode.*; - -/** - * 支付流程 - * - * @author xxm - * @since 2020/12/9 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayService { - - private final PaymentService paymentService; - - private final PayEventSender eventSender; - - private final MchAppManager mchAppManager; - - private final MerchantInfoManager mchManager; - - /** - * 支付方法(同步/异步/组合支付) 同步支付:都只会在第一次执行中就完成支付,例如钱包、积分都是调用完就进行了扣减,完成了支付记录 - * 异步支付:例如支付宝、微信,发起支付后还需要跳转第三方平台进行支付,支付后通常需要进行回调,之后才完成支付记录 - * 组合支付:主要是混合了同步支付和异步支付,同时异步支付只能有一个,在支付时先对同步支付进行扣减,然后异步支付回调结束后完成整个支付单 - * 组合支付在非第一次支付的时候,只对新传入的异步支付PayMode进行处理,PayMode的价格使用第一次发起的价格,旧的同步支付如果传入后也不做处理, - * Payment中PayModeList将会为 旧有的同步支付+新传入的异步支付方式(在具体支付实现中处理) - */ - @Transactional(rollbackFor = Exception.class) - public PayResult pay(PayParam payParam) { - // 检验参数 - ValidationUtil.validateParam(payParam); - // 异步支付方式检查 - PayWayUtil.validationAsyncPayMode(payParam); - // 商户和应用信息检测 - this.checkMchAndApp(payParam); - // 获取并校验支付状态 - Payment payment = this.getAndCheckPaymentByBusinessId(payParam.getBusinessId()); - - // 异步支付且非第一次支付 - if (Objects.nonNull(payment) && payment.isAsyncPayMode()) { - return this.paySyncNotFirst(payParam, payment); - } - else { - // 第一次发起支付或同步支付 - return this.payFirst(payParam, payment); - } - } - - /** - * 发起的第一次支付请求(同步/异步) - */ - private PayResult payFirst(PayParam payParam, Payment payment) { - // 0. 支付成功直接返回 - if (Objects.nonNull(payment)) { - return PaymentBuilder.buildResultByPayment(payment); - } - - // 1. 价格检测 - PayWayUtil.validationAmount(payParam.getPayWayList()); - - // 2. 创建支付记录 - payment = this.createPayment(payParam); - - // 3. 调用支付方法进行发起支付 - this.payFirstMethod(payParam, payment); - - // 4. 获取支付记录信息 - payment = paymentService.findById(payment.getId()).orElseThrow(PayNotExistedException::new); - - // 5. 返回支付结果 - PayResult payResult = PaymentBuilder.buildResultByPayment(payment); - - // 如果是支付成功, 发送事件 - if (Objects.equals(payResult.getPayStatus(), TRADE_SUCCESS)) { - eventSender.sendPayComplete(PayEventBuilder.buildPayComplete(payment)); - } - return payResult; - } - - /** - * 执行支付方法 (第一次支付) - */ - private void payFirstMethod(PayParam payParam, Payment payment) { - - // 1.获取支付方式,通过工厂生成对应的策略组 - List paymentStrategyList = PayStrategyFactory.create(payParam.getPayWayList()); - if (CollectionUtil.isEmpty(paymentStrategyList)) { - throw new PayUnsupportedMethodException(); - } - - // 2.初始化支付的参数 - for (AbsPayStrategy paymentStrategy : paymentStrategyList) { - paymentStrategy.initPayParam(payment, payParam); - } - - // 3.支付前准备 - this.doHandler(payment, paymentStrategyList, AbsPayStrategy::doBeforePayHandler, null); - - // 4.支付 - this.doHandler(payment, paymentStrategyList, AbsPayStrategy::doPayHandler, (strategyList, paymentObj) -> { - // 发起支付成功进行的执行方法 - strategyList.forEach(AbsPayStrategy::doSuccessHandler); - // 所有支付方式都是同步时进行Payment处理 - if (PayWayUtil.isNotSync(payParam.getPayWayList())) { - // 修改payment支付状态为成功 - paymentObj.setPayStatus(TRADE_SUCCESS); - paymentObj.setPayTime(LocalDateTime.now()); - } - paymentService.updateById(paymentObj); - }); - } - - /** - * 异步支付执行(非第一次请求), 只执行异步支付策略, 报错不影响继续发起支付 - */ - private PayResult paySyncNotFirst(PayParam payParam, Payment payment) { - - // 0. 处理支付完成情况(完成/退款) - List trades = Arrays.asList(TRADE_SUCCESS, TRADE_CANCEL, TRADE_REFUNDING, TRADE_REFUNDED); - if (trades.contains(payment.getPayStatus())) { - return PaymentBuilder.buildResultByPayment(payment); - } - - // 1.获取 异步支付 渠道,通过工厂生成对应的策略组 - PayParam oldPayParam = PaymentBuilder.buildPayParamByPayment(payment); - PayWayParam payWayParam = this.getAsyncPayModeParam(payParam, oldPayParam); - List paymentStrategyList = PayStrategyFactory.create(Collections.singletonList(payWayParam)); - - // 2.初始化支付的参数 - for (AbsPayStrategy paymentStrategy : paymentStrategyList) { - paymentStrategy.initPayParam(payment, payParam); - } - // 3.支付前准备 - this.doHandler(payment, paymentStrategyList, AbsPayStrategy::doBeforePayHandler, null); - - // 4. 发起支付 - this.doHandler(payment, paymentStrategyList, AbsPayStrategy::doPayHandler, (strategyList, paymentObj) -> { - // 发起支付成功进行的执行方法 - strategyList.forEach(AbsPayStrategy::doSuccessHandler); - paymentService.updateById(paymentObj); - }); - - // 5. 获取支付记录信息 - payment = paymentService.findById(payment.getId()).orElseThrow(PayNotExistedException::new); - - // 6. 组装返回参数 - return PaymentBuilder.buildResultByPayment(payment); - } - - /** - * 执行策略中不同的handler - * @param payment 主支付对象 - * @param strategyList 策略列表 - * @param payMethod 执行支付/支付前的函数 - * @param successMethod 执行成功的函数 - */ - private void doHandler(Payment payment, List strategyList, Consumer payMethod, - PayStrategyConsumer, Payment> successMethod) { - // 执行策略操作,如支付前/支付时 - // 等同strategyList.forEach(payMethod.accept(PaymentStrategy)) - strategyList.forEach(payMethod); - - // 执行操作成功的处理 - Optional.ofNullable(successMethod).ifPresent(fun -> fun.accept(strategyList, payment)); - } - - /** - * 获取异步支付参数 - */ - private PayWayParam getAsyncPayModeParam(PayParam payParam, PayParam oldPaymentParam) { - - List oldPayModes = oldPaymentParam.getPayWayList(); - // 旧的异步支付方式 - PayWayParam oldModeParam = oldPayModes.stream() - .filter(payMode -> PayChannelEnum.ASYNC_TYPE_CODE.contains(payMode.getPayChannel())) - .findFirst() - .orElseThrow(() -> new PayFailureException("支付方式数据异常")); - - // 新的异步支付方式 - PayWayParam payWayParam = payParam.getPayWayList() - .stream() - .filter(payMode -> PayChannelEnum.ASYNC_TYPE_CODE.contains(payMode.getPayChannel())) - .findFirst() - .orElseThrow(() -> new PayFailureException("支付方式数据异常")); - payWayParam.setAmount(oldModeParam.getAmount()); - - return payWayParam; - } - - /** - * 创建支付记录 - */ - private Payment createPayment(PayParam payParam) { - // 构建payment记录 并保存 - Payment payment = PaymentBuilder.buildPayment(payParam); - return paymentService.save(payment); - } - - /** - * 商户和应用信息检测 - */ - private void checkMchAndApp(PayParam payParam) { - MerchantInfo merchantInfo = mchManager.findByCode(payParam.getMchCode()) - .orElseThrow(DataNotExistException::new); - MchApplication mchApp = mchAppManager.findByCode(payParam.getMchAppCode()).orElseThrow(DataNotExistException::new); - - // 商户与应用是否有关联关系 - if (!Objects.equals(mchApp.getMchCode(), merchantInfo.getCode())) { - throw new BizException("商户应用编码与商户不匹配"); - } - - // 商户是否可用状态 - if (!Objects.equals(MchAndAppCode.MCH_STATE_NORMAL, merchantInfo.getState())) { - throw new BizException("商户状态不可用"); - } - - // 应用是否可用状态 - if (!Objects.equals(MchAndAppCode.MCH_APP_STATE_NORMAL, mchApp.getState())) { - throw new BizException("商户应用状态不可用"); - } - } - - /** - * 校验支付状态,支付成功则返回,支付失败则抛出对应的异常 - */ - private Payment getAndCheckPaymentByBusinessId(String businessId) { - // 根据订单查询支付记录 - Payment payment = paymentService.findByBusinessId(businessId).orElse(null); - if (Objects.nonNull(payment)) { - // 支付失败类型状态 - List tradesStatus = Arrays.asList(TRADE_FAIL, TRADE_CANCEL); - if (tradesStatus.contains(payment.getPayStatus())) { - throw new PayFailureException("支付失败或已经被撤销"); - } - // 退款类型状态 - tradesStatus = Arrays.asList(TRADE_REFUNDING, TRADE_REFUNDED); - if (tradesStatus.contains(payment.getPayStatus())) { - throw new PayFailureException("支付失败或已经被撤销"); - } - // 支付超时状态 - if (Objects.nonNull(payment.getExpiredTime()) - && LocalDateTimeUtil.ge(LocalDateTime.now(), payment.getExpiredTime())) { - throw new PayFailureException("支付已超时"); - } - return payment; - } - return null; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/AliPayStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/AliPayStrategy.java deleted file mode 100644 index 6528917e..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/AliPayStrategy.java +++ /dev/null @@ -1,166 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.strategy; - -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.paymodel.AliPayCode; -import cn.bootx.platform.daxpay.core.channel.alipay.dao.AlipayConfigManager; -import cn.bootx.platform.daxpay.core.channel.alipay.entity.AlipayConfig; -import cn.bootx.platform.daxpay.core.channel.alipay.service.*; -import cn.bootx.platform.daxpay.core.pay.exception.ExceptionInfo; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayStrategy; -import cn.bootx.platform.daxpay.exception.payment.PayAmountAbnormalException; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.param.channel.alipay.AliPayParam; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONException; -import cn.hutool.json.JSONUtil; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -import java.math.BigDecimal; -import java.util.Map; - -import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; - -/** - * 支付宝支付 - * - * @author xxm - * @since 2021/2/27 - */ -@Scope(SCOPE_PROTOTYPE) -@Component -@RequiredArgsConstructor -public class AliPayStrategy extends AbsPayStrategy { - - private final AlipayConfigManager alipayConfigManager; - - private final AliPaymentService aliPaymentService; - - private final AlipaySyncService alipaySyncService; - - private final AliPayService aliPayService; - - private final AlipayConfigService alipayConfigService; - - private final AliPayCancelService aliPayCancelService; - - private AlipayConfig alipayConfig; - - private AliPayParam aliPayParam; - - @Override - public PayChannelEnum getType() { - return PayChannelEnum.ALI; - } - - /** - * 支付前操作 - */ - @Override - public void doBeforePayHandler() { - try { - // 支付宝参数验证 - String extraParamsJson = this.getPayWayParam().getExtraParamsJson(); - if (StrUtil.isNotBlank(extraParamsJson)) { - this.aliPayParam = JSONUtil.toBean(extraParamsJson, AliPayParam.class); - } - else { - this.aliPayParam = new AliPayParam(); - } - } - catch (JSONException e) { - throw new PayFailureException("支付参数错误"); - } - // 检查金额 - PayWayParam payMode = this.getPayWayParam(); - if (BigDecimalUtil.compareTo(payMode.getAmount(), BigDecimal.ZERO) < 1) { - throw new PayAmountAbnormalException(); - } - // 检查并获取支付宝支付配置 - this.initAlipayConfig(this.getPayParam().getMchAppCode()); - aliPayService.validation(this.getPayWayParam(), alipayConfig); - // 如果没有显式传入同步回调地址, 使用默认配置 - if (StrUtil.isBlank(aliPayParam.getReturnUrl())) { - aliPayParam.setReturnUrl(alipayConfig.getReturnUrl()); - } - this.initAlipayConfig(this.getPayParam().getMchAppCode()); - } - - /** - * 发起支付操作 - */ - @Override - public void doPayHandler() { - aliPayService.pay(this.getPayWayParam().getAmount(), this.getPayment(), this.aliPayParam, this.getPayWayParam(), - this.alipayConfig); - } - - /** - * 支付调起成功 - */ - @Override - public void doSuccessHandler() { - aliPaymentService.updatePaySuccess(this.getPayment(), this.getPayWayParam()); - } - - /** - * 发起支付失败 - */ - @Override - public void doErrorHandler(ExceptionInfo exceptionInfo) { - this.doCloseHandler(); - } - - /** - * 异步支付成功 - */ - @Override - public void doAsyncSuccessHandler(Map map) { - String tradeNo = map.get(AliPayCode.TRADE_NO); - aliPaymentService.updateAsyncSuccess(this.getPayment().getId(), this.getPayWayParam(), tradeNo); - } - - /** - * 异步支付失败 - */ - @Override - public void doAsyncErrorHandler(ExceptionInfo exceptionInfo) { - // 调用撤销支付 - this.doCancelHandler(); - } - - /** - * 撤销支付 - */ - @Override - public void doCancelHandler() { - this.initAlipayConfig(this.getPayParam().getMchAppCode()); - // 撤销支付 - aliPayCancelService.cancelRemote(this.getPayment()); - // 调用关闭本地支付记录 - this.doCloseHandler(); - } - - /** - * 关闭本地支付记录 - */ - @Override - public void doCloseHandler() { - aliPaymentService.updateClose(this.getPayment().getId()); - } - - - /** - * 初始化支付宝配置信息 - */ - private void initAlipayConfig(String mchAppCode) { - // 检查并获取支付宝支付配置 - this.alipayConfig = alipayConfigManager.findByMchAppCode(mchAppCode) - .orElseThrow(() -> new PayFailureException("支付配置不存在")); - alipayConfigService.initApiConfig(this.alipayConfig); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/CashPayStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/CashPayStrategy.java deleted file mode 100644 index b0c39a2b..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/CashPayStrategy.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.strategy; - -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayStrategy; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.core.channel.cash.service.CashService; -import cn.bootx.platform.daxpay.exception.payment.PayAmountAbnormalException; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; - -import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; - -/** - * 现金支付 - * - * @author xxm - * @since 2021/6/23 - */ -@Slf4j -@Scope(SCOPE_PROTOTYPE) -@Service -@RequiredArgsConstructor -public class CashPayStrategy extends AbsPayStrategy { - - private final CashService cashService; - - private final PaymentService paymentService; - - /** - * 现金支付 - */ - @Override - public PayChannelEnum getType() { - return PayChannelEnum.CASH; - } - - /** - * 支付前检查 - */ - @Override - public void doBeforePayHandler() { - // 检查金额 - PayWayParam payMode = this.getPayWayParam(); - if (BigDecimalUtil.compareTo(payMode.getAmount(), BigDecimal.ZERO) < 1) { - throw new PayAmountAbnormalException(); - } - } - - /** - * 支付操作 - */ - @Override - public void doPayHandler() { - cashService.pay(this.getPayWayParam(), this.getPayment(), this.getPayParam()); - } - - /** - * 关闭本地支付记录 - */ - @Override - public void doCloseHandler() { - cashService.close(this.getPayment().getId()); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/UnionPayStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/UnionPayStrategy.java deleted file mode 100644 index b53434a8..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/UnionPayStrategy.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.strategy; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.pay.exception.ExceptionInfo; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayStrategy; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Service; - -import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; - -/** - * 云闪付 - * - * @author xxm - * @since 2022/3/8 - */ -@Slf4j -@Scope(SCOPE_PROTOTYPE) -@Service -@RequiredArgsConstructor -public class UnionPayStrategy extends AbsPayStrategy { - - @Override - public PayChannelEnum getType() { - return PayChannelEnum.UNION_PAY; - } - - @Override - public void doPayHandler() { - - } - - @Override - public void doErrorHandler(ExceptionInfo exceptionInfo) { - - } - - @Override - public void doCloseHandler() { - - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/VoucherPayStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/VoucherPayStrategy.java deleted file mode 100644 index a20c3570..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/VoucherPayStrategy.java +++ /dev/null @@ -1,84 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.strategy; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.Voucher; -import cn.bootx.platform.daxpay.core.channel.voucher.entity.VoucherRecord; -import cn.bootx.platform.daxpay.core.channel.voucher.service.VoucherPayService; -import cn.bootx.platform.daxpay.core.channel.voucher.service.VoucherPaymentService; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayStrategy; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -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 2022/3/13 - */ -@Slf4j -@Scope(SCOPE_PROTOTYPE) -@Service -@RequiredArgsConstructor -public class VoucherPayStrategy extends AbsPayStrategy { - - private final VoucherPayService voucherPayService; - - private final VoucherPaymentService voucherPaymentService; - - private List vouchers; - - @Override - public PayChannelEnum getType() { - return PayChannelEnum.VOUCHER; - } - - /** - * 支付前处理 - */ - @Override - public void doBeforePayHandler() { - // 获取并校验储值卡 - this.vouchers = voucherPayService.getAndCheckVoucher(this.getPayWayParam()); - } - - /** - * 支付操作 - */ - @Override - public void doPayHandler() { - List voucherRecords; - if (this.getPayment().isAsyncPayMode()){ - voucherRecords = voucherPayService.freezeBalance(this.getPayWayParam().getAmount(), this.getPayment(), this.vouchers); - } else { - voucherRecords = voucherPayService.pay(this.getPayWayParam().getAmount(), this.getPayment(), this.vouchers); - } - voucherPaymentService.savePayment(this.getPayment(), getPayParam(), getPayWayParam(), voucherRecords); - } - - /** - * 成功 - */ - @Override - public void doSuccessHandler() { - if (this.getPayment().isAsyncPayMode()){ - voucherPayService.paySuccess(this.getPayment().getId()); - } - voucherPaymentService.updateSuccess(this.getPayment().getId()); - } - - /** - * 关闭支付 - */ - @Override - public void doCloseHandler() { - voucherPayService.close(this.getPayment().getId()); - voucherPaymentService.updateClose(this.getPayment().getId()); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/WalletPayStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/WalletPayStrategy.java deleted file mode 100644 index 4fd1ebb9..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/WalletPayStrategy.java +++ /dev/null @@ -1,114 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.strategy; - -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.paymodel.WalletCode; -import cn.bootx.platform.daxpay.core.channel.wallet.entity.Wallet; -import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletPayService; -import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletPaymentService; -import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletQueryService; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayStrategy; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.exception.waller.WalletBannedException; -import cn.bootx.platform.daxpay.exception.waller.WalletLackOfBalanceException; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletPayParam; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONException; -import cn.hutool.json.JSONUtil; -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 2020/12/11 - */ -@Scope(SCOPE_PROTOTYPE) -@Component -@RequiredArgsConstructor -public class WalletPayStrategy extends AbsPayStrategy { - - private final WalletPaymentService walletPaymentService; - - private final WalletPayService walletPayService; - - private final WalletQueryService walletQueryService; - - private Wallet wallet; - - @Override - public PayChannelEnum getType() { - return PayChannelEnum.WALLET; - } - - /** - * 支付前处理 - */ - @Override - public void doBeforePayHandler() { - WalletPayParam walletPayParam = new WalletPayParam(); - try { - // 钱包参数验证 - String extraParamsJson = this.getPayWayParam().getExtraParamsJson(); - if (StrUtil.isNotBlank(extraParamsJson)) { - walletPayParam = JSONUtil.toBean(extraParamsJson, WalletPayParam.class); - } - } catch (JSONException e) { - throw new PayFailureException("支付参数错误"); - } - // 获取钱包 - this.wallet = walletQueryService.getWallet(walletPayParam,getPayParam()); - if (Objects.isNull(this.wallet)){ - throw new PayFailureException("钱包不存在"); - } - // 是否被禁用 - if (Objects.equals(WalletCode.STATUS_FORBIDDEN, this.wallet.getStatus())) { - throw new WalletBannedException(); - } - // 判断余额 - if (BigDecimalUtil.compareTo(this.wallet.getBalance(), getPayWayParam().getAmount()) < 0) { - throw new WalletLackOfBalanceException(); - } - } - - /** - * 支付操作 - */ - @Override - public void doPayHandler() { - // 异步支付方式时使用冻结方式 - if (this.getPayment().isAsyncPayMode()){ - walletPayService.freezeBalance(getPayWayParam().getAmount(), this.getPayment(), this.wallet); - } else { - walletPayService.pay(getPayWayParam().getAmount(), this.getPayment(), this.wallet); - } - walletPaymentService.savePayment(this.getPayment(), this.getPayParam(), this.getPayWayParam(), this.wallet); - } - - /** - * 成功 - */ - @Override - public void doSuccessHandler() { - if (this.getPayment().isAsyncPayMode()){ - walletPayService.paySuccess(this.getPayment().getId()); - } - walletPaymentService.updateSuccess(this.getPayment().getId()); - } - - /** - * 取消支付并返还金额 - */ - @Override - public void doCloseHandler() { - walletPayService.close(this.getPayment().getId()); - walletPaymentService.updateClose(this.getPayment().getId()); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/WeChatPayStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/WeChatPayStrategy.java deleted file mode 100644 index aceecc97..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/pay/strategy/WeChatPayStrategy.java +++ /dev/null @@ -1,166 +0,0 @@ -package cn.bootx.platform.daxpay.core.pay.strategy; - -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.paymodel.WeChatPayCode; -import cn.bootx.platform.daxpay.core.channel.wechat.dao.WeChatPayConfigManager; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.bootx.platform.daxpay.core.channel.wechat.service.WeChatPayCancelService; -import cn.bootx.platform.daxpay.core.channel.wechat.service.WeChatPayService; -import cn.bootx.platform.daxpay.core.channel.wechat.service.WeChatPaySyncService; -import cn.bootx.platform.daxpay.core.channel.wechat.service.WeChatPaymentService; -import cn.bootx.platform.daxpay.core.pay.exception.ExceptionInfo; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayStrategy; -import cn.bootx.platform.daxpay.exception.payment.PayAmountAbnormalException; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.param.channel.wechat.WeChatPayParam; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONException; -import cn.hutool.json.JSONUtil; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -import java.math.BigDecimal; -import java.util.Map; -import java.util.Optional; - -import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE; - -/** - * 微信支付 - * - * @author xxm - * @since 2021/4/5 - */ -@Scope(SCOPE_PROTOTYPE) -@Component -@RequiredArgsConstructor -public class WeChatPayStrategy extends AbsPayStrategy { - - private final WeChatPayConfigManager weChatPayConfigManager; - - private final WeChatPayService weChatPayService; - - private final WeChatPaymentService weChatPaymentService; - - private final WeChatPayCancelService weChatPayCancelService; - - private final WeChatPaySyncService weChatPaySyncService; - - private WeChatPayConfig weChatPayConfig; - - private WeChatPayParam weChatPayParam; - - /** - * 类型 - */ - @Override - public PayChannelEnum getType() { - return PayChannelEnum.WECHAT; - } - - /** - * 支付前操作 - */ - @Override - public void doBeforePayHandler() { - try { - // 微信参数验证 - String extraParamsJson = this.getPayWayParam().getExtraParamsJson(); - if (StrUtil.isNotBlank(extraParamsJson)) { - this.weChatPayParam = JSONUtil.toBean(extraParamsJson, WeChatPayParam.class); - } - else { - this.weChatPayParam = new WeChatPayParam(); - } - } - catch (JSONException e) { - throw new PayFailureException("支付参数错误"); - } - - // 检查金额 - PayWayParam payMode = this.getPayWayParam(); - if (BigDecimalUtil.compareTo(payMode.getAmount(), BigDecimal.ZERO) < 1) { - throw new PayAmountAbnormalException(); - } - - // 检查并获取微信支付配置 - this.initWeChatPayConfig(this.getPayParam().getMchAppCode()); - weChatPayService.validation(this.getPayWayParam(), weChatPayConfig); - } - - /** - * 发起支付 - */ - @Override - public void doPayHandler() { - weChatPayService.pay(this.getPayWayParam().getAmount(), this.getPayment(), this.weChatPayParam, - this.getPayWayParam(), this.weChatPayConfig); - } - - /** - * 支付调起成功 - */ - @Override - public void doSuccessHandler() { - weChatPaymentService.updatePaySuccess(this.getPayment(), this.getPayWayParam()); - } - - /** - * 错误处理 - */ - @Override - public void doErrorHandler(ExceptionInfo exceptionInfo) { - this.doCloseHandler(); - } - - /** - * 异步支付成功 - */ - @Override - public void doAsyncSuccessHandler(Map map) { - String tradeNo = map.get(WeChatPayCode.TRANSACTION_ID); - weChatPaymentService.updateAsyncSuccess(this.getPayment().getId(), this.getPayWayParam(), tradeNo); - } - - /** - * 异步支付失败 - */ - @Override - public void doAsyncErrorHandler(ExceptionInfo exceptionInfo) { - // 调用撤销支付 - this.doCancelHandler(); - } - - /** - * 撤销支付 - */ - @Override - public void doCancelHandler() { - // 检查并获取微信支付配置 - this.initWeChatPayConfig(this.getPayParam().getMchAppCode()); - weChatPayCancelService.cancelRemote(this.getPayment(), weChatPayConfig); - // 调用关闭本地支付记录 - this.doCloseHandler(); - } - - /** - * 关闭本地支付记录 - */ - @Override - public void doCloseHandler() { - weChatPaymentService.updateClose(this.getPayment().getId()); - } - - /** - * 初始化微信支付 - */ - private void initWeChatPayConfig(String appCode) { - // 检查并获取微信支付配置 - this.weChatPayConfig = Optional.ofNullable(this.weChatPayConfig) - .orElse(weChatPayConfigManager.findByMchAppCode(appCode).orElseThrow(() -> new PayFailureException("支付配置不存在"))); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/convert/PaymentConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/convert/PaymentConvert.java deleted file mode 100644 index f4f2794b..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/convert/PaymentConvert.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.bootx.platform.daxpay.core.payment.convert; - -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.dto.payment.PaymentDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 支付记录转换 - * - * @author xxm - * @since 2021/8/20 - */ -@Mapper -public interface PaymentConvert { - - PaymentConvert CONVERT = Mappers.getMapper(PaymentConvert.class); - - PaymentDto convert(Payment payment); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/dao/PaymentExpiredTimeRepository.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/dao/PaymentExpiredTimeRepository.java deleted file mode 100644 index c20303a2..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/dao/PaymentExpiredTimeRepository.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.bootx.platform.daxpay.core.payment.dao; - -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import cn.bootx.platform.common.redis.RedisClient; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.time.LocalDateTime; -import java.util.Set; - -/** - * 支付单过去处理 - * - * @author xxm - * @since 2022/7/12 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class PaymentExpiredTimeRepository { - - private static final String KEY = "pay:payment:expiredtime"; - - private final RedisClient redisClient; - - /** - * 根据 token 存储对应的 ExpiredTokenKey - */ - public void store(Long paymentId, LocalDateTime expiredTime) { - long time = LocalDateTimeUtil.timestamp(expiredTime); - redisClient.zadd(KEY, String.valueOf(paymentId), time); - } - - /** - * 获取所有已过期的ExpiredTokenKey - */ - public Set retrieveExpiredKeys(LocalDateTime expiredTime) { - long time = LocalDateTimeUtil.timestamp(expiredTime); - return redisClient.zrangeByScore(KEY, 0L, time); - } - - /** - * 删除指定的ExpiredTokenKey - */ - public void removeKeys(String... keys) { - if (keys != null && keys.length > 0) { - redisClient.zremByMembers(KEY, keys); - } - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/dao/PaymentManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/dao/PaymentManager.java deleted file mode 100644 index 2a4a29bb..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/dao/PaymentManager.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.bootx.platform.daxpay.core.payment.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.common.query.entity.QueryOrder; -import cn.bootx.platform.common.query.entity.QueryParams; -import cn.bootx.platform.common.query.generator.QueryGenerator; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.param.payment.PaymentQuery; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.cache.annotation.Caching; -import org.springframework.stereotype.Repository; - -import java.io.Serializable; -import java.util.Optional; - -import static cn.bootx.platform.daxpay.code.CachingCode.PAYMENT_BUSINESS_ID; -import static cn.bootx.platform.daxpay.code.CachingCode.PAYMENT_ID; - -@Repository -@RequiredArgsConstructor -public class PaymentManager extends BaseManager { - - @Override - @Caching(evict = { @CacheEvict(value = PAYMENT_ID, key = "#payment.id"), - @CacheEvict(value = PAYMENT_BUSINESS_ID, key = "#payment.businessId") }) - public Payment updateById(Payment payment) { - return super.updateById(payment); - } - - @Override - @Cacheable(value = { PAYMENT_ID }, key = "#id") - public Optional findById(Serializable id) { - return super.findById(id); - } - - /** - * 根据BusinessId查询 - */ - @Cacheable(value = { PAYMENT_BUSINESS_ID }, key = "#businessId") - public Optional findByBusinessId(String businessId) { - return findByField(Payment::getBusinessId, businessId); - } - - /** - * 分页查询 - */ - public Page page(PageParam pageParam, PaymentQuery param, QueryOrder queryOrder) { - Page mpPage = MpUtil.getMpPage(pageParam, Payment.class); - QueryWrapper wrapper = QueryGenerator.generator(param, queryOrder); - return this.page(mpPage,wrapper); - } - - /** - * 超级分页查询 - */ - public Page superPage(PageParam pageParam, QueryParams queryParams) { - QueryWrapper wrapper = QueryGenerator.generator(queryParams); - Page mpPage = MpUtil.getMpPage(pageParam, Payment.class); - return this.page(mpPage, wrapper); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/dao/PaymentMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/dao/PaymentMapper.java deleted file mode 100644 index f7e3a336..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/dao/PaymentMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.daxpay.core.payment.dao; - -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 支付记录 - * - * @author xxm - * @since 2021/7/27 - */ -@Mapper -public interface PaymentMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/entity/Payment.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/entity/Payment.java deleted file mode 100644 index f4727e61..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/entity/Payment.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.bootx.platform.daxpay.core.payment.entity; - -import cn.bootx.platform.common.core.annotation.BigField; -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.common.mybatisplus.handler.JacksonRawTypeHandler; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.payment.convert.PaymentConvert; -import cn.bootx.platform.daxpay.dto.payment.PayChannelInfo; -import cn.bootx.platform.daxpay.dto.payment.PaymentDto; -import cn.bootx.platform.daxpay.dto.payment.RefundableInfo; -import cn.bootx.table.modify.annotation.DbColumn; -import cn.bootx.table.modify.mysql.annotation.DbMySqlFieldType; -import cn.bootx.table.modify.mysql.annotation.DbMySqlIndex; -import cn.bootx.table.modify.mysql.constants.MySqlFieldTypeEnum; -import cn.bootx.table.modify.mysql.constants.MySqlIndexType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import lombok.experimental.FieldNameConstants; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 支付记录 - * - * @author xxm - * @since 2020/12/8 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@FieldNameConstants -@Accessors(chain = true) -@TableName(value = "pay_payment", autoResultMap = true) -public class Payment extends MpBaseEntity implements EntityBaseFunction { - - /** 关联的业务id */ - @DbMySqlIndex(comment = "业务Id索引",type = MySqlIndexType.UNIQUE) - @DbColumn(comment = "关联的业务id") - private String businessId; - - /** 商户编码 */ - @DbColumn(comment = "商户编码") - private String mchCode; - - /** 商户应用编码 */ - @DbColumn(comment = "商户应用编码") - private String mchAppCode; - - /** 标题 */ - @DbColumn(comment = "标题") - private String title; - - /** 描述 */ - @DbColumn(comment = "描述") - private String description; - - /** 是否是异步支付 */ - @DbColumn(comment = "是否是异步支付") - private boolean asyncPayMode; - - /** 是否是组合支付 */ - @DbColumn(comment = "是否是组合支付") - private boolean combinationPayMode; - - /** - * 异步支付渠道 - * @see cn.bootx.platform.daxpay.code.pay.PayChannelEnum#ALI - */ - @DbColumn(comment = "异步支付渠道") - private String asyncPayChannel; - - /** 金额 */ - @DbColumn(comment = "金额") - private BigDecimal amount; - - /** 可退款余额 */ - @DbColumn(comment = "可退款余额") - private BigDecimal refundableBalance; - - /** 错误码 */ - @DbColumn(comment = "错误码") - private String errorCode; - - /** 错误信息 */ - @DbColumn(comment = "错误信息") - private String errorMsg; - - /** - * 支付渠道信息列表 - * @see PayChannelInfo - */ - @TableField(typeHandler = JacksonRawTypeHandler.class) - @BigField - @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) - @DbColumn(comment = "支付渠道信息列表") - private List payChannelInfo; - - /** - * 退款信息列表 - * @see RefundableInfo - */ - @TableField(typeHandler = JacksonRawTypeHandler.class) - @BigField - @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) - @DbColumn(comment = "退款信息列表") - private List refundableInfo; - - /** - * 支付状态 - * @see PayStatusCode#TRADE_PROGRESS - */ - @DbColumn(comment = "支付状态") - private String payStatus; - - /** 支付时间 */ - @DbColumn(comment = "支付时间") - private LocalDateTime payTime; - - /** 支付终端ip */ - @DbColumn(comment = "支付终端ip") - private String clientIp; - - /** 过期时间 */ - @DbColumn(comment = "过期时间") - private LocalDateTime expiredTime; - - @Override - public PaymentDto toDto() { - return PaymentConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/service/PaymentQueryService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/service/PaymentQueryService.java deleted file mode 100644 index 60f9cc17..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/service/PaymentQueryService.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.bootx.platform.daxpay.core.payment.service; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.common.query.entity.QueryOrder; -import cn.bootx.platform.common.query.entity.QueryParams; -import cn.bootx.platform.daxpay.core.payment.dao.PaymentManager; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.dto.payment.PayChannelInfo; -import cn.bootx.platform.daxpay.dto.payment.PaymentDto; -import cn.bootx.platform.daxpay.param.payment.PaymentQuery; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - -import static cn.bootx.platform.daxpay.code.pay.PayStatusCode.TRADE_UNKNOWN; - -/** - * 支付单查询 - * - * @author xxm - * @since 2021/6/28 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PaymentQueryService { - - private final PaymentManager paymentManager; - - /** - * 根据支付Id查询支付单 - */ - public PaymentDto findById(Long id) { - return paymentManager.findById(id).map(Payment::toDto).orElseThrow(DataNotExistException::new); - } - - /** - * 根据业务ID获取支付状态 - */ - public String findStatusByBusinessId(String businessId) { - return paymentManager.findByBusinessId(businessId).map(Payment::getPayStatus).orElse(TRADE_UNKNOWN); - } - - /** - * 根据businessId获取订单支付方式 - */ - public List findPayTypeInfoByBusinessId(String businessId) { - return paymentManager.findByBusinessId(businessId).map(Payment::getPayChannelInfo).orElse(new ArrayList<>(1)); - } - - /** - * 根据id获取订单支付方式 - */ - public List findPayTypeInfoById(Long id) { - return paymentManager.findById(id).map(Payment::getPayChannelInfo).orElse(new ArrayList<>(1)); - } - - /** - * 分页 - */ - public PageResult page(PageParam pageParam, PaymentQuery param, QueryOrder queryOrder) { - return MpUtil.convert2DtoPageResult(paymentManager.page(pageParam, param, queryOrder)); - } - - /** - * 超级查询 - */ - public PageResult superPage(PageParam pageParam, QueryParams queryParams) { - return MpUtil.convert2DtoPageResult(paymentManager.superPage(pageParam, queryParams)); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/service/PaymentService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/service/PaymentService.java deleted file mode 100644 index 9bd23182..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/payment/service/PaymentService.java +++ /dev/null @@ -1,109 +0,0 @@ -package cn.bootx.platform.daxpay.core.payment.service; - -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import cn.bootx.platform.common.spring.exception.RetryableException; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.payment.dao.PaymentExpiredTimeRepository; -import cn.bootx.platform.daxpay.core.payment.dao.PaymentManager; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.dto.payment.RefundableInfo; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.retry.annotation.Retryable; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -import static cn.bootx.platform.daxpay.code.pay.PayStatusCode.TRADE_PROGRESS; - -/** - * 支付记录 - * - * @author xxm - * @since 2021/3/8 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PaymentService { - - private final PaymentManager paymentManager; - - private final PaymentExpiredTimeRepository expiredTimeRepository; - - /** - * 保存 - */ - public Payment save(Payment payment) { - return paymentManager.save(payment); - } - - /** - * 更新支付记录 - */ - public Payment updateById(Payment payment) { - // 超时注册 - this.registerExpiredTime(payment); - return paymentManager.updateById(payment); - } - - /** - * 根据id查询 - */ - public Optional findById(Serializable id) { - return paymentManager.findById(id); - } - - /** - * 根据BusinessId查询 - */ - public Optional findByBusinessId(String businessId) { - return paymentManager.findByBusinessId(businessId); - } - - /** - * 退款成功处理, 更新可退款信息 不要进行持久化 - */ - public void updateRefundSuccess(Payment payment, BigDecimal amount, PayChannelEnum payChannelEnum) { - // 删除旧有的退款记录, 替换退款完的新的 - List refundableInfos = payment.getRefundableInfo(); - RefundableInfo refundableInfo = refundableInfos.stream() - .filter(o -> Objects.equals(o.getPayChannel(), payChannelEnum.getCode())) - .findFirst() - .orElseThrow(() -> new PayFailureException("数据不存在")); - refundableInfos.remove(refundableInfo); - refundableInfo.setAmount(refundableInfo.getAmount().subtract(amount)); - refundableInfos.add(refundableInfo); - payment.setRefundableInfo(refundableInfos); - } - - /** - * 支付单超时关闭事件注册, 失败重试3次, 间隔一秒 - */ - @Async("bigExecutor") - @Retryable(value = RetryableException.class) - public void registerExpiredTime(Payment payment) { - LocalDateTime expiredTime = payment.getExpiredTime(); - // 支付中且有超时时间才会注册超时关闭时间 - if (Objects.equals(payment.getPayStatus(), TRADE_PROGRESS) && Objects.nonNull(expiredTime)) { - try { - // 将过期时间添加到redis中, 往后延时一分钟 - expiredTime = LocalDateTimeUtil.offset(expiredTime, 1, ChronoUnit.MINUTES); - expiredTimeRepository.store(payment.getId(), expiredTime); - } - catch (Exception e) { - log.error("注册支付单超时关闭失败"); - throw new RetryableException(); - } - } - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/factory/PayRefundStrategyFactory.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/factory/PayRefundStrategyFactory.java deleted file mode 100644 index d37d2d88..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/factory/PayRefundStrategyFactory.java +++ /dev/null @@ -1,119 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.factory; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.refund.func.AbsPayRefundStrategy; -import cn.bootx.platform.daxpay.core.refund.strategy.*; -import cn.bootx.platform.daxpay.exception.payment.PayUnsupportedMethodException; -import cn.bootx.platform.daxpay.param.refund.RefundModeParam; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.extra.spring.SpringUtil; -import lombok.val; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -import static cn.bootx.platform.daxpay.code.pay.PayChannelEnum.ASYNC_TYPE_CODE; - -/** - * 退款策略工厂 - * @author xxm - * @since 2023/7/4 - */ -public class PayRefundStrategyFactory { - - /** - * 根据传入的支付渠道创建策略 - * @return 支付策略 - */ - public static AbsPayRefundStrategy create(RefundModeParam refundModeParam) { - - AbsPayRefundStrategy strategy = null; - PayChannelEnum channelEnum = PayChannelEnum.findByCode(refundModeParam.getPayChannel()); - switch (channelEnum) { - case ALI: - strategy = SpringUtil.getBean(AliPayRefundStrategy.class); - break; - case WECHAT: - strategy = SpringUtil.getBean(WeChatPayRefundStrategy.class); - break; - case UNION_PAY: - strategy = SpringUtil.getBean(UnionPayRefundStrategy.class); - break; - case CASH: - strategy = SpringUtil.getBean(CashPayRefundStrategy.class); - break; - case WALLET: - strategy = SpringUtil.getBean(WalletPayRefundStrategy.class); - break; - case VOUCHER: - strategy = SpringUtil.getBean(VoucherPayRefundStrategy.class); - break; - case CREDIT_CARD: - break; - case APPLE_PAY: - break; - default: - throw new PayUnsupportedMethodException(); - } - // noinspection ConstantConditions - strategy.setRefundModeParam(refundModeParam); - return strategy; - } - - /** - * 根据传入的支付类型批量创建策略, 异步支付在后面 - */ - public static List createDesc(List refundModeParams) { - return create(refundModeParams, true); - } - - /** - * 根据传入的支付类型批量创建策略, 默认异步支付在前面 - */ - public static List create(List refundModeParams) { - return create(refundModeParams, false); - } - - /** - * 根据传入的支付类型批量创建策略 - * @param refundModeParams 支付类型 - * @return 支付策略 - */ - private static List create(List refundModeParams, boolean description) { - if (CollectionUtil.isEmpty(refundModeParams)) { - return Collections.emptyList(); - } - List list = new ArrayList<>(refundModeParams.size()); - - // 同步支付 - val syncRefundModeParams = refundModeParams.stream() - .filter(Objects::nonNull) - .filter(payModeParam -> !ASYNC_TYPE_CODE.contains(payModeParam.getPayChannel())) - .collect(Collectors.toList()); - - // 异步支付 - val asyncRefundModeParams = refundModeParams.stream() - .filter(Objects::nonNull) - .filter(payModeParam -> ASYNC_TYPE_CODE.contains(payModeParam.getPayChannel())) - .collect(Collectors.toList()); - - List sortList = new ArrayList<>(refundModeParams.size()); - - // 异步在后面 - if (description) { - sortList.addAll(syncRefundModeParams); - sortList.addAll(asyncRefundModeParams); - } - else { - sortList.addAll(asyncRefundModeParams); - sortList.addAll(syncRefundModeParams); - } - - // 此处有一个根据Type的反转排序, - sortList.stream().filter(Objects::nonNull).forEach(payMode -> list.add(create(payMode))); - return list; - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/func/AbsPayRefundStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/func/AbsPayRefundStrategy.java deleted file mode 100644 index f359062e..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/func/AbsPayRefundStrategy.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.func; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.pay.exception.ExceptionInfo; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.param.refund.RefundModeParam; -import cn.bootx.platform.daxpay.param.refund.RefundParam; -import lombok.Getter; -import lombok.Setter; - -/** - * 抽象支付退款策略基类 - * - * @author xxm - * @since 2020/12/11 - */ -@Getter -@Setter -public abstract class AbsPayRefundStrategy { - - /** 支付对象 */ - private Payment payment = null; - - /** 退款参数 */ - private RefundParam refundParam = null; - - /** 当前支付方式退款参数 退款参参数中的与这个不一致, 以这个为准 */ - private RefundModeParam refundModeParam = null; - - /** - * 策略标识 - * @see PayChannelEnum - */ - public abstract PayChannelEnum getType(); - - /** - * 初始化支付的参数 - */ - public void initPayParam(Payment payment, RefundParam refundParam) { - this.payment = payment; - this.refundParam = refundParam; - } - - /** - * 退款前对处理 包含必要的校验以及对Payment对象的创建和保存操作 - */ - public void doBeforeRefundHandler() { - } - - /** - * 退款操作 - */ - public abstract void doRefundHandler(); - - /** - * 退款失败的处理方式 - */ - public void doErrorHandler(ExceptionInfo exceptionInfo) { - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/func/PayRefundStrategyConsumer.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/func/PayRefundStrategyConsumer.java deleted file mode 100644 index 6bba8573..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/func/PayRefundStrategyConsumer.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.func; - -import cn.bootx.platform.daxpay.core.payment.entity.Payment; - -import java.util.List; - -/** - * 支付退款策略接口 - * @author xxm - * @since 2023/7/5 - */ -@FunctionalInterface -public interface PayRefundStrategyConsumer, S extends Payment> { - - void accept(T t, S s); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/local/AsyncRefundLocal.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/local/AsyncRefundLocal.java deleted file mode 100644 index 88ddba61..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/local/AsyncRefundLocal.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.local; - -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import com.alibaba.ttl.TransmittableThreadLocal; - -/** - * 异步退款线程变量 - * - * @author xxm - * @since 2022/3/9 - */ -public final class AsyncRefundLocal { - - private static final ThreadLocal THREAD_LOCAL = new TransmittableThreadLocal<>(); - - private static final ThreadLocal ERROR_MSG = new TransmittableThreadLocal<>(); - - private static final ThreadLocal ERROR_CODE = new TransmittableThreadLocal<>(); - - /** - * 设置 退款号 - */ - public static void set(String refundId) { - THREAD_LOCAL.set(refundId); - } - - /** - * 获取 退款号 - */ - public static String get() { - return THREAD_LOCAL.get(); - } - - /** - * 设置 错误内容 - */ - public static void setErrorMsg(String errorMsg) { - ERROR_MSG.set(errorMsg); - } - - /** - * 获取 错误内容 - */ - public static String getErrorMsg() { - return ERROR_MSG.get(); - } - - /** - * 设置 错误码 - * @see PayStatusCode#REFUND_PROCESS_FAIL 或者其他支付渠道返回的错误码 - */ - public static void setErrorCode(String errorCode) { - ERROR_CODE.set(errorCode); - } - - /** - * 获取 错误码 - */ - public static String getErrorCode() { - return ERROR_CODE.get(); - } - - /** - * 清除 - */ - public static void clear() { - THREAD_LOCAL.remove(); - ERROR_MSG.remove(); - ERROR_CODE.remove(); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/convert/RefundConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/convert/RefundConvert.java deleted file mode 100644 index b62f968e..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/convert/RefundConvert.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.record.convert; - -import cn.bootx.platform.daxpay.core.refund.record.entity.PayRefundRecord; -import cn.bootx.platform.daxpay.dto.refund.PayRefundRecordDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * @author xxm - * @since 2022/3/2 - */ -@Mapper -public interface RefundConvert { - - RefundConvert CONVERT = Mappers.getMapper(RefundConvert.class); - - PayRefundRecordDto convert(PayRefundRecord in); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/dao/PayRefundRecordManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/dao/PayRefundRecordManager.java deleted file mode 100644 index 9c68bdaa..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/dao/PayRefundRecordManager.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.record.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.refund.record.entity.PayRefundRecord; -import cn.bootx.platform.daxpay.dto.refund.PayRefundRecordDto; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Objects; - -/** - * @author xxm - * @since 2022/3/2 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class PayRefundRecordManager extends BaseManager { - - public Page page(PageParam pageParam, PayRefundRecordDto param) { - Page mpPage = MpUtil.getMpPage(pageParam, PayRefundRecord.class); - return lambdaQuery().orderByDesc(MpIdEntity::getId) - .like(Objects.nonNull(param.getPaymentId()), PayRefundRecord::getPaymentId, param.getPaymentId()) - .like(Objects.nonNull(param.getBusinessId()), PayRefundRecord::getBusinessId, param.getBusinessId()) - .like(Objects.nonNull(param.getTitle()), PayRefundRecord::getTitle, param.getTitle()) - .page(mpPage); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/dao/PayRefundRecordMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/dao/PayRefundRecordMapper.java deleted file mode 100644 index db718ce7..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/dao/PayRefundRecordMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.record.dao; - -import cn.bootx.platform.daxpay.core.refund.record.entity.PayRefundRecord; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author xxm - * @since 2022/3/2 - */ -@Mapper -public interface PayRefundRecordMapper extends BaseMapper { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/entity/PayRefundRecord.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/entity/PayRefundRecord.java deleted file mode 100644 index 1db4012f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/entity/PayRefundRecord.java +++ /dev/null @@ -1,82 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.record.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; -import cn.bootx.platform.common.mybatisplus.handler.JacksonRawTypeHandler; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.refund.record.convert.RefundConvert; -import cn.bootx.platform.daxpay.dto.payment.RefundableInfo; -import cn.bootx.platform.daxpay.dto.refund.PayRefundRecordDto; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 退款记录 - * - * @author xxm - * @since 2022/3/2 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@TableName(value = "pay_refund_record", autoResultMap = true) -public class PayRefundRecord extends MpBaseEntity implements EntityBaseFunction { - - /** 支付单号 */ - private Long paymentId; - - /** 关联的业务id */ - private String businessId; - - /** 异步方式关联退款请求号(部分退款情况) */ - private String refundRequestNo; - - /** 用户ID */ - private Long userId; - - /** 标题 */ - private String title; - - /** 退款金额 */ - private BigDecimal amount; - - /** 剩余可退 */ - private BigDecimal refundableBalance; - - /** 退款终端ip */ - private String clientIp; - - /** 退款时间 */ - private LocalDateTime refundTime; - - /** - * 退款信息列表 - */ - @TableField(typeHandler = JacksonRawTypeHandler.class) - private List refundableInfo; - - /** - * 退款状态 - * @see PayStatusCode#REFUND_PROCESS_FAIL - */ - private String refundStatus; - - /** 错误码 */ - private String errorCode; - - /** 错误信息 */ - private String errorMsg; - - @Override - public PayRefundRecordDto toDto() { - return RefundConvert.CONVERT.convert(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/service/PayRefundRecordService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/service/PayRefundRecordService.java deleted file mode 100644 index fadc4a42..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/record/service/PayRefundRecordService.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.record.service; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.refund.record.dao.PayRefundRecordManager; -import cn.bootx.platform.daxpay.core.refund.record.entity.PayRefundRecord; -import cn.bootx.platform.daxpay.dto.refund.PayRefundRecordDto; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * 退款 - * - * @author xxm - * @since 2022/3/2 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayRefundRecordService { - - private final PayRefundRecordManager refundRecordManager; - - /** - * 分页查询 - */ - public PageResult page(PageParam pageParam, PayRefundRecordDto param) { - Page page = refundRecordManager.page(pageParam, param); - return MpUtil.convert2DtoPageResult(page); - } - - /** - * 根据id查询 - */ - public PayRefundRecordDto findById(Long id) { - return refundRecordManager.findById(id).map(PayRefundRecord::toDto).orElseThrow(DataNotExistException::new); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/service/PayRefundService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/service/PayRefundService.java deleted file mode 100644 index 3dc082ef..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/service/PayRefundService.java +++ /dev/null @@ -1,249 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.service; - -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.common.spring.util.WebServletUtil; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.core.payment.dao.PaymentManager; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.core.refund.factory.PayRefundStrategyFactory; -import cn.bootx.platform.daxpay.core.refund.func.AbsPayRefundStrategy; -import cn.bootx.platform.daxpay.core.refund.func.PayRefundStrategyConsumer; -import cn.bootx.platform.daxpay.core.refund.local.AsyncRefundLocal; -import cn.bootx.platform.daxpay.core.refund.record.dao.PayRefundRecordManager; -import cn.bootx.platform.daxpay.core.refund.record.entity.PayRefundRecord; -import cn.bootx.platform.daxpay.dto.payment.RefundableInfo; -import cn.bootx.platform.daxpay.exception.payment.PayAmountAbnormalException; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.exception.payment.PayUnsupportedMethodException; -import cn.bootx.platform.daxpay.param.refund.RefundModeParam; -import cn.bootx.platform.daxpay.param.refund.RefundParam; -import cn.bootx.platform.starter.auth.util.SecurityUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.extra.servlet.ServletUtil; -import cn.hutool.extra.spring.SpringUtil; -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 javax.servlet.http.HttpServletRequest; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.*; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static cn.bootx.platform.daxpay.code.pay.PayStatusCode.*; - -/** - * 支付退款 - * - * @author xxm - * @since 2022/2/26 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayRefundService { - - private final PaymentService paymentService; - - private final PaymentManager paymentManager; - - private final PayRefundRecordManager refundRecordManager; - - /** - * 退款 - */ - @Transactional(rollbackFor = Exception.class) - public void refund(RefundParam refundParam) { - Payment payment = paymentService.findByBusinessId(refundParam.getBusinessId()) - .orElseThrow(() -> new PayFailureException("未找到支付单")); - this.refundPayment(payment, refundParam); - } - - /** - * 根据业务ID全额退款 - */ - @Transactional(rollbackFor = Exception.class) - public void refundByBusinessId(String businessId) { - Payment payment = paymentService.findByBusinessId(businessId) - .orElseThrow(() -> new PayFailureException("未找到支付单")); - List refundModeParams = payment.getRefundableInfo() - .stream() - .map(o -> new RefundModeParam().setPayChannel(o.getPayChannel()).setAmount(o.getAmount())) - .collect(Collectors.toList()); - RefundParam refundParam = new RefundParam() - .setBusinessId(businessId) - .setRefundModeParams(refundModeParams); - this.refundPayment(payment, refundParam); - - } - - /** - * 退款 - */ - private void refundPayment(Payment payment,RefundParam refundParam) { - - List refundModeParams = refundParam.getRefundModeParams(); - // 状态判断, 支付中/失败/撤销不处理 - List tradesStatus = Arrays.asList(TRADE_PROGRESS, TRADE_CANCEL, TRADE_FAIL); - if (tradesStatus.contains(payment.getPayStatus())) { - throw new PayFailureException("状态非法, 无法退款"); - } - - // 过滤退款金额为0的支付渠道参数 - refundModeParams.removeIf(refundModeParam -> BigDecimalUtil.compareTo(refundModeParam.getAmount(), BigDecimal.ZERO) == 0); - // 退款参数检查 - this.payModeCheck(refundModeParams, payment.getRefundableInfo()); - - // 1.获取退款参数方式,通过工厂生成对应的策略组 - List payRefundStrategies = PayRefundStrategyFactory.create(refundModeParams); - if (CollectionUtil.isEmpty(payRefundStrategies)) { - throw new PayUnsupportedMethodException(); - } - - // 2.初始化支付的参数 - for (AbsPayRefundStrategy refundStrategy : payRefundStrategies) { - refundStrategy.initPayParam(payment, refundParam); - } - - // 3.支付前准备 - this.doHandler(refundModeParams,payment, payRefundStrategies, AbsPayRefundStrategy::doBeforeRefundHandler, null); - - // 4.执行退款 - this.doHandler(refundModeParams,payment, payRefundStrategies, AbsPayRefundStrategy::doRefundHandler, (strategyList, paymentObj) -> { - this.paymentHandler(paymentObj, refundModeParams); - }); - } - - /** - * 支付单处理 - */ - private void paymentHandler(Payment payment, List refundModeParams) { - BigDecimal amount = refundModeParams.stream() - .map(RefundModeParam::getAmount) - .reduce(BigDecimal.ZERO, BigDecimal::add); - // 剩余可退款余额 - BigDecimal refundableBalance = payment.getRefundableBalance().subtract(amount); - - // 退款完成 - if (BigDecimalUtil.compareTo(refundableBalance, BigDecimal.ZERO) < 1) { - payment.setPayStatus(PayStatusCode.TRADE_REFUNDED); - } - else { - payment.setPayStatus(PayStatusCode.TRADE_REFUNDING); - } - - payment.setRefundableBalance(refundableBalance); - paymentManager.updateById(payment); - // 记录退款成功的记录 - SpringUtil.getBean(this.getClass()).saveRefund(payment, amount, refundModeParams); - } - - /** - * 处理方法 - * @param refundModeParams 退款方式参数 - * @param payment 支付记录 - * @param strategyList 退款策略 - * @param refundStrategy 执行方法 - * @param successCallback 成功操作 - */ - private void doHandler( List refundModeParams, - Payment payment, - List strategyList, - Consumer refundStrategy, - PayRefundStrategyConsumer, Payment> successCallback) { - try { - // 执行策略操作,如退款前/退款时 - // 等同strategyList.forEach(payMethod.accept(PaymentStrategy)) - strategyList.forEach(refundStrategy); - - // 执行操作成功的处 - Optional.ofNullable(successCallback).ifPresent(fun -> fun.accept(strategyList, payment)); - } - catch (Exception e) { - // 记录退款失败的记录 - BigDecimal amount = refundModeParams.stream() - .map(RefundModeParam::getAmount) - .reduce(BigDecimal.ZERO, BigDecimal::add); - // 错误 - AsyncRefundLocal.setErrorCode(REFUND_PROCESS_FAIL); - AsyncRefundLocal.setErrorMsg(e.getMessage()); - SpringUtil.getBean(this.getClass()).saveRefund(payment, amount, refundModeParams); - throw e; - } - finally { - // 清除 - AsyncRefundLocal.clear(); - } - } - - /** - * 支付方式检查 - * @param refundModeParams 退款参数 - * @param refundableInfos 可退款信息 - */ - private void payModeCheck(List refundModeParams, List refundableInfos) { - if (CollUtil.isEmpty(refundModeParams)) { - throw new PayFailureException("传入的退款参数不合法"); - } - Map payModeMap = refundableInfos.stream() - .collect(Collectors.toMap(RefundableInfo::getPayChannel, Function.identity())); - for (RefundModeParam refundPayMode : refundModeParams) { - this.payModeCheck(refundPayMode, payModeMap.get(refundPayMode.getPayChannel())); - } - } - - /** - * 支付方式检查 - * @param refundModeParam 退款参数 - * @param refundableInfo 可退款对象 - */ - public void payModeCheck(RefundModeParam refundModeParam, RefundableInfo refundableInfo) { - if (Objects.isNull(refundableInfo)) { - throw new PayFailureException("退款参数非法"); - } - // 退款金额为负数的 - if (BigDecimalUtil.compareTo(refundModeParam.getAmount(), BigDecimal.ZERO) < 1) { - throw new PayAmountAbnormalException(); - } - // 退款金额大于可退款金额 - if (BigDecimalUtil.compareTo(refundModeParam.getAmount(), refundableInfo.getAmount()) == 1) { - throw new PayAmountAbnormalException("退款金额大于可退款金额"); - } - - } - - /** - * 保存退款记录 成不成功都记录 - */ - @Transactional(propagation = Propagation.REQUIRES_NEW) - public void saveRefund(Payment payment, BigDecimal amount, List refundModeParams) { - List refundableInfos = refundModeParams.stream() - .map(RefundModeParam::toRefundableInfo) - .collect(Collectors.toList()); - HttpServletRequest request = WebServletUtil.getRequest(); - String ip = ServletUtil.getClientIP(request); - PayRefundRecord refundRecord = new PayRefundRecord().setRefundRequestNo(AsyncRefundLocal.get()) - .setRefundableInfo(refundableInfos) - .setAmount(amount) - .setRefundableBalance(payment.getRefundableBalance()) - .setClientIp(ip) - .setPaymentId(payment.getId()) - .setBusinessId(payment.getBusinessId()) - .setUserId(SecurityUtil.getUserIdOrDefaultId()) - .setRefundTime(LocalDateTime.now()) - .setTitle(payment.getTitle()) - .setErrorMsg(AsyncRefundLocal.getErrorMsg()) - .setErrorCode(AsyncRefundLocal.getErrorCode()) - .setRefundStatus(Objects.isNull(AsyncRefundLocal.getErrorCode()) ? PayStatusCode.REFUND_PROCESS_SUCCESS - : PayStatusCode.REFUND_PROCESS_FAIL); - refundRecordManager.save(refundRecord); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/AliPayRefundStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/AliPayRefundStrategy.java deleted file mode 100644 index 00864ce8..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/AliPayRefundStrategy.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.strategy; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPayCancelService; -import cn.bootx.platform.daxpay.core.channel.alipay.service.AliPaymentService; -import cn.bootx.platform.daxpay.core.channel.alipay.service.AlipayConfigService; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.core.refund.func.AbsPayRefundStrategy; -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 AliPayRefundStrategy extends AbsPayRefundStrategy { - - private final AlipayConfigService alipayConfigService; - private final AliPaymentService aliPaymentService; - private final AliPayCancelService aliPayCancelService; - private final PaymentService paymentService; - - /** - * 策略标识 - * - * @see PayChannelEnum - */ - @Override - public PayChannelEnum getType() { - return PayChannelEnum.ALI; - } - - - /** - * 退款前前操作 - */ - @Override - public void doBeforeRefundHandler() { - alipayConfigService.initApiConfigByMchAppCode(this.getPayment().getMchAppCode()); - } - - /** - * 退款 - */ - @Override - public void doRefundHandler() { - aliPayCancelService.refund(this.getPayment(), this.getRefundModeParam().getAmount()); - aliPaymentService.updatePayRefund(this.getPayment().getId(), this.getRefundModeParam().getAmount()); - paymentService.updateRefundSuccess(this.getPayment(), this.getRefundModeParam().getAmount(), PayChannelEnum.ALI); - } - - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/CashPayRefundStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/CashPayRefundStrategy.java deleted file mode 100644 index 7ff58e2e..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/CashPayRefundStrategy.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.strategy; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.channel.cash.service.CashService; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.core.refund.func.AbsPayRefundStrategy; -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/5 - */ -@Scope(SCOPE_PROTOTYPE) -@Component -@RequiredArgsConstructor -public class CashPayRefundStrategy extends AbsPayRefundStrategy { - - private final CashService cashService; - private final PaymentService paymentService; - - /** - * 策略标识 - * - * @see PayChannelEnum - */ - @Override - public PayChannelEnum getType() { - return PayChannelEnum.CASH; - } - - /** - * 退款 - */ - @Override - public void doRefundHandler() { - cashService.refund(this.getPayment().getId(), this.getRefundModeParam().getAmount()); - paymentService.updateRefundSuccess(this.getPayment(), this.getRefundModeParam().getAmount(), PayChannelEnum.CASH); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/UnionPayRefundStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/UnionPayRefundStrategy.java deleted file mode 100644 index 142ff8f7..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/UnionPayRefundStrategy.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.strategy; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.refund.func.AbsPayRefundStrategy; -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/5 - */ -@Scope(SCOPE_PROTOTYPE) -@Component -@RequiredArgsConstructor -public class UnionPayRefundStrategy extends AbsPayRefundStrategy { - /** - * 策略标识 - * - * @see PayChannelEnum - */ - @Override - public PayChannelEnum getType() { - return PayChannelEnum.UNION_PAY; - } - - /** - * 退款 - */ - @Override - public void doRefundHandler() { - - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/VoucherPayRefundStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/VoucherPayRefundStrategy.java deleted file mode 100644 index 3da002e0..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/VoucherPayRefundStrategy.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.strategy; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.channel.voucher.service.VoucherPayService; -import cn.bootx.platform.daxpay.core.channel.voucher.service.VoucherPaymentService; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.core.refund.func.AbsPayRefundStrategy; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherRefundParam; -import cn.bootx.platform.daxpay.param.refund.RefundModeParam; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -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/5 - */ -@Scope(SCOPE_PROTOTYPE) -@Component -@RequiredArgsConstructor -public class VoucherPayRefundStrategy extends AbsPayRefundStrategy { - private final VoucherPayService voucherPayService; - private final VoucherPaymentService voucherPaymentService; - private final PaymentService paymentService; - - private VoucherRefundParam voucherRefundParam; - - /** - * 策略标识 - * - * @see PayChannelEnum - */ - @Override - public PayChannelEnum getType() { - return PayChannelEnum.VOUCHER; - } - - /** - * 退款前对处理 - */ - @Override - public void doBeforeRefundHandler() { - RefundModeParam refundModeParam = this.getRefundModeParam(); - this.voucherRefundParam = new VoucherRefundParam(); - if (StrUtil.isNotBlank(refundModeParam.getExtraParamsJson())){ - this.voucherRefundParam = JSONUtil.toBean(refundModeParam.getExtraParamsJson(), VoucherRefundParam.class); - } - } - - /** - * 退款 - */ - @Override - public void doRefundHandler() { - voucherPayService.refund(this.getPayment().getId(), this.getRefundModeParam().getAmount(),voucherRefundParam); - voucherPaymentService.updateRefund(this.getPayment().getId(), this.getRefundModeParam().getAmount()); - paymentService.updateRefundSuccess(this.getPayment(), this.getRefundModeParam().getAmount(), - PayChannelEnum.VOUCHER); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/WalletPayRefundStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/WalletPayRefundStrategy.java deleted file mode 100644 index 8a87942d..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/WalletPayRefundStrategy.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.strategy; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletPayService; -import cn.bootx.platform.daxpay.core.channel.wallet.service.WalletPaymentService; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.core.refund.func.AbsPayRefundStrategy; -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/5 - */ -@Scope(SCOPE_PROTOTYPE) -@Component -@RequiredArgsConstructor -public class WalletPayRefundStrategy extends AbsPayRefundStrategy { - private final WalletPayService walletPayService; - private final WalletPaymentService walletPaymentService; - private final PaymentService paymentService; - /** - * 策略标识 - * - * @see PayChannelEnum - */ - @Override - public PayChannelEnum getType() { - return PayChannelEnum.WALLET; - } - - /** - * 退款 - */ - @Override - public void doRefundHandler() { - walletPayService.refund(this.getPayment().getId(), this.getRefundModeParam().getAmount()); - walletPaymentService.updateRefund(this.getPayment().getId(), this.getRefundModeParam().getAmount()); - paymentService.updateRefundSuccess(this.getPayment(), this.getRefundModeParam().getAmount(), PayChannelEnum.WALLET); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/WeChatPayRefundStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/WeChatPayRefundStrategy.java deleted file mode 100644 index 57ce0bc7..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/refund/strategy/WeChatPayRefundStrategy.java +++ /dev/null @@ -1,66 +0,0 @@ -package cn.bootx.platform.daxpay.core.refund.strategy; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.channel.wechat.dao.WeChatPayConfigManager; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.bootx.platform.daxpay.core.channel.wechat.service.WeChatPayCancelService; -import cn.bootx.platform.daxpay.core.channel.wechat.service.WeChatPaymentService; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.core.refund.func.AbsPayRefundStrategy; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -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/5 - */ -@Scope(SCOPE_PROTOTYPE) -@Component -@RequiredArgsConstructor -public class WeChatPayRefundStrategy extends AbsPayRefundStrategy { - - private final WeChatPayConfigManager weChatPayConfigManager; - - private final WeChatPayCancelService weChatPayCancelService; - private final WeChatPaymentService weChatPaymentService; - private final PaymentService paymentService; - - - private WeChatPayConfig weChatPayConfig; - - /** - * 策略标识 - * - * @see PayChannelEnum - */ - @Override - public PayChannelEnum getType() { - return PayChannelEnum.WECHAT; - } - - /** - * 退款前对处理, 初始化微信支付配置 - */ - @Override - public void doBeforeRefundHandler() { - this.weChatPayConfig = weChatPayConfigManager.findByMchAppCode(this.getPayment().getMchAppCode()) - .orElseThrow(() -> new PayFailureException("支付配置不存在")); - } - - /** - * 退款 - */ - @Override - public void doRefundHandler() { - weChatPayCancelService.refund(this.getPayment(), this.getRefundModeParam().getAmount(), this.weChatPayConfig); - weChatPaymentService.updatePayRefund(this.getPayment().getId(), this.getRefundModeParam().getAmount()); - paymentService.updateRefundSuccess(this.getPayment(), this.getRefundModeParam().getAmount(), PayChannelEnum.WECHAT); - - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/factory/PaySyncStrategyFactory.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/factory/PaySyncStrategyFactory.java deleted file mode 100644 index 755fb48c..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/factory/PaySyncStrategyFactory.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.bootx.platform.daxpay.core.sync.factory; - - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.core.sync.func.AbsPaySyncStrategy; -import cn.bootx.platform.daxpay.core.sync.strategy.AliPaySyncStrategy; -import cn.bootx.platform.daxpay.core.sync.strategy.WeChatPaySyncStrategy; -import cn.bootx.platform.daxpay.exception.payment.PayUnsupportedMethodException; -import cn.hutool.extra.spring.SpringUtil; - -/** - * 支付同步策略工厂类 - * @author xxm - * @since 2023/7/14 - */ -public class PaySyncStrategyFactory { - /** - * 获取支付同步策略 - * @param payChannelCode - * @return - */ - public static AbsPaySyncStrategy create(String payChannelCode) { - AbsPaySyncStrategy strategy; - PayChannelEnum channelEnum = PayChannelEnum.findByCode(payChannelCode); - switch (channelEnum) { - case ALI: - strategy = SpringUtil.getBean(AliPaySyncStrategy.class); - break; - case WECHAT: - strategy = SpringUtil.getBean(WeChatPaySyncStrategy.class); - break; - default: - throw new PayUnsupportedMethodException(); - } - // noinspection ConstantConditions - return strategy; - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/func/AbsPaySyncStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/func/AbsPaySyncStrategy.java deleted file mode 100644 index 10764ecd..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/func/AbsPaySyncStrategy.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.bootx.platform.daxpay.core.sync.func; - -import cn.bootx.platform.daxpay.code.pay.PaySyncStatus; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.sync.result.PaySyncResult; -import lombok.Getter; -import lombok.Setter; - -/** - * 支付同步抽象类 - * @author xxm - * @since 2023/7/14 - */ -@Getter -@Setter -public abstract class AbsPaySyncStrategy { - - /** 支付对象 */ - private Payment payment = null; - - /** - * 初始化支付的参数 - */ - public void initPayParam(Payment payment) { - this.payment = payment; - } - - - /** - * 异步支付单与支付网关进行状态比对 - * @see PaySyncStatus - */ - public abstract PaySyncResult doSyncPayStatusHandler(); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/convert/PaySyncRecordConvert.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/convert/PaySyncRecordConvert.java deleted file mode 100644 index 94c96b17..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/convert/PaySyncRecordConvert.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bootx.platform.daxpay.core.sync.record.convert; - -import cn.bootx.platform.daxpay.core.sync.record.entity.PaySyncRecord; -import cn.bootx.platform.daxpay.dto.sync.PaySyncRecordDto; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * 支付同步记录同步 - * @author xxm - * @since 2023/7/14 - */ -@Mapper -public interface PaySyncRecordConvert { - PaySyncRecordConvert CONVERT = Mappers.getMapper(PaySyncRecordConvert.class); - - PaySyncRecordDto convert(PaySyncRecord in); - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/dao/PaySyncRecordManager.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/dao/PaySyncRecordManager.java deleted file mode 100644 index e6b3bc8b..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/dao/PaySyncRecordManager.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.bootx.platform.daxpay.core.sync.record.dao; - -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.base.MpIdEntity; -import cn.bootx.platform.common.mybatisplus.impl.BaseManager; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.sync.record.entity.PaySyncRecord; -import cn.bootx.platform.daxpay.dto.sync.PaySyncRecordDto; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.Objects; - -/** - * - * @author xxm - * @since 2023/7/14 - */ -@Slf4j -@Repository -@RequiredArgsConstructor -public class PaySyncRecordManager extends BaseManager { - - public Page page(PageParam pageParam, PaySyncRecordDto param) { - Page mpPage = MpUtil.getMpPage(pageParam, PaySyncRecord.class); - return lambdaQuery().orderByDesc(MpIdEntity::getId) - .like(Objects.nonNull(param.getPaymentId()), PaySyncRecord::getPaymentId, param.getPaymentId()) - .eq(Objects.nonNull(param.getPayChannel()), PaySyncRecord::getPayChannel, param.getPayChannel()) - .eq(Objects.nonNull(param.getStatus()), PaySyncRecord::getStatus, param.getStatus()) - .page(mpPage); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/dao/PaySyncRecordMapper.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/dao/PaySyncRecordMapper.java deleted file mode 100644 index 60fc9f96..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/dao/PaySyncRecordMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.daxpay.core.sync.record.dao; - -import cn.bootx.platform.daxpay.core.sync.record.entity.PaySyncRecord; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 支付同步记录 - * @author xxm - * @since 2023/7/14 - */ -@Mapper -public interface PaySyncRecordMapper extends BaseMapper { -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/entity/PaySyncRecord.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/entity/PaySyncRecord.java deleted file mode 100644 index 3cb76bda..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/entity/PaySyncRecord.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.bootx.platform.daxpay.core.sync.record.entity; - -import cn.bootx.platform.common.core.function.EntityBaseFunction; -import cn.bootx.platform.common.mybatisplus.base.MpCreateEntity; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PaySyncStatus; -import cn.bootx.platform.daxpay.core.sync.record.convert.PaySyncRecordConvert; -import cn.bootx.platform.daxpay.dto.sync.PaySyncRecordDto; -import cn.bootx.table.modify.annotation.DbComment; -import cn.bootx.table.modify.mysql.annotation.DbMySqlFieldType; -import cn.bootx.table.modify.mysql.constants.MySqlFieldTypeEnum; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - * 支付同步记录 - * @author xxm - * @since 2023/7/14 - */ -@EqualsAndHashCode(callSuper = true) -@Data -//@DbTable(comment = "支付同步记录") -@Accessors(chain = true) -@TableName("pay_sync_record") -public class PaySyncRecord extends MpCreateEntity implements EntityBaseFunction { - - /** 支付记录id */ - @DbComment("支付记录id") - private Long paymentId; - - /** 商户编码 */ - @DbComment("商户编码") - private String mchCode; - - /** 商户应用编码 */ - @DbComment("商户应用编码") - private String mchAppCode; - - /** - * 支付渠道 - * @see PayChannelEnum#getCode() - */ - @DbComment("支付渠道") - private String payChannel; - - /** 通知消息 */ - @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) - @DbComment("通知消息") - private String syncInfo; - - /** - * 同步状态 - * @see PaySyncStatus#WAIT_BUYER_PAY - */ - @DbComment("同步状态") - private String status; - - @DbComment("错误消息") - private String msg; - - /** 同步时间 */ - @DbComment("同步时间") - private LocalDateTime syncTime; - - /** - * 转换 - */ - @Override - public PaySyncRecordDto toDto() { - return PaySyncRecordConvert.CONVERT.convert(this); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/service/PaySyncRecordService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/service/PaySyncRecordService.java deleted file mode 100644 index 3d00fa2b..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/record/service/PaySyncRecordService.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.bootx.platform.daxpay.core.sync.record.service; - -import cn.bootx.platform.common.core.exception.DataNotExistException; -import cn.bootx.platform.common.core.rest.PageResult; -import cn.bootx.platform.common.core.rest.param.PageParam; -import cn.bootx.platform.common.mybatisplus.util.MpUtil; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.sync.record.dao.PaySyncRecordManager; -import cn.bootx.platform.daxpay.core.sync.record.entity.PaySyncRecord; -import cn.bootx.platform.daxpay.core.sync.result.PaySyncResult; -import cn.bootx.platform.daxpay.dto.sync.PaySyncRecordDto; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -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.time.LocalDateTime; - -/** - * 支付同步记录 - * @author xxm - * @since 2023/7/14 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PaySyncRecordService { - private final PaySyncRecordManager syncRecordManager; - - /** - * 记录同步记录 - */ - @Transactional(propagation= Propagation.REQUIRES_NEW) - public void saveRecord(PaySyncResult paySyncResult, Payment payment){ - PaySyncRecord paySyncRecord = new PaySyncRecord() - .setPaymentId(payment.getId()) - .setMchCode(payment.getMchCode()) - .setMchAppCode(payment.getMchAppCode()) - .setPayChannel(payment.getAsyncPayChannel()) - .setSyncInfo(paySyncResult.getJson()) - .setStatus(paySyncResult.getPaySyncStatus()) - .setMsg(paySyncResult.getMsg()) - .setSyncTime(LocalDateTime.now()); - syncRecordManager.save(paySyncRecord); - } - - /** - * 分页查询 - */ - public PageResult page(PageParam pageParam, PaySyncRecordDto param) { - Page page = syncRecordManager.page(pageParam, param); - return MpUtil.convert2DtoPageResult(page); - } - - /** - * 根据id查询 - */ - public PaySyncRecordDto findById(Long id) { - return syncRecordManager.findById(id).map(PaySyncRecord::toDto).orElseThrow(DataNotExistException::new); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/result/PaySyncResult.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/result/PaySyncResult.java deleted file mode 100644 index 1c1fb42e..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/result/PaySyncResult.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.bootx.platform.daxpay.core.sync.result; - -import cn.bootx.platform.daxpay.code.pay.PaySyncStatus; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.Map; - -import static cn.bootx.platform.daxpay.code.pay.PaySyncStatus.NOT_SYNC; - -/** - * 支付网关通知状态对象 - * - * @author xxm - * @since 2021/4/21 - */ -@Data -@Accessors(chain = true) -public class PaySyncResult { - - /** - * 支付网关同步状态 - * @see PaySyncStatus#NOT_SYNC - */ - private String paySyncStatus = NOT_SYNC; - - /** 网关返回参数(会被用到的参数) */ - private Map map; - - /** 网关返回对象的json字符串 */ - private String json; - - /** 错误提示 */ - private String msg; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/service/PayExpiredTimeService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/service/PayExpiredTimeService.java deleted file mode 100644 index b1eb4948..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/service/PayExpiredTimeService.java +++ /dev/null @@ -1,174 +0,0 @@ -package cn.bootx.platform.daxpay.core.sync.service; - -import cn.bootx.platform.daxpay.core.pay.builder.PayEventBuilder; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayStrategy; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.core.sync.result.PaySyncResult; -import cn.bootx.platform.daxpay.event.PayEventSender; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -import static cn.bootx.platform.daxpay.code.pay.PayStatusCode.*; - -/** - * 支付超时处理 - * - * @author xxm - * @since 2022/7/13 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayExpiredTimeService { - - private final PaymentService paymentService; - - private final PayEventSender eventSender; - - /** - * 支付单超时支付单处理 - */ - @Async("bigExecutor") - @Transactional(rollbackFor = Exception.class) - public void expiredTime(Long paymentId) { - -// Payment payment = paymentService.findById(paymentId).orElseThrow(() -> new PayFailureException("支付单未找到")); -// // 只处理支付中 -// if (!Objects.equals(payment.getPayStatus(), TRADE_PROGRESS)) { -// return; -// } -// // 获取支付网关状态 -// PayParam payParam = PaymentBuilder.buildPayParamByPayment(payment); -// // 1.获取支付方式,通过工厂生成对应的策略组 -// List paymentStrategyList = PayStrategyFactory.create(payParam.getPayWayList()); -// if (CollUtil.isEmpty(paymentStrategyList)) { -// throw new PayUnsupportedMethodException(); -// } -// -// // 2.初始化支付的参数 -// for (AbsPayStrategy paymentStrategy : paymentStrategyList) { -// paymentStrategy.initPayParam(payment, payParam); -// } -// -// // 3 拿到异步支付方法, 与支付网关进行同步 -// PayWayParam asyncPayMode = PayWayUtil.getAsyncPayModeParam(payParam); -// AbsPayStrategy syncPayStrategy = PayStrategyFactory.create(asyncPayMode); -// syncPayStrategy.initPayParam(payment, payParam); -// PaySyncResult paySyncResult = syncPayStrategy.doSyncPayStatusHandler(); -// -// // 4 对返回的支付网关各种状态进行处理 -// String paySyncStatus = paySyncResult.getPaySyncStatus(); -// switch (paySyncStatus) { -// // 成功状态 -// case PaySyncStatus.TRADE_SUCCESS: { -// this.paySuccess(payment, syncPayStrategy, paySyncResult); -// break; -// } -// // 待付款/ 支付中 -// case PaySyncStatus.WAIT_BUYER_PAY: { -// this.payCancel(payment, paymentStrategyList); -// break; -// } -// // 超时关闭 和 网关没找到记录 -// case PaySyncStatus.TRADE_CLOSED: -// case PaySyncStatus.NOT_FOUND: { -// this.payClose(payment, paymentStrategyList); -// break; -// } -// // 交易退款 -// case PaySyncStatus.TRADE_REFUND: { -// log.info("交易退款不需要关闭: {}", payment.getId()); -// break; -// } -// // 调用出错 进行重试 -// case PaySyncStatus.FAIL: { -// log.warn("支付状态同步接口调用出错"); -// } -// case PaySyncStatus.NOT_SYNC: -// default: { -// log.error("支付超时代码有问题"); -// } -// } - } - - /** - * 如果支付网关是支付中状态, 关闭网关支付, 然后再关闭本地支付单, 排除退款 - */ - private void payCancel(Payment payment, List payStrategies) { - try { - // 异常情况, 不继续进行处理 - if (!this.check(payment)) { - return; - } - // 撤销和关闭支付单 - payStrategies.forEach(AbsPayStrategy::doCancelHandler); - payment.setPayStatus(TRADE_CANCEL); - paymentService.updateById(payment); - // 发送事件 - eventSender.sendPayCancel(PayEventBuilder.buildPayCancel(payment)); - } - catch (Exception e) { - log.warn("支付状态同步后关闭支付单报错了", e); - } - } - - /** - * 如果支付网关是关闭或未找到, 关闭本地支付单 - */ - private void payClose(Payment payment, List absPayStrategies) { - try { - // 已关闭的不再进行关闭 - if (Objects.equals(payment.getPayStatus(), TRADE_CANCEL)) { - return; - } - // 退款状态则不进行更新 - if (Objects.equals(payment.getPayStatus(), TRADE_REFUNDED) - || Objects.equals(payment.getPayStatus(), TRADE_REFUNDING)) { - return; - } - // 异常情况, 不继续进行处理 - if (!this.check(payment)) { - return; - } - // 关闭支付单 - absPayStrategies.forEach(AbsPayStrategy::doCloseHandler); - payment.setPayStatus(TRADE_CANCEL); - paymentService.updateById(payment); - // 发送事件 - eventSender.sendPayCancel(PayEventBuilder.buildPayCancel(payment)); - } - catch (Exception e) { - log.warn("支付状态同步后关闭支付单报错了", e); - } - } - - /** - * 如果是支付网关是支付完成状态, 记录为异常支付单 - */ - private void paySuccess(Payment payment, AbsPayStrategy syncPayStrategy, PaySyncResult paySyncResult) { - // 修改payment支付状态为成功 - log.error("支付网关支付单已被支付, 需要线下处理: {}", payment.getId()); - } - - /** - * 校验状态, 处理在发起撤销与正式处理之间订单被完成的情况. 理论上不会发生 - */ - private boolean check(Payment payment) { - // 支付失败/撤销/退款不需要处理 - List trades = Arrays.asList(TRADE_FAIL, TRADE_CANCEL, TRADE_REFUNDING, TRADE_REFUNDED); - if (trades.contains(payment.getPayStatus())) { - log.info("订单在超时撤销期间发生了操作, 需要人工介入处理"); - return false; - } - return true; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/service/PaySyncService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/service/PaySyncService.java deleted file mode 100644 index 840f947d..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/service/PaySyncService.java +++ /dev/null @@ -1,202 +0,0 @@ -package cn.bootx.platform.daxpay.core.sync.service; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.daxpay.code.pay.PaySyncStatus; -import cn.bootx.platform.daxpay.core.pay.builder.PayEventBuilder; -import cn.bootx.platform.daxpay.core.pay.builder.PaymentBuilder; -import cn.bootx.platform.daxpay.core.pay.factory.PayStrategyFactory; -import cn.bootx.platform.daxpay.core.pay.func.AbsPayStrategy; -import cn.bootx.platform.daxpay.core.payment.entity.Payment; -import cn.bootx.platform.daxpay.core.payment.service.PaymentService; -import cn.bootx.platform.daxpay.core.sync.factory.PaySyncStrategyFactory; -import cn.bootx.platform.daxpay.core.sync.func.AbsPaySyncStrategy; -import cn.bootx.platform.daxpay.core.sync.record.service.PaySyncRecordService; -import cn.bootx.platform.daxpay.core.sync.result.PaySyncResult; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.exception.payment.PayUnsupportedMethodException; -import cn.bootx.platform.daxpay.event.PayEventSender; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.bootx.platform.daxpay.util.PayWayUtil; -import cn.hutool.core.collection.CollUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; - -import static cn.bootx.platform.daxpay.code.pay.PayStatusCode.*; - -/** - * 未完成的异步支付单与支付网关进行对比 - * - * @author xxm - * @since 2021/4/21 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PaySyncService { - - private final PaymentService paymentService; - - private final PaySyncRecordService paySyncRecordService; - - private final PayEventSender eventSender; - - /** - * 同步订单的支付状态 - */ - public void syncByPaymentId(Long id) { - Payment payment = paymentService.findById(id).orElse(null); - if (Objects.isNull(payment)) { - return; - } - this.syncPayment(payment); - } - - /** - * 同步订单的支付状态 - */ - public void syncByBusinessId(String businessId) { - Payment payment = paymentService.findByBusinessId(businessId).orElse(null); - if (Objects.isNull(payment)) { - return; - } - this.syncPayment(payment); - } - - /** - * 同步支付状态 传入 payment 对象 - */ - public void syncPayment(Payment payment) { - // 获取同步策略类 - AbsPaySyncStrategy syncPayStrategy = PaySyncStrategyFactory.create(payment.getAsyncPayChannel()); - syncPayStrategy.initPayParam(payment); - // 同步 - PaySyncResult paySyncResult = syncPayStrategy.doSyncPayStatusHandler(); - // 记录 - paySyncRecordService.saveRecord(paySyncResult,payment); - // 处理 - this.resultHandler(paySyncResult,payment); - } - - /** - * 对同步结果进行处理 - */ - public void resultHandler(PaySyncResult paySyncResult, Payment payment){ - String paySyncStatus = paySyncResult.getPaySyncStatus(); - PayParam payParam = PaymentBuilder.buildPayParamByPayment(payment); - // 获取支付方式,通过工厂生成对应的策略组 - List paymentStrategyList = PayStrategyFactory.create(payParam.getPayWayList()); - if (CollUtil.isEmpty(paymentStrategyList)) { - throw new PayUnsupportedMethodException(); - } - - // 初始化支付的参数 - for (AbsPayStrategy paymentStrategy : paymentStrategyList) { - paymentStrategy.initPayParam(payment, payParam); - } - - // 拿到对应的支付方式 - PayWayParam asyncPayMode = PayWayUtil.getAsyncPayModeParam(payParam); - AbsPayStrategy syncPayStrategy = PayStrategyFactory.create(asyncPayMode); - - // 对同步结果处理 - switch (paySyncStatus) { - // 支付成功 支付宝退款时也是支付成功状态, 除非支付完成 - case PaySyncStatus.TRADE_SUCCESS: { - this.paymentSuccess(payment, syncPayStrategy, paySyncResult); - break; - } - // 待付款/ 支付中 - case PaySyncStatus.WAIT_BUYER_PAY: { - log.info("依然是付款状态"); - break; - } - // 订单已经关闭超时关闭 和 网关没找到记录, 支付宝退款完成也是这个状态 - case PaySyncStatus.TRADE_CLOSED: - case PaySyncStatus.NOT_FOUND: { - // 判断下是否超时, 同时payment 变更为取消支付 - this.paymentCancel(payment, paymentStrategyList); - break; - } - // 交易退款 支付宝没这个状态 - case PaySyncStatus.TRADE_REFUND: { - this.paymentRefund(payment, syncPayStrategy, paySyncResult); - break; - } - // 调用出错 - case PaySyncStatus.FAIL: { - // 不进行处理 - log.warn("支付状态同步接口调用出错"); - break; - } - case PaySyncStatus.NOT_SYNC: - default: { - throw new BizException("代码有问题"); - } - } - } - - /** - * payment 变更为已支付 - */ - private void paymentSuccess(Payment payment, AbsPayStrategy syncPayStrategy, PaySyncResult paySyncResult) { - - // 已支付不在重复处理 - if (Objects.equals(payment.getPayStatus(), TRADE_SUCCESS)) { - return; - } - // 退款的不处理 - if (Objects.equals(payment.getPayStatus(), TRADE_REFUNDED) - || Objects.equals(payment.getPayStatus(), TRADE_REFUNDING)) { - return; - } - // 修改payment支付状态为成功 - syncPayStrategy.doAsyncSuccessHandler(paySyncResult.getMap()); - payment.setPayStatus(TRADE_SUCCESS); - payment.setPayTime(LocalDateTime.now()); - paymentService.updateById(payment); - - // 发送成功事件 - eventSender.sendPayComplete(PayEventBuilder.buildPayComplete(payment)); - } - - /** - * payment 变更为取消支付 - */ - private void paymentCancel(Payment payment, List absPayStrategies) { - try { - // 已关闭的不再进行关闭 - if (Objects.equals(payment.getPayStatus(), TRADE_CANCEL)) { - return; - } - // 修改payment支付状态为取消, 退款状态则不进行更新 - if (Objects.equals(payment.getPayStatus(), TRADE_REFUNDED) - || Objects.equals(payment.getPayStatus(), TRADE_REFUNDING)) { - return; - } - payment.setPayStatus(TRADE_CANCEL); - // 执行策略的关闭方法 - absPayStrategies.forEach(AbsPayStrategy::doCloseHandler); - paymentService.updateById(payment); - // 发送事件 - eventSender.sendPayCancel(PayEventBuilder.buildPayCancel(payment)); - } - catch (Exception e) { - log.warn("支付状态同步后关闭支付单报错了", e); - throw new PayFailureException("支付状态同步后关闭支付单报错了"); - } - } - - /** - * payment 退款处理 TODO 需要考虑退款详情的合并处理 - */ - private void paymentRefund(Payment payment, AbsPayStrategy syncPayStrategy, PaySyncResult paySyncResult) { - - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/strategy/AliPaySyncStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/strategy/AliPaySyncStrategy.java deleted file mode 100644 index 46756a3b..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/strategy/AliPaySyncStrategy.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.bootx.platform.daxpay.core.sync.strategy; - - -import cn.bootx.platform.daxpay.core.channel.alipay.dao.AlipayConfigManager; -import cn.bootx.platform.daxpay.core.channel.alipay.entity.AlipayConfig; -import cn.bootx.platform.daxpay.core.channel.alipay.service.AlipayConfigService; -import cn.bootx.platform.daxpay.core.channel.alipay.service.AlipaySyncService; -import cn.bootx.platform.daxpay.core.sync.func.AbsPaySyncStrategy; -import cn.bootx.platform.daxpay.core.sync.result.PaySyncResult; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -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 AliPaySyncStrategy extends AbsPaySyncStrategy { - - private final AlipayConfigManager alipayConfigManager; - - private final AlipaySyncService alipaySyncService; - - private final AlipayConfigService alipayConfigService; - - private AlipayConfig alipayConfig; - - /** - * 异步支付单与支付网关进行状态比对 - */ - @Override - public PaySyncResult doSyncPayStatusHandler() { - this.initAlipayConfig(this.getPayment().getMchAppCode()); - return alipaySyncService.syncPayStatus(this.getPayment()); - } - - /** - * 初始化支付宝配置信息 - */ - private void initAlipayConfig(String mchAppCode) { - // 检查并获取支付宝支付配置 - this.alipayConfig = alipayConfigManager.findByMchAppCode(mchAppCode) - .orElseThrow(() -> new PayFailureException("支付配置不存在")); - alipayConfigService.initApiConfig(this.alipayConfig); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/strategy/WeChatPaySyncStrategy.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/strategy/WeChatPaySyncStrategy.java deleted file mode 100644 index 08735d73..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/sync/strategy/WeChatPaySyncStrategy.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.bootx.platform.daxpay.core.sync.strategy; - -import cn.bootx.platform.daxpay.core.channel.wechat.dao.WeChatPayConfigManager; -import cn.bootx.platform.daxpay.core.channel.wechat.entity.WeChatPayConfig; -import cn.bootx.platform.daxpay.core.channel.wechat.service.WeChatPaySyncService; -import cn.bootx.platform.daxpay.core.sync.func.AbsPaySyncStrategy; -import cn.bootx.platform.daxpay.core.sync.result.PaySyncResult; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -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 WeChatPaySyncStrategy extends AbsPaySyncStrategy { - - private final WeChatPayConfigManager weChatPayConfigManager; - - private final WeChatPaySyncService weChatPaySyncService; - - private WeChatPayConfig weChatPayConfig; - - /** - * 异步支付单与支付网关进行状态比对 - */ - @Override - public PaySyncResult doSyncPayStatusHandler() { - // 检查并获取微信支付配置 - this.initWeChatPayConfig(this.getPayment().getMchAppCode()); - return weChatPaySyncService.syncPayStatus(this.getPayment().getId(), this.weChatPayConfig); - } - - /** - * 初始化微信支付 - */ - private void initWeChatPayConfig(String appCode) { - // 检查并获取微信支付配置 - this.weChatPayConfig = weChatPayConfigManager.findByMchAppCode(appCode) - .orElseThrow(() -> new PayFailureException("支付配置不存在")); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/alipay/AliPaymentDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/alipay/AliPaymentDto.java deleted file mode 100644 index 1ce82d89..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/alipay/AliPaymentDto.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.alipay; - -import cn.bootx.platform.daxpay.dto.payment.BasePaymentDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * @author xxm - * @since 2021/2/27 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "支付宝支付记录") -public class AliPaymentDto extends BasePaymentDto implements Serializable { - - private static final long serialVersionUID = 6883103229754466130L; - - @Schema(description = "支付宝交易号") - private String tradeNo; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/alipay/AlipayConfigDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/alipay/AlipayConfigDto.java deleted file mode 100644 index 5924206e..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/alipay/AlipayConfigDto.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.alipay; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import cn.bootx.platform.starter.data.perm.sensitive.SensitiveInfo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.List; - -/** - * @author xxm - * @since 2021/2/26 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "支付宝配置") -public class AlipayConfigDto extends BaseDto implements Serializable { - - private static final long serialVersionUID = 6641158663606363171L; - - @Schema(description = "名称") - private String name; - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - @Schema(description = "支付宝商户appId") - @SensitiveInfo - private String appId; - - @Schema(description = "服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问") - private String notifyUrl; - - @Schema(description = "页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址") - private String returnUrl; - - @Schema(description = "请求网关地址") - private String serverUrl; - - @Schema(description = "认证类型 证书/公钥") - private String authType; - - @Schema(description = "签名类型") - private String signType; - - @Schema(description = "支付宝公钥") - @SensitiveInfo(value = SensitiveInfo.SensitiveType.OTHER, front = 15) - private String alipayPublicKey; - - @Schema(description = "私钥") - @SensitiveInfo(value = SensitiveInfo.SensitiveType.OTHER, front = 15) - private String privateKey; - - @Schema(description = "应用公钥证书") - @SensitiveInfo(value = SensitiveInfo.SensitiveType.OTHER, front = 15) - private String appCert; - - @Schema(description = "支付宝公钥证书文件") - @SensitiveInfo(value = SensitiveInfo.SensitiveType.OTHER, front = 15) - private String alipayCert; - - @Schema(description = "支付宝CA根证书文件") - @SensitiveInfo(value = SensitiveInfo.SensitiveType.OTHER, front = 15) - private String alipayRootCert; - - @Schema(description = "超时配置") - private Integer expireTime; - - @Schema(description = "可用支付方式") - private List payWayList; - - @Schema(description = "是否沙箱环境") - private boolean sandbox; - - @Schema(description = "是否启用") - private Boolean activity; - - @Schema(description = "状态") - private String state; - - @Schema(description = "备注") - private String remark; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/config/PayChannelConfigDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/config/PayChannelConfigDto.java deleted file mode 100644 index 2f4e1fd7..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/config/PayChannelConfigDto.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.config; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 支付渠道配置 - * - * @author xxm - * @since 2023-05-24 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(title = "支付渠道配置") -@Accessors(chain = true) -public class PayChannelConfigDto extends BaseDto { - - @Schema(description = "渠道编码") - private String code; - - @Schema(description = "渠道名称") - private String name; - - @Schema(description = "图片") - private Long image; - - @Schema(description = "排序") - private Double sortNo; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/union/UnionPayConfigDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/union/UnionPayConfigDto.java deleted file mode 100644 index cb01c084..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/union/UnionPayConfigDto.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.union; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * @author xxm - * @since 2022/3/11 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "云闪付配置") -public class UnionPayConfigDto extends BaseDto { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/voucher/VoucherDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/voucher/VoucherDto.java deleted file mode 100644 index 727e8f50..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/voucher/VoucherDto.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.voucher; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import cn.bootx.platform.daxpay.code.paymodel.VoucherCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * @author xxm - * @since 2022/3/14 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "储值卡") -public class VoucherDto extends BaseDto { - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - @Schema(description = "卡号") - private String cardNo; - - @Schema(description = "生成批次号") - private Long batchNo; - - @Schema(description = "面值") - private BigDecimal faceValue; - - @Schema(description = "余额") - private BigDecimal balance; - - @Schema(description = "是否长期有效") - private Boolean enduring; - - @Schema(description = "开始时间") - private LocalDateTime startTime; - - @Schema(description = "结束时间") - private LocalDateTime endTime; - - /** - * @see VoucherCode#STATUS_FORBIDDEN - */ - @Schema(description = "状态") - private String status; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/voucher/VoucherLogDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/voucher/VoucherLogDto.java deleted file mode 100644 index 51adc28c..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/voucher/VoucherLogDto.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.voucher; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import cn.bootx.platform.daxpay.code.paymodel.VoucherCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 储值卡日志 - * - * @author xxm - * @since 2022/3/17 - */ -@Schema(title = "储值卡日志") -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -public class VoucherLogDto extends BaseDto { - - /** 储值卡id */ - @Schema(description = "储值卡id") - private Long voucherId; - - /** 储值卡号 */ - @Schema(description = "储值卡号") - private String voucherNo; - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - /** 金额 */ - @Schema(description = "金额") - private BigDecimal amount; - - /** - * 类型 - * @see VoucherCode#LOG_PAY - */ - @Schema(description = "类型") - private String type; - - /** 交易记录ID */ - @Schema(description = "交易记录ID") - private Long paymentId; - - /** 业务ID */ - @Schema(description = "业务ID") - private String businessId; - - /** 备注 */ - @Schema(description = "备注") - private String remark; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/voucher/VoucherPaymentDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/voucher/VoucherPaymentDto.java deleted file mode 100644 index 878fd1b4..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/voucher/VoucherPaymentDto.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.voucher; - -import cn.bootx.platform.daxpay.dto.payment.BasePaymentDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * @author xxm - * @since 2022/3/14 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "储值卡支付记录") -public class VoucherPaymentDto extends BasePaymentDto { - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletConfigDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletConfigDto.java deleted file mode 100644 index 639de5d4..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletConfigDto.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.wallet; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * - * @author xxm - * @since 2023/7/20 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钱包配置") -public class WalletConfigDto extends BaseDto { - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - @Schema(description = "默认余额") - private BigDecimal defaultBalance; - - @Schema(description = "状态") - private String state; - - @Schema(description = "备注") - private String remark; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletDto.java deleted file mode 100644 index 627ba931..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletDto.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.wallet; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * @author xxm - * @since 2020/12/8 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钱包") -public class WalletDto extends BaseDto implements Serializable { - - private static final long serialVersionUID = -1563719305334334625L; - - @Schema(description = "ID,钱包的唯一标识") - private Long id; - - @Schema(description = "钱包关联的账号ID") - private Long userId; - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - @Schema(description = "钱包余额") - private BigDecimal balance; - - @Schema(description = "预冻结额度") - private BigDecimal freezeBalance; - - @Schema(description = "状态") - private String status; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletInfoDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletInfoDto.java deleted file mode 100644 index 804ad755..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletInfoDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.wallet; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 钱包综合信息 - * - * @author xxm - * @since 2022/3/13 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钱包综合信息") -public class WalletInfoDto extends WalletDto { - - @Schema(description = "钱包关联的账号名称") - private String userName; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletLogDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletLogDto.java deleted file mode 100644 index d2fa9d44..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletLogDto.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.wallet; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import cn.bootx.platform.daxpay.code.paymodel.WalletCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * @author xxm - * @since 2020/12/8 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钱包日志") -public class WalletLogDto extends BaseDto implements Serializable { - - private static final long serialVersionUID = -2553004953931903738L; - - @Schema(description = "钱包ID") - private Long walletId; - - @Schema(description = "用户ID") - private Long userId; - - /** - * @see WalletCode - */ - @Schema(description = "类型") - private String type; - - @Schema(description = "交易记录ID") - private Long paymentId; - - @Schema(description = "备注") - private String remark; - - @Schema(description = "业务ID") - private String businessId; - - /** - * @see WalletCode#OPERATION_SOURCE_SYSTEM - */ - @Schema(description = " 1 系统操作 2管理员操作 3用户操作") - private String operationSource; - - @Schema(description = "金额") - private BigDecimal amount; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletPaymentDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletPaymentDto.java deleted file mode 100644 index af23b29c..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wallet/WalletPaymentDto.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.wallet; - -import cn.bootx.platform.daxpay.dto.payment.BasePaymentDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * @author xxm - * @since 2020/12/8 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "钱包支付记录") -public class WalletPaymentDto extends BasePaymentDto implements Serializable { - - private static final long serialVersionUID = 8238920331255597223L; - - @Schema(description = "钱包ID") - private Long walletId; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wechat/WeChatPayConfigDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wechat/WeChatPayConfigDto.java deleted file mode 100644 index a8060f19..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wechat/WeChatPayConfigDto.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.wechat; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import cn.bootx.platform.daxpay.code.paymodel.WeChatPayCode; -import cn.bootx.platform.starter.data.perm.sensitive.SensitiveInfo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.List; - -/** - * @author xxm - * @since 2021/3/19 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "微信支付配置") -public class WeChatPayConfigDto extends BaseDto implements Serializable { - - @Schema(description = "名称") - private String name; - - @Schema(description = "微信商户号") - @SensitiveInfo - private String wxMchId; - - @Schema(description = "微信应用appId") - @SensitiveInfo - private String wxAppId; - - /** - * @see WeChatPayCode#API_V2 - */ - @Schema(description = "api版本") - private String apiVersion; - - @Schema(description = "商户平台「API安全」中的 APIv2 密钥") - @SensitiveInfo - private String apiKeyV2; - - @Schema(description = "商户平台「API安全」中的 APIv3 密钥") - @SensitiveInfo - private String apiKeyV3; - - @Schema(description = "APPID对应的接口密码,用于获取接口调用凭证access_token时使用") - @SensitiveInfo - private String appSecret; - - @Schema(description = "API 证书中的 p12 文件id") - @SensitiveInfo - private String p12; - - @Schema(description = "服务器异步通知页面路径 通知url必须为直接可访问的url,不能携带参数。公网域名必须为https ") - private String notifyUrl; - - @Schema(description = "页面跳转同步通知页面路径") - private String returnUrl; - - @Schema(description = "是否沙箱环境") - private boolean sandbox; - - @Schema(description = "超时时间(分钟)") - private Integer expireTime; - - @Schema(description = "可用支付方式") - private List payWayList; - - @Schema(description = "是否启用") - private Boolean activity; - - @Schema(description = "状态") - private String state; - - @Schema(description = "备注") - private String remark; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wechat/WeChatPaymentDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wechat/WeChatPaymentDto.java deleted file mode 100644 index 706dc4e6..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/channel/wechat/WeChatPaymentDto.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.daxpay.dto.channel.wechat; - -import cn.bootx.platform.daxpay.dto.payment.BasePaymentDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * @author xxm - * @since 2021/6/21 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "微信支付记录") -public class WeChatPaymentDto extends BasePaymentDto implements Serializable { - - private static final long serialVersionUID = -2400358210732595795L; - - @Schema(description = "微信交易号") - private String tradeNo; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/merchant/MchAppPayConfigResult.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/merchant/MchAppPayConfigResult.java deleted file mode 100644 index 9d84d9b6..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/merchant/MchAppPayConfigResult.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.bootx.platform.daxpay.dto.merchant; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 支付渠道配置 - * - * @author xxm - * @since 2023/5/24 - */ -@Data -@Accessors(chain = true) -@Schema(title = "支付渠道配置") -public class MchAppPayConfigResult { - - @Schema(description = "支付渠道编码") - private String channelCode; - - @Schema(description = "支付渠道名称") - private String channelName; - - @Schema(description = "状态") - private String state; - - @Schema(description = "图片") - private Long img; - - @Schema(description = "关联配置ID") - private Long configId; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/merchant/MchApplicationDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/merchant/MchApplicationDto.java deleted file mode 100644 index 095b0379..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/merchant/MchApplicationDto.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.bootx.platform.daxpay.dto.merchant; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 商户应用 - * - * @author xxm - * @since 2023-05-19 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(title = "商户应用") -@Accessors(chain = true) -public class MchApplicationDto extends BaseDto { - - @Schema(description = "应用编码") - private String code; - - @Schema(description = "名称") - private String name; - - @Schema(description = "商户号") - private String mchCode; - - @Schema(description = "状态类型") - private String state; - - @Schema(description = "备注") - private String remark; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/merchant/MerchantInfoDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/merchant/MerchantInfoDto.java deleted file mode 100644 index cdaa0ec4..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/merchant/MerchantInfoDto.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.bootx.platform.daxpay.dto.merchant; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * 商户 - * - * @author xxm - * @since 2023-05-17 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(title = "商户") -@Accessors(chain = true) -public class MerchantInfoDto extends BaseDto { - - @Schema(description = "商户号") - private String code; - - @Schema(description = "商户名称") - private String name; - - @Schema(description = "商户简称") - private String shortName; - - @Schema(description = "类型") - private String type; - - @Schema(description = "联系人姓名") - private String contactName; - - @Schema(description = "联系人手机号") - private String contactTel; - - @Schema(description = "状态类型") - private String state; - - @Schema(description = "商户备注") - private String remark; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/notify/PayNotifyRecordDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/notify/PayNotifyRecordDto.java deleted file mode 100644 index 363e621a..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/notify/PayNotifyRecordDto.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.bootx.platform.daxpay.dto.notify; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @author xxm - * @since 2021/6/22 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "支付回调记录") -public class PayNotifyRecordDto extends BaseDto implements Serializable { - - private static final long serialVersionUID = -1241346974397068912L; - - @Schema(description = "支付号") - private Long paymentId; - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - @Schema(description = "通知消息") - private String notifyInfo; - - @Schema(description = "支付渠道") - private String payChannel; - - @Schema(description = "处理状态") - private String status; - - @Schema(description = "提示信息") - private String msg; - - @Schema(description = "回调时间") - private LocalDateTime notifyTime; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/pay/AsyncPayInfo.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/pay/AsyncPayInfo.java deleted file mode 100644 index 9619b101..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/pay/AsyncPayInfo.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.daxpay.dto.pay; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * @author xxm - * @since 2021/2/28 - */ -@Data -@Accessors(chain = true) -@Schema(title = "异步支付线程信息") -public class AsyncPayInfo implements Serializable { - - private static final long serialVersionUID = 8239742916705144905L; - - /** 支付参数体(通常用于发起支付的参数) */ - private String payBody; - - /** 第三方支付平台订单号(付款码支付直接成功时会出现) */ - private String tradeNo; - - /** 是否记录超时时间,默认记录 */ - private boolean expiredTime = true; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/pay/PayResult.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/pay/PayResult.java deleted file mode 100644 index 4ca0f59f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/pay/PayResult.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.bootx.platform.daxpay.dto.pay; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * @author xxm - * @since 2020/12/9 - */ -@Data -@Accessors(chain = true) -@Schema(title = "支付返回信息") -public class PayResult implements Serializable { - - private static final long serialVersionUID = 7729669194741851195L; - - @Schema(description = "是否是异步支付") - private boolean asyncPayMode; - - /** - * @see PayChannelEnum#getCode() - */ - @Schema(description = "异步支付渠道") - private String asyncPayChannel; - - /** - * @see PayStatusCode#TRADE_PROGRESS - */ - @Schema(description = "支付状态") - private String payStatus; - - @Schema(description = "异步支付参数") - private AsyncPayInfo asyncPayInfo; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/BasePaymentDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/BasePaymentDto.java deleted file mode 100644 index 885573e2..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/BasePaymentDto.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.bootx.platform.daxpay.dto.payment; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * @author xxm - * @since 2021/2/25 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "具体支付日志基类") -public class BasePaymentDto extends BaseDto { - - @Schema(description = "支付id") - private Long paymentId; - - @Schema(description = "用户id") - private Long userId; - - @Schema(description = "关联的业务id") - private String businessId; - - @Schema(description = "金额") - private BigDecimal amount; - - @Schema(description = "可退款金额") - private BigDecimal refundableBalance; - - /** - * @see PayStatusCode - */ - @Schema(description = "支付状态") - private int payStatus; - - @Schema(description = "支付时间") - private LocalDateTime payTime; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/PayChannelInfo.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/PayChannelInfo.java deleted file mode 100644 index 5b1722a8..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/PayChannelInfo.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.bootx.platform.daxpay.dto.payment; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * 支付渠道信息 - * - * @author xxm - * @since 2020/12/8 - */ -@Data -@Accessors(chain = true) -@Schema(title = "支付渠道信息") -public class PayChannelInfo implements Serializable { - - private static final long serialVersionUID = -7757908686367215682L; - - @Schema(description = "支付渠道") - private String payChannel; - - @Schema(description = "支付方式") - private String payWay; - - @Schema(description = "金额") - private BigDecimal amount; - - @Schema(description = "扩展参数的json字符串", hidden = true) - private String extraParamsJson; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/PaymentDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/PaymentDto.java deleted file mode 100644 index 28559768..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/PaymentDto.java +++ /dev/null @@ -1,93 +0,0 @@ -package cn.bootx.platform.daxpay.dto.payment; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * @author xxm - * @since 2020/12/9 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "支付记录") -public class PaymentDto extends BaseDto implements Serializable { - - private static final long serialVersionUID = 3269223993950227228L; - - @Schema(description = "关联的业务id") - private String businessId; - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppNo; - - @Schema(description = "标题") - private String title; - - @Schema(description = "描述") - private String description; - - @Schema(description = "是否是异步支付") - private boolean asyncPayMode; - - @Schema(description = "是否是组合支付") - private boolean combinationPayMode; - - /** - * @see cn.bootx.platform.daxpay.code.pay.PayChannelEnum#ASYNC_TYPE_CODE - */ - @Schema(description = "异步支付渠道") - private String asyncPayChannel; - - /** - * @see PayStatusCode - */ - @Schema(description = "支付状态") - private String payStatus; - - @Schema(description = "金额") - private BigDecimal amount; - - @Schema(description = "可退款余额") - private BigDecimal refundableBalance; - - @Schema(description = "错误码") - private String errorCode; - - @Schema(description = "错误信息") - private String errorMsg; - - /** - * @see PayChannelInfo - */ - @Schema(description = "支付渠道信息") - private List payChannelInfo; - - /** - * @see RefundableInfo - */ - @Schema(description = "可退款信息列表") - private List refundableInfo; - - @Schema(description = "支付时间") - private LocalDateTime payTime; - - @Schema(description = "支付终端ip") - private String clientIp; - - @Schema(description = "过期时间") - private LocalDateTime expiredTime; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/RefundableInfo.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/RefundableInfo.java deleted file mode 100644 index 83b61a31..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/payment/RefundableInfo.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.daxpay.dto.payment; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 可退款信息 - * - * @author xxm - * @since 2022/3/2 - */ -@Data -@Accessors(chain = true) -@Schema(title = "可退款信息") -public class RefundableInfo { - - /** - * @see cn.bootx.platform.daxpay.code.pay.PayChannelEnum - */ - @Schema(description = "支付渠道") - private String payChannel; - - @Schema(description = "金额") - private BigDecimal amount; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/refund/PayRefundRecordDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/refund/PayRefundRecordDto.java deleted file mode 100644 index 145d0c50..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/refund/PayRefundRecordDto.java +++ /dev/null @@ -1,69 +0,0 @@ -package cn.bootx.platform.daxpay.dto.refund; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import cn.bootx.platform.daxpay.code.pay.PayStatusCode; -import cn.bootx.platform.daxpay.dto.payment.RefundableInfo; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 退款记录 - * - * @author xxm - * @since 2022/3/2 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "退款记录") -public class PayRefundRecordDto extends BaseDto { - - @Schema(description = "关联的业务id") - private String businessId; - - @Schema(description = "付款付单号") - private Long paymentId; - - @Schema(description = "异步方式关联退款请求号(部分退款情况)") - private String refundRequestNo; - - @Schema(description = "用户ID") - private Long userId; - - @Schema(description = "标题") - private String title; - - @Schema(description = "退款金额") - private BigDecimal amount; - - @Schema(description = "剩余可退") - private BigDecimal refundableBalance; - - @Schema(description = "退款终端ip") - private String clientIp; - - @Schema(description = "退款时间") - private LocalDateTime refundTime; - - @Schema(description = "退款信息列表") - private List refundableInfo; - - /** - * @see PayStatusCode#REFUND_PROCESS_FAIL - */ - @Schema(description = "退款状态") - private String refundStatus; - - @Schema(description = "错误码") - private String errorCode; - - @Schema(description = "错误信息") - private String errorMsg; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/sync/PaySyncRecordDto.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/sync/PaySyncRecordDto.java deleted file mode 100644 index b6dcfa6d..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/dto/sync/PaySyncRecordDto.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.bootx.platform.daxpay.dto.sync; - -import cn.bootx.platform.common.core.rest.dto.BaseDto; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PaySyncStatus; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -/** - * 支付同步记录 - * @author xxm - * @since 2023/7/14 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@Schema(title = "支付同步记录") -public class PaySyncRecordDto extends BaseDto { - - /** 支付记录id */ - @Schema(description = "支付记录id") - private Long paymentId; - - /** 商户编码 */ - @Schema(description = "商户编码") - private String mchCode; - - /** 商户应用编码 */ - @Schema(description = "商户应用编码") - private String mchAppCode; - - /** - * 支付渠道 - * @see PayChannelEnum#getCode() - */ - @Schema(description = "支付渠道") - private String payChannel; - - /** 通知消息 */ - @Schema(description = "通知消息") - private String syncInfo; - - /** - * 同步状态 - * @see PaySyncStatus#WAIT_BUYER_PAY - */ - @Schema(description = "同步状态") - private String status; - - @Schema(description = "错误消息") - private String msg; - - /** 同步时间 */ - @Schema(description = "同步时间") - private LocalDateTime syncTime; -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/PayEventSender.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/PayEventSender.java deleted file mode 100644 index 0f56b2cf..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/PayEventSender.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.bootx.platform.daxpay.event; - -import cn.bootx.platform.daxpay.event.domain.PayCancelEvent; -import cn.bootx.platform.daxpay.event.domain.PayCompleteEvent; -import cn.bootx.platform.daxpay.event.domain.PayExpiredTimeEvent; -import cn.bootx.platform.daxpay.event.domain.PayRefundEvent; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.retry.annotation.Retryable; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -/** - * 支付中心消息发送器 - * - * @author xxm - * @since 2021/4/22 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class PayEventSender { - - private final PayMqMsgSender mqMsgSender; - - /** - * 支付完成 事件发布 - */ - @Async("bigExecutor") - @Retryable(value = Exception.class) - public void sendPayComplete(PayCompleteEvent event) { - mqMsgSender.send(event); - } - - /** - * 支付撤销/关闭 事件发布 - */ - @Async("bigExecutor") - @Retryable(value = Exception.class) - public void sendPayCancel(PayCancelEvent event) { - mqMsgSender.send(event); - } - - /** - * 支付退款 事件发布 - */ - @Async("bigExecutor") - @Retryable(value = Exception.class) - public void sendPayRefund(PayRefundEvent event) { - mqMsgSender.send(event); - } - - /** - * 支付单超时 事件发布 - */ - @Async("bigExecutor") - @Retryable(value = Exception.class) - public void sendPayExpiredTime(PayExpiredTimeEvent event) { - mqMsgSender.send(event); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/PayMqMsgSender.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/PayMqMsgSender.java deleted file mode 100644 index d144e9a0..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/PayMqMsgSender.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.bootx.platform.daxpay.event; - -import cn.bootx.platform.daxpay.event.domain.PayEvent; - -/** - * 支付消息队列发送接口定义 - * @author xxm - * @since 2023/7/17 - */ -public interface PayMqMsgSender { - - /** - * 实时推送MQ消息 - * @param msg 消息 - */ - void send(PayEvent msg); - - /** - * 推送MQ延迟消息 - * @param msg 消息 - * @param delay 延迟时间, 单位秒 - */ - void send(PayEvent msg, int delay); -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayCancelEvent.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayCancelEvent.java deleted file mode 100644 index 08559558..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayCancelEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.bootx.platform.daxpay.event.domain; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 支付撤销事件 - * - * @author xxm - * @since 2022/7/11 - */ -@Data -@Accessors(chain = true) -public class PayCancelEvent implements PayEvent{ - - /** 支付单ID */ - private Long paymentId; - - /** 业务单号 */ - private String businessId; - - /** - * MQ队列名称 - */ - @Override - public String getQueueName() { - return null; - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayCompleteEvent.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayCompleteEvent.java deleted file mode 100644 index c372fd30..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayCompleteEvent.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.daxpay.event.domain; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 支付完成事件 - * - * @author xxm - * @since 2022/7/11 - */ -@Data -@Accessors(chain = true) -public class PayCompleteEvent implements PayEvent{ - - /** 支付单ID */ - private Long paymentId; - - /** 业务单号 */ - private String businessId; - - /** - * MQ队列名称 - */ - @Override - public String getQueueName() { - return null; - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayEvent.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayEvent.java deleted file mode 100644 index 1c33ea73..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayEvent.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bootx.platform.daxpay.event.domain; - -import cn.bootx.platform.common.jackson.util.JacksonUtil; - -/** - * Mq事件消息定义 - * @author xxm - * @since 2023/7/17 - */ -public interface PayEvent { - /** MQ队列名称 */ - String getQueueName(); - /** 要发送的消息体 */ - default Object toMessage(){ - return JacksonUtil.toJson(this); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayExpiredTimeEvent.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayExpiredTimeEvent.java deleted file mode 100644 index dca27817..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayExpiredTimeEvent.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.daxpay.event.domain; - -import cn.bootx.platform.daxpay.code.PaymentEventCode; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 支付超时事件 - * @author xxm - * @since 2023/7/20 - */ -@Data -@Accessors(chain = true) -public class PayExpiredTimeEvent implements PayEvent{ - - /** 支付单ID */ - private Long paymentId; - - /** 业务单号 */ - private String businessId; - - /** - * MQ队列名称 - */ - @Override - public String getQueueName() { - return PaymentEventCode.PAYMENT_EXPIRED_TIME; - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayRefundEvent.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayRefundEvent.java deleted file mode 100644 index 55958d2a..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/domain/PayRefundEvent.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.daxpay.event.domain; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 支付退款事件 - * - * @author xxm - * @since 2022/7/11 - */ -@Data -@Accessors(chain = true) -public class PayRefundEvent implements PayEvent{ - - /** 支付单ID */ - private Long paymentId; - - /** 业务单号 */ - private String businessId; - - /** - * MQ队列名称 - */ - @Override - public String getQueueName() { - return null; - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/active/listener/PayActiveMqMsgListener.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/active/listener/PayActiveMqMsgListener.java deleted file mode 100644 index 75739182..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/active/listener/PayActiveMqMsgListener.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bootx.platform.daxpay.event.vender.active.listener; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Component; - -/** - * activeMQ 消息接收 - * @author xxm - * @since 2023/7/20 - */ -@Component -@ConditionalOnProperty(name ="bootx.daxpay.mq-type", havingValue = "active") -public class PayActiveMqMsgListener { -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/active/sender/PayActiveMqMsgSender.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/active/sender/PayActiveMqMsgSender.java deleted file mode 100644 index 6ef58eec..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/active/sender/PayActiveMqMsgSender.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.bootx.platform.daxpay.event.vender.active.sender; - -import cn.bootx.platform.daxpay.event.PayMqMsgSender; -import cn.bootx.platform.daxpay.event.domain.PayEvent; -import lombok.RequiredArgsConstructor; -import org.apache.activemq.ScheduledMessage; -import org.apache.activemq.command.ActiveMQQueue; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.jms.core.JmsTemplate; -import org.springframework.stereotype.Component; - -import javax.jms.TextMessage; - -/** - * activeMQ 发送器 - * @author xxm - * @since 2023/7/20 - */ -@Component -@RequiredArgsConstructor -@ConditionalOnProperty(name ="bootx.daxpay.mq-type", havingValue = "active") -public class PayActiveMqMsgSender implements PayMqMsgSender { - - private final JmsTemplate jmsTemplate; - - /** - * 实时推送MQ消息 - */ - @Override - public void send(PayEvent msg) { - jmsTemplate.convertAndSend(new ActiveMQQueue(msg.getQueueName()),msg.toMessage()); - } - - /** - * 推送MQ延迟消息 - */ - @Override - public void send(PayEvent msg, int delay) { - jmsTemplate.send(new ActiveMQQueue(msg.getQueueName()), session -> { - TextMessage tm = session.createTextMessage(msg.toMessage().toString()); - tm.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay * 1000); - tm.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, 1*1000); - tm.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, 1); - return tm; - }); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rabbit/config/PayRabbitBeanRegistry.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rabbit/config/PayRabbitBeanRegistry.java deleted file mode 100644 index 0f8991ff..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rabbit/config/PayRabbitBeanRegistry.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.bootx.platform.daxpay.event.vender.rabbit.config; - -import cn.bootx.platform.daxpay.code.PaymentEventCode; -import cn.bootx.platform.daxpay.event.domain.PayEvent; -import cn.hutool.core.util.ClassUtil; -import cn.hutool.core.util.ReflectUtil; -import cn.hutool.extra.spring.SpringUtil; -import org.springframework.amqp.core.*; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; -import org.springframework.beans.factory.support.RootBeanDefinition; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -import static cn.bootx.platform.daxpay.code.PaymentEventCode.DELAYED_EXCHANGE_PAYMENT; - -/** - * 注入Rabbit相关的消息类 - * @author xxm - * @since 2023/7/17 - */ -@Configuration -@ConditionalOnProperty(name ="bootx.daxpay.mq-type", havingValue = "rabbit") -public class PayRabbitBeanRegistry implements BeanDefinitionRegistryPostProcessor { - - - /** 自定义交换机: 用于延迟消息 **/ - @Bean - CustomExchange delayedExchange() { - Map args = new HashMap<>(); - args.put("x-delayed-type", "direct"); - return new CustomExchange(DELAYED_EXCHANGE_PAYMENT, "x-delayed-message", true, false, args); - } - - /** - * 注册Bean - * @param beanDefinitionRegistry 应用程序上下文使用的 Bean 定义注册表 - */ - @Override - public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException { - this.initRabbitBeans(beanDefinitionRegistry); - } - - @Override - public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { - } - - /** - * 初始化RabbitMQ相关的消息, 并注册到Bean容器中 - */ - public void initRabbitBeans(BeanDefinitionRegistry beanDefinitionRegistry){ - // 扫描所有的消息类 - Set> set = ClassUtil.scanPackageBySuper(ClassUtil.getPackage(PayEvent.class), PayEvent.class); - // 遍历 - for (Class clazz : set) { - // 实例化 - PayEvent eventMsg = (PayEvent) ReflectUtil.newInstance(clazz); - - // 注册队列(Queue) - RootBeanDefinition queueDefinition = new RootBeanDefinition(Queue.class, () -> new Queue(eventMsg.getQueueName())); - beanDefinitionRegistry.registerBeanDefinition(eventMsg.getQueueName(),queueDefinition); - - // 注册与交换机的绑定关系Binding - Queue queue = SpringUtil.getBean(eventMsg.getQueueName(), Queue.class); - RootBeanDefinition bindingDefinition = new RootBeanDefinition(Binding.class, - BindingBuilder - .bind(queue) - .to(delayedExchange()) - .with(PaymentEventCode.PAY_REFUND)::noargs); - beanDefinitionRegistry.registerBeanDefinition(eventMsg.getQueueName()+".exchange",bindingDefinition); - } - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rabbit/listener/PayRabbitMqMsgListener.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rabbit/listener/PayRabbitMqMsgListener.java deleted file mode 100644 index 0ce03aee..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rabbit/listener/PayRabbitMqMsgListener.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.bootx.platform.daxpay.event.vender.rabbit.listener; - -import cn.bootx.platform.daxpay.code.PaymentEventCode; -import cn.bootx.platform.daxpay.core.sync.service.PayExpiredTimeService; -import cn.bootx.platform.daxpay.event.domain.PayCancelEvent; -import cn.bootx.platform.daxpay.event.domain.PayCompleteEvent; -import cn.bootx.platform.daxpay.event.domain.PayRefundEvent; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Component; - -/** - * 消息接收 - * - * @author xxm - * @since 2021/4/22 - */ -@Slf4j -@Component -@ConditionalOnProperty(name ="bootx.daxpay.mq-type", havingValue = "rabbit") -@RequiredArgsConstructor -public class PayRabbitMqMsgListener { - - private final PayExpiredTimeService payExpiredTimeService; - - /** - * 支付超时事件处理 - */ - @RabbitListener(queues = PaymentEventCode.PAYMENT_EXPIRED_TIME) - public void PaymentExpiredTime(Long paymentId) { - payExpiredTimeService.expiredTime(paymentId); - } - - /** - * 支付成功 - */ - @RabbitListener(queues = PaymentEventCode.PAY_COMPLETE) - public void payCancel(PayCompleteEvent event) { - log.info("支付完成事件:{}", event); - } - - /** - * 支付撤销/关闭 - */ - @RabbitListener(queues = PaymentEventCode.PAY_CANCEL) - public void payCancel(PayCancelEvent event) { - log.info("支付撤销/关闭事件:{}", event); - } - - /** - * 支付退款 - */ - @RabbitListener(queues = PaymentEventCode.PAY_REFUND) - public void payCancel(PayRefundEvent event) { - log.info("支付退款事件:{}", event); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rabbit/sender/PayRabbitMqMsgSender.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rabbit/sender/PayRabbitMqMsgSender.java deleted file mode 100644 index c2b93eee..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rabbit/sender/PayRabbitMqMsgSender.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.bootx.platform.daxpay.event.vender.rabbit.sender; - -import cn.bootx.platform.daxpay.event.PayMqMsgSender; -import cn.bootx.platform.daxpay.event.domain.PayEvent; -import lombok.RequiredArgsConstructor; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Component; - -import static cn.bootx.platform.daxpay.code.PaymentEventCode.DELAYED_EXCHANGE_PAYMENT; - -/** - * RabbitMQ消息发送器 - * @author xxm - * @since 2023/7/17 - */ -@Component -@RequiredArgsConstructor -@ConditionalOnProperty(name ="bootx.daxpay.mq-type", havingValue = "rabbit") -public class PayRabbitMqMsgSender implements PayMqMsgSender { - private final RabbitTemplate rabbitTemplate; - - /** - * 实时推送MQ消息 - */ - @Override - public void send(PayEvent msg) { - rabbitTemplate.convertAndSend(msg.getQueueName(), msg.toMessage()); - } - - /** - * 推送MQ延迟消息 - */ - @Override - public void send(PayEvent msg, int delay) { - rabbitTemplate.convertAndSend(DELAYED_EXCHANGE_PAYMENT, msg.getQueueName(), msg.toMessage(), - messagePostProcessor ->{ - messagePostProcessor.getMessageProperties().setDelay(Math.toIntExact(delay * 1000L)); - return messagePostProcessor; - }); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rocket/listener/PayRocketMqMsgListener.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rocket/listener/PayRocketMqMsgListener.java deleted file mode 100644 index baba40d4..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rocket/listener/PayRocketMqMsgListener.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.daxpay.event.vender.rocket.listener; - -import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.spring.core.RocketMQListener; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Component; - -/** - * rocketMQ 消息监听 - * @author xxm - * @since 2023/7/17 - */ -@Slf4j -@Component -@ConditionalOnProperty(name ="bootx.daxpay.mq-type", havingValue = "rocket") -//@RocketMQMessageListener(topic ="MQ_NAME", consumerGroup = "MQ_NAME") -public class PayRocketMqMsgListener implements RocketMQListener { - - /** - * 消息处理 - */ - @Override - public void onMessage(String message) { - - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rocket/sender/PayRocketMqMsgSender.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rocket/sender/PayRocketMqMsgSender.java deleted file mode 100644 index bef652b9..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/rocket/sender/PayRocketMqMsgSender.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.bootx.platform.daxpay.event.vender.rocket.sender; - -import cn.bootx.platform.daxpay.event.PayMqMsgSender; -import cn.bootx.platform.daxpay.event.domain.PayEvent; -import lombok.RequiredArgsConstructor; -import org.apache.rocketmq.spring.core.RocketMQTemplate; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Component; - -/** - * rocketMQ 发送器 - * @author xxm - * @since 2023/7/17 - */ -@Component -@RequiredArgsConstructor -@ConditionalOnProperty(name ="bootx.daxpay.mq-type", havingValue = "rocket") -public class PayRocketMqMsgSender implements PayMqMsgSender { - private final RocketMQTemplate rocketMQTemplate; - - /** - * 实时推送MQ消息 - */ - @Override - public void send(PayEvent msg) { - rocketMQTemplate.syncSend(msg.getQueueName(),msg.toMessage()); - } - - /** - * 推送MQ延迟消息 - */ - @Override - public void send(PayEvent msg, int delay) { - rocketMQTemplate.syncSend(msg.getQueueName(),msg.toMessage(),delay); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/spring/sender/PaySpringMsgSender.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/spring/sender/PaySpringMsgSender.java deleted file mode 100644 index da65cdcd..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/event/vender/spring/sender/PaySpringMsgSender.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.bootx.platform.daxpay.event.vender.spring.sender; - -import cn.bootx.platform.daxpay.event.PayMqMsgSender; -import cn.bootx.platform.daxpay.event.domain.PayEvent; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Component; - -/** - * Spring 事件方式 - * @author xxm - * @since 2023/7/17 - */ -@Component -@RequiredArgsConstructor -@ConditionalOnProperty(name ="bootx.daxpay.mq-type", havingValue = "spring", matchIfMissing = true) -public class PaySpringMsgSender implements PayMqMsgSender { - private final ApplicationEventPublisher applicationEventPublisher; - - /** - * 实时推送MQ消息 - * - * @param msg 消息 - */ - @Override - public void send(PayEvent msg) { - applicationEventPublisher.publishEvent(msg); - } - - /** - * 推送MQ延迟消息 - * - * @param msg 消息 - * @param delay 延迟时间, 单位秒 - */ - @Override - public void send(PayEvent msg, int delay) { - applicationEventPublisher.publishEvent(msg); - } -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletBannedException.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletBannedException.java deleted file mode 100644 index b412dc94..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletBannedException.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bootx.platform.daxpay.exception.waller; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.daxpay.code.PaymentErrorCode; - -/** - * 钱包被禁用 - * - * @author xxm - * @since 2020/12/8 - */ -public class WalletBannedException extends BizException { - - public WalletBannedException() { - super(PaymentErrorCode.WALLET_BANNED, "钱包被禁用"); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletInfoNotExistException.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletInfoNotExistException.java deleted file mode 100644 index 1be32d7f..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletInfoNotExistException.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bootx.platform.daxpay.exception.waller; - -import cn.bootx.platform.common.core.exception.FatalException; -import cn.bootx.platform.daxpay.code.PaymentErrorCode; - -/** - * 钱包信息不存在 - * - * @author xxm - * @since 2020/12/8 - */ -public class WalletInfoNotExistException extends FatalException { - - public WalletInfoNotExistException() { - super(PaymentErrorCode.WALLET_INFO_NOT_EXISTS, "钱包信息不存在"); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletLackOfBalanceException.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletLackOfBalanceException.java deleted file mode 100644 index 55246292..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletLackOfBalanceException.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bootx.platform.daxpay.exception.waller; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.daxpay.code.PaymentErrorCode; - -/** - * 余额不足异常 - * - * @author xxm - * @since 2020/12/8 - */ -public class WalletLackOfBalanceException extends BizException { - - public WalletLackOfBalanceException() { - super(PaymentErrorCode.WALLET_BALANCE_NOT_ENOUGH, "余额不足异常"); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletLogError.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletLogError.java deleted file mode 100644 index 1a956366..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletLogError.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bootx.platform.daxpay.exception.waller; - -import cn.bootx.platform.common.core.exception.FatalException; -import cn.bootx.platform.daxpay.code.PaymentErrorCode; - -/** - * 钱包日志错误 - * - * @author xxm - * @since 2020/12/8 - */ -public class WalletLogError extends FatalException { - - public WalletLogError() { - super(PaymentErrorCode.WALLET_LOG_ERROR, "钱包日志错误"); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletNotExistsException.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletNotExistsException.java deleted file mode 100644 index e5df4833..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/waller/WalletNotExistsException.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bootx.platform.daxpay.exception.waller; - -import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.daxpay.code.PaymentErrorCode; - -/** - * 钱包不存在 - * - * @author xxm - * @since 2020/12/8 - */ -public class WalletNotExistsException extends BizException { - - public WalletNotExistsException() { - super(PaymentErrorCode.WALLET_NOT_EXISTS, "钱包不存在"); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/cashier/CashierCombinationPayParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/cashier/CashierCombinationPayParam.java deleted file mode 100644 index 7dfdb4f0..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/cashier/CashierCombinationPayParam.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.bootx.platform.daxpay.param.cashier; - -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.util.List; - -/** - * 结算台发起支付参数 - * - * @author xxm - * @since 2022/2/23 - */ -@Data -@Accessors(chain = true) -@Schema(title = "结算台组合支付参数") -public class CashierCombinationPayParam { - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - @Schema(description = "标题") - private String title; - - @Schema(description = "金额") - private BigDecimal amount; - - @Schema(description = "业务id") - private String businessId; - - @Schema(description = "支付信息") - private List payWayList; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/cashier/CashierSinglePayParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/cashier/CashierSinglePayParam.java deleted file mode 100644 index 103eb946..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/cashier/CashierSinglePayParam.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.bootx.platform.daxpay.param.cashier; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.util.List; - -/** - * 结算台发起支付参数 - * - * @author xxm - * @since 2022/2/23 - */ -@Data -@Accessors(chain = true) -@Schema(title = "结算台单支付参数") -public class CashierSinglePayParam { - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - @Schema(description = "标题") - private String title; - - @Schema(description = "金额") - private BigDecimal amount; - - @Schema(description = "openId") - private String openId; - - @Schema(description = "支付渠道") - private String payChannel; - - @Schema(description = "支付方式") - private String payWay; - - @Schema(description = "业务id") - private String businessId; - - @Schema(description = "付款码") - private String authCode; - - @Schema(description = "储值卡") - private String voucherNo; - - @Schema(description = "储值卡") - private List voucherNoList; - - @Schema(description = "钱包ID") - private String walletId; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/alipay/AlipayConfigParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/alipay/AlipayConfigParam.java deleted file mode 100644 index 5867b142..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/alipay/AlipayConfigParam.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.alipay; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.List; - -/** - * @author xxm - * @since 2021/2/26 - */ -@Data -@Accessors(chain = true) -@Schema(title = "支付宝配置参数") -public class AlipayConfigParam implements Serializable { - - @Schema(description = "主键") - private Long id; - - @Schema(description = "名称") - private String name; - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - @Schema(description = "支付宝商户appId") - private String appId; - - @Schema(description = "服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问") - private String notifyUrl; - - @Schema(description = "页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址") - private String returnUrl; - - @Schema(description = "请求网关地址") - private String serverUrl; - - @Schema(description = "认证类型 证书/公钥") - private String authType; - - @Schema(description = "签名类型") - public String signType; - - @Schema(description = "支付宝公钥") - public String alipayPublicKey; - - @Schema(description = "私钥") - private String privateKey; - - @Schema(description = "应用公钥证书") - private String appCert; - - @Schema(description = "支付宝公钥证书文件") - private String alipayCert; - - @Schema(description = "支付宝CA根证书文件") - private String alipayRootCert; - - @Schema(description = "超时配置") - private Integer expireTime; - - @Schema(description = "可用支付方式") - private List payWayList; - - @Schema(description = "是否沙箱环境") - private boolean sandbox; - - @Schema(description = "状态") - private String state; - - @Schema(description = "备注") - private String remark; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/alipay/AlipayConfigQuery.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/alipay/AlipayConfigQuery.java deleted file mode 100644 index 94cbf0e9..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/alipay/AlipayConfigQuery.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.alipay; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * @author xxm - * @since 2021/7/22 - */ -@Data -@Accessors(chain = true) -@Schema(title = "支付宝配置搜索参数") -public class AlipayConfigQuery implements Serializable { - - private static final long serialVersionUID = -173325268481050362L; - - /** 名称 */ - private String name; - - /** 状态 */ - private Integer state; - - /** 支付宝商户appId */ - private String appId; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/config/PayChannelConfigParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/config/PayChannelConfigParam.java deleted file mode 100644 index fc12096c..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/config/PayChannelConfigParam.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.config; - -import cn.bootx.platform.common.core.annotation.QueryParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import static cn.bootx.platform.common.core.annotation.QueryParam.CompareTypeEnum.LIKE; - -/** - * 支付渠道配置 编码见 @see {@link cn.bootx.platform.daxpay.code.pay.PayChannelCode} - * - * @author xxm - * @since 2023-05-24 - */ -@Data -@Schema(title = "支付渠道配置") -@Accessors(chain = true) -public class PayChannelConfigParam { - - @Schema(description = "主键") - private Long id; - - @QueryParam(type = LIKE) - @Schema(description = "渠道编码") - private String code; - - @QueryParam(type = LIKE) - @Schema(description = "支付渠道名称") - private String name; - - @Schema(description = "图片") - private Long image; - - @Schema(description = "排序") - private Double sortNo; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherChangeParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherChangeParam.java deleted file mode 100644 index 5e2191f8..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherChangeParam.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.voucher; - -import cn.bootx.platform.daxpay.code.paymodel.VoucherCode; -import cn.hutool.core.date.DatePattern; -import com.alibaba.excel.annotation.ExcelProperty; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * - * @author xxm - * @since 2023/7/13 - */ -@Data -@Accessors(chain = true) -@Schema(title = "储值卡信息更改参数") -public class VoucherChangeParam { - - @ExcelProperty("卡号") - @Schema(description = "卡号") - private String cardNo; - - @ExcelProperty("卡号") - @Schema(description = "面值") - private BigDecimal faceValue; - - @ExcelProperty("卡号") - @Schema(description = "余额") - private BigDecimal balance; - - @ExcelProperty("卡号") - @Schema(description = "是否长期有效") - private Boolean enduring; - - @ExcelProperty("开始时间") - @Schema(description = "开始时间") - @JsonFormat(pattern = DatePattern.NORM_DATETIME_PATTERN) - private LocalDateTime startTime; - - @ExcelProperty("结束时间") - @Schema(description = "结束时间") - @JsonFormat(pattern = DatePattern.NORM_DATETIME_PATTERN) - private LocalDateTime endTime; - - /** - * @see VoucherCode#STATUS_NORMAL - */ - @ExcelProperty("默认状态") - @Schema(description = "默认状态") - private String status; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherGenerationParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherGenerationParam.java deleted file mode 100644 index c82ffea8..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherGenerationParam.java +++ /dev/null @@ -1,51 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.voucher; - -import cn.bootx.platform.daxpay.code.paymodel.VoucherCode; -import cn.hutool.core.date.DatePattern; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * @author xxm - * @since 2022/3/14 - */ -@Data -@Accessors(chain = true) -@Schema(title = "储值卡生成参数") -public class VoucherGenerationParam { - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - @Schema(description = "数量") - private Integer count; - - @Schema(description = "面值") - private BigDecimal faceValue; - - @Schema(description = "是否长期有效") - private Boolean enduring; - - @Schema(description = "开始时间") - @JsonFormat(pattern = DatePattern.NORM_DATETIME_PATTERN) - private LocalDateTime startTime; - - @Schema(description = "结束时间") - @JsonFormat(pattern = DatePattern.NORM_DATETIME_PATTERN) - private LocalDateTime endTime; - - /** - * @see VoucherCode#STATUS_NORMAL - */ - @Schema(description = "默认状态") - private String status; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherImportParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherImportParam.java deleted file mode 100644 index ac50888b..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherImportParam.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.voucher; - -import cn.bootx.platform.daxpay.code.paymodel.VoucherCode; -import cn.hutool.core.date.DatePattern; -import com.alibaba.excel.annotation.ExcelProperty; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * @author xxm - * @since 2022/3/14 - */ -@Data -@Schema(title = "储值卡导入参数") -public class VoucherImportParam { - - @ExcelProperty("卡号") - @Schema(description = "卡号") - private String cardNo; - - @ExcelProperty("面值") - @Schema(description = "面值") - private BigDecimal faceValue; - - @ExcelProperty("余额") - @Schema(description = "余额") - private BigDecimal balance; - - @ExcelProperty("是否长期有效") - @Schema(description = "是否长期有效") - private Boolean enduring; - - @ExcelProperty("开始时间") - @Schema(description = "开始时间") - @JsonFormat(pattern = DatePattern.NORM_DATETIME_PATTERN) - private LocalDateTime startTime; - - @ExcelProperty("结束时间") - @Schema(description = "结束时间") - @JsonFormat(pattern = DatePattern.NORM_DATETIME_PATTERN) - private LocalDateTime endTime; - - /** - * @see VoucherCode#STATUS_NORMAL - */ - @ExcelProperty("默认状态") - @Schema(description = "默认状态") - private String status; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherParam.java deleted file mode 100644 index edca8f93..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherParam.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.voucher; - -import cn.bootx.platform.daxpay.code.paymodel.VoucherCode; -import cn.hutool.core.date.DatePattern; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; -import org.springframework.format.annotation.DateTimeFormat; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * @author xxm - * @since 2022/3/14 - */ -@Data -@Accessors(chain = true) -@Schema(title = "储值卡查询参数") -public class VoucherParam { - - @Schema(description = "主键") - private Long id; - - @Schema(description = "卡号") - private String cardNo; - - @Schema(description = "生成批次号") - private Long batchNo; - - @Schema(description = "面值") - private BigDecimal faceValue; - - @Schema(description = "余额") - private BigDecimal balance; - - @Schema(description = "是否长期有效") - private Boolean enduring; - - @Schema(description = "开始时间") - @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN) - private LocalDateTime startTime; - - @Schema(description = "结束时间") - @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN) - private LocalDateTime endTime; - - /** - * @see VoucherCode - */ - @Schema(description = "状态") - private Integer status; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherRefundParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherRefundParam.java deleted file mode 100644 index 3ef835c5..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherRefundParam.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.voucher; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 储值卡退款参数 - * @author xxm - * @since 2023/6/29 - */ -@Data -@Accessors(chain = true) -@Schema(title = "储值卡退款参数") -public class VoucherRefundParam { - - @Schema(description = "是否统一退款到指定卡中") - private boolean refundToOne; - - @Schema(description = "统一退款到的卡号") - private String refundVoucherNo; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletLogQueryParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletLogQueryParam.java deleted file mode 100644 index 43867ec4..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletLogQueryParam.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.wallet; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - -/** - * @author xxm - * @since 2020/12/8 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钱包日志查询参数") -public class WalletLogQueryParam implements Serializable { - - private static final long serialVersionUID = -4046664021959786637L; - - @Schema(description = "钱包ID (与userId至少存在一个)") - private Long walletId; - - @Schema(description = "用户ID (钱包至少存在一个)") - private Long userId; - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - @Schema(description = "开始日期") - private LocalDateTime startDate; - - @Schema(description = "结束日期") - private LocalDateTime endDate; - - @Schema(description = "日志类型,不传则查询全部") - private List type; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletQueryParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletQueryParam.java deleted file mode 100644 index b95d0892..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletQueryParam.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.wallet; - -import cn.bootx.platform.common.core.annotation.QueryParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * @author xxm - * @since 2020/12/8 - */ -@Data -@QueryParam(type = QueryParam.CompareTypeEnum.LIKE) -@Accessors(chain = true) -@Schema(title = "钱包查询参数") -public class WalletQueryParam { - - @Schema(description = "钱包ID") - private Long walletId; - - @Schema(description = "用户ID") - private Long userId; - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletRechargeParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletRechargeParam.java deleted file mode 100644 index b4ae2cd9..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletRechargeParam.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.wallet; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import javax.validation.constraints.NotNull; -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * @author xxm - * @since 2020/12/8 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钱包充值参数") -public class WalletRechargeParam implements Serializable { - - private static final long serialVersionUID = 73058709379178254L; - - @NotNull(message = "钱包ID不可为空") - @Schema(description = "钱包ID") - private Long walletId; - - @NotNull(message = "充值金额不可为空") - @Schema(description = "充值金额") - private BigDecimal amount; -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletRefundParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletRefundParam.java deleted file mode 100644 index 02ab736a..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletRefundParam.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.wallet; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 钱包退款参数 - * @author xxm - * @since 2023/6/29 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钱包退款参数") -public class WalletRefundParam { -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wechat/WalletConfigParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wechat/WalletConfigParam.java deleted file mode 100644 index 2bccd293..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wechat/WalletConfigParam.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.wechat; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 钱包配置 - * @author xxm - * @since 2023/7/20 - */ -@Data -@Accessors(chain = true) -@Schema(title = "钱包配置") -public class WalletConfigParam { - @Schema(description = "主键") - private Long id; - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - @Schema(description = "默认余额") - private BigDecimal defaultBalance; - - @Schema(description = "状态") - private String state; - - @Schema(description = "备注") - private String remark; - - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wechat/WeChatPayConfigParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wechat/WeChatPayConfigParam.java deleted file mode 100644 index 0e8a5525..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wechat/WeChatPayConfigParam.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.bootx.platform.daxpay.param.channel.wechat; - -import cn.bootx.platform.common.core.annotation.QueryParam; -import cn.bootx.platform.daxpay.code.paymodel.WeChatPayCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.List; - -/** - * 微信支付配置参数 - * - * @author xxm - * @since 2022/7/7 - */ -@Data -@QueryParam(type = QueryParam.CompareTypeEnum.LIKE) -@Accessors(chain = true) -@Schema(title = "微信支付配置参数") -public class WeChatPayConfigParam { - - @Schema(description = "主键") - private Long id; - - @Schema(description = "名称") - private String name; - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户应用编码") - private String mchAppCode; - - @Schema(description = "微信商户号") - private String wxMchId; - - @Schema(description = "微信应用appId") - private String wxAppId; - - /** - * @see WeChatPayCode#API_V2 - */ - @Schema(description = "api版本") - private String apiVersion; - - @Schema(description = "商户平台「API安全」中的 APIv2 密钥") - private String apiKeyV2; - - @Schema(description = "商户平台「API安全」中的 APIv3 密钥") - private String apiKeyV3; - - @Schema(description = "APPID对应的接口密码,用于获取接口调用凭证access_token时使用") - private String appSecret; - - @Schema(description = "API 证书中的 p12 文件") - private String p12; - - @Schema(description = "服务器异步通知页面路径 通知url必须为直接可访问的url,不能携带参数。公网域名必须为https ") - private String notifyUrl; - - @Schema(description = "页面跳转同步通知页面路径") - private String returnUrl; - - @Schema(description = "是否沙箱环境") - private boolean sandbox; - - @Schema(description = "超时时间(分钟)") - private Integer expireTime; - - @Schema(description = "可用支付方式") - private List payWayList; - - @Schema(description = "是否启用") - private Boolean activity; - - @Schema(description = "状态") - private String state; - - @Schema(description = "备注") - private String remark; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/merchant/MchApplicationParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/merchant/MchApplicationParam.java deleted file mode 100644 index 589d9f31..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/merchant/MchApplicationParam.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.bootx.platform.daxpay.param.merchant; - -import cn.bootx.platform.common.core.annotation.QueryParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 商户应用 - * - * @author xxm - * @since 2023-05-19 - */ -@Data -@QueryParam(type = QueryParam.CompareTypeEnum.LIKE) -@Schema(title = "商户应用") -@Accessors(chain = true) -public class MchApplicationParam { - - @Schema(description = "主键") - private Long id; - - @Schema(description = "应用编码") - private String code; - - @Schema(description = "名称") - private String name; - - @Schema(description = "商户号") - private String mchCode; - - @Schema(description = "状态类型") - private String state; - - @Schema(description = "备注") - private String remark; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/merchant/MerchantInfoParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/merchant/MerchantInfoParam.java deleted file mode 100644 index b66e7c52..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/merchant/MerchantInfoParam.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.bootx.platform.daxpay.param.merchant; - -import cn.bootx.platform.common.core.annotation.QueryParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import static cn.bootx.platform.common.core.annotation.QueryParam.CompareTypeEnum.*; - -/** - * 商户 - * - * @author xxm - * @since 2023-05-17 - */ -@Data -@Schema(title = "商户") -@Accessors(chain = true) -public class MerchantInfoParam { - - @Schema(description = "主键") - private Long id; - - @QueryParam(type = LIKE) - @Schema(description = "商户号") - private String code; - - @QueryParam(type = LIKE) - @Schema(description = "商户名称") - private String name; - - @QueryParam(type = LIKE) - @Schema(description = "商户简称") - private String shortName; - - @Schema(description = "类型") - private String type; - - @QueryParam(type = LIKE) - @Schema(description = "联系人姓名") - private String contactName; - - @QueryParam(type = LIKE) - @Schema(description = "联系人手机号") - private String contactTel; - - @Schema(description = "状态类型") - private String state; - - @Schema(description = "商户备注") - private String remark; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/payment/PaymentQuery.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/payment/PaymentQuery.java deleted file mode 100644 index d2d6a41c..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/payment/PaymentQuery.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.bootx.platform.daxpay.param.payment; - -import cn.bootx.platform.common.core.annotation.QueryParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - * @author xxm - * @since 2021/7/21 - */ -@Data -@Accessors(chain = true) -@QueryParam(type = QueryParam.CompareTypeEnum.LIKE) -@Schema(title = "支付记录查询参数") -public class PaymentQuery implements Serializable { - - private static final long serialVersionUID = 7071042101962400106L; - - @Schema(description = "支付单id") - private String paymentId; - - @Schema(description = "关联的业务id") - private String businessId; - - @Schema(description = "标题") - private String title; - - @Schema(description = "商户编码") - private String mchCode; - - @Schema(description = "商户编应用码") - private String mchAppCode; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/refund/RefundModeParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/refund/RefundModeParam.java deleted file mode 100644 index 6eb5a963..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/refund/RefundModeParam.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.bootx.platform.daxpay.param.refund; - -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.dto.payment.RefundableInfo; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherRefundParam; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletRefundParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * 退款方式参数 - * - * @author xxm - * @since 2022/3/2 - */ -@Data -@Accessors(chain = true) -@Schema(title = "退款方式参数") -public class RefundModeParam { - - /** - * @see PayChannelEnum#getCode() - */ - @Schema(description = "支付渠道") - private String payChannel; - - @Schema(description = "支付金额") - private BigDecimal amount; - - /** - * @see VoucherRefundParam - * @see WalletRefundParam - */ - @Schema(description = "扩展参数的json字符串") - private String extraParamsJson; - - - /** - * 转换成退款方式记录对象 - */ - public RefundableInfo toRefundableInfo() { - return new RefundableInfo().setPayChannel(getPayChannel()).setAmount(getAmount()); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/refund/RefundParam.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/refund/RefundParam.java deleted file mode 100644 index 466b1fa8..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/refund/RefundParam.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bootx.platform.daxpay.param.refund; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.List; - -/** - * 退款参数 - * - * @author xxm - * @since 2020/12/10 - */ -@Data -@Accessors(chain = true) -@Schema(title = "退款参数") -public class RefundParam { - - @Schema(description = "业务id") - private String businessId; - - @Schema(description = "各渠道退款参数") - private List refundModeParams; - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/task/PayExpiredTimeTask.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/task/PayExpiredTimeTask.java deleted file mode 100644 index d7238b89..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/task/PayExpiredTimeTask.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.bootx.platform.daxpay.task; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.quartz.DisallowConcurrentExecution; -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.PersistJobDataAfterExecution; -import org.springframework.stereotype.Component; - -/** - * 超时支付单任务撤销(2-5秒轮训一次) - * - * @author xxm - * @since 2022/7/12 - */ -@Slf4j -@Component -@DisallowConcurrentExecution -@PersistJobDataAfterExecution -@RequiredArgsConstructor -public class PayExpiredTimeTask implements Job { - - private final PayExpiredTimeTaskService payExpiredTimeTaskService; - - @Override - public void execute(JobExecutionContext context) { - payExpiredTimeTaskService.sync(); - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/task/PayExpiredTimeTaskService.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/task/PayExpiredTimeTaskService.java deleted file mode 100644 index a9be6366..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/task/PayExpiredTimeTaskService.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.bootx.platform.daxpay.task; - -import cn.bootx.platform.common.core.util.CollUtil; -import cn.bootx.platform.daxpay.core.payment.dao.PaymentExpiredTimeRepository; -import cn.bootx.platform.daxpay.event.PayEventSender; -import cn.bootx.platform.daxpay.event.domain.PayExpiredTimeEvent; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 支付超时任务撤销消息注册 - * - * @author xxm - * @since 2022/7/12 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayExpiredTimeTaskService { - - private final PaymentExpiredTimeRepository expiredTimeRepository; - - private final PayEventSender payEventSender; - - /** - * 定时查询, 如果有过时的发送到消息队列 - */ - public void sync() { - List paymentIds = expiredTimeRepository.retrieveExpiredKeys(LocalDateTime.now()) - .stream() - .map(Long::valueOf) - .collect(Collectors.toList()); - if (CollUtil.isNotEmpty(paymentIds)) { - expiredTimeRepository.removeKeys(paymentIds.stream().map(String::valueOf).toArray(String[]::new)); - paymentIds.forEach(id-> payEventSender.sendPayExpiredTime(new PayExpiredTimeEvent().setPaymentId(id))); - } - } - -} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/util/PayWayUtil.java b/dax-pay/src/main/java/cn/bootx/platform/daxpay/util/PayWayUtil.java deleted file mode 100644 index 02ab5b14..00000000 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/util/PayWayUtil.java +++ /dev/null @@ -1,158 +0,0 @@ -package cn.bootx.platform.daxpay.util; - -import cn.bootx.platform.common.core.util.BigDecimalUtil; -import cn.bootx.platform.common.core.util.CollUtil; -import cn.bootx.platform.common.core.util.LocalDateTimeUtil; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PayWayExtraCode; -import cn.bootx.platform.daxpay.exception.payment.PayAmountAbnormalException; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletPayParam; -import cn.bootx.platform.daxpay.param.pay.PayWayParam; -import cn.bootx.platform.daxpay.param.pay.PayParam; -import cn.bootx.platform.daxpay.param.channel.alipay.AliPayParam; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherPayParam; -import cn.bootx.platform.daxpay.param.channel.wechat.WeChatPayParam; -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import lombok.experimental.UtilityClass; - -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 支付方式工具类 - * - * @author xxm - * @since 2022/7/12 - */ -@UtilityClass -public class PayWayUtil { - - /** - * 获取支付宝的过期时间 - */ - public String getAliExpiredTime(Integer minute) { - return minute + "m"; - } - - /** - * 获取微信的过期时间 - */ - public String getWxExpiredTime(Integer minute) { - LocalDateTime time = LocalDateTimeUtil.offset(LocalDateTime.now(), minute, ChronoUnit.MINUTES); - return LocalDateTimeUtil.format(time, DatePattern.PURE_DATETIME_PATTERN); - } - - /** - * 获取支付单的超时时间 - */ - public LocalDateTime getPaymentExpiredTime(Integer minute) { - return LocalDateTimeUtil.offset(LocalDateTime.now(), minute, ChronoUnit.MINUTES); - } - - /** - * 判断是否有异步支付 - */ - public boolean isNotSync(List payWayParams) { - return payWayParams.stream() - .map(PayWayParam::getPayChannel) - .noneMatch(PayChannelEnum.ASYNC_TYPE_CODE::contains); - } - - /** - * 获取异步支付参数 - */ - public PayWayParam getAsyncPayModeParam(PayParam payParam) { - return payParam.getPayWayList() - .stream() - .filter(payMode -> PayChannelEnum.ASYNC_TYPE_CODE.contains(payMode.getPayChannel())) - .findFirst() - .orElseThrow(() -> new PayFailureException("支付方式数据异常")); - } - - /** - * 构建扩展参数构建 - * @param payChannel 支付渠道编码 - * @param map 支付方式扩展字段信息 key 为 PayModelExtraCode中定义的 - */ - public String buildExtraParamsJson(String payChannel, Map map) { - PayChannelEnum payChannelEnum = PayChannelEnum.findByCode(payChannel); - switch (payChannelEnum) { - case ALI: { - return JSONUtil.toJsonStr(new AliPayParam().setAuthCode(MapUtil.getStr(map,PayWayExtraCode.AUTH_CODE)) - .setReturnUrl(MapUtil.getStr(map,PayWayExtraCode.RETURN_URL))); - } - case WECHAT: { - return JSONUtil.toJsonStr(new WeChatPayParam().setOpenId(MapUtil.getStr(map,PayWayExtraCode.OPEN_ID)) - .setAuthCode(MapUtil.getStr(map,PayWayExtraCode.AUTH_CODE))); - } - case VOUCHER: { - String voucherNo = MapUtil.getStr(map,PayWayExtraCode.VOUCHER_NO); - @SuppressWarnings("unchecked") - List voucherNos = MapUtil.get(map,PayWayExtraCode.VOUCHER_NO_LIST,List.class); - List list = new ArrayList<>(); - if (CollUtil.isNotEmpty(voucherNos)){ - list.addAll(voucherNos); - } - else if (StrUtil.isNotBlank(voucherNo)) { - list.add(voucherNo); - } - return JSONUtil.toJsonStr(new VoucherPayParam().setCardNoList(list)); - } - case WALLET: { - String walletId = MapUtil.getStr(map,PayWayExtraCode.WALLET_ID); - String userId = MapUtil.getStr(map,PayWayExtraCode.USER_ID); - WalletPayParam walletPayParam = new WalletPayParam(); - - if (StrUtil.isNotBlank(walletId)){ - walletPayParam.setWalletId(Long.valueOf(walletId)); - } - - if (StrUtil.isNotBlank(userId)){ - walletPayParam.setUserId(Long.valueOf(userId)); - } - return JSONUtil.toJsonStr(walletPayParam); - } - default: { - return null; - } - } - } - - /** - * 检查支付金额 - */ - public void validationAmount(List payModeList) { - for (PayWayParam payWayParam : payModeList) { - // 支付金额小于等于零 - if (BigDecimalUtil.compareTo(payWayParam.getAmount(), BigDecimal.ZERO) < 1) { - throw new PayAmountAbnormalException(); - } - } - } - - /** - * 检查异步支付方式 - */ - public void validationAsyncPayMode(PayParam payParam) { - // 组合支付时只允许有一个异步支付方式 - List payModeList = payParam.getPayWayList(); - - long asyncPayModeCount = payModeList.stream() - .map(PayWayParam::getPayChannel) - .map(PayChannelEnum::findByCode) - .filter(PayChannelEnum.ASYNC_TYPE::contains) - .count(); - if (asyncPayModeCount > 1) { - throw new PayFailureException("组合支付时只允许有一个异步支付方式"); - } - } - -} diff --git a/dax-pay/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/dax-pay/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index c7c0e3e8..00000000 --- a/dax-pay/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -cn.bootx.platform.daxpay.DaxPayApplication diff --git a/dax-pay/src/main/resources/template/import/ImportVoucher.xlsx b/dax-pay/src/main/resources/template/import/ImportVoucher.xlsx deleted file mode 100644 index 2707d64f8b169c5c83e985a5a9dd79384b43ae0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10060 zcmeHtRaBhYvM#|jcmyZGgL{C+ElA_;?ldmJJ-7yU53a%8C1`?MaCg_+BzrGmud~Ow zk9UkaA6iT1|5eSJHL6Nl910o{;&BB4mw6xG|Gf~vAM`QrXAlskkPr}PeTSqNq8%R-|&KCjy5FkGne zO3)Wg71*h%9r0TttQ~EUIbs@=NCyhB?e7n`%_ZZu8|@U3ps<$~f7mjPmxdIcR!=ez zqkEC(^Hz*YEP7xJM|2C8D<$v_kosQDM*t<&7k)*qp1&wB#JSpA>{_Qx(h6~hDp1Ex z+%TB`9eeq9E~JlnGD!gP1Uy-Qt27A8L?W5>a&cs?Aa+=bmen5O#cgegcrl58>@rnS z^l(64_|40q>y2Av{aMcF8Rs_KWY+W%j^#58WA5Bl)sM!Qaxza4Ug z@yz00jIFBd_E3wgS}btMYrXLKx4PsNC?DvasXd1ffhzHet|G>!R{nUO z#^xam%nhY(Bp)H8QwS18dxMHaCsd+HS+6p9i@ExGAVyp03y}~my>TKw0ZC(K<9Dl^ z0mQ0rZBAj?$ZHBg6BCM9dL5HQ2?)so@2yo#`-)t)u}fZgXuoTfc}1Xy5Q|{=+S1FN z1#R>N<)vp4f&J(+=pJcLXaf|oXKg&1NUDiExEuznF?I9umU$L)3~Gm(cypnBaC#b( zeE5zG>h9hL>v5Cw1@0v?YSz3eZ`jvx;%V&9kIs+J?(eUzlb2+wo3z_PQX2H=Y|)I8 zicCn}OCEySM(Ym&7`_|JBiy&Zy3k>|7fdliI#@S9JIRl{1(`WAb(|K5=666VXE1ds z_a4i>7>sZBAyndA9>nz*{|-Du!STgC7;q0T_?UkK-rm*@Wbw<%BL+-;>9Ke({O$#M zxyf>;WCEWn7_n+pjco0bb|-i`M+nYloG#)faGz^v4y{@38_YVgcnPu7g_dY1qQU#F z8%A8qw@r2stf5_w>|~^cyufaRN3A*ALveBFMtqrlNJLdty7V4eO?UT7C4Ye&eMeMy zMV@eZ6F3!;wVKJ~s>lx~fl$}udfrB%?_qzq{VwiMYfbx7bt60=IJA!CCRVF8-y4tW za@4?L(tt$3PN|B5)Wj#KLDxqV2ybEBKu6$^hBjrNz@P4dE#=|r95kb|o{_M|jOQ1; zO&SyJcGC7EMjtE3B#NB5??kfukWlZEJj2k*qQSl79`X^ce~ueaV7Q#je?^RcCV2jv zz!79)W@~I=8MBNa{6jMQv7nUoE0}Thb31+I+DWVUub&|mg?E`xbx5q!op|q>qbH=yQNI;l z;`G3sa%?4hP!H|(DrNV`kP`nH!e-IyJ8B+tKDLJ4z;XPg3n}vfOWfA6rIK9Kd~{Bj z>NP?1{0B5&qg0(&6>ZlNr&3ggFjTa!eb2RO7xt)r9>pcv~J+e%8sSHkzb+ z^d&uBiqrkWt6OtP$i+D?Nc8kJnGBM!*6#S5+9Ragd&Kf`lz4Cx}nv(v<*_g}~* z3o)cwY-ij5T5%!B7i@IA8->B9$XV=DPI(g+6^g*FD);>-5*)QyYKqJl4rVSy1G@78 z(JpoQoOeUC$B~aWJ_~SJ4JcKcIZ?Y*i(KyZcABGHyZ8BG@-^Y#Pdv+6+g1(uv>So_ z_kZv@#$R3+EeZNgkLG_MdJ8vj(XB!eQye94tn`kZNTI5AI!OY<%p$y;Tymha$2xH@ zb8SR!y~Fu*=+fT$#F*Iyf)HyaslS-+}bOx~1W=Q-#O`_sb}MUmDS2()M1G zuAm1z0HR#9EMpZA+3@1ccfhOHjCR_3c|stPuJ4X-*ikD!@Vus3Si2I@$*yoEQ@@#{ zFSAfUQ7eLjiZ%QMM?<-d+GL}X0bng%X3-3@o)8)i?A)7sf2o67YMO8fpZxS(D zVlhcy;hXu^;+G1e`L$hJ+X(?*SJRZZUdY|#c{3z;n%5rymUT>BEyPl#h(@HPl8hML z3ACY9$q|uSq&$~Ji-O{uG7h2yECFWepM7#swzUc}npe%5zc;U3!pKj`Rc)@xtS|$= z@94uVW*@|$NC@B#uTEndxpSxK^2Zervd_NllB8B4L_rv(a6V71d=VMDn&1M*%)Xut z<&k$U_#h&=sZgb9quz)A@mO}0#MFNegEV*fQm~-q|JvA0|KHgEPaFH6@1Dn`7JNC` z85>v_JV|OV@A1$=VId&maerU=e~|qm{&nN*sVstUS@1kWmOaY$-OR?wG~{Sf5}8$W zb`)8rM+j1aZ8y3cxu<~*jgqq~BqW`@E`0orhn}7vlAtkG(lYdnkxd>TwPqdTY;804 z6umr!6l{$=Ztw2yuFW=e#Obn&*)jgckDR!fGl}N5K|X?a___=4T~ETEex2Eh;G=W8Z^ErnbJ1% zdKduLg$sWau*s@W%Rp6xSHHhiHK_htx4VSWyS!t2scKd^uW5e>tAA8zd%5q|ZThVX zSGw1jD^WIp%$L2;~yQv{YMp_9?lxzhCS}9@ZeuFM{jm* zgnPJLUv_1MYq_74K{rz#ro$hMe-gC|#Y+becv*JSm#pd&0c$b|b+?OJiAQLO=VdaW z8dC64Szj9C=5)$Q#?XU+01zwG5m&oX)UWh5ybh- zd_R*fAFl0|pvTNdSwmat#u-!EeuP;#SZ2O3GEfCYy1hg|@KOmpbZf_B((K0c%VLaj z!z<5hE7ir0MVL-PZ27b!3X}RAekGrYL^ig#j+S@Pd%RRTUn$3OQD?kY2vMlVfVot6 zD7cq~+cJP%tiKF^6Ckt;XM;=}G)k*vaEQNe_{klPXUQp}0VKOzdvnQePk#h?ta9skbrncS1G7px0!`<106U)NDd9?mogbiMG5457D-*}55$_D;muk`HvHHB^PQM*dLsK1k_ zETKu$hMPPKuwT~zh+Z6k0_*0$)olu6i6VJUQ=8KHLCB#RW|#4xDKxGEKGhi^A74`B z#mngEuFdoZCvz;x7?74``jp!J@5=kkD_qyV3FpQqK`YeW zl{uuzO?`n1j4(wS81eT{5EJn1N{s&OQTN;s@D4_-V6-n=S;a^DvL_pYv%Z8h3;jr8 zblMNyg7YRZR+d{v@U;EsGn}%(sg5Og{DSo12(j8DdThRy*0bcVUlVMCZ4>Rf#2I`l zSK>*Dfdj?BQR--#Ijn4T*b_xGRJ(Vd=P4XNDoFIFMN)Oq-=}@ayuhsWR(@@YdTI56 zntm){?6g*zIDjg~_xk~&F`mSpr?J;N&3ONG??TfPn%?I7ukVda;;a0lvuCoNVPKuV z#YW_J$e>Qx7dAtBidg*6C5E-WCv)a7jbA56rb=)I%`g zdsi(g>PaQFJg985+vZU48cjAs4fX{#f_+ArYM_Bqj%zv;HGF}=>>ZP2;#H^C(wx~% zGs$FNKmvQ%n{QKL!#B1=faVJhHMVfLRJ&n>w`_;A74=_wqgEV!Qg;Ze)2wgk+MjNtrZ6 zSInI1wl+f{%5cz+pfEp0igmQ<5MuP7h@l*^(cNjEs!5G(BHQb>5o+?$9f zBdqil9LmKm%ux^X-sCw#(ZT1u(uS7lR&sS&B5@2Ea=*G>({r87z!&yx_LXKEVF_tE z9rD_NBd%8#*QbujPEUF%*6yew24o2CkIK^Qw*A@WuJ)CBN6}VErT#`%$56zp-THI+ zj7V=EnzBgpd+2RHeeCnMVK$fzMwB@l*Xss?BWv5O%?3kQo>;c5((cj$|YlAc898bRD+LJ3KSh;j^xcB zR@xSKbRS}&Ijs{zdP(Apgf~+!8#fe4hz!_P=t5;9LqFv$*@&D_nv_w320wY&F1rK& zqBkZbpxM?28W4$E%x+^vQwM6Bhs$uwG<8ycCyWM@IxC=xXEy~zR!X`%P29Oi)`P1* zhP7-o4Ji>i>qmz|aoEiafH0^uNi-CzK*qYNrnUEXuLyGaFP6~m!hPPJ8e?}_ z(|h`)nh`=b@3raBWcA(;XZYGvDMy(OG-=l!yeFbbSSH3MTt_%Og+CPZrlm1jI-UFJ z+54f;;+S1sUNG0z^;29Md#EGxDIbD{fMVW0m8h3SFhDH=LN~%Mov2G;N|Zb}Xr@;h zt1^<9!uYL#%y(hT1|= zTCk9pY8fZTp5rCGtsO4%@34GURTQMSF-j~UpBwO@4hZ~OV?GQxgbPCrt_Hqp(5U)8 z>nBI9k_On9DwkBe#%wmGR2@{R2oGz-L|WC`>U%vWHtcW+FE|V`_&6ed;LEpbr`LGH z_w0nWfNJGg6@d7MydP|!JzwT_jlYi@dDWpmd;wpbSV2f^8N{$Lf-T>apDs<@5(gA0 zM>&`R*D0$@HJ=KWgbPX$Gdx{6miaJQofsdb5zcU)Kg=p|f~Z*aUf=4=dN}rpScHOu zMSw`Axt&^?41DYtc<9z)A*KSm4Mr#Js1?DXnmuu6eYwejRaY$tk1AL%yj7zB@*w} zzo>7hrc;r=8;3Sg|5g|kB|&Dz;eBkIskS}RcG{2}M8B;dD1@~@ZGYB(-jI(uTqPI| zVE$YPElO5hy$wWSOfA}_=yAf3%|9L$9>@EkR8dhWC{b12@1OLAcZc3QYd!BcLLCnO zhdpn0^K+Q|iWSzRnVpE)Lw}JoTQ#)+tI|gC!t%m{K2@$to3tf4#_`+Yu zz=DcXb4O!JMRCVAPlm}nTHI*-r8aV<$q>l1o*2l3i$q1c)6KS>xNu>fhv_T0117Re$@B3@fV@Frw;K)Xj44}NuwFf5o4sK62SKr<HR_O4~UJN_d7QU^-c=@7(d<0DmAa{Y|gu`qAS@58#xmq`vpWcCysdT zUEQw<(E9}7zQ3qtofILW^`cH}&`Zun(qXvYJiT36{9t7!)+s>g%w{pO(09TU>V8K+ z(tp{}g2qq4y@g6E0mB+8Eb0W`CZF0m)K@9h%Cd4ZoZERsUw~vCg98Uc#1a;OLXCj{ zoh#TG>LeTl3BjT9OvaM=lX)Y#e}z{c`?Dl@)?yAW2kkZ?-k5hu(AYfd($i%;!mY3h zrQ^elNj!EBp24~Q*g85Yq%y{in@sk0GGZ)$%dL6AQ6QDRaVg!$$SO})jn?S2) zskxP95{i!(E7OO>+GJ zLcQF6@8+`E<=7i%kwD;q*>VD5Ep_m*r|D&9ypURM4=C$`BT8rXeb{2y(mc#19g08= z&4V#0&t!jJWky(h+Qi~jz1$-G4rc?deO6^d5hPpSWt@NrXy%ZjmglHdrT-A@r()H6`~bN3Z^L zyE%RS0P*)Mu)tXM{WUoIQwA3@AKP`{8iuX0j*Wr7oSlt{rO~fs&>})gtdkzk@50*= zewy*u?DfxS;**A)Zg($V}}qZG3ilxUXL_EgML5FSG}Jl2&g% zZ~>hdUx?;xO0N=yK0h)gZx!9_?UcRXZ>(vktO!I`F40THq2YI>hH#ud#(*iypEiZJ z*0uO51TPpUjmJTTSwAXv_dKo|UAG&S=a=;MvyVRZrb#ma?k zz^1?8s5i7Hx5eRI22!5$ViXWZrva5xS8c4Z7je)k9^f-qjjs3YB&leloF@bex?)UR z!scowfT^qV#xYd5>>Mf3Pb=6&id}BQqj``0uIB<;(Ld(X${Au6Eh25d?0sP-0*dR!M(9k|o7Do+(eHN|z z!21Agy;;%`8-3c2?#-^GzME&f#KQ;~W|Ycaa}%Eo_4j(X@Pw=Nq(xW#2HbffO@`dC zMsIr=Z(dNZL$l1GtCRA)w`ft*4=87Ot9Iyy?PJ{=U!QfZm>F7q(fj|X2LrZ{!EP-LB zcdPP|DfZ?O*dacySyL@&XF{;B?}u&dxd#p$#R7_o4QWt>)cxY+g67uLTdb)Qdeni0 zL8R&5u6W1CH`?1GN7bqZL^*s(Gj|?H7<)QbW1YEKv_x%=X$l?xXDt6!&-^Dii7xkF z-+*EK4sK}RfZxHf;5XS{z5ExtP0<6UznaK?_dfA%G_xiG2$7YPe&(~MP`&_nG&RP= ztqzaHw%}U-B})lb?*zV!)KQ_E4ynlkI^^$8Mnr+S(wjC~%q5J6)*s!RV1>*zbkq(; zT0NlycJD18{EH3h1ntM8F|b8oP1oJ?Sk_n^V&5!gMSs{5FjDE4-db2UQp*6YI2Cqi zq4XLiZY#fn@6kotWWq=b zuXfYN#h>od89r$XfSh68*n&d>KG;PcyS{1yAWJ&~OFJ!jXDb6+jmNN19W!9r{@8H; ze2p4egUulQrGN@Dm^+q6b_=fd+*hy@)fw5Z<)D+76b)uNv=UtjN@P&x9mPA3RL~!-;tt&N?9G(=m zke3E`yW=w|W>fAnF&_(rOoo z@n?`&zpk_2(jU`ZA8htp!2cYKz?|UqILM+x@MmcHyV9q@>5=2N zQnx>NejTR&rtI;w{$7vD9@k$6Z2qqA>4?oE@o#K`_t)%KiLt$!Q@Z&KV~8R+e1Ij1N>f(56up4>VqTEe`EMNN;!mo30+S&`ZUHp z>iLb*;9uGPBjP=k^E7YzQ%)u-Nbs0R=3JWBYZ8u!0{_8(xM1+)IU zTlIGjdD^e~Q{(Ml+5YTaJ>Bxt1n5rzyLi9!{uQ?Ww&}-#j^FFo8TxJEN9I4qJN~}& zrvo03yuYpH_aD4}j(a@a{?ms2pHgnX;TsIwUv}_I%CGkQ|6a-_{69+h)fbi)hk49m Rz?TFjL^OEMS#KV{{T~MdOfLWc diff --git a/dax-pay/src/main/resources/templates/errorCashier.html b/dax-pay/src/main/resources/templates/errorCashier.html deleted file mode 100644 index 3e4433e5..00000000 --- a/dax-pay/src/main/resources/templates/errorCashier.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - 请使用微信或支付宝扫码打开 - - -

请使用微信或支付宝扫码打开!

- - \ No newline at end of file diff --git a/dax-pay/src/main/resources/templates/wechatJsapiPay.html b/dax-pay/src/main/resources/templates/wechatJsapiPay.html deleted file mode 100644 index 356c3582..00000000 --- a/dax-pay/src/main/resources/templates/wechatJsapiPay.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - 微信支付 - - -

-
-

- - - diff --git a/dax-start/pom.xml b/dax-start/pom.xml deleted file mode 100644 index 893854c2..00000000 --- a/dax-start/pom.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - 4.0.0 - - cn.bootx.platform - bootx-dax-pay - 1.0.2 - - dax-start - - - - - - org.projectlombok - lombok - provided - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - - - org.springframework.boot - spring-boot-starter-undertow - - - - - cn.bootx.platform - dax-pay - ${dax.version} - - - - - - xml-apis - xml-apis - ${xml-apis.version} - - - - com.plumelog - plumelog-logback - ${plumelog.version} - - - - - - dax-start - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/dax-start/src/main/resources/mapper/wallet/WalletMapper.xml b/dax-start/src/main/resources/mapper/wallet/WalletMapper.xml deleted file mode 100644 index e5d066dd..00000000 --- a/dax-start/src/main/resources/mapper/wallet/WalletMapper.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - update pay_wallet - set freeze_balance = #{amount}, - last_modifier = #{operator}, - last_modified_time = #{date}, - version = (version+1) - where id = #{walletId} and (balance - freeze_balance - #{amount}) >= 0 - - - - update pay_wallet - set freeze_balance = (freeze_balance - #{amount}), - last_modifier = #{operator}, - last_modified_time = #{date}, - version = (version+1) - where id = #{walletId} and (freeze_balance - #{amount}) >= 0 - - - - - update pay_wallet - set balance = (balance - #{amount}), - last_modifier = #{operator}, - last_modified_time = #{date}, - version = (version+1) - where id = #{walletId} and (balance - freeze_balance- #{amount}) >= 0 - - - - - update pay_wallet - set balance = (balance - #{amount}), - freeze_balance = (freeze_balance - #{amount}), - last_modifier = #{operator}, - last_modified_time = #{date}, - version = (version+1) - where id = #{walletId} and (freeze_balance- #{amount}) >= 0 - - - - - update pay_wallet - set balance = (balance + #{amount}), - last_modifier = #{operator}, - last_modified_time = #{date}, - version = (version+1) - where id = #{walletId} - - - - - update pay_wallet - set balance = (balance - #{amount}), - last_modifier = #{operator}, - last_modified_time = #{date}, - version = (version+1) - where id = #{walletId} - - - - - - - diff --git a/daxpay-common/pom.xml b/daxpay-common/pom.xml new file mode 100644 index 00000000..940243ab --- /dev/null +++ b/daxpay-common/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + cn.bootx.platform + dax-pay + 2.0.0 + + + daxpay-common + 支付公共的资源包 + + + + + cn.bootx.platform + daxpay-core + ${dax.version} + + + + org.projectlombok + lombok + provided + + + + org.projectlombok + lombok-mapstruct-binding + provided + + + + org.mapstruct + mapstruct-processor + provided + + + + diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayAmountAbnormalException.java b/daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayAmountAbnormalException.java similarity index 55% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayAmountAbnormalException.java rename to daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayAmountAbnormalException.java index 3b53176d..0186dd94 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayAmountAbnormalException.java +++ b/daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayAmountAbnormalException.java @@ -1,7 +1,7 @@ -package cn.bootx.platform.daxpay.exception.payment; +package cn.bootx.platform.daxpay.exception.pay; import cn.bootx.platform.common.core.exception.FatalException; -import cn.bootx.platform.daxpay.code.PaymentErrorCode; +import cn.bootx.platform.daxpay.code.DaxPayErrorCode; /** * 异常金额 @@ -12,11 +12,11 @@ import cn.bootx.platform.daxpay.code.PaymentErrorCode; public class PayAmountAbnormalException extends FatalException { public PayAmountAbnormalException(String msg) { - super(PaymentErrorCode.PAYMENT_AMOUNT_ABNORMAL, msg); + super(DaxPayErrorCode.PAYMENT_AMOUNT_ABNORMAL, msg); } public PayAmountAbnormalException() { - super(PaymentErrorCode.PAYMENT_AMOUNT_ABNORMAL, "异常金额"); + super(DaxPayErrorCode.PAYMENT_AMOUNT_ABNORMAL, "异常金额"); } } diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayFailureException.java b/daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayFailureException.java similarity index 55% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayFailureException.java rename to daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayFailureException.java index 48cc654b..281f3bd3 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayFailureException.java +++ b/daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayFailureException.java @@ -1,7 +1,7 @@ -package cn.bootx.platform.daxpay.exception.payment; +package cn.bootx.platform.daxpay.exception.pay; import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.daxpay.code.PaymentErrorCode; +import cn.bootx.platform.daxpay.code.DaxPayErrorCode; /** * 付款错误 @@ -12,11 +12,11 @@ import cn.bootx.platform.daxpay.code.PaymentErrorCode; public class PayFailureException extends BizException { public PayFailureException(String message) { - super(PaymentErrorCode.PAY_FAILURE, message); + super(DaxPayErrorCode.PAY_FAILURE, message); } public PayFailureException() { - super(PaymentErrorCode.PAY_FAILURE, "支付失败"); + super(DaxPayErrorCode.PAY_FAILURE, "支付失败"); } } diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayHasExistedException.java b/daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayHasExistedException.java similarity index 56% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayHasExistedException.java rename to daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayHasExistedException.java index 1df43119..5273c22c 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayHasExistedException.java +++ b/daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayHasExistedException.java @@ -1,7 +1,7 @@ -package cn.bootx.platform.daxpay.exception.payment; +package cn.bootx.platform.daxpay.exception.pay; import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.daxpay.code.PaymentErrorCode; +import cn.bootx.platform.daxpay.code.DaxPayErrorCode; /** * 付款已存在 @@ -12,7 +12,7 @@ import cn.bootx.platform.daxpay.code.PaymentErrorCode; public class PayHasExistedException extends BizException { public PayHasExistedException() { - super(PaymentErrorCode.PAYMENT_HAS_EXISTED, "付款已存在"); + super(DaxPayErrorCode.PAYMENT_HAS_EXISTED, "付款已存在"); } } diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayIsProcessingException.java b/daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayIsProcessingException.java similarity index 56% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayIsProcessingException.java rename to daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayIsProcessingException.java index 095d4cbc..8b3b17f1 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayIsProcessingException.java +++ b/daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayIsProcessingException.java @@ -1,7 +1,7 @@ -package cn.bootx.platform.daxpay.exception.payment; +package cn.bootx.platform.daxpay.exception.pay; import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.daxpay.code.PaymentErrorCode; +import cn.bootx.platform.daxpay.code.DaxPayErrorCode; /** * 付款正在处理中 @@ -12,7 +12,7 @@ import cn.bootx.platform.daxpay.code.PaymentErrorCode; public class PayIsProcessingException extends BizException { public PayIsProcessingException() { - super(PaymentErrorCode.PAYMENT_IS_PROCESSING, "付款正在处理中"); + super(DaxPayErrorCode.PAYMENT_IS_PROCESSING, "付款正在处理中"); } } diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayNotExistedException.java b/daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayNotExistedException.java similarity index 55% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayNotExistedException.java rename to daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayNotExistedException.java index 719f9a94..24bbce95 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayNotExistedException.java +++ b/daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayNotExistedException.java @@ -1,7 +1,7 @@ -package cn.bootx.platform.daxpay.exception.payment; +package cn.bootx.platform.daxpay.exception.pay; import cn.bootx.platform.common.core.exception.BizException; -import cn.bootx.platform.daxpay.code.PaymentErrorCode; +import cn.bootx.platform.daxpay.code.DaxPayErrorCode; /** * 付款记录不存在 @@ -12,7 +12,7 @@ import cn.bootx.platform.daxpay.code.PaymentErrorCode; public class PayNotExistedException extends BizException { public PayNotExistedException() { - super(PaymentErrorCode.PAYMENT_RECORD_NOT_EXISTED, "付款记录不存在"); + super(DaxPayErrorCode.PAYMENT_RECORD_NOT_EXISTED, "付款记录不存在"); } } diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayUnsupportedMethodException.java b/daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayUnsupportedMethodException.java similarity index 57% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayUnsupportedMethodException.java rename to daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayUnsupportedMethodException.java index 145fc3af..4a6ee110 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/exception/payment/PayUnsupportedMethodException.java +++ b/daxpay-common/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayUnsupportedMethodException.java @@ -1,7 +1,7 @@ -package cn.bootx.platform.daxpay.exception.payment; +package cn.bootx.platform.daxpay.exception.pay; import cn.bootx.platform.common.core.exception.FatalException; -import cn.bootx.platform.daxpay.code.PaymentErrorCode; +import cn.bootx.platform.daxpay.code.DaxPayErrorCode; /** * 付款方式不支持异常 @@ -12,7 +12,7 @@ import cn.bootx.platform.daxpay.code.PaymentErrorCode; public class PayUnsupportedMethodException extends FatalException { public PayUnsupportedMethodException() { - super(PaymentErrorCode.PAYMENT_METHOD_UNSUPPORT, "不支持的支付方式"); + super(DaxPayErrorCode.PAYMENT_METHOD_UNSUPPORT, "不支持的支付方式"); } } diff --git a/daxpay-core/pom.xml b/daxpay-core/pom.xml new file mode 100644 index 00000000..81a8f506 --- /dev/null +++ b/daxpay-core/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + cn.bootx.platform + dax-pay + 2.0.0 + + + daxpay-core + 支付核心依赖包 + + + + + cn.bootx.platform + bootx-common-core + + + + org.projectlombok + lombok + provided + + + + org.projectlombok + lombok-mapstruct-binding + provided + + + + org.mapstruct + mapstruct-processor + provided + + + diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/PaymentErrorCode.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/DaxPayErrorCode.java similarity index 53% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/code/PaymentErrorCode.java rename to daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/DaxPayErrorCode.java index e97f4ddd..15982831 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/PaymentErrorCode.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/DaxPayErrorCode.java @@ -6,9 +6,8 @@ package cn.bootx.platform.daxpay.code; * @author xxm * @since 2020/12/7 */ -public interface PaymentErrorCode { +public interface DaxPayErrorCode { - // 支付过程相关 /** * 支付金额异常 */ @@ -44,34 +43,5 @@ public interface PaymentErrorCode { */ int PAYMENT_METHOD_UNSUPPORT = 28106; - /** - * 钱包已存在 - */ - int WALLET_ALREADY_EXISTS = 28814; - - /** - * 钱包不存在 - */ - int WALLET_NOT_EXISTS = 28815; - - /** - * 钱包已被禁用 - */ - int WALLET_BANNED = 28816; - - /** - * 钱包余额不足 - */ - int WALLET_BALANCE_NOT_ENOUGH = 28817; - - /** - * wallet 信息不存在 - */ - int WALLET_INFO_NOT_EXISTS = 28819; - - /** - * 钱包日志异常(类型不正确,或者充值金额小于0等场景) - */ - int WALLET_LOG_ERROR = 28827; } diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayChannelEnum.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/PayChannelEnum.java similarity index 56% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayChannelEnum.java rename to daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/PayChannelEnum.java index f3fc6580..0364f65d 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayChannelEnum.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/PayChannelEnum.java @@ -1,15 +1,16 @@ -package cn.bootx.platform.daxpay.code.pay; +package cn.bootx.platform.daxpay.code; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; +import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import lombok.Getter; import lombok.RequiredArgsConstructor; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Objects; /** - * 支付渠道枚举 + * 支付通道枚举 * * @author xxm * @since 2021/7/26 @@ -18,14 +19,17 @@ import java.util.Objects; @RequiredArgsConstructor public enum PayChannelEnum { - ALI("ali_pay", "支付宝"), WECHAT("wechat_pay", "微信支付"), UNION_PAY("union_pay", "云闪付"), CASH("cash_pay", "现金支付"), - WALLET("wallet_pay", "钱包支付"), VOUCHER("voucher_pay", "储值卡支付"), CREDIT_CARD("credit_pay", "信用卡支付"), - APPLE_PAY("apple_pay", "苹果支付"), AGGREGATION("aggregation_pay", "聚合支付"); + ALI("ali_pay", "支付宝"), + WECHAT("wechat_pay", "微信支付"), + UNION_PAY("union_pay", "云闪付"), + CASH("cash_pay", "现金支付"), + WALLET("wallet_pay", "钱包支付"), + VOUCHER("voucher_pay", "储值卡支付"); - /** 支付渠道字符编码 */ + /** 支付通道编码 */ private final String code; - /** 名称 */ + /** 支付通道名称 */ private final String name; /** @@ -50,9 +54,8 @@ public enum PayChannelEnum { public static final String UA_WECHAT_PAY = "MicroMessenger"; /** 异步支付渠道 */ - public static final List ASYNC_TYPE = Arrays.asList(ALI, WECHAT, UNION_PAY, APPLE_PAY); + public static final List ASYNC_TYPE = Collections.unmodifiableList(Arrays.asList(ALI, WECHAT, UNION_PAY)); - public static final List ASYNC_TYPE_CODE = Arrays.asList(ALI.code, WECHAT.code, UNION_PAY.code, - APPLE_PAY.code); + public static final List ASYNC_TYPE_CODE = Collections.unmodifiableList(Arrays.asList(ALI.code, WECHAT.code, UNION_PAY.code)); } diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayWayEnum.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/PayWayEnum.java similarity index 88% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayWayEnum.java rename to daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/PayWayEnum.java index 26e70cfa..d6da579e 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/code/pay/PayWayEnum.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/PayWayEnum.java @@ -1,6 +1,6 @@ -package cn.bootx.platform.daxpay.code.pay; +package cn.bootx.platform.daxpay.code; -import cn.bootx.platform.daxpay.exception.payment.PayFailureException; +import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayAmountAbnormalException.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayAmountAbnormalException.java new file mode 100644 index 00000000..0186dd94 --- /dev/null +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayAmountAbnormalException.java @@ -0,0 +1,22 @@ +package cn.bootx.platform.daxpay.exception.pay; + +import cn.bootx.platform.common.core.exception.FatalException; +import cn.bootx.platform.daxpay.code.DaxPayErrorCode; + +/** + * 异常金额 + * + * @author xxm + * @since 2020/12/8 + */ +public class PayAmountAbnormalException extends FatalException { + + public PayAmountAbnormalException(String msg) { + super(DaxPayErrorCode.PAYMENT_AMOUNT_ABNORMAL, msg); + } + + public PayAmountAbnormalException() { + super(DaxPayErrorCode.PAYMENT_AMOUNT_ABNORMAL, "异常金额"); + } + +} diff --git a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayFailureException.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayFailureException.java new file mode 100644 index 00000000..281f3bd3 --- /dev/null +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayFailureException.java @@ -0,0 +1,22 @@ +package cn.bootx.platform.daxpay.exception.pay; + +import cn.bootx.platform.common.core.exception.BizException; +import cn.bootx.platform.daxpay.code.DaxPayErrorCode; + +/** + * 付款错误 + * + * @author xxm + * @since 2020/12/8 + */ +public class PayFailureException extends BizException { + + public PayFailureException(String message) { + super(DaxPayErrorCode.PAY_FAILURE, message); + } + + public PayFailureException() { + super(DaxPayErrorCode.PAY_FAILURE, "支付失败"); + } + +} diff --git a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayHasExistedException.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayHasExistedException.java new file mode 100644 index 00000000..5273c22c --- /dev/null +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayHasExistedException.java @@ -0,0 +1,18 @@ +package cn.bootx.platform.daxpay.exception.pay; + +import cn.bootx.platform.common.core.exception.BizException; +import cn.bootx.platform.daxpay.code.DaxPayErrorCode; + +/** + * 付款已存在 + * + * @author xxm + * @since 2020/12/8 + */ +public class PayHasExistedException extends BizException { + + public PayHasExistedException() { + super(DaxPayErrorCode.PAYMENT_HAS_EXISTED, "付款已存在"); + } + +} diff --git a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayIsProcessingException.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayIsProcessingException.java new file mode 100644 index 00000000..8b3b17f1 --- /dev/null +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayIsProcessingException.java @@ -0,0 +1,18 @@ +package cn.bootx.platform.daxpay.exception.pay; + +import cn.bootx.platform.common.core.exception.BizException; +import cn.bootx.platform.daxpay.code.DaxPayErrorCode; + +/** + * 付款正在处理中 + * + * @author xxm + * @since 2020/12/8 + */ +public class PayIsProcessingException extends BizException { + + public PayIsProcessingException() { + super(DaxPayErrorCode.PAYMENT_IS_PROCESSING, "付款正在处理中"); + } + +} diff --git a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayNotExistedException.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayNotExistedException.java new file mode 100644 index 00000000..24bbce95 --- /dev/null +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayNotExistedException.java @@ -0,0 +1,18 @@ +package cn.bootx.platform.daxpay.exception.pay; + +import cn.bootx.platform.common.core.exception.BizException; +import cn.bootx.platform.daxpay.code.DaxPayErrorCode; + +/** + * 付款记录不存在 + * + * @author xxm + * @since 2020/12/8 + */ +public class PayNotExistedException extends BizException { + + public PayNotExistedException() { + super(DaxPayErrorCode.PAYMENT_RECORD_NOT_EXISTED, "付款记录不存在"); + } + +} diff --git a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayUnsupportedMethodException.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayUnsupportedMethodException.java new file mode 100644 index 00000000..4a6ee110 --- /dev/null +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/exception/pay/PayUnsupportedMethodException.java @@ -0,0 +1,18 @@ +package cn.bootx.platform.daxpay.exception.pay; + +import cn.bootx.platform.common.core.exception.FatalException; +import cn.bootx.platform.daxpay.code.DaxPayErrorCode; + +/** + * 付款方式不支持异常 + * + * @author xxm + * @since 2020/12/9 + */ +public class PayUnsupportedMethodException extends FatalException { + + public PayUnsupportedMethodException() { + super(DaxPayErrorCode.PAYMENT_METHOD_UNSUPPORT, "不支持的支付方式"); + } + +} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/alipay/AliPayParam.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel/AliPayParam.java similarity index 76% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/alipay/AliPayParam.java rename to daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel/AliPayParam.java index 3821832a..9eda654e 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/alipay/AliPayParam.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel/AliPayParam.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.param.channel.alipay; +package cn.bootx.platform.daxpay.param.channel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -20,7 +20,4 @@ public class AliPayParam implements Serializable { @Schema(description = "授权码(主动扫描用户的付款码)") private String authCode; - @Schema(description = "页面跳转同步通知页面路径") - private String returnUrl; - } diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherPayParam.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel/VoucherPayParam.java similarity index 73% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherPayParam.java rename to daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel/VoucherPayParam.java index 0b479604..368ba757 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/voucher/VoucherPayParam.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel/VoucherPayParam.java @@ -1,11 +1,9 @@ -package cn.bootx.platform.daxpay.param.channel.voucher; +package cn.bootx.platform.daxpay.param.channel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; -import java.util.List; - /** * 储值卡支付参数 * @@ -18,6 +16,6 @@ import java.util.List; public class VoucherPayParam { @Schema(description = "储值卡号") - private List cardNoList; + private String cardNo; } diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletPayParam.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel/WalletPayParam.java similarity index 90% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletPayParam.java rename to daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel/WalletPayParam.java index 8b86502a..4968d6f0 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wallet/WalletPayParam.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel/WalletPayParam.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.param.channel.wallet; +package cn.bootx.platform.daxpay.param.channel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wechat/WeChatPayParam.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel/WeChatPayParam.java similarity index 88% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wechat/WeChatPayParam.java rename to daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel/WeChatPayParam.java index 4040e34f..34a20d67 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/channel/wechat/WeChatPayParam.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/channel/WeChatPayParam.java @@ -1,4 +1,4 @@ -package cn.bootx.platform.daxpay.param.channel.wechat; +package cn.bootx.platform.daxpay.param.channel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/pay/PayParam.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/PayParam.java similarity index 88% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/param/pay/PayParam.java rename to daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/PayParam.java index a2afb41e..0d5bd069 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/pay/PayParam.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/PayParam.java @@ -7,7 +7,6 @@ import lombok.experimental.Accessors; import javax.validation.Valid; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; -import java.io.Serializable; import java.util.List; /** @@ -19,15 +18,14 @@ import java.util.List; @Data @Accessors(chain = true) @Schema(title = "支付参数") -public class PayParam implements Serializable { - - private static final long serialVersionUID = 3895679513150533566L; +public class PayParam { @Schema(description = "商户编码") @NotEmpty(message = "商户应用不可为空") private String mchCode; @Schema(description = "商户应用编码") + @NotEmpty(message = "商户应用编码不可为空") private String mchAppCode; @@ -46,5 +44,4 @@ public class PayParam implements Serializable { @NotEmpty(message = "支付方式信息参数不可为空") @Valid private List payWayList; - } diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/pay/PayWayParam.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/PayWayParam.java similarity index 58% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/param/pay/PayWayParam.java rename to daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/PayWayParam.java index 061642a4..b6ce566f 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/param/pay/PayWayParam.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/PayWayParam.java @@ -1,14 +1,11 @@ package cn.bootx.platform.daxpay.param.pay; -import cn.bootx.platform.daxpay.code.pay.PayChannelEnum; -import cn.bootx.platform.daxpay.code.pay.PayWayEnum; -import cn.bootx.platform.daxpay.core.pay.convert.PayConvert; -import cn.bootx.platform.daxpay.dto.payment.PayChannelInfo; -import cn.bootx.platform.daxpay.dto.payment.RefundableInfo; -import cn.bootx.platform.daxpay.param.channel.alipay.AliPayParam; -import cn.bootx.platform.daxpay.param.channel.voucher.VoucherPayParam; -import cn.bootx.platform.daxpay.param.channel.wallet.WalletPayParam; -import cn.bootx.platform.daxpay.param.channel.wechat.WeChatPayParam; +import cn.bootx.platform.daxpay.code.PayChannelEnum; +import cn.bootx.platform.daxpay.code.PayWayEnum; +import cn.bootx.platform.daxpay.param.channel.AliPayParam; +import cn.bootx.platform.daxpay.param.channel.VoucherPayParam; +import cn.bootx.platform.daxpay.param.channel.WalletPayParam; +import cn.bootx.platform.daxpay.param.channel.WeChatPayParam; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; @@ -57,19 +54,4 @@ public class PayWayParam implements Serializable { */ @Schema(description = "扩展参数的json字符串") private String extraParamsJson; - - /** - * 转换为 支付渠道信息 对象 - */ - public PayChannelInfo toPayTypeInfo() { - return PayConvert.CONVERT.convert(this); - } - - /** - * 转换为可退款信息 - */ - public RefundableInfo toRefundableInfo() { - return new RefundableInfo().setPayChannel(getPayChannel()).setAmount(getAmount()); - } - } diff --git a/daxpay-single/daxpay-single-admin/pom.xml b/daxpay-single/daxpay-single-admin/pom.xml new file mode 100644 index 00000000..af190e44 --- /dev/null +++ b/daxpay-single/daxpay-single-admin/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + cn.bootx.platform + daxpay-single + 2.0.0 + + + daxpay-single-admin + + + + + cn.bootx.platform + daxpay-single-service + ${dax.version} + + + + cn.bootx.platform + service-iam + ${bootx-platform.version} + + + + + com.baomidou + lock4j-redis-template-spring-boot-starter + ${lock4j.version} + + + + + cn.bootx.platform + service-baseapi + ${bootx-platform.version} + + + + + cn.bootx.platform + service-iam + ${bootx-platform.version} + + + + + cn.bootx.platform + service-notice + ${bootx-platform.version} + + + + + cn.bootx.platform + common-starter-file + + + + + cn.bootx.platform + common-websocket + + + + + diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/DaxPayApplication.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/DaxPaySingleGatewayApp.java similarity index 70% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/DaxPayApplication.java rename to daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/DaxPaySingleGatewayApp.java index 02ecbfaf..771e2e10 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/DaxPayApplication.java +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/DaxPaySingleGatewayApp.java @@ -1,19 +1,15 @@ package cn.bootx.platform.daxpay; -import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.annotations.Mapper; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; /** - * DaxPay 支付开发平台 - * + * 管理端 * @author xxm - * @since 2023/4/20 + * @since 2023/12/14 */ -@Slf4j @ConfigurationPropertiesScan @MapperScan(annotationClass = Mapper.class) -public class DaxPayApplication { - +public class DaxPaySingleGatewayApp { } diff --git a/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/openapi/controller/UniPayController.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/openapi/controller/UniPayController.java new file mode 100644 index 00000000..13a936ab --- /dev/null +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/openapi/controller/UniPayController.java @@ -0,0 +1,65 @@ +package cn.bootx.platform.daxpay.openapi.controller; + +import cn.bootx.platform.common.core.annotation.IgnoreAuth; +import cn.bootx.platform.common.core.rest.Res; +import cn.bootx.platform.common.core.rest.ResResult; +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 统一支付接口 + * @author xxm + * @since 2023/12/15 + */ +@IgnoreAuth +@Tag(name = "统一支付接口") +@RestController +@RequestMapping("/unipay") +@RequiredArgsConstructor +public class UniPayController { + + @Operation(summary = "统一下单") + @PostMapping("/pay") + public ResResult pay(){ + return Res.ok(); + } + @Operation(summary = "简单下单") + @PostMapping("/simplePay") + public ResResult simplePay(){ + return Res.ok(); + } + @Operation(summary = "订单撤销") + @PostMapping("/cancel") + public ResResult cancel(){ + return Res.ok(); + } + @Operation(summary = "订单关闭") + @PostMapping("/close") + public ResResult close(){ + return Res.ok(); + } + @Operation(summary = "统一退款") + @PostMapping("/refund") + public ResResult refund(){ + return Res.ok(); + } + @Operation(summary = "简单退款") + @PostMapping("/simpleRefund") + public ResResult simpleRefund(){ + return Res.ok(); + } + @Operation(summary = "支付状态同步") + @PostMapping("/syncPay") + public ResResult syncPay(){ + return Res.ok(); + } + @Operation(summary = "退款状态同步") + @PostMapping("/syncRefund") + public ResResult syncRefund(){ + return Res.ok(); + } +} diff --git a/daxpay-single/daxpay-single-admin/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/daxpay-single/daxpay-single-admin/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..88c2aa85 --- /dev/null +++ b/daxpay-single/daxpay-single-admin/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +cn.bootx.platform.daxpay.DaxPaySingleGatewayApp diff --git a/daxpay-single/daxpay-single-gateway/pom.xml b/daxpay-single/daxpay-single-gateway/pom.xml new file mode 100644 index 00000000..130cdce5 --- /dev/null +++ b/daxpay-single/daxpay-single-gateway/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + cn.bootx.platform + daxpay-single + 2.0.0 + + + daxpay-single-gateway + + + + cn.bootx.platform + daxpay-single-service + ${dax.version} + + + + diff --git a/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/DaxpaySingleGatewayApp.java b/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/DaxpaySingleGatewayApp.java new file mode 100644 index 00000000..a4dc4c68 --- /dev/null +++ b/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/DaxpaySingleGatewayApp.java @@ -0,0 +1,14 @@ +package cn.bootx.platform.daxpay; + +import org.apache.ibatis.annotations.Mapper; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.context.properties.ConfigurationPropertiesScan; +/** + * 网关端 + * @author xxm + * @since 2023/12/15 + */ +@ConfigurationPropertiesScan +@MapperScan(annotationClass = Mapper.class) +public class DaxpaySingleGatewayApp { +} diff --git a/daxpay-single/daxpay-single-gateway/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/daxpay-single/daxpay-single-gateway/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..a015acf4 --- /dev/null +++ b/daxpay-single/daxpay-single-gateway/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +cn.bootx.platform.daxpay.DaxpaySingleGatewayApp diff --git a/daxpay-single/daxpay-single-service/pom.xml b/daxpay-single/daxpay-single-service/pom.xml new file mode 100644 index 00000000..a3181c1c --- /dev/null +++ b/daxpay-single/daxpay-single-service/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + cn.bootx.platform + daxpay-single + 2.0.0 + + + daxpay-single-service + + + + + cn.bootx.platform + daxpay-core + ${dax.version} + + + + cn.bootx.platform + daxpay-common + ${dax.version} + + + + com.baomidou + mybatis-plus-boot-starter + + + diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/DaxpaySingleServiceApp.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/DaxpaySingleServiceApp.java new file mode 100644 index 00000000..2981cfd6 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/DaxpaySingleServiceApp.java @@ -0,0 +1,15 @@ +package cn.bootx.platform.daxpay; + +import org.apache.ibatis.annotations.Mapper; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.context.properties.ConfigurationPropertiesScan; + +/** + * 业务服务 + * @author xxm + * @since 2023/12/15 + */ +@ConfigurationPropertiesScan +@MapperScan(annotationClass = Mapper.class) +public class DaxpaySingleServiceApp { +} diff --git a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/service/UnionPayService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayService.java similarity index 60% rename from dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/service/UnionPayService.java rename to daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayService.java index 12b11f15..0541abd3 100644 --- a/dax-pay/src/main/java/cn/bootx/platform/daxpay/core/channel/union/service/UnionPayService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/pay/service/PayService.java @@ -1,16 +1,17 @@ -package cn.bootx.platform.daxpay.core.channel.union.service; +package cn.bootx.platform.daxpay.core.pay.service; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** + * 支付流程服务 + * * @author xxm - * @since 2022/3/11 + * @since 2020/12/9 */ @Slf4j @Service @RequiredArgsConstructor -public class UnionPayService { - +public class PayService { } diff --git a/daxpay-single/daxpay-single-service/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/daxpay-single/daxpay-single-service/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..88c2aa85 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +cn.bootx.platform.daxpay.DaxPaySingleGatewayApp diff --git a/daxpay-single/daxpay-single-start/pom.xml b/daxpay-single/daxpay-single-start/pom.xml new file mode 100644 index 00000000..14a99763 --- /dev/null +++ b/daxpay-single/daxpay-single-start/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + cn.bootx.platform + daxpay-single + 2.0.0 + + + daxpay-single-start + + + + + cn.bootx.platform + daxpay-single-gateway + ${dax.version} + + + + cn.bootx.platform + daxpay-single-admin + ${dax.version} + + + + cn.bootx.platform + common-starter-quartz + + + + cn.bootx.platform + common-starter-code-gen + + + + diff --git a/dax-start/src/main/java/cn/bootx/platform/daxpay/DaxPayStart.java b/daxpay-single/daxpay-single-start/src/main/java/cn/bootx/platform/daxpay/DaxpaySingleStart.java similarity index 91% rename from dax-start/src/main/java/cn/bootx/platform/daxpay/DaxPayStart.java rename to daxpay-single/daxpay-single-start/src/main/java/cn/bootx/platform/daxpay/DaxpaySingleStart.java index d1c7847a..210360ec 100644 --- a/dax-start/src/main/java/cn/bootx/platform/daxpay/DaxPayStart.java +++ b/daxpay-single/daxpay-single-start/src/main/java/cn/bootx/platform/daxpay/DaxpaySingleStart.java @@ -11,17 +11,16 @@ import java.net.InetAddress; import java.net.UnknownHostException; /** - * DaxPay 支付开发平台 - * + * DaxPay 单商户模式启动类 * @author xxm - * @since 2023/4/20 + * @since 2023/12/15 */ @Slf4j @SpringBootApplication -public class DaxPayStart { +public class DaxpaySingleStart { public static void main(String[] args) throws UnknownHostException { - ConfigurableApplicationContext application = SpringApplication.run(DaxPayStart.class, args); + ConfigurableApplicationContext application = SpringApplication.run(DaxpaySingleStart.class, args); Environment env = application.getEnvironment(); // 环境变量 String appName = env.getProperty("spring.application.name"); @@ -38,5 +37,4 @@ public class DaxPayStart { log.info("\n----------------------------------------------------------\n\t" + "{}{} \n" + "----------------------------------------------------------", appInfo, swagger); } - } diff --git a/daxpay-single/daxpay-single-start/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/daxpay-single/daxpay-single-start/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..88c2aa85 --- /dev/null +++ b/daxpay-single/daxpay-single-start/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +cn.bootx.platform.daxpay.DaxPaySingleGatewayApp diff --git a/dax-start/src/main/resources/application-dev.yml b/daxpay-single/daxpay-single-start/src/main/resources/application-dev.yml similarity index 79% rename from dax-start/src/main/resources/application-dev.yml rename to daxpay-single/daxpay-single-start/src/main/resources/application-dev.yml index 25107144..806b3e24 100644 --- a/dax-start/src/main/resources/application-dev.yml +++ b/daxpay-single/daxpay-single-start/src/main/resources/application-dev.yml @@ -1,5 +1,5 @@ server: - port: 9898 + port: 9000 spring: datasource: dynamic: @@ -74,11 +74,6 @@ spring: threadPriority: 5 threadsInheritContextClassLoaderOfInitializingThread: true # 开发时显示debug日志 -mybatis-table: - scan-package: cn.bootx.platform.daxpay - database-type: mysql - update-type: update -# 开发时显示debug日志 logging: level: cn.bootx.**: debug @@ -92,15 +87,12 @@ bootx: version: 1.2.3 title: bootx开发平台单体版 description: bootx-platform开发平台单体版 - # basic认证 - basic: - enable: true # 多模块扫码 base-packages: + "[支付服务]": cn.bootx.platform.daxpay "[基础API]": cn.bootx.platform.baseapi "[身份识别和管理]": cn.bootx.platform.iam "[消息服务]": cn.bootx.platform.notice - "[支付服务]": cn.bootx.platform.daxpay "[第三方对接]": - cn.bootx.platform.starter.dingtalk - cn.bootx.platform.starter.wecom @@ -130,29 +122,6 @@ bootx: # 显示详细异常 show-full-message: true starter: - # 三方平台 - third: - # 钉钉 - ding-talk: - app-key: ?? - app-secret: ?? - #微信(公众平台) - wechat: - app-id: ?? - app-secret: ?? - token: ?? - encoding-aes-key: ?? - # 企业微信 - wecom: - agent-id: 1000003 - corp-id: ?? - corp-secret: ?? - token: ?? - encoding-aes-key: ?? - # 微信小程序 - wechat-applet: - app-id: ?? - app-secret: ?? # 认证 auth: default-password: 123456 @@ -181,23 +150,6 @@ bootx: file-path: /data/ip2region/ip2region.xdb # 查询方式 search-type: cache - # 文件上传 - file-upload: - upload-type: local - server-url: http://127.0.0.1:8080 - local: - local-path: /data/file - mongo: - bucket: fs - minio: - # 地址 - endpoint: http://127.0.0.1:9000 - # 账号 - access-key: root - # 密码 - access-secret: password - # 存储桶 需要至少三位 - bucket: bootx # 数据权限 data-perm: # 需要符合AES密钥的要求 diff --git a/dax-start/src/main/resources/application.yml b/daxpay-single/daxpay-single-start/src/main/resources/application.yml similarity index 88% rename from dax-start/src/main/resources/application.yml rename to daxpay-single/daxpay-single-start/src/main/resources/application.yml index 23d9abd6..a02bafa5 100644 --- a/dax-start/src/main/resources/application.yml +++ b/daxpay-single/daxpay-single-start/src/main/resources/application.yml @@ -1,10 +1,12 @@ spring: application: - name: dax-pay + name: dax-pay-single profiles: active: dev config: - use-legacy-processing: true +# use-legacy-processing: true + activate: + on-profile: dev servlet: multipart: max-file-size: 100MB diff --git a/dax-start/src/main/resources/banner.txt b/daxpay-single/daxpay-single-start/src/main/resources/banner.txt similarity index 100% rename from dax-start/src/main/resources/banner.txt rename to daxpay-single/daxpay-single-start/src/main/resources/banner.txt diff --git a/dax-start/src/main/resources/logback-spring.xml b/daxpay-single/daxpay-single-start/src/main/resources/logback-spring.xml similarity index 94% rename from dax-start/src/main/resources/logback-spring.xml rename to daxpay-single/daxpay-single-start/src/main/resources/logback-spring.xml index 6e9bb100..55989954 100644 --- a/dax-start/src/main/resources/logback-spring.xml +++ b/daxpay-single/daxpay-single-start/src/main/resources/logback-spring.xml @@ -2,7 +2,7 @@ - + diff --git a/daxpay-single/pom.xml b/daxpay-single/pom.xml new file mode 100644 index 00000000..b2b9cce0 --- /dev/null +++ b/daxpay-single/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + cn.bootx.platform + dax-pay + 2.0.0 + + + daxpay-single + pom + + daxpay-single-service + daxpay-single-gateway + daxpay-single-admin + daxpay-single-start + + + + + + org.projectlombok + lombok + provided + + + + org.projectlombok + lombok-mapstruct-binding + provided + + + + + org.mapstruct + mapstruct-processor + provided + + + + diff --git a/pom.xml b/pom.xml index 75a2bc05..ca7b1352 100644 --- a/pom.xml +++ b/pom.xml @@ -6,20 +6,21 @@ org.springframework.boot spring-boot-starter-parent - 2.7.16 + 2.7.18 4.0.0 cn.bootx.platform - bootx-dax-pay + dax-pay pom - 1.0.2 + 2.0.0 - dax-pay - dax-start + daxpay-core + daxpay-common + daxpay-single @@ -28,8 +29,8 @@ 1.8 - 1.3.5 - 1.0.2 + 1.3.6 + 2.0.0 1.7.30 @@ -48,6 +49,7 @@ + cn.bootx.platform bootx-platform-parent @@ -59,28 +61,6 @@ - - - central - https://maven.aliyun.com/nexus/content/groups/public - - true - - - false - - - - snapshots - https://maven.aliyun.com/nexus/content/groups/public - - false - - - true - - -