From 0cdbc1412d004889bafdd5c8638cb5e09fcaef6e Mon Sep 17 00:00:00 2001 From: DaxPay Dev Date: Mon, 13 Jul 2026 09:41:46 +0800 Subject: [PATCH] =?UTF-8?q?refactor(payment):=20=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E4=BB=85=E4=BF=9D=E7=95=99=E7=AD=BE=E5=90=8D?= =?UTF-8?q?=E7=BB=84=E5=8F=82=EF=BC=8C=E5=8E=BB=E6=8E=89=E7=9B=B4=E8=B0=83?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=90=8E=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 管理端 develop 不再调用 NormalPayService;真实支付由前端模拟商户请求走 /unipay/pay。 同步放宽直传模式 method 校验,路由模式由 PayRouteService 显式校验。 --- .../develop}/DevelopAuthController.java | 4 +- .../develop}/DevelopSignController.java | 10 +- .../develop}/DevelopTradeController.java | 18 ++-- .../admin/param/develop}/DevelopParam.java | 2 +- .../param/develop}/DevelopSignParam.java | 2 +- .../param/develop}/DevelopVerifyParam.java | 2 +- .../result/develop}/DevelopSignResult.java | 2 +- .../service/develop}/DevelopAuthService.java | 2 +- .../service/develop}/DevelopSignService.java | 8 +- .../service/develop/DevelopTradeService.java | 57 ++++++++++ .../route/runtime/PayRouteService.java | 4 + .../param/trade/pay/NormalPayParam.java | 5 +- .../web/develop/result/DevelopPayResult.java | 21 ---- .../develop/service/DevelopTradeService.java | 100 ------------------ .../resources/i18n/en-US/pay/route/error.json | 1 + .../resources/i18n/zh-CN/pay/route/error.json | 1 + 16 files changed, 88 insertions(+), 151 deletions(-) rename daxpay-payment/{daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/controller => daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/develop}/DevelopAuthController.java (96%) rename daxpay-payment/{daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/controller => daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/develop}/DevelopSignController.java (80%) rename daxpay-payment/{daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/controller => daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/develop}/DevelopTradeController.java (81%) rename daxpay-payment/{daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/param => daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/param/develop}/DevelopParam.java (93%) rename daxpay-payment/{daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/param => daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/param/develop}/DevelopSignParam.java (90%) rename daxpay-payment/{daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/param => daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/param/develop}/DevelopVerifyParam.java (91%) rename daxpay-payment/{daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/result => daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/result/develop}/DevelopSignResult.java (89%) rename daxpay-payment/{daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/service => daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/develop}/DevelopAuthService.java (98%) rename daxpay-payment/{daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/service => daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/develop}/DevelopSignService.java (83%) create mode 100644 daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/develop/DevelopTradeService.java delete mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/result/DevelopPayResult.java delete mode 100644 daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/service/DevelopTradeService.java diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/controller/DevelopAuthController.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/develop/DevelopAuthController.java similarity index 96% rename from daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/controller/DevelopAuthController.java rename to daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/develop/DevelopAuthController.java index 286642e18..254416420 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/controller/DevelopAuthController.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/develop/DevelopAuthController.java @@ -1,9 +1,9 @@ -package cn.daxpay.open.payment.web.develop.controller; +package cn.daxpay.open.payment.admin.controller.develop; import cn.daxpay.open.payment.unipay.param.assist.GenerateAuthUrlParam; import cn.daxpay.open.payment.unipay.result.assist.AuthResult; import cn.daxpay.open.payment.unipay.result.assist.AuthUrlResult; -import cn.daxpay.open.payment.web.develop.service.DevelopAuthService; +import cn.daxpay.open.payment.admin.service.develop.DevelopAuthService; import cn.daxpay.open.platform.core.annotation.PermCode; import cn.daxpay.open.platform.core.rest.Res; import cn.daxpay.open.platform.core.rest.result.Result; diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/controller/DevelopSignController.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/develop/DevelopSignController.java similarity index 80% rename from daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/controller/DevelopSignController.java rename to daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/develop/DevelopSignController.java index 6afc7b750..bc3c2c366 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/controller/DevelopSignController.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/develop/DevelopSignController.java @@ -1,9 +1,9 @@ -package cn.daxpay.open.payment.web.develop.controller; +package cn.daxpay.open.payment.admin.controller.develop; -import cn.daxpay.open.payment.web.develop.param.DevelopSignParam; -import cn.daxpay.open.payment.web.develop.param.DevelopVerifyParam; -import cn.daxpay.open.payment.web.develop.result.DevelopSignResult; -import cn.daxpay.open.payment.web.develop.service.DevelopSignService; +import cn.daxpay.open.payment.admin.param.develop.DevelopSignParam; +import cn.daxpay.open.payment.admin.param.develop.DevelopVerifyParam; +import cn.daxpay.open.payment.admin.result.develop.DevelopSignResult; +import cn.daxpay.open.payment.admin.service.develop.DevelopSignService; import cn.daxpay.open.platform.core.annotation.PermCode; import cn.daxpay.open.platform.core.rest.Res; import cn.daxpay.open.platform.core.rest.result.Result; diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/controller/DevelopTradeController.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/develop/DevelopTradeController.java similarity index 81% rename from daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/controller/DevelopTradeController.java rename to daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/develop/DevelopTradeController.java index daa100dc5..d4dd3e0d7 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/controller/DevelopTradeController.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/controller/develop/DevelopTradeController.java @@ -1,9 +1,8 @@ -package cn.daxpay.open.payment.web.develop.controller; +package cn.daxpay.open.payment.admin.controller.develop; -import cn.daxpay.open.payment.web.develop.param.DevelopParam; -import cn.daxpay.open.payment.web.develop.result.DevelopPayResult; -import cn.daxpay.open.payment.web.develop.result.DevelopSignResult; -import cn.daxpay.open.payment.web.develop.service.DevelopTradeService; +import cn.daxpay.open.payment.admin.param.develop.DevelopParam; +import cn.daxpay.open.payment.admin.result.develop.DevelopSignResult; +import cn.daxpay.open.payment.admin.service.develop.DevelopTradeService; import cn.daxpay.open.payment.masterdata.constants.provider.result.PayProviderMethodResult; import cn.daxpay.open.payment.unipay.param.trade.pay.NormalPayParam; import cn.daxpay.open.platform.core.annotation.PermCode; @@ -24,6 +23,8 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; /// 交易开发调试(管理) +/// +/// 仅提供签名与元数据辅助, 真实支付由前端模拟商户请求调用 `/unipay/pay`。 @PermCode(menuCode = "develop:trade") @Tag(name = "交易开发调试服务") @RestController @@ -40,13 +41,6 @@ public class DevelopTradeController { return Res.ok(developTradeService.sign(param)); } - @PermCode(code = "pay", nameCn = "支付", nameEn = "Pay") - @Operation(summary = "支付调试(真实发起)") - @PostMapping("/pay") - public Result pay(@RequestBody DevelopParam param) { - return Res.ok(developTradeService.pay(param)); - } - @PermCode(code = "view", nameCn = "查看", nameEn = "View") @Operation(summary = "已启用渠道支付方式目录") @GetMapping("/method-directory") diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/param/DevelopParam.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/param/develop/DevelopParam.java similarity index 93% rename from daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/param/DevelopParam.java rename to daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/param/develop/DevelopParam.java index 2f140c268..0ab39f858 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/param/DevelopParam.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/param/develop/DevelopParam.java @@ -1,4 +1,4 @@ -package cn.daxpay.open.payment.web.develop.param; +package cn.daxpay.open.payment.admin.param.develop; import cn.daxpay.open.payment.unipay.param.MerchantPaymentCommonParam; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/param/DevelopSignParam.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/param/develop/DevelopSignParam.java similarity index 90% rename from daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/param/DevelopSignParam.java rename to daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/param/develop/DevelopSignParam.java index a0ec29304..d1da6395a 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/param/DevelopSignParam.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/param/develop/DevelopSignParam.java @@ -1,4 +1,4 @@ -package cn.daxpay.open.payment.web.develop.param; +package cn.daxpay.open.payment.admin.param.develop; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/param/DevelopVerifyParam.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/param/develop/DevelopVerifyParam.java similarity index 91% rename from daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/param/DevelopVerifyParam.java rename to daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/param/develop/DevelopVerifyParam.java index c7b2f2889..72e223442 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/param/DevelopVerifyParam.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/param/develop/DevelopVerifyParam.java @@ -1,4 +1,4 @@ -package cn.daxpay.open.payment.web.develop.param; +package cn.daxpay.open.payment.admin.param.develop; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/result/DevelopSignResult.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/result/develop/DevelopSignResult.java similarity index 89% rename from daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/result/DevelopSignResult.java rename to daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/result/develop/DevelopSignResult.java index 0d80cce2f..691733106 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/result/DevelopSignResult.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/result/develop/DevelopSignResult.java @@ -1,4 +1,4 @@ -package cn.daxpay.open.payment.web.develop.result; +package cn.daxpay.open.payment.admin.result.develop; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/service/DevelopAuthService.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/develop/DevelopAuthService.java similarity index 98% rename from daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/service/DevelopAuthService.java rename to daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/develop/DevelopAuthService.java index 3436324bf..c1f47ad56 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/service/DevelopAuthService.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/develop/DevelopAuthService.java @@ -1,4 +1,4 @@ -package cn.daxpay.open.payment.web.develop.service; +package cn.daxpay.open.payment.admin.service.develop; import cn.daxpay.open.payment.core.assist.AuthSessionStore; import cn.daxpay.open.payment.core.assist.ChannelAuthService; diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/service/DevelopSignService.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/develop/DevelopSignService.java similarity index 83% rename from daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/service/DevelopSignService.java rename to daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/develop/DevelopSignService.java index 374e74859..27db22515 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/service/DevelopSignService.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/develop/DevelopSignService.java @@ -1,8 +1,8 @@ -package cn.daxpay.open.payment.web.develop.service; +package cn.daxpay.open.payment.admin.service.develop; -import cn.daxpay.open.payment.web.develop.param.DevelopSignParam; -import cn.daxpay.open.payment.web.develop.param.DevelopVerifyParam; -import cn.daxpay.open.payment.web.develop.result.DevelopSignResult; +import cn.daxpay.open.payment.admin.param.develop.DevelopSignParam; +import cn.daxpay.open.payment.admin.param.develop.DevelopVerifyParam; +import cn.daxpay.open.payment.admin.result.develop.DevelopSignResult; import cn.daxpay.open.payment.common.util.JsonSignStrUtil; import cn.daxpay.open.platform.core.util.RsaSignUtil; import lombok.RequiredArgsConstructor; diff --git a/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/develop/DevelopTradeService.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/develop/DevelopTradeService.java new file mode 100644 index 000000000..62322436d --- /dev/null +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/service/develop/DevelopTradeService.java @@ -0,0 +1,57 @@ +package cn.daxpay.open.payment.admin.service.develop; + +import cn.daxpay.open.payment.admin.param.develop.DevelopParam; +import cn.daxpay.open.payment.admin.result.develop.DevelopSignResult; +import cn.daxpay.open.payment.common.util.ObjectSignStrUtil; +import cn.daxpay.open.payment.common.util.PaySignUtil; +import cn.daxpay.open.payment.masterdata.constants.provider.result.PayProviderMethodResult; +import cn.daxpay.open.payment.masterdata.constants.provider.service.PayProviderMethodService; +import cn.daxpay.open.payment.merchant.service.route.support.PayRouteStrategyCapabilitySupport; +import cn.daxpay.open.payment.unipay.param.trade.pay.NormalPayParam; +import cn.daxpay.open.platform.core.rest.dto.LabelValue; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/// # 交易开发调试服务 +/// +/// 仅提供组参辅助与签名能力, **不发起真实交易**。 +/// 真实支付由管理端调试页模拟商户 HTTP 请求调用 `/unipay/pay` 完成, +/// 与正式对接走同一入口, 避免 admin 内部直调支付核心形成后门。 +@Slf4j +@Service +@RequiredArgsConstructor +public class DevelopTradeService { + + private final PayProviderMethodService payProviderMethodService; + private final PayRouteStrategyCapabilitySupport payRouteStrategyCapabilitySupport; + + /// 生成支付参数签名(与正式签名逻辑一致) + /// + /// 调用方需在 param 中自备 reqTime / nonceStr 等公共字段, 本方法只负责签名串与签名值。 + public DevelopSignResult sign(DevelopParam param) { + // 签名串(与 PaySignUtil 内部一致) + String signStr = ObjectSignStrUtil.buildSignStr(param.getParam()); + // 签名值 + String sign = PaySignUtil.sign(param.getParam(), param.getPrivateKey()); + return new DevelopSignResult().setSignStr(signStr).setSign(sign); + } + + /// 已启用渠道支付方式目录(供调试页支付方式下拉) + public List listMethodDirectory() { + return payProviderMethodService.listDirectoryFlat(); + } + + /// 传值模式:商户全部启用通道商户候选, provider 为空返回全部, + /// 非空按支付渠道过滤(如 wechat 返回所有声明支持微信的产品通道商户, 含官方与三方聚合通道) + public List listChannelMchCandidates(String mchNo, String provider) { + return payRouteStrategyCapabilitySupport.listDirectChannelMchCandidates(mchNo, provider); + } + + /// 传值模式:按通道商户(产品)返回全部启用支付能力候选 + public List listCapabilityCandidates(String channelMchNo) { + return payRouteStrategyCapabilitySupport.listDirectCapabilityCandidates(channelMchNo); + } +} diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/merchant/service/route/runtime/PayRouteService.java b/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/merchant/service/route/runtime/PayRouteService.java index 3f8805f0c..3ca624928 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/merchant/service/route/runtime/PayRouteService.java +++ b/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/merchant/service/route/runtime/PayRouteService.java @@ -55,6 +55,10 @@ public class PayRouteService implements PayRouteFacade { resolveDirect(payParam); return; } + // 路由模式: 支付方式必填(Bean Validation 已放宽以兼容直定可空, 此处显式校验) + if (StrUtil.isBlank(payParam.getMethod())) { + throw new BizInfoException(CommonErrorCode.VALIDATE_PARAMETERS_ERROR, "pay.route.error.methodRequired"); + } String appId = payParam.getAppId(); var bundle = loadBundle(appId); if (bundle == null || bundle.getStrategy() == null) { diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/unipay/param/trade/pay/NormalPayParam.java b/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/unipay/param/trade/pay/NormalPayParam.java index 189a00acf..189b81459 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/unipay/param/trade/pay/NormalPayParam.java +++ b/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/unipay/param/trade/pay/NormalPayParam.java @@ -55,9 +55,10 @@ public class NormalPayParam extends MerchantPaymentCommonParam { private String product; /// 支付方式编码 + /// - 路由模式: 必填, 由路由引擎按 appId+method 匹配 + /// - 直定模式(已传 channelMchNo+capability): 可空, 由 PayRouteService 按能力反推回填 /// @see PayMethodEnum - @Schema(description = "支付方式编码") - @NotBlank(message = "{validation.field.method.notBlank}") + @Schema(description = "支付方式编码(路由模式必填; 直定模式可空, 由能力反推)") @Size(max = 32, message = "{validation.field.method.size}") private String method; diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/result/DevelopPayResult.java b/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/result/DevelopPayResult.java deleted file mode 100644 index 4ed63aa19..000000000 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/result/DevelopPayResult.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.daxpay.open.payment.web.develop.result; - -import cn.daxpay.open.payment.unipay.result.trade.pay.NormalPayResult; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.experimental.Accessors; - -/// # 支付调试结果 -@Data -@Accessors(chain = true) -@Schema(title = "支付调试结果") -public class DevelopPayResult { - - /// 支付结果 - @Schema(description = "支付结果") - private NormalPayResult payResult; - - /// 响应签名(平台私钥签名, 可用于验证响应完整性) - @Schema(description = "响应签名") - private String sign; -} diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/service/DevelopTradeService.java b/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/service/DevelopTradeService.java deleted file mode 100644 index 18ac7d532..000000000 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/web/develop/service/DevelopTradeService.java +++ /dev/null @@ -1,100 +0,0 @@ -package cn.daxpay.open.payment.web.develop.service; - -import cn.daxpay.open.payment.web.develop.param.DevelopParam; -import cn.daxpay.open.payment.web.develop.result.DevelopPayResult; -import cn.daxpay.open.payment.web.develop.result.DevelopSignResult; -import cn.daxpay.open.payment.common.runtime.PaymentContext; -import cn.daxpay.open.payment.common.service.MerchantContextLoader; -import cn.daxpay.open.payment.common.service.PaySignService; -import cn.daxpay.open.payment.common.util.ObjectSignStrUtil; -import cn.daxpay.open.payment.common.util.PaySignUtil; -import cn.daxpay.open.payment.masterdata.constants.provider.result.PayProviderMethodResult; -import cn.daxpay.open.payment.masterdata.constants.provider.service.PayProviderMethodService; -import cn.daxpay.open.payment.merchant.service.route.support.PayRouteStrategyCapabilitySupport; -import cn.daxpay.open.payment.core.trade.runtime.service.pay.NormalPayService; -import cn.daxpay.open.payment.unipay.param.trade.pay.NormalPayParam; -import cn.daxpay.open.payment.unipay.result.trade.pay.NormalPayResult; -import cn.daxpay.open.platform.common.config.properties.PlatformConfigProperties; -import cn.daxpay.open.platform.core.code.CommonErrorCode; -import cn.daxpay.open.platform.core.exception.BizInfoException; -import cn.daxpay.open.platform.core.rest.dto.LabelValue; -import cn.hutool.core.util.StrUtil; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; - -/// # 交易开发调试服务 -/// -/// 复用普通支付核心服务 NormalPayService, 在管理端以指定商户/应用身份真实发起一笔支付, -/// 便于联调验证通道配置与签名是否正确 -@Slf4j -@Service -@RequiredArgsConstructor -public class DevelopTradeService { - - private final NormalPayService normalPayService; - private final PaymentContext paymentContext; - private final MerchantContextLoader merchantContextLoader; - private final PaySignService paySignService; - private final PlatformConfigProperties platformConfigProperties; - private final PayProviderMethodService payProviderMethodService; - private final PayRouteStrategyCapabilitySupport payRouteStrategyCapabilitySupport; - - /// 生成支付参数签名(与正式签名逻辑一致) - public DevelopSignResult sign(DevelopParam param) { - // 签名串(与 PaySignUtil 内部一致) - String signStr = ObjectSignStrUtil.buildSignStr(param.getParam()); - // 签名值 - String sign = PaySignUtil.sign(param.getParam(), param.getPrivateKey()); - return new DevelopSignResult().setSignStr(signStr).setSign(sign); - } - - /// 支付调试(真实发起) - /// - /// 安全流程与正式支付一致: - /// 1. 使用传入的商户私钥对参数签名, 再用系统配置的商户公钥验签, 校验私钥是否正确 - /// 2. 发起真实支付 - /// 3. 使用平台私钥对支付结果签名, 便于客户端验证响应完整性 - public DevelopPayResult pay(DevelopParam param) { - NormalPayParam payParam = param.getParam(); - // 私钥必填 - if (StrUtil.isBlank(param.getPrivateKey())) { - throw new BizInfoException(CommonErrorCode.VALIDATE_PARAMETERS_ERROR, "pay.error.assist.privateKeyEmpty"); - } - // 在支付作用域内执行, 初始化商户身份(mchNo 进入线程上下文) - return paymentContext.runAs(() -> { - // 初始化商户身份(含状态校验) - merchantContextLoader.initMch(payParam.getMchNo()); - // 私钥验证: 用传入私钥签名, 再用系统配置的商户公钥验签 - String sign = PaySignUtil.sign(payParam, param.getPrivateKey()); - payParam.setSign(sign); - paySignService.signVerify(payParam); - // 发起真实支付 - NormalPayResult payResult = normalPayService.pay(payParam); - // 使用平台私钥对支付结果签名 - String platformPrivateKey = platformConfigProperties.getKeyConfig().getPrivateKey(); - String resultSign = PaySignUtil.sign(payResult, platformPrivateKey); - return new DevelopPayResult() - .setPayResult(payResult) - .setSign(resultSign); - }); - } - - /// 已启用渠道支付方式目录(供调试页支付方式下拉) - public List listMethodDirectory() { - return payProviderMethodService.listDirectoryFlat(); - } - - /// 传值模式:商户全部启用通道商户候选, provider 为空返回全部, - /// 非空按支付渠道过滤(如 wechat 返回所有声明支持微信的产品通道商户, 含官方与三方聚合通道) - public List listChannelMchCandidates(String mchNo, String provider) { - return payRouteStrategyCapabilitySupport.listDirectChannelMchCandidates(mchNo, provider); - } - - /// 传值模式:按通道商户(产品)返回全部启用支付能力候选 - public List listCapabilityCandidates(String channelMchNo) { - return payRouteStrategyCapabilitySupport.listDirectCapabilityCandidates(channelMchNo); - } -} diff --git a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/pay/route/error.json b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/pay/route/error.json index 67d6d3885..cc954f842 100644 --- a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/pay/route/error.json +++ b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/pay/route/error.json @@ -1,6 +1,7 @@ { "strategyNotFound": "Payment route strategy not configured for this app", "noMatch": "No available payment product matched", + "methodRequired": "Pay method is required in route mode", "providerRequired": "Pay brand is required when product is not specified", "methodRequiredWhenProductSet": "Pay method is required when product is specified", "basicProviderInvalid": "Invalid pay brand", diff --git a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/pay/route/error.json b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/pay/route/error.json index 6fcf92530..618ab639a 100644 --- a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/pay/route/error.json +++ b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/pay/route/error.json @@ -1,6 +1,7 @@ { "strategyNotFound": "应用未配置通道路由策略", "noMatch": "未匹配到可用支付产品", + "methodRequired": "路由模式下支付方式不能为空", "providerRequired": "未指定支付产品时,支付渠道不能为空", "methodRequiredWhenProductSet": "指定支付产品时,支付方式不能为空", "basicProviderInvalid": "支付渠道无效",