diff --git a/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/trade/TransferAdminController.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/trade/TransferAdminController.java index 35b1fb468..5c2f46080 100644 --- a/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/trade/TransferAdminController.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/trade/TransferAdminController.java @@ -17,8 +17,7 @@ import cn.daxpay.open.payment.trade.transfer.result.DouyinTransferOrderResult; import cn.daxpay.open.payment.trade.transfer.result.TransferCreateResult; import cn.daxpay.open.payment.trade.transfer.result.TransferTradeResult; import cn.daxpay.open.payment.trade.transfer.result.WechatTransferOrderResult; -import cn.daxpay.open.platform.system.service.config.infra.PlatformUrlConfigService; -import cn.hutool.core.util.StrUtil; +import cn.daxpay.open.payment.trade.transfer.runtime.service.TransferConfirmUrlService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; @@ -43,7 +42,7 @@ import org.springframework.web.bind.annotation.RestController; public class TransferAdminController { private final TransferAdminService transferAdminService; - private final PlatformUrlConfigService platformUrlConfigService; + private final TransferConfirmUrlService transferConfirmUrlService; // ===== 微信转账 ===== @@ -104,19 +103,10 @@ public class TransferAdminController { public Result wechatCreate(@Valid @RequestBody TransferParam param) { String transferNo = transferAdminService.create("wechat", param); // 生成确认收款链接(供商户发给收款人在微信内打开) - String confirmUrl = buildConfirmUrl(transferNo); + String confirmUrl = transferConfirmUrlService.buildConfirmUrl(transferNo); return Res.ok(new TransferCreateResult().setTransferNo(transferNo).setConfirmUrl(confirmUrl)); } - /// 生成微信转账确认收款链接 - private String buildConfirmUrl(String transferNo) { - String base = platformUrlConfigService.getUrlConfig().getPaymentGatewayBaseUrl(); - if (StrUtil.isBlank(base)) { - return null; - } - return StrUtil.format("{}/transfer-confirm/{}", base, transferNo); - } - @PermCode(code = PermCodes.Action.MANAGE) @Operation(summary = "发起支付宝转账(运营端代发, 传 mchNo; FAIL 单复用原单号即重试)") @PostMapping("/alipay/create") diff --git a/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/trade/TransferAdminService.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/trade/TransferAdminService.java index ae28cde14..cf1ff2a03 100644 --- a/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/trade/TransferAdminService.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/trade/TransferAdminService.java @@ -22,6 +22,7 @@ import cn.daxpay.open.payment.trade.transfer.result.DouyinTransferOrderResult; import cn.daxpay.open.payment.trade.transfer.result.TransferTradeResult; import cn.daxpay.open.payment.trade.transfer.result.WechatTransferOrderResult; import cn.daxpay.open.payment.trade.transfer.runtime.service.TransferCloseService; +import cn.daxpay.open.payment.trade.transfer.runtime.service.TransferConfirmUrlService; import cn.daxpay.open.payment.trade.transfer.runtime.service.TransferStartService; import cn.daxpay.open.payment.trade.transfer.runtime.service.TransferSyncService; import cn.daxpay.open.payment.trade.transfer.util.PayeeDesensitizeUtil; @@ -48,6 +49,7 @@ public class TransferAdminService { private final TransferStartService transferStartService; private final TransferSyncService transferSyncService; private final TransferCloseService transferCloseService; + private final TransferConfirmUrlService transferConfirmUrlService; private final TransService transService; // ===== 微信转账 ===== @@ -67,6 +69,10 @@ public class TransferAdminService { WechatTransferOrder entity = wechatTransferOrderManager.findById(id) .orElseThrow(() -> new DataNotExistException("pay.error.transfer.notFound")); WechatTransferOrderResult result = WechatTransferOrderConvert.CONVERT.toResult(entity); + // 待领取状态填充确认收款链接 + if ("processing".equals(entity.getStatus())) { + result.setConfirmUrl(transferConfirmUrlService.buildConfirmUrl(entity.getTransferNo())); + } transService.translate(result); // 收款人信息脱敏 PayeeDesensitizeUtil.desensitize(result); diff --git a/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/transfer/result/WechatTransferOrderResult.java b/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/transfer/result/WechatTransferOrderResult.java index 1e7bd8f91..aa84f45e1 100644 --- a/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/transfer/result/WechatTransferOrderResult.java +++ b/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/transfer/result/WechatTransferOrderResult.java @@ -84,6 +84,10 @@ public class WechatTransferOrderResult extends BaseResult { @Schema(description = "拉起转账确认参数") private String transferBody; + /// 确认收款链接(仅待领取 processing 状态返回, 供商户发给收款人在微信内打开) + @Schema(description = "确认收款链接(微信转账待领取)") + private String confirmUrl; + /// 收款人姓名 @Schema(description = "收款人姓名") private String userName; diff --git a/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/transfer/runtime/service/TransferConfirmUrlService.java b/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/transfer/runtime/service/TransferConfirmUrlService.java new file mode 100644 index 000000000..1fda556a8 --- /dev/null +++ b/daxpay-payment/daxpay-payment-core/src/main/java/cn/daxpay/open/payment/trade/transfer/runtime/service/TransferConfirmUrlService.java @@ -0,0 +1,31 @@ +package cn.daxpay.open.payment.trade.transfer.runtime.service; + +import cn.daxpay.open.platform.system.service.config.infra.PlatformUrlConfigService; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/// # 微信转账确认收款链接生成服务 +/// +/// 生成确认收款链接供商户发给收款人在微信内打开, +/// 路径约定: `{paymentGatewayBaseUrl}/transfer-confirm/{transferNo}`(H5 确认页路由)。 +/// +/// 链接不落库(由 transferNo + 平台配置实时拼接), 供发起返回与订单详情查询复用。 +@Service +@RequiredArgsConstructor +public class TransferConfirmUrlService { + + private final PlatformUrlConfigService platformUrlConfigService; + + /// 生成微信转账确认收款链接 + /// + /// @param transferNo 平台转账单号 + /// @return 确认收款链接, 平台未配置网关地址时返回 null + public String buildConfirmUrl(String transferNo) { + String base = platformUrlConfigService.getUrlConfig().getPaymentGatewayBaseUrl(); + if (StrUtil.isBlank(base)) { + return null; + } + return StrUtil.format("{}/transfer-confirm/{}", base, transferNo); + } +} diff --git a/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/controller/trade/MchTransferController.java b/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/controller/trade/MchTransferController.java index 8ae69042d..7f79d11e9 100644 --- a/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/controller/trade/MchTransferController.java +++ b/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/controller/trade/MchTransferController.java @@ -17,8 +17,7 @@ import cn.daxpay.open.payment.trade.transfer.result.DouyinTransferOrderResult; import cn.daxpay.open.payment.trade.transfer.result.TransferCreateResult; import cn.daxpay.open.payment.trade.transfer.result.TransferTradeResult; import cn.daxpay.open.payment.trade.transfer.result.WechatTransferOrderResult; -import cn.daxpay.open.platform.system.service.config.infra.PlatformUrlConfigService; -import cn.hutool.core.util.StrUtil; +import cn.daxpay.open.payment.trade.transfer.runtime.service.TransferConfirmUrlService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; @@ -43,7 +42,7 @@ import org.springframework.web.bind.annotation.RestController; public class MchTransferController { private final MchTransferService mchTransferService; - private final PlatformUrlConfigService platformUrlConfigService; + private final TransferConfirmUrlService transferConfirmUrlService; // ===== 微信转账 ===== @@ -68,19 +67,10 @@ public class MchTransferController { public Result wechatCreate(@Valid @RequestBody TransferParam param) { String transferNo = mchTransferService.create("wechat", param); // 生成确认收款链接(供商户发给收款人在微信内打开) - String confirmUrl = buildConfirmUrl(transferNo); + String confirmUrl = transferConfirmUrlService.buildConfirmUrl(transferNo); return Res.ok(new TransferCreateResult().setTransferNo(transferNo).setConfirmUrl(confirmUrl)); } - /// 生成微信转账确认收款链接 - private String buildConfirmUrl(String transferNo) { - String base = platformUrlConfigService.getUrlConfig().getPaymentGatewayBaseUrl(); - if (StrUtil.isBlank(base)) { - return null; - } - return StrUtil.format("{}/transfer-confirm/{}", base, transferNo); - } - // ===== 支付宝转账 ===== @PermCode(code = PermCodes.Action.VIEW) diff --git a/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/service/trade/MchTransferService.java b/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/service/trade/MchTransferService.java index 3c7688229..ba1d44ff7 100644 --- a/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/service/trade/MchTransferService.java +++ b/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/service/trade/MchTransferService.java @@ -22,6 +22,7 @@ import cn.daxpay.open.payment.trade.transfer.result.DouyinTransferOrderResult; import cn.daxpay.open.payment.trade.transfer.result.TransferTradeResult; import cn.daxpay.open.payment.trade.transfer.result.WechatTransferOrderResult; import cn.daxpay.open.payment.trade.transfer.runtime.service.TransferCloseService; +import cn.daxpay.open.payment.trade.transfer.runtime.service.TransferConfirmUrlService; import cn.daxpay.open.payment.trade.transfer.runtime.service.TransferStartService; import cn.daxpay.open.payment.trade.transfer.runtime.service.TransferSyncService; import cn.daxpay.open.payment.trade.transfer.util.PayeeDesensitizeUtil; @@ -47,6 +48,7 @@ public class MchTransferService { private final TransferStartService transferStartService; private final TransferSyncService transferSyncService; private final TransferCloseService transferCloseService; + private final TransferConfirmUrlService transferConfirmUrlService; private final TransService transService; /// 微信转账单分页 @@ -64,6 +66,10 @@ public class MchTransferService { WechatTransferOrder entity = wechatTransferOrderManager.findById(id) .orElseThrow(() -> new DataNotExistException("pay.error.transfer.notFound")); WechatTransferOrderResult result = WechatTransferOrderConvert.CONVERT.toResult(entity); + // 待领取状态填充确认收款链接 + if ("processing".equals(entity.getStatus())) { + result.setConfirmUrl(transferConfirmUrlService.buildConfirmUrl(entity.getTransferNo())); + } transService.translate(result); // 收款人信息脱敏 PayeeDesensitizeUtil.desensitize(result);