From 1111b6b754c6f316d18443ad851054ec3660bd3f Mon Sep 17 00:00:00 2001 From: nws <3239709711@qq.com> Date: Sun, 14 Jan 2024 01:37:37 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E6=94=AF=E4=BB=98=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E9=85=8D=E7=BD=AE/=E9=80=9A=E9=81=93=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5,=20=E9=80=80=E6=AC=BE=E9=87=91=E9=A2=9D?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=A4=B1=E8=B4=A5=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _doc/Task.md | 9 ++-- .../system/PlatformConfigController.java | 6 +-- .../daxpay/code/PaySyncStatusEnum.java | 2 +- .../bootx/platform/daxpay/util/PayUtil.java | 8 ++++ .../controller/PayReturnController.java | 33 ++++++++++++++ .../service/common/context/PlatformLocal.java | 2 +- .../channel/alipay/entity/AliPayConfig.java | 7 +-- .../alipay/service/AliPayConfigService.java | 14 ++++-- .../alipay/service/AliPayRefundService.java | 6 +-- .../channel/wechat/convert/WeChatConvert.java | 2 - .../wechat/entity/WeChatPayConfig.java | 4 ++ .../service/WeChatPayConfigService.java | 8 ++++ .../wechat/service/WeChatPaySyncService.java | 5 +++ .../wechat/service/WechatRefundService.java | 25 ++++++----- .../service/PayRefundAssistService.java | 1 + .../refund/service/PayRefundService.java | 3 +- .../repair/service/PayRepairService.java | 7 ++- .../record/sync/entity/PaySyncRecord.java | 2 +- .../system/config/entity/PlatformConfig.java | 5 ++- .../payinfo/dao/PayChannelInfoManager.java | 17 +++++-- .../system/payinfo/entity/PayChannelInfo.java | 4 ++ .../service/PayChannelInfoService.java | 13 +++++- .../dto/channel/alipay/AliPayConfigDto.java | 10 +++-- .../channel/wechat/WeChatPayConfigDto.java | 19 ++++---- .../dto/record/sync/PaySyncRecordDto.java | 44 +++++++++++-------- .../dto/system/config/PlatformConfigDto.java | 14 +++--- .../channel/alipay/AliPayConfigParam.java | 3 ++ .../channel/wechat/WeChatPayConfigParam.java | 16 ++++--- .../system/config/PlatformConfigParam.java | 3 ++ 29 files changed, 209 insertions(+), 83 deletions(-) create mode 100644 daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/PayReturnController.java diff --git a/_doc/Task.md b/_doc/Task.md index 8661ffa56..28451ddbd 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -53,10 +53,13 @@ - [x] (前端) 退款订单 - [x] (前端) 支付通道配置列表 - 2024-01-13: - - [ ] (前端) 微信/支付宝支付通道配置 - - [ ] 支付通道支持停用 + - [x] (前端) 微信/支付宝支付通道配置 + - [x] 支付通道支持停用 + - [x] 请求支付网关时区退款号以R开头, 用于与支付ID的区分 + - [ ] 优化支付相关订单和记录的查询条件 + - [ ] (前端) 平台配置 - **任务池** - - [ ] 支付宝关闭支付时支持撤销方式, + - [ ] 支付宝关闭支付时支持撤销方式, - [ ] 支持转账操作, 通过支付通道专有参数进行实现, 转账时只能单个通道进行操作 - [ ] 支付成功回调后, 如果订单已超时, 则进入待退款订单中,提示进行退款,或者自动退款 - [ ] 退款状态同步逻辑 diff --git a/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/system/PlatformConfigController.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/system/PlatformConfigController.java index f1c8df976..21f0d5226 100644 --- a/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/system/PlatformConfigController.java +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/bootx/platform/daxpay/admin/controller/system/PlatformConfigController.java @@ -11,18 +11,18 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; /** - * 平台配置项 + * 支付平台配置控制器 * @author xxm * @since 2024/1/2 */ -@Tag(name = "平台配置项") +@Tag(name = "支付平台配置控制器") @RestController @RequestMapping("/platform/config") @RequiredArgsConstructor public class PlatformConfigController { private final PlatformConfigService platformConfigService; - @Operation(summary = "平台配置项") + @Operation(summary = "获取平台配置") @GetMapping("/getConfig") public ResResult getConfig(){ return Res.ok(platformConfigService.getConfig().toDto()); diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PaySyncStatusEnum.java b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PaySyncStatusEnum.java index 2d0b053e0..66fb113fb 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PaySyncStatusEnum.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/code/PaySyncStatusEnum.java @@ -8,7 +8,7 @@ import java.util.Arrays; import java.util.Objects; /** - * 支付同步状态 + * 支付同步结果 * * @author xxm * @since 2021/4/21 diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/util/PayUtil.java b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/util/PayUtil.java index 27dd58316..844330e76 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/util/PayUtil.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/bootx/platform/daxpay/util/PayUtil.java @@ -7,6 +7,7 @@ import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.param.pay.PayChannelParam; import cn.bootx.platform.daxpay.param.pay.PayParam; import cn.hutool.core.date.DatePattern; +import cn.hutool.core.util.IdUtil; import lombok.experimental.UtilityClass; import java.time.LocalDateTime; @@ -86,4 +87,11 @@ public class PayUtil { .map(PayChannelParam::getChannel) .noneMatch(PayChannelEnum.ASYNC_TYPE_CODE::contains); } + + /** + * 生成退款号 + */ + public String getRefundNo(){ + return "R" + IdUtil.getSnowflakeNextIdStr(); + } } diff --git a/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/PayReturnController.java b/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/PayReturnController.java new file mode 100644 index 000000000..9b1ad1239 --- /dev/null +++ b/daxpay-single/daxpay-single-gateway/src/main/java/cn/bootx/platform/daxpay/gateway/controller/PayReturnController.java @@ -0,0 +1,33 @@ +package cn.bootx.platform.daxpay.gateway.controller; + +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; +import org.springframework.web.servlet.ModelAndView; + +/** + * 支付同步通知控制器 + * @author xxm + * @since 2024/1/13 + */ +@Tag(name = "支付同步通知控制器") +@RestController +@RequestMapping("/pay/return") +@RequiredArgsConstructor +public class PayReturnController { + + @Operation(summary = "支付宝同步通知") + @GetMapping("/alipay") + public ModelAndView alipay(){ + return null; + } + + @Operation(summary = "微信同步通知") + @GetMapping("/wechat") + public ModelAndView wechat(){ + return null; + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/PlatformLocal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/PlatformLocal.java index 073bfe160..35e002aed 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/PlatformLocal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/common/context/PlatformLocal.java @@ -28,6 +28,6 @@ public class PlatformLocal { /** 支付通知地址 */ private String notifyUrl; - /** 订单支付超时 */ + /** 订单支付超时(分钟) */ private Integer orderTimeout; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliPayConfig.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliPayConfig.java index 6a6b1ee71..7e1c014cc 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliPayConfig.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/entity/AliPayConfig.java @@ -37,6 +37,10 @@ public class AliPayConfig extends MpBaseEntity implements EntityBaseFunction payWays; - @DbColumn(comment = "状态") - private String status; - /** 备注 */ @DbColumn(comment = "备注") private String remark; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayConfigService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayConfigService.java index f9bf5dd0a..830aa54bb 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayConfigService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayConfigService.java @@ -3,10 +3,12 @@ package cn.bootx.platform.daxpay.service.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.dto.LabelValue; +import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.service.code.AliPayCode; import cn.bootx.platform.daxpay.service.code.AliPayWay; import cn.bootx.platform.daxpay.service.core.channel.alipay.dao.AliPayConfigManager; import cn.bootx.platform.daxpay.service.core.channel.alipay.entity.AliPayConfig; +import cn.bootx.platform.daxpay.service.core.system.payinfo.service.PayChannelInfoService; import cn.bootx.platform.daxpay.service.param.channel.alipay.AliPayConfigParam; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; @@ -36,6 +38,7 @@ public class AliPayConfigService { /** 默认支付宝配置的主键ID */ private final static Long ID = 0L; private final AliPayConfigManager alipayConfigManager; + private final PayChannelInfoService payChannelInfoService; /** * 修改 @@ -43,6 +46,11 @@ public class AliPayConfigService { @Transactional(rollbackFor = Exception.class) public void update(AliPayConfigParam param) { AliPayConfig alipayConfig = alipayConfigManager.findById(ID).orElseThrow(() -> new DataNotExistException("支付宝配置不存在")); + // 启用或停用 + if (!Objects.equals(param.getEnable(), alipayConfig.getEnable())){ + payChannelInfoService.setEnable(PayChannelEnum.ALI.getCode(), param.getEnable()); + } + BeanUtil.copyProperties(param, alipayConfig, CopyOptions.create().ignoreNullValue()); alipayConfigManager.updateById(alipayConfig); } @@ -52,9 +60,9 @@ public class AliPayConfigService { */ public List findPayWays() { return AliPayWay.getPayWays() - .stream() - .map(e -> new LabelValue(e.getName(),e.getCode())) - .collect(Collectors.toList()); + .stream() + .map(e -> new LabelValue(e.getName(),e.getCode())) + .collect(Collectors.toList()); } /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayRefundService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayRefundService.java index 19d0d9087..899693671 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayRefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/alipay/service/AliPayRefundService.java @@ -1,11 +1,11 @@ package cn.bootx.platform.daxpay.service.core.channel.alipay.service; +import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.service.code.AliPayCode; import cn.bootx.platform.daxpay.service.common.context.AsyncRefundLocal; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.exception.pay.PayFailureException; -import cn.hutool.core.util.IdUtil; +import cn.bootx.platform.daxpay.util.PayUtil; import com.alipay.api.AlipayApiException; import com.alipay.api.domain.AlipayTradeRefundModel; import com.alipay.api.response.AlipayTradeRefundResponse; @@ -38,7 +38,7 @@ public class AliPayRefundService { // 设置退款信息 AsyncRefundLocal refundInfo = PaymentContextLocal.get().getAsyncRefundInfo(); - refundInfo.setRefundNo(IdUtil.getSnowflakeNextIdStr()); + refundInfo.setRefundNo(PayUtil.getRefundNo()); refundModel.setOutRequestNo(refundInfo.getRefundNo()); try { AlipayTradeRefundResponse response = AliPayApi.tradeRefundToResponse(refundModel); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/convert/WeChatConvert.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/convert/WeChatConvert.java index 572f83665..731e415a2 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/convert/WeChatConvert.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/convert/WeChatConvert.java @@ -25,6 +25,4 @@ public interface WeChatConvert { WeChatPayOrderDto convert(WeChatPayOrder in); - WeChatPayOrder convert(WeChatPayOrderDto in); - } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WeChatPayConfig.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WeChatPayConfig.java index afeef2a42..abbabea26 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WeChatPayConfig.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/entity/WeChatPayConfig.java @@ -41,6 +41,10 @@ public class WeChatPayConfig extends MpBaseEntity implements EntityBaseFunction< @DbColumn(comment = "微信应用appId") private String wxAppId; + /** 是否启用 */ + @DbColumn(comment = "是否启用") + private Boolean enable; + /** * 服务器异步通知页面路径, 需要填写本网关服务的地址, 不可以直接填写业务系统的地址 * 1. 需http://或者https://格式的完整路径, diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayConfigService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayConfigService.java index 9eea83297..4ff616c0b 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayConfigService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPayConfigService.java @@ -2,10 +2,12 @@ package cn.bootx.platform.daxpay.service.core.channel.wechat.service; import cn.bootx.platform.common.core.exception.DataNotExistException; import cn.bootx.platform.common.core.rest.dto.LabelValue; +import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.service.code.WeChatPayWay; import cn.bootx.platform.daxpay.service.core.channel.wechat.dao.WeChatPayConfigManager; import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayConfig; import cn.bootx.platform.daxpay.exception.pay.PayFailureException; +import cn.bootx.platform.daxpay.service.core.system.payinfo.service.PayChannelInfoService; import cn.bootx.platform.daxpay.service.param.channel.wechat.WeChatPayConfigParam; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; @@ -15,6 +17,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -30,6 +33,7 @@ public class WeChatPayConfigService { /** 默认微信支付配置的主键ID */ private final static Long ID = 0L; private final WeChatPayConfigManager weChatPayConfigManager; + private final PayChannelInfoService payChannelInfoService; /** * 修改 @@ -37,6 +41,10 @@ public class WeChatPayConfigService { @Transactional(rollbackFor = Exception.class) public void update(WeChatPayConfigParam param) { WeChatPayConfig weChatPayConfig = weChatPayConfigManager.findById(ID).orElseThrow(() -> new PayFailureException("微信支付配置不存在")); + // 启用或停用 + if (!Objects.equals(param.getEnable(), weChatPayConfig.getEnable())){ + payChannelInfoService.setEnable(PayChannelEnum.WECHAT.getCode(), param.getEnable()); + } BeanUtil.copyProperties(param, weChatPayConfig, CopyOptions.create().ignoreNullValue()); weChatPayConfigManager.updateById(weChatPayConfig); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPaySyncService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPaySyncService.java index 99474ba3d..d11346cd7 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPaySyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WeChatPaySyncService.java @@ -58,6 +58,7 @@ public class WeChatPaySyncService { log.warn("疑似未查询到订单:{}", result); return syncResult.setSyncStatus(PaySyncStatusEnum.NOT_FOUND); } + // 查询到订单的状态 String tradeStatus = result.get(WeChatPayCode.TRADE_STATE); // 支付完成 if (Objects.equals(tradeStatus, WeChatPayCode.TRADE_SUCCESS) || Objects.equals(tradeStatus, WeChatPayCode.TRADE_ACCEPT)) { @@ -89,4 +90,8 @@ public class WeChatPaySyncService { } return syncResult; } + + /** + * 退款查询 + */ } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WechatRefundService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WechatRefundService.java index ea4ce34d2..6bf0276fa 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WechatRefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/channel/wechat/service/WechatRefundService.java @@ -2,15 +2,16 @@ package cn.bootx.platform.daxpay.service.core.channel.wechat.service; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.code.PayRefundStatusEnum; +import cn.bootx.platform.daxpay.exception.pay.PayFailureException; import cn.bootx.platform.daxpay.service.code.WeChatPayCode; import cn.bootx.platform.daxpay.service.common.context.AsyncRefundLocal; -import cn.bootx.platform.daxpay.service.common.entity.RefundableInfo; import cn.bootx.platform.daxpay.service.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.service.core.channel.wechat.entity.WeChatPayConfig; +import cn.bootx.platform.daxpay.service.core.order.pay.dao.PayOrderChannelManager; import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.exception.pay.PayFailureException; +import cn.bootx.platform.daxpay.service.core.order.pay.entity.PayOrderChannel; +import cn.bootx.platform.daxpay.util.PayUtil; 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; @@ -22,7 +23,6 @@ import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; import java.util.Map; -import java.util.Objects; import java.util.Optional; /** @@ -35,20 +35,21 @@ import java.util.Optional; @RequiredArgsConstructor public class WechatRefundService { + private final PayOrderChannelManager payOrderChannelManager; + /** - * 退款 + * 退款方法 + * 微信需要同时传输订单金额或退款金额 */ - public void refund(PayOrder payOrder, int amount, - WeChatPayConfig weChatPayConfig) { - RefundableInfo refundableInfo = payOrder.getRefundableInfos().stream() - .filter(o -> Objects.equals(o.getChannel(), PayChannelEnum.WECHAT.getCode())) - .findFirst() + public void refund(PayOrder payOrder, int amount, WeChatPayConfig weChatPayConfig) { + PayOrderChannel orderChannel = payOrderChannelManager.findByPaymentIdAndChannel(payOrder.getId(), PayChannelEnum.WECHAT.getCode()) .orElseThrow(() -> new PayFailureException("未找到微信支付的详细信息")); String refundFee = String.valueOf(amount); - String totalFee = refundableInfo.getAmount().toString(); + String totalFee = String.valueOf(orderChannel.getAmount()); // 设置退款信息 AsyncRefundLocal refundInfo = PaymentContextLocal.get().getAsyncRefundInfo(); - refundInfo.setRefundNo(IdUtil.getSnowflakeNextIdStr()); + refundInfo.setRefundNo(PayUtil.getRefundNo()); + Map params = RefundModel.builder() .appid(weChatPayConfig.getWxAppId()) .mch_id(weChatPayConfig.getWxMchId()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundAssistService.java index 7c06f9ad4..ddb94b0bb 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundAssistService.java @@ -127,6 +127,7 @@ public class PayRefundAssistService { PayRefundOrder refundOrder = new PayRefundOrder() .setRefundRequestNo(asyncRefundInfo.getRefundNo()) .setAmount(amount) + .setRefundableBalance(payOrder.getRefundableBalance()) .setPaymentId(payOrder.getId()) .setBusinessNo(payOrder.getBusinessNo()) .setRefundTime(LocalDateTime.now()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundService.java index a399f814e..6925c1066 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/refund/service/PayRefundService.java @@ -91,7 +91,8 @@ public class PayRefundService { // 全部退款根据支付订单的退款信息构造退款参数 List channelParams = payOrder.getRefundableInfos() .stream() - .map(o -> new RefundChannelParam().setChannel(o.getChannel()) + .map(o -> new RefundChannelParam() + .setChannel(o.getChannel()) .setAmount(o.getAmount())) .collect(Collectors.toList()); param.setRefundChannels(channelParams); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java index af0eb52e8..2e6ede152 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/payment/repair/service/PayRepairService.java @@ -18,6 +18,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -71,8 +72,10 @@ public class PayRepairService { break; case REFUND: this.refund(order, repairStrategies); +// repairResult.setRepairStatus(PayStatusEnum.REFUNDED); break; default: + repairResult.setRepairStatus(repairResult.getBeforeStatus()); break; } this.saveRecord(order, repairParam, repairResult); @@ -147,13 +150,15 @@ public class PayRepairService { * 保存记录 */ private void saveRecord(PayOrder order, PayRepairParam repairParam, RepairResult repairResult){ + // 修复后的状态 + String afterStatus = Optional.ofNullable(repairResult.getRepairStatus()).map(PayStatusEnum::getCode).orElse(null); PayRepairRecord payRepairRecord = new PayRepairRecord() .setPaymentId(order.getId()) .setAsyncChannel(order.getAsyncChannel()) .setBusinessNo(order.getBusinessNo()) .setBeforeStatus(repairResult.getBeforeStatus().getCode()) - .setAfterStatus(repairResult.getRepairStatus().getCode()) + .setAfterStatus(afterStatus) .setAmount(repairParam.getAmount()) .setRepairSource(repairParam.getRepairSource().getCode()) .setRepairType(repairParam.getRepairType().getCode()); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/sync/entity/PaySyncRecord.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/sync/entity/PaySyncRecord.java index 3794984c2..b42e5017f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/sync/entity/PaySyncRecord.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/record/sync/entity/PaySyncRecord.java @@ -51,7 +51,7 @@ public class PaySyncRecord extends MpCreateEntity implements EntityBaseFunction< * 网关返回状态 * @see PaySyncStatusEnum */ - @DbColumn(comment = "同步状态") + @DbColumn(comment = "网关返回状态") private String gatewayStatus; /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/system/config/entity/PlatformConfig.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/system/config/entity/PlatformConfig.java index 60d2b3410..64af8bef5 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/system/config/entity/PlatformConfig.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/system/config/entity/PlatformConfig.java @@ -39,7 +39,10 @@ public class PlatformConfig extends MpBaseEntity implements EntityBaseFunction

{ + + /** + * 根据code查询 + */ + public Optional findByCode(String code){ + return findByField(PayChannelInfo::getCode, code); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/system/payinfo/entity/PayChannelInfo.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/system/payinfo/entity/PayChannelInfo.java index 0fa678cee..c03df448f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/system/payinfo/entity/PayChannelInfo.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/core/system/payinfo/entity/PayChannelInfo.java @@ -45,6 +45,10 @@ public class PayChannelInfo extends MpBaseEntity implements EntityBaseFunction

payWays; - @Schema(description = "是否启用") - private Boolean activity; - - @Schema(description = "状态") - private String state; - @Schema(description = "备注") private String remark; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/record/sync/PaySyncRecordDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/record/sync/PaySyncRecordDto.java index 173ae573a..075218697 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/record/sync/PaySyncRecordDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/record/sync/PaySyncRecordDto.java @@ -3,14 +3,13 @@ package cn.bootx.platform.daxpay.service.dto.record.sync; import cn.bootx.platform.common.core.rest.dto.BaseDto; import cn.bootx.platform.daxpay.code.PayChannelEnum; import cn.bootx.platform.daxpay.code.PaySyncStatusEnum; -import cn.bootx.table.modify.annotation.DbColumn; +import cn.bootx.table.modify.mysql.annotation.DbMySqlFieldType; +import cn.bootx.table.modify.mysql.constants.MySqlFieldTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; -import java.time.LocalDateTime; - /** * 支付同步记录 * @author xxm @@ -23,44 +22,53 @@ import java.time.LocalDateTime; public class PaySyncRecordDto extends BaseDto { /** 支付记录id */ - @Schema(description = "支付记录id") + @Schema(description ="支付记录id") private Long paymentId; - @Schema(description = "业务号") + /** 业务号 */ + @Schema(description ="业务号") private String businessNo; /** * 同步通道 * @see PayChannelEnum#getCode() */ - @Schema(description = "同步通道") + @Schema(description ="同步通道") private String asyncChannel; - /** 同步消息 */ - @Schema(description = "同步消息") + /** 通知消息 */ + @DbMySqlFieldType(MySqlFieldTypeEnum.LONGTEXT) + @Schema(description ="通知消息") private String syncInfo; /** - * 同步状态 + * 网关返回状态 * @see PaySyncStatusEnum */ - @Schema(description = "同步状态") - private String status; + @Schema(description ="网关返回状态") + private String gatewayStatus; /** * 支付单如果状态不一致, 是否进行修复 */ - @DbColumn(comment = "是否进行修复") + @Schema(description ="是否进行修复") private boolean repairOrder; - @Schema(description = "错误消息") + /** 支付单修复前状态 */ + @Schema(description ="支付单修复前状态") + private String beforeStatus; + /** 支付单修复后状态 */ + @Schema(description ="支付单修复后状态") + private String afterStatus; + + @Schema(description ="错误消息") private String errorMsg; - /** 同步时间 */ - @Schema(description = "同步时间") - private LocalDateTime syncTime; - /** 客户端IP */ - @Schema(description = "客户端IP") + @Schema(description ="客户端IP") private String clientIp; + + /** 请求链路ID */ + @Schema(description ="请求链路ID") + private String reqId; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/system/config/PlatformConfigDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/system/config/PlatformConfigDto.java index 332472a99..d3d822756 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/system/config/PlatformConfigDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/dto/system/config/PlatformConfigDto.java @@ -1,7 +1,6 @@ package cn.bootx.platform.daxpay.service.dto.system.config; import cn.bootx.platform.daxpay.code.PaySignTypeEnum; -import cn.bootx.table.modify.annotation.DbColumn; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; @@ -16,21 +15,24 @@ import lombok.experimental.Accessors; @Schema(title = "平台配置") public class PlatformConfigDto { - @DbColumn(comment = "网站地址") + @Schema(description ="网站地址") private String websiteUrl; /** * @see PaySignTypeEnum */ - @DbColumn(comment = "签名方式") + @Schema(description ="签名方式") private String signType; - @DbColumn(comment = "签名秘钥") + @Schema(description ="签名秘钥") private String signSecret; - @DbColumn(comment = "支付通知地址") + @Schema(description ="异步支付通知地址") private String notifyUrl; - @DbColumn(comment = "订单默认超时时间") + @Schema(description ="同步支付通知地址") + private String returnUrl; + + @Schema(description ="订单默认超时时间(分钟)") private Integer orderTimeout; } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/channel/alipay/AliPayConfigParam.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/channel/alipay/AliPayConfigParam.java index 205dec32a..d05bdf4c3 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/channel/alipay/AliPayConfigParam.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/channel/alipay/AliPayConfigParam.java @@ -18,6 +18,9 @@ public class AliPayConfigParam { @Schema(description = "支付宝商户appId") private String appId; + @Schema(description = "是否启用") + private Boolean enable; + @Schema(description = "服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问") private String notifyUrl; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/channel/wechat/WeChatPayConfigParam.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/channel/wechat/WeChatPayConfigParam.java index 0908430ba..f9c1a1d29 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/channel/wechat/WeChatPayConfigParam.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/channel/wechat/WeChatPayConfigParam.java @@ -1,6 +1,7 @@ package cn.bootx.platform.daxpay.service.param.channel.wechat; import cn.bootx.platform.common.core.annotation.QueryParam; +import cn.bootx.table.modify.annotation.DbColumn; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; @@ -25,6 +26,15 @@ public class WeChatPayConfigParam { @Schema(description = "微信应用appId") private String wxAppId; + @DbColumn(comment = "是否启用") + private Boolean enable; + + @Schema(description = "异步通知地址") + private String notifyUrl; + + @Schema(description ="同步通知地址") + private String returnUrl; + @Schema(description = "商户平台「API安全」中的 APIv2 密钥") private String apiKeyV2; @@ -37,18 +47,12 @@ public class WeChatPayConfigParam { @Schema(description = "API 证书中的 p12 文件") private String p12; - @Schema(description = "服务器异步通知页面路径 通知url必须为直接可访问的url,不能携带参数。公网域名必须为https ") - private String notifyUrl; - @Schema(description = "是否沙箱环境") private boolean sandbox; @Schema(description = "可用支付方式") private List payWays; - @Schema(description = "状态") - private String state; - @Schema(description = "备注") private String remark; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/system/config/PlatformConfigParam.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/system/config/PlatformConfigParam.java index 657d7ef9e..ba6abb623 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/system/config/PlatformConfigParam.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/service/param/system/config/PlatformConfigParam.java @@ -31,6 +31,9 @@ public class PlatformConfigParam { @DbColumn(comment = "支付通知地址") private String notifyUrl; + @Schema(description ="同步支付通知地址") + private String returnUrl; + @DbColumn(comment = "订单默认超时时间") private Integer orderTimeout; }