refactor(transfer): 微信确认收款链接抽取为 TransferConfirmUrlService 复用, 订单详情 processing 状态回填 confirmUrl

- 将运营/商户两端 Controller 内联的 buildConfirmUrl 抽取到 payment-core 的 TransferConfirmUrlService, 发起返回与详情查询共用
- TransferAdminService/MchTransferService 详情查询在待领取(processing)状态时填充 confirmUrl
- WechatTransferOrderResult 新增 confirmUrl 字段
This commit is contained in:
daxpay
2026-08-08 14:48:15 +08:00
parent 6b94808510
commit 09547d9018
6 changed files with 53 additions and 26 deletions

View File

@@ -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<TransferCreateResult> 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")

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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<TransferCreateResult> 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)

View File

@@ -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);