diff --git a/_doc/Task.md b/_doc/Task.md index bad55e6b..6356dc4f 100644 --- a/_doc/Task.md +++ b/_doc/Task.md @@ -2,20 +2,21 @@ 2.0.8: 转账/撤销接口和系统优化 - [x] 支持撤销接口 - [x] 增加转账接口功能 +- [ ] 转账订单功能 - [ ] 转账同步接口 - [x] 支付宝支持JSAPI方式支付 -- [ ] 支付宝SDK修改为官方SDK +- [x] 支付宝SDK修改为官方SDK +- [ ] 手动发起分账是参数修正 - [ ] 细分各种支付异常类和编码(部分) -- [ ] 增加分账回调处理(支付宝) - [ ] 增加分账修复功能 - [x] 增加扫码获取微信OpenID和支付宝OpenId功能 - [x] 微信 - [x] 支付宝 - [ ] DEMO增加转账演示功能 - [x] 支付宝微信等消息通知地址支持一键生成 -- [ ] 管理端界面支持扫码绑定对账接收方功能 +- [x] 管理端界面支持扫码绑定对账接收方功能 - [x] 微信 - - [ ] 支付宝 + - [x] 支付宝 - [x] 界面金额统一显示为分 - [ ] 上下文对象进行优化精简 - [x] 请求IP参数增加正则校验 @@ -42,15 +43,16 @@ - [x] 策略工厂修改为通用策略工厂 - [x] 支付和退款达到终态不可以再回退回之前的状态 - [x] 修复支付关闭参数名称不正确问题 -- [ ] 脚手架优化 - - [ ] 请求权限改版, 使用专用配置类 - - [X] 去除消息通知模块 +- [X] 去除消息通知模块 2.0.9: 消息通知改版和系统优化 - [ ] 增加类似支付宝应用通知的方式, 先支持http方式通信 - [ ] 优化前端各种状态颜色展示 +- [ ] 修复功能优化, 更改为交易调整单 - [ ] 增加验签调试等功能的页面 - [ ] 聚合支付UA在前端判断, 提高响应速度 +- [ ] 增加分账回调处理(支付宝) +- [ ] 请求权限改版, 使用专用配置类 **任务池** - [ ] 增加收单收银台功能 diff --git a/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/allocation/AllocationOrderController.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/AllocationOrderController.java similarity index 98% rename from daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/allocation/AllocationOrderController.java rename to daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/AllocationOrderController.java index 709cadf9..f7e206e6 100644 --- a/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/allocation/AllocationOrderController.java +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/AllocationOrderController.java @@ -1,4 +1,4 @@ -package cn.daxpay.single.admin.controller.allocation; +package cn.daxpay.single.admin.controller.order; import cn.bootx.platform.common.core.rest.PageResult; import cn.bootx.platform.common.core.rest.Res; diff --git a/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/ReconcileOrderController.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/ReconcileOrderController.java index 8b0d0260..8a1151c4 100644 --- a/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/ReconcileOrderController.java +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/ReconcileOrderController.java @@ -24,7 +24,7 @@ import org.springframework.web.multipart.MultipartFile; * @author xxm * @since 2024/1/18 */ -@Tag(name = "对账控制器") +@Tag(name = "对账订单控制器") @RestController @RequestMapping("/order/reconcile") @RequiredArgsConstructor diff --git a/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/RefundOrderController.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/RefundOrderController.java index b8c36c5c..5ae5779b 100644 --- a/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/RefundOrderController.java +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/RefundOrderController.java @@ -12,7 +12,6 @@ import cn.daxpay.single.service.core.order.refund.service.RefundOrderQueryServic import cn.daxpay.single.service.core.order.refund.service.RefundOrderService; import cn.daxpay.single.service.core.payment.sync.service.RefundSyncService; import cn.daxpay.single.service.dto.order.refund.RefundOrderDto; -import cn.daxpay.single.service.param.order.PayOrderQuery; import cn.daxpay.single.service.param.order.PayOrderRefundParam; import cn.daxpay.single.service.param.order.RefundOrderQuery; import io.swagger.v3.oas.annotations.Operation; @@ -25,7 +24,7 @@ import org.springframework.web.bind.annotation.*; * @author xxm * @since 2024/1/9 */ -@Tag(name = "支付退款控制器") +@Tag(name = "退款订单控制器") @RestController @RequestMapping("/order/refund") @RequiredArgsConstructor @@ -69,6 +68,7 @@ public class RefundOrderController { return Res.ok(); } + @InitPaymentContext(PaymentApiCode.SYNC_REFUND) @Operation(summary = "退款同步") @PostMapping("/syncByRefundNo") public ResResult syncByRefundNo(String refundNo){ @@ -79,7 +79,7 @@ public class RefundOrderController { @Operation(summary = "查询金额汇总") @GetMapping("/getTotalAmount") - public ResResult getTotalAmount(PayOrderQuery param){ + public ResResult getTotalAmount(RefundOrderQuery param){ return Res.ok(queryService.getTotalAmount(param)); } } diff --git a/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/TransferOrderController.java b/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/TransferOrderController.java new file mode 100644 index 00000000..0cb5e164 --- /dev/null +++ b/daxpay-single/daxpay-single-admin/src/main/java/cn/daxpay/single/admin/controller/order/TransferOrderController.java @@ -0,0 +1,77 @@ +package cn.daxpay.single.admin.controller.order; + +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.daxpay.single.code.PaymentApiCode; +import cn.daxpay.single.param.payment.transfer.TransferParam; +import cn.daxpay.single.service.annotation.InitPaymentContext; +import cn.daxpay.single.service.core.order.transfer.service.TransferOrderQueryService; +import cn.daxpay.single.service.core.order.transfer.service.TransferOrderService; +import cn.daxpay.single.service.dto.order.transfer.TransferOrderDto; +import cn.daxpay.single.service.param.order.TransferOrderQuery; +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 2024/6/17 + */ +@Tag(name = "转账订单控制器") +@RestController +@RequestMapping("/order/transfer") +@RequiredArgsConstructor +public class TransferOrderController { + private final TransferOrderQueryService queryService; + private final TransferOrderService transferOrderService; + + + @Operation(summary = "分页查询") + @GetMapping("/page") + public ResResult> page(PageParam pageParam, TransferOrderQuery query){ + return Res.ok(queryService.page(pageParam, query)); + } + + + @Operation(summary = "查询退款订单详情") + @GetMapping("/findByTransferNo") + public ResResult findByTransferNo(String refundNo){ + return Res.ok(queryService.findByTransferNo(refundNo)); + } + @Operation(summary = "查询单条") + @GetMapping("/findById") + public ResResult findById(Long id){ + return Res.ok(queryService.findById(id)); + } + + + @InitPaymentContext(PaymentApiCode.TRANSFER) + @Operation(summary = "手动发起转账") + @PostMapping("/transfer") + public ResResult transfer(@RequestBody TransferParam param){ + return Res.ok(); + } + + @InitPaymentContext(PaymentApiCode.TRANSFER) + @Operation(summary = "重新发起转账") + @PostMapping("/resetTransfer") + public ResResult resetTransfer(Long id){ + return Res.ok(); + } + + @Operation(summary = "手动转账同步") + @PostMapping("/syncByTransferNo") + public ResResult syncByTransferNo(String transferNo){ + return Res.ok(); + } + + @Operation(summary = "查询金额汇总") + @GetMapping("/getTotalAmount") + public ResResult getTotalAmount(TransferOrderQuery param){ + return Res.ok(queryService.getTotalAmount(param)); + } +} diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/transfer/QueryTransferParam.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/transfer/QueryTransferParam.java index 67a1da65..f2d44cf8 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/transfer/QueryTransferParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/transfer/QueryTransferParam.java @@ -6,14 +6,26 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import javax.validation.constraints.Size; + /** - * 转正订单查询参数 + * 转账订单查询参数 * @author xxm * @since 2024/5/27 */ @EqualsAndHashCode(callSuper = true) @Data @Accessors(chain = true) -@Schema(title = "转正订单查询参数") +@Schema(title = "转账订单查询参数") public class QueryTransferParam extends PaymentCommonParam { + + /** 商户转账号 */ + @Size(max = 100, message = "商户转账号不可超过100位") + @Schema(description = "商户转账号") + private String bizTransferNo; + + /** 转账号 */ + @Size(max = 32, message = "转账号不可超过100位") + @Schema(description = "转账号") + private String transferNo; } diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/transfer/TransferParam.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/transfer/TransferParam.java index 8cf0e5ec..967f3b6e 100644 --- a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/transfer/TransferParam.java +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/transfer/TransferParam.java @@ -63,10 +63,6 @@ public class TransferParam extends PaymentCommonParam { @Schema(description = "转账类型, 微信使用") private String transferType; - /** 付款方显示名称 */ - @Size(max = 50, message = "付款方显示名称不可超过50位") - @Schema(description = "付款方显示名称") - private String payerShowName; /** * 收款人账号类型 diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/transfer/TransferSyncParam.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/transfer/TransferSyncParam.java new file mode 100644 index 00000000..266ccebd --- /dev/null +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/param/payment/transfer/TransferSyncParam.java @@ -0,0 +1,29 @@ +package cn.daxpay.single.param.payment.transfer; + +import cn.daxpay.single.param.PaymentCommonParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.Size; + +/** + * 转账状态同步参数 + * @author xxm + * @since 2024/6/17 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Schema(title = "转账状态同步参数") +public class TransferSyncParam extends PaymentCommonParam { + + /** 商户转账号 */ + @Size(max = 100, message = "商户转账号不可超过100位") + @Schema(description = "商户转账号") + private String bizTransferNo; + + /** 转账号 */ + @Size(max = 32, message = "转账号不可超过100位") + @Schema(description = "转账号") + private String transferNo; +} diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/result/order/TransferOrderResult.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/result/order/TransferOrderResult.java new file mode 100644 index 00000000..8db961e7 --- /dev/null +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/result/order/TransferOrderResult.java @@ -0,0 +1,19 @@ +package cn.daxpay.single.result.order; + +import cn.daxpay.single.result.PaymentCommonResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 转账订单数据 + * @author xxm + * @since 2024/6/17 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "转账订单数据") +public class TransferOrderResult extends PaymentCommonResult { +} diff --git a/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/result/sync/TransferSyncResult.java b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/result/sync/TransferSyncResult.java new file mode 100644 index 00000000..11972ada --- /dev/null +++ b/daxpay-single/daxpay-single-core/src/main/java/cn/daxpay/single/result/sync/TransferSyncResult.java @@ -0,0 +1,27 @@ +package cn.daxpay.single.result.sync; + +import cn.daxpay.single.code.TransferStatusEnum; +import cn.daxpay.single.result.PaymentCommonResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 转账同步结果 + * @author xxm + * @since 2024/6/17 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "转账同步结果") +public class TransferSyncResult extends PaymentCommonResult { + + /** + * 转账状态 + * @see TransferStatusEnum + */ + @Schema(description = "转账状态") + private String status; +} diff --git a/daxpay-single/daxpay-single-gateway/src/main/java/cn/daxpay/single/gateway/controller/UniPayController.java b/daxpay-single/daxpay-single-gateway/src/main/java/cn/daxpay/single/gateway/controller/UniPayController.java index 37c4aee0..6c5d2c73 100644 --- a/daxpay-single/daxpay-single-gateway/src/main/java/cn/daxpay/single/gateway/controller/UniPayController.java +++ b/daxpay-single/daxpay-single-gateway/src/main/java/cn/daxpay/single/gateway/controller/UniPayController.java @@ -13,8 +13,8 @@ import cn.daxpay.single.result.pay.PayCloseResult; import cn.daxpay.single.result.pay.PayResult; import cn.daxpay.single.result.pay.RefundResult; import cn.daxpay.single.result.transfer.TransferResult; -import cn.daxpay.single.service.annotation.PaymentVerify; import cn.daxpay.single.service.annotation.InitPaymentContext; +import cn.daxpay.single.service.annotation.PaymentVerify; import cn.daxpay.single.service.core.payment.cancel.service.PayCancelService; import cn.daxpay.single.service.core.payment.close.service.PayCloseService; import cn.daxpay.single.service.core.payment.pay.service.PayService; diff --git a/daxpay-single/daxpay-single-gateway/src/main/java/cn/daxpay/single/gateway/controller/UniPaySyncController.java b/daxpay-single/daxpay-single-gateway/src/main/java/cn/daxpay/single/gateway/controller/UniPaySyncController.java index 9dce6c2d..fd6dae1c 100644 --- a/daxpay-single/daxpay-single-gateway/src/main/java/cn/daxpay/single/gateway/controller/UniPaySyncController.java +++ b/daxpay-single/daxpay-single-gateway/src/main/java/cn/daxpay/single/gateway/controller/UniPaySyncController.java @@ -5,15 +5,18 @@ import cn.daxpay.single.code.PaymentApiCode; import cn.daxpay.single.param.payment.allocation.AllocSyncParam; import cn.daxpay.single.param.payment.pay.PaySyncParam; import cn.daxpay.single.param.payment.refund.RefundSyncParam; +import cn.daxpay.single.param.payment.transfer.TransferSyncParam; import cn.daxpay.single.result.DaxResult; import cn.daxpay.single.result.sync.AllocSyncResult; import cn.daxpay.single.result.sync.PaySyncResult; import cn.daxpay.single.result.sync.RefundSyncResult; -import cn.daxpay.single.service.annotation.PaymentVerify; +import cn.daxpay.single.result.sync.TransferSyncResult; import cn.daxpay.single.service.annotation.InitPaymentContext; +import cn.daxpay.single.service.annotation.PaymentVerify; import cn.daxpay.single.service.core.payment.allocation.service.AllocationSyncService; import cn.daxpay.single.service.core.payment.sync.service.PaySyncService; import cn.daxpay.single.service.core.payment.sync.service.RefundSyncService; +import cn.daxpay.single.service.core.payment.sync.service.TransferSyncService; import cn.daxpay.single.util.DaxRes; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -38,6 +41,7 @@ public class UniPaySyncController { private final PaySyncService paySyncService; private final RefundSyncService refundSyncService; private final AllocationSyncService allocationSyncService; + private final TransferSyncService transferSyncService; @PaymentVerify @InitPaymentContext(PaymentApiCode.SYNC_PAY) @@ -55,7 +59,6 @@ public class UniPaySyncController { return DaxRes.ok(refundSyncService.sync(param)); } - @PaymentVerify @InitPaymentContext(PaymentApiCode.SYNC_ALLOCATION) @Operation(summary = "分账同步接口") @@ -68,8 +71,8 @@ public class UniPaySyncController { @InitPaymentContext(PaymentApiCode.SYNC_TRANSFER) @Operation(summary = "转账同步接口") @PostMapping("/transfer") - public DaxResult transfer(@RequestBody AllocSyncParam param){ - allocationSyncService.sync(param); - return DaxRes.ok(); + public DaxResult transfer(@RequestBody TransferSyncParam param){ + return DaxRes.ok(transferSyncService.sync(param)); } + } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/code/AliPayCode.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/code/AliPayCode.java index d095fbb9..87875abf 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/code/AliPayCode.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/code/AliPayCode.java @@ -89,6 +89,10 @@ public interface AliPayCode { /** 返回退款时间 */ String GMT_REFUND_PAY = "gmt_refund_pay"; + // 转账状态 + /** 转账成功 */ + String TRANSFER_SUCCESS = "SUCCESS"; + // 错误提示 /** 交易不存在 */ String ACQ_TRADE_NOT_EXIST = "ACQ.TRADE_NOT_EXIST"; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/common/context/TransferLocal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/common/context/TransferLocal.java index 51608e2a..5361ec15 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/common/context/TransferLocal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/common/context/TransferLocal.java @@ -19,7 +19,7 @@ public class TransferLocal { private String outTransferNo; /** 状态 */ - private TransferStatusEnum status = TransferStatusEnum.SUCCESS; + private TransferStatusEnum status = TransferStatusEnum.TRANSFERRING; /** 完成时间 */ private LocalDateTime finishTime; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/channel/alipay/service/AliPaySyncService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/channel/alipay/service/AliPaySyncService.java index c3307732..316f7912 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/channel/alipay/service/AliPaySyncService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/channel/alipay/service/AliPaySyncService.java @@ -3,22 +3,29 @@ package cn.daxpay.single.service.core.channel.alipay.service; import cn.bootx.platform.common.core.util.LocalDateTimeUtil; import cn.daxpay.single.code.PaySyncStatusEnum; import cn.daxpay.single.code.RefundSyncStatusEnum; +import cn.daxpay.single.code.TransferStatusEnum; +import cn.daxpay.single.result.sync.TransferSyncResult; import cn.daxpay.single.service.code.AliPayCode; import cn.daxpay.single.service.core.channel.alipay.entity.AliPayConfig; import cn.daxpay.single.service.core.order.pay.entity.PayOrder; import cn.daxpay.single.service.core.order.refund.entity.RefundOrder; +import cn.daxpay.single.service.core.order.transfer.entity.TransferOrder; import cn.daxpay.single.service.core.payment.sync.result.PayRemoteSyncResult; import cn.daxpay.single.service.core.payment.sync.result.RefundRemoteSyncResult; import cn.hutool.json.JSONUtil; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; +import com.alipay.api.domain.AlipayFundTransCommonQueryModel; import com.alipay.api.domain.AlipayTradeFastpayRefundQueryModel; import com.alipay.api.domain.AlipayTradeQueryModel; +import com.alipay.api.request.AlipayFundTransCommonQueryRequest; import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest; import com.alipay.api.request.AlipayTradeQueryRequest; +import com.alipay.api.response.AlipayFundTransCommonQueryResponse; import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse; import com.alipay.api.response.AlipayTradeQueryResponse; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -140,4 +147,26 @@ public class AliPaySyncService { } return syncResult; } + + /** + * 转账同步 + */ + @SneakyThrows + public TransferSyncResult syncTransferStatus(TransferOrder transferOrder){ + AlipayClient alipayClient = aliPayConfigService.getAlipayClient(); + // 构造请求参数以调用接口 + AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest(); + AlipayFundTransCommonQueryModel model = new AlipayFundTransCommonQueryModel(); + // 设置销售产品码 + model.setProductCode("STD_RED_PACKET"); + // 设置描述特定的业务场景 + model.setBizScene("PERSONAL_PAY"); + // 设置商户转账唯一订单号 + model.setOutBizNo(transferOrder.getTransferNo()); + request.setBizModel(model); + AlipayFundTransCommonQueryResponse response = alipayClient.execute(request); + System.out.println(response.getBody()); + return new TransferSyncResult().setStatus(TransferStatusEnum.FAIL.getCode()); + } + } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/channel/alipay/service/AliPayTransferService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/channel/alipay/service/AliPayTransferService.java index 0d6aee8a..a7f0b78d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/channel/alipay/service/AliPayTransferService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/channel/alipay/service/AliPayTransferService.java @@ -8,17 +8,16 @@ import cn.daxpay.single.service.common.context.TransferLocal; import cn.daxpay.single.service.common.local.PaymentContextLocal; import cn.daxpay.single.service.core.channel.alipay.entity.AliPayConfig; import cn.daxpay.single.service.core.order.transfer.entity.TransferOrder; -import cn.daxpay.single.util.OrderNoGenerateUtil; import cn.daxpay.single.util.PayUtil; import cn.hutool.core.date.DatePattern; -import cn.hutool.core.util.StrUtil; import com.alipay.api.AlipayClient; import com.alipay.api.domain.AlipayFundAccountQueryModel; -import com.alipay.api.domain.AlipayFundTransToaccountTransferModel; +import com.alipay.api.domain.AlipayFundTransUniTransferModel; +import com.alipay.api.domain.Participant; import com.alipay.api.request.AlipayFundAccountQueryRequest; -import com.alipay.api.request.AlipayFundTransToaccountTransferRequest; +import com.alipay.api.request.AlipayFundTransUniTransferRequest; import com.alipay.api.response.AlipayFundAccountQueryResponse; -import com.alipay.api.response.AlipayFundTransToaccountTransferResponse; +import com.alipay.api.response.AlipayFundTransUniTransferResponse; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -57,18 +56,35 @@ public class AliPayTransferService { @SneakyThrows public void transfer(TransferOrder order, AliPayConfig aliPayConfig){ AlipayClient alipayClient = aliPayConfigService.getAlipayClient(aliPayConfig); - AlipayFundTransToaccountTransferModel model = new AlipayFundTransToaccountTransferModel(); - model.setAmount(PayUtil.conversionAmount(order.getAmount()).toString()); - model.setOutBizNo(OrderNoGenerateUtil.transfer()); - model.setPayeeType(order.getPayeeType()); - model.setPayeeAccount(order.getPayeeAccount()); - model.setPayerShowName(order.getPayerShowName()); - // 标题需要用附加方式传输进去 - model.setExtParam(StrUtil.format("{order_title: '{}'}", order.getTitle())); + + // 构造请求参数以调用接口 + AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); + AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); + + // 设置转账业务的标题 + model.setOrderTitle(order.getTitle()); + // 设置描述特定的业务场景 + model.setBizScene("DIRECT_TRANSFER"); + // 设置业务产品码 + model.setProductCode("TRANS_ACCOUNT_NO_PWD"); + // 设置转账业务请求的扩展参数 + model.setBusinessParams("{payer_show_name_use_alias: true}"); + // 设置业务备注 + model.setRemark(order.getReason()); + // 设置商家侧唯一订单号 + model.setOutBizNo(order.getTransferNo()); + // 设置订单总金额 + model.setTransAmount(PayUtil.conversionAmount(order.getAmount()).toString()); + + // 设置收款方信息 + Participant payeeInfo = new Participant(); + payeeInfo.setIdentity(order.getPayeeAccount()); + payeeInfo.setName(order.getPayeeName()); + payeeInfo.setIdentityType(order.getPayeeType()); + model.setPayeeInfo(payeeInfo); model.setRemark(order.getReason()); - AlipayFundTransToaccountTransferRequest request = new AlipayFundTransToaccountTransferRequest(); request.setBizModel(model); - AlipayFundTransToaccountTransferResponse response = alipayClient.execute(request); + AlipayFundTransUniTransferResponse response = alipayClient.execute(request); if (!Objects.equals(AliPayCode.SUCCESS, response.getCode())) { log.error("网关返回退款失败: {}", response.getSubMsg()); throw new PayFailureException(response.getSubMsg()); @@ -77,9 +93,10 @@ public class AliPayTransferService { // 通道转账号 transferInfo.setOutTransferNo(response.getOrderId()); // 有完成时间代表处理完成 - String payDate = response.getPayDate(); - if (StrUtil.isNotBlank(payDate)){ - LocalDateTime time = LocalDateTimeUtil.parse(payDate, DatePattern.NORM_DATETIME_PATTERN); + if (Objects.equals(response.getStatus(), AliPayCode.TRANSFER_SUCCESS)){ + // 时间 + String transDate = response.getTransDate(); + LocalDateTime time = LocalDateTimeUtil.parse(transDate, DatePattern.NORM_DATETIME_PATTERN); transferInfo.setFinishTime(time).setStatus(TransferStatusEnum.SUCCESS); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/refund/dao/RefundOrderManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/refund/dao/RefundOrderManager.java index 4070f6dd..4452acad 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/refund/dao/RefundOrderManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/refund/dao/RefundOrderManager.java @@ -7,7 +7,6 @@ import cn.bootx.platform.common.query.generator.QueryGenerator; import cn.daxpay.single.code.PayStatusEnum; import cn.daxpay.single.code.RefundStatusEnum; import cn.daxpay.single.service.core.order.refund.entity.RefundOrder; -import cn.daxpay.single.service.param.order.PayOrderQuery; import cn.daxpay.single.service.param.order.RefundOrderQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -86,7 +85,7 @@ public class RefundOrderManager extends BaseManager generator = QueryGenerator.generator(query); generator.eq(MpUtil.getColumnName(RefundOrder::getStatus), PayStatusEnum.SUCCESS.getCode()); return baseMapper.getTalAmount(generator); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/refund/service/RefundOrderQueryService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/refund/service/RefundOrderQueryService.java index e529c947..41cdacbb 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/refund/service/RefundOrderQueryService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/refund/service/RefundOrderQueryService.java @@ -11,7 +11,6 @@ import cn.daxpay.single.service.core.order.refund.convert.RefundOrderConvert; import cn.daxpay.single.service.core.order.refund.dao.RefundOrderManager; import cn.daxpay.single.service.core.order.refund.entity.RefundOrder; import cn.daxpay.single.service.dto.order.refund.RefundOrderDto; -import cn.daxpay.single.service.param.order.PayOrderQuery; import cn.daxpay.single.service.param.order.RefundOrderQuery; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -89,7 +88,7 @@ public class RefundOrderQueryService { /** * 查询支付总金额 */ - public Integer getTotalAmount(PayOrderQuery param) { + public Integer getTotalAmount(RefundOrderQuery param) { return refundOrderManager.getTalAmount(param); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/refund/service/RefundOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/refund/service/RefundOrderService.java index f2b3b847..4dd8d6cf 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/refund/service/RefundOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/refund/service/RefundOrderService.java @@ -50,8 +50,6 @@ public class RefundOrderService { refundParam.setReason(param.getReason()); refundParam.setReqTime(LocalDateTime.now()); refundParam.setClientIp(ip); - // 手动初始化上下文 - paymentAssistService.initRequest(refundParam); // 调用统一退款接口 refundService.refund(refundParam); } @@ -60,8 +58,7 @@ public class RefundOrderService { * 重新退款 */ public void resetRefund(Long id){ - - // 查询扩展信息 + // 查询信息 RefundOrder refundOrder = refundOrderManager.findById(id) .orElseThrow(() -> new DataNotExistException("未找到退款订单")); @@ -76,8 +73,7 @@ public class RefundOrderService { refundParam.setAttach(refundOrder.getAttach()); refundParam.setReqTime(LocalDateTime.now()); refundParam.setClientIp(ip); - - // 手动初始化请求上下文 - paymentAssistService.initRequest(refundParam); + // 调用统一退款接口 + refundService.refund(refundParam); } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/convert/TransferOrderConvert.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/convert/TransferOrderConvert.java index 08b5b0a8..c84d7f5f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/convert/TransferOrderConvert.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/convert/TransferOrderConvert.java @@ -1,5 +1,6 @@ package cn.daxpay.single.service.core.order.transfer.convert; +import cn.daxpay.single.result.order.TransferOrderResult; import cn.daxpay.single.service.core.order.transfer.entity.TransferOrder; import cn.daxpay.single.service.dto.order.transfer.TransferOrderDto; import org.mapstruct.Mapper; @@ -15,4 +16,7 @@ public interface TransferOrderConvert { TransferOrderConvert CONVERT = Mappers.getMapper(TransferOrderConvert.class); TransferOrderDto convert(TransferOrder in); + + + TransferOrderResult convertResult(TransferOrder in); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/dao/TransferOrderManager.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/dao/TransferOrderManager.java index 91206efd..3a3b6afc 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/dao/TransferOrderManager.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/dao/TransferOrderManager.java @@ -1,11 +1,21 @@ package cn.daxpay.single.service.core.order.transfer.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.daxpay.single.code.PayStatusEnum; +import cn.daxpay.single.service.core.order.refund.entity.RefundOrder; import cn.daxpay.single.service.core.order.transfer.entity.TransferOrder; +import cn.daxpay.single.service.param.order.TransferOrderQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; +import java.util.Optional; + /** * * @author xxm @@ -15,4 +25,37 @@ import org.springframework.stereotype.Repository; @Repository @RequiredArgsConstructor public class TransferOrderManager extends BaseManager { + + + /** + * 分页 + */ + public Page page(PageParam pageParam, TransferOrderQuery query) { + Page mpPage = MpUtil.getMpPage(pageParam, TransferOrder.class); + QueryWrapper generator = QueryGenerator.generator(query); + return page(mpPage,generator); + } + + /** + * 根据转账号查询 + */ + public Optional findByTransferNo(String transferNo) { + return findByField(TransferOrder::getTransferNo, transferNo); + } + + /** + * 根据商户转账号查询 + */ + public Optional findByBizTransferNo(String bizTransferNo) { + return findByField(TransferOrder::getBizTransferNo, bizTransferNo); + } + + /** + * 查询汇总金额 + */ + public Integer getTalAmount(TransferOrderQuery query){ + QueryWrapper generator = QueryGenerator.generator(query); + generator.eq(MpUtil.getColumnName(RefundOrder::getStatus), PayStatusEnum.SUCCESS.getCode()); + return baseMapper.getTalAmount(generator); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/dao/TransferOrderMapper.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/dao/TransferOrderMapper.java index b5009faa..468b679d 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/dao/TransferOrderMapper.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/dao/TransferOrderMapper.java @@ -1,8 +1,13 @@ package cn.daxpay.single.service.core.order.transfer.dao; import cn.daxpay.single.service.core.order.transfer.entity.TransferOrder; +import cn.daxpay.single.service.param.order.TransferOrderQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; /** * @@ -11,4 +16,10 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface TransferOrderMapper extends BaseMapper { + + /** + * 查询转账总金额 + */ + @Select("select sum(amount) from pay_transfer_order ${ew.customSqlSegment}") + Integer getTalAmount(@Param(Constants.WRAPPER) QueryWrapper generator); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/entity/TransferOrder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/entity/TransferOrder.java index 38734f83..d7877653 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/entity/TransferOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/entity/TransferOrder.java @@ -76,10 +76,6 @@ public class TransferOrder extends MpBaseEntity implements EntityBaseFunction page(PageParam pageParam, TransferOrderQuery query) { + Page page = transferOrderManager.page(pageParam, query); + return MpUtil.convert2DtoPageResult(page); + } + + /** + * 根据id查询 + */ + public TransferOrderDto findById(Long id) { + return transferOrderManager.findById(id).map(TransferOrder::toDto) + .orElseThrow(() -> new DataNotExistException("转账订单不存在")); + } + + /** + * 根据转账号查询 + */ + public TransferOrderDto findByTransferNo(String transferNo){ + return transferOrderManager.findByTransferNo(transferNo).map(TransferOrder::toDto) + .orElseThrow(() -> new DataNotExistException("转账订单扩展信息不存在")); + + } + + /** + * 根据转账号和商户转账号查询 + */ + public Optional findByBizOrTransferNo(String transferNo, String bizTransferNo) { + if (StrUtil.isNotBlank(transferNo)){ + return transferOrderManager.findByTransferNo(transferNo); + } else if (StrUtil.isNotBlank(bizTransferNo)){ + return transferOrderManager.findByBizTransferNo(bizTransferNo); + } else { + return Optional.empty(); + } + } + + /** + * 查询转账订单 + */ + public TransferOrderResult queryTransferOrder(QueryTransferParam param) { + // 校验参数 + if (StrUtil.isBlank(param.getTransferNo()) && Objects.isNull(param.getBizTransferNo())){ + throw new PayFailureException("转账号或商户转账号不能都为空"); + } + // 查询转账单 + TransferOrder transferOrder = this.findByBizOrTransferNo(param.getTransferNo(), param.getBizTransferNo()) + .orElseThrow(() -> new PayFailureException("转账订单不存在")); + + return TransferOrderConvert.CONVERT.convertResult(transferOrder); + } + + /** + * 查询支付总金额 + */ + public Integer getTotalAmount(TransferOrderQuery param) { + return transferOrderManager.getTalAmount(param); + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/service/TransferOrderService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/service/TransferOrderService.java index 055b18a2..fb620dac 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/service/TransferOrderService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/order/transfer/service/TransferOrderService.java @@ -5,9 +5,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** - * 转正订单服务 + * 转账订单服务 * @author xxm - * @since 2024/3/21 + * @since 2024/6/17 */ @Slf4j @Service @@ -15,6 +15,17 @@ import org.springframework.stereotype.Service; public class TransferOrderService { /** - * 创建订单 + * 手动转账 */ + public void transfer(){ + + } + + /** + * 重试转账 + */ + public void retryTransfer(){ + + } + } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/common/aop/PaymentVerifyAop.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/common/aop/PaymentVerifyAop.java index 2e5dbd19..69fa7732 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/common/aop/PaymentVerifyAop.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/common/aop/PaymentVerifyAop.java @@ -40,9 +40,8 @@ public class PaymentVerifyAop { if (param instanceof PaymentCommonParam){ // 参数校验 ValidationUtil.validateParam(param); - - // 请求上下文初始化 - paymentAssistService.initRequest((PaymentCommonParam) param); + // 终端信息初始化 + paymentAssistService.initClient((PaymentCommonParam) param); // 参数签名校验 paymentAssistService.signVerify((PaymentCommonParam) param); // 参数请求时间校验 diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/common/service/PaymentAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/common/service/PaymentAssistService.java index b8dbaa35..13f266a2 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/common/service/PaymentAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/common/service/PaymentAssistService.java @@ -32,7 +32,7 @@ public class PaymentAssistService { /** * 初始化请求相关信息上下文 */ - public void initRequest(PaymentCommonParam paymentCommonParam){ + public void initClient(PaymentCommonParam paymentCommonParam){ ClientLocal request = PaymentContextLocal.get().getClientInfo(); request.setClientIp(paymentCommonParam.getClientIp()); } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/sync/service/TransferSyncService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/sync/service/TransferSyncService.java new file mode 100644 index 00000000..e85a6606 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/sync/service/TransferSyncService.java @@ -0,0 +1,26 @@ +package cn.daxpay.single.service.core.payment.sync.service; + +import cn.daxpay.single.param.payment.transfer.TransferSyncParam; +import cn.daxpay.single.result.sync.TransferSyncResult; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 转账同步接口 + * @author xxm + * @since 2024/6/17 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class TransferSyncService { + + /** + * 转账同步接口 + */ + public TransferSyncResult sync(TransferSyncParam param) { + + return null; + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/sync/strategy/Refund/AliRefundSyncStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/sync/strategy/Refund/AliRefundSyncStrategy.java index 66232160..2b1b219f 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/sync/strategy/Refund/AliRefundSyncStrategy.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/sync/strategy/Refund/AliRefundSyncStrategy.java @@ -2,7 +2,6 @@ package cn.daxpay.single.service.core.payment.sync.strategy.Refund; import cn.daxpay.single.code.PayChannelEnum; import cn.daxpay.single.code.PaySyncStatusEnum; -import cn.daxpay.single.service.core.channel.alipay.service.AliPayConfigService; import cn.daxpay.single.service.core.channel.alipay.service.AliPaySyncService; import cn.daxpay.single.service.core.payment.sync.result.RefundRemoteSyncResult; import cn.daxpay.single.service.func.AbsRefundSyncStrategy; @@ -22,8 +21,6 @@ import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROT @RequiredArgsConstructor public class AliRefundSyncStrategy extends AbsRefundSyncStrategy { - private final AliPayConfigService alipayConfigService; - private final AliPaySyncService aliPaySyncService;; /** diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/sync/strategy/transfer/AliTransferSyncStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/sync/strategy/transfer/AliTransferSyncStrategy.java new file mode 100644 index 00000000..3ae1b75e --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/sync/strategy/transfer/AliTransferSyncStrategy.java @@ -0,0 +1,18 @@ +package cn.daxpay.single.service.core.payment.sync.strategy.transfer; + +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 2024/6/17 + */ +@Scope(SCOPE_PROTOTYPE) +@Component +@RequiredArgsConstructor +public class AliTransferSyncStrategy { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/transfer/service/TransferAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/transfer/service/TransferAssistService.java index 25bcb15f..5044c7e4 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/transfer/service/TransferAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/core/payment/transfer/service/TransferAssistService.java @@ -39,7 +39,6 @@ public class TransferAssistService { .setPayeeName(param.getPayeeName()) .setPayeeAccount(param.getPayeeAccount()) .setPayeeType(param.getPayeeType()) - .setPayerShowName(param.getPayerShowName()) .setReason(param.getReason()) .setStatus(TransferStatusEnum.TRANSFERRING.getCode()) .setTitle(param.getTitle()) diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/transfer/TransferOrderDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/transfer/TransferOrderDto.java index fb71952e..c8996eec 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/transfer/TransferOrderDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/dto/order/transfer/TransferOrderDto.java @@ -27,7 +27,7 @@ public class TransferOrderDto extends BaseDto { private String bizTransferNo; /** 转账号 */ - @Schema(description = "收款人账号") + @Schema(description = "转账号") private String transferNo; /** 通道转账号 */ @@ -64,10 +64,6 @@ public class TransferOrderDto extends BaseDto { @Schema(description = "付款方") private String payer; - /** 付款方显示名称 */ - @Schema(description = "付款方显示名称") - private String payerShowName; - /** * 收款人类型 * @see TransferPayeeTypeEnum diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/func/AbsTransferSyncStrategy.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/func/AbsTransferSyncStrategy.java new file mode 100644 index 00000000..992fbc27 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/func/AbsTransferSyncStrategy.java @@ -0,0 +1,29 @@ +package cn.daxpay.single.service.func; + +import cn.daxpay.single.code.PaySyncStatusEnum; +import cn.daxpay.single.service.core.order.transfer.entity.TransferOrder; +import cn.daxpay.single.service.core.payment.sync.result.RefundRemoteSyncResult; +import lombok.Getter; +import lombok.Setter; + +/** + * 转账修复策略 + * @author xxm + * @since 2024/6/17 + */ +@Getter +@Setter +public abstract class AbsTransferSyncStrategy implements PayStrategy{ + + private TransferOrder transferOrder; + + /** + * 同步前处理 + */ + public void doBeforeHandler(){} + /** + * 异步支付单与支付网关进行状态比对后的结果 + * @see PaySyncStatusEnum + */ + public abstract RefundRemoteSyncResult doSyncStatus(); +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/param/order/TransferOrderQuery.java b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/param/order/TransferOrderQuery.java new file mode 100644 index 00000000..4e895cb8 --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/daxpay/single/service/param/order/TransferOrderQuery.java @@ -0,0 +1,101 @@ +package cn.daxpay.single.service.param.order; + +import cn.bootx.platform.common.core.annotation.QueryParam; +import cn.bootx.platform.common.core.rest.param.QueryOrder; +import cn.daxpay.single.code.PayChannelEnum; +import cn.daxpay.single.code.TransferPayeeTypeEnum; +import cn.daxpay.single.code.TransferTypeEnum; +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 2024/6/17 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "转账订单查询参数") +public class TransferOrderQuery extends QueryOrder { + + /** 商户转账号 */ + @Schema(description = "商户转账号") + @QueryParam(type = QueryParam.CompareTypeEnum.LIKE) + private String bizTransferNo; + + /** 转账号 */ + @Schema(description = "转账号") + @QueryParam(type = QueryParam.CompareTypeEnum.LIKE) + private String transferNo; + + /** 通道转账号 */ + @Schema(description = "通道转账号") + @QueryParam(type = QueryParam.CompareTypeEnum.LIKE) + private String outTransferNo; + + /** + * 支付通道 + * @see PayChannelEnum + */ + @Schema(description = "支付通道") + private String channel; + + /** 转账金额 */ + @Schema(description = "转账金额") + private Integer amount; + + /** 标题 */ + @Schema(description = "标题") + @QueryParam(type = QueryParam.CompareTypeEnum.LIKE) + private String title; + + /** + * 转账类型, 微信使用 + * @see TransferTypeEnum + */ + @Schema(description = "转账类型, 微信使用") + private String transferType; + + /** 付款方 */ + @Schema(description = "付款方") + private String payer; + + /** + * 收款人类型 + * @see TransferPayeeTypeEnum + */ + @Schema(description = "收款人类型") + private String payeeType; + + /** 收款人账号 */ + @Schema(description = "收款人账号") + private String payeeAccount; + + /** 收款人姓名 */ + @Schema(description = "收款人姓名") + @QueryParam(type = QueryParam.CompareTypeEnum.LIKE) + private String payeeName; + + /** + * 状态 + * @see cn.daxpay.single.code.TransferStatusEnum + */ + @Schema(description = "状态") + private String status; + + /** 成功时间 */ + @Schema(description = "成功时间") + private LocalDateTime successTime; + + /** + * 错误码 + */ + @Schema(description = "错误码") + private String errorCode; + +}