同步平台业务模块能力

This commit is contained in:
baiyanyun
2026-07-13 09:13:30 +08:00
parent e612f5e434
commit a1a38f62d8
224 changed files with 22331 additions and 1224 deletions

View File

@@ -0,0 +1,28 @@
package com.xspaceagi.pay.spec.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用项目支付 - App 原生第一步:创建订单请求。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralProjectAppOrderCreateRequest {
/** 项目 ID必传前端从 DEV_PROJECT_ID 环境变量获取 */
private String projectId;
/** 业务订单号,可空;传了用 GP1_ 前缀(幂等),不传用 GP2_ 前缀自动生成 */
private String bizOrderNo;
/** 订单金额(单位:分) */
private Long orderAmount;
/** 订单标题/商品描述 */
private String subject;
}

View File

@@ -0,0 +1,20 @@
package com.xspaceagi.pay.spec.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用项目支付 - App 原生第一步:创建订单响应。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralProjectAppOrderCreateResponse {
private String orderNo;
private String gatewayOrderNo;
}

View File

@@ -0,0 +1,22 @@
package com.xspaceagi.pay.spec.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用项目支付 - App 原生第二步:调起渠道支付请求。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralProjectAppPayRequest {
/** 业务订单号(第一步返回的 orderNo */
private String orderNo;
/** 支付渠道WxPay / AliPay */
private String payChannel;
}

View File

@@ -0,0 +1,44 @@
package com.xspaceagi.pay.spec.dto;
import com.xspaceagi.pay.sdk.dto.WxPayInvokeParams;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用项目支付 - App 原生第二步:调起渠道支付响应。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralProjectAppPayResponse {
private String orderNo;
private String gatewayOrderNo;
/** WxPay | AliPay */
private String payChannel;
/** 微信:其他渠道 prepay JSON当前安心付渠道为 null支付宝不使用 */
private WxPayInvokeParams wxPayParams;
/**
* 微信weixin://dl/business/...
* 支付宝https://qr.alipay.com/... 或 alipays://
*/
private String redirectUrl;
/** 支付宝 tradeNO部分 SDK 使用) */
private String alipayTradeNo;
/** REDIRECT_URL | QRCODE_FALLBACK */
private String invokeType;
/** 支付宝 invokeType=QRCODE_FALLBACK 时的二维码内容 */
private String qrCodeContent;
private String status;
}

View File

@@ -0,0 +1,31 @@
package com.xspaceagi.pay.spec.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用项目支付 - 收银台模式请求。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralProjectCashierRequest {
/** 项目 ID必传前端从 DEV_PROJECT_ID 环境变量获取 */
private String projectId;
/** 业务订单号,可空;传了用 GP1_ 前缀(幂等),不传用 GP2_ 前缀自动生成 */
private String bizOrderNo;
/** 订单金额(单位:分) */
private Long orderAmount;
/** 订单标题/商品描述 */
private String subject;
/** 支付完成后前端回跳地址,可空 */
private String frontNotifyUrl;
}

View File

@@ -0,0 +1,25 @@
package com.xspaceagi.pay.spec.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用项目支付 - 收银台模式响应。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralProjectCashierResponse {
/** 业务订单号GP1_ 或 GP2_ 前缀) */
private String orderNo;
/** 网关支付订单号 */
private String gatewayOrderNo;
/** 收银台跳转地址(浏览器直接跳转) */
private String cashierUrl;
}

View File

@@ -0,0 +1,28 @@
package com.xspaceagi.pay.spec.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用项目支付 - H5 第一步:创建订单请求。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralProjectH5OrderCreateRequest {
/** 项目 ID必传前端从 DEV_PROJECT_ID 环境变量获取 */
private String projectId;
/** 业务订单号,可空;传了用 GP1_ 前缀(幂等),不传用 GP2_ 前缀自动生成 */
private String bizOrderNo;
/** 订单金额(单位:分) */
private Long orderAmount;
/** 订单标题/商品描述 */
private String subject;
}

View File

@@ -0,0 +1,22 @@
package com.xspaceagi.pay.spec.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用项目支付 - H5 第一步:创建订单响应。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralProjectH5OrderCreateResponse {
/** 业务订单号GP1_ 或 GP2_ 前缀) */
private String orderNo;
/** 网关支付订单号 */
private String gatewayOrderNo;
}

View File

@@ -0,0 +1,25 @@
package com.xspaceagi.pay.spec.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用项目支付 - H5 第二步:调起渠道支付请求。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralProjectH5PayRequest {
/** 业务订单号(第一步返回的 orderNo */
private String orderNo;
/** 支付渠道WxPay / AliPay */
private String payChannel;
/** 支付完成后前端回跳地址 */
private String frontNotifyUrl;
}

View File

@@ -0,0 +1,34 @@
package com.xspaceagi.pay.spec.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用项目支付 - H5 第二步:调起渠道支付响应。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralProjectH5PayResponse {
/** 业务订单号 */
private String orderNo;
/** 网关支付订单号 */
private String gatewayOrderNo;
/** 表单 HTMLinvokeType=FORM_HTML 时,直接写入页面) */
private String formHtml;
/** 跳转地址invokeType=REDIRECT_URL 时,浏览器跳转) */
private String redirectUrl;
/** 调起方式FORM_HTML / REDIRECT_URL / QRCODE_FALLBACK */
private String invokeType;
/** 当前支付单状态 */
private String status;
}

View File

@@ -0,0 +1,19 @@
package com.xspaceagi.pay.spec.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用项目支付 - 查询支付状态请求。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralProjectPaymentStatusRequest {
/** 网关支付订单号 */
private String gatewayOrderNo;
}

View File

@@ -0,0 +1,31 @@
package com.xspaceagi.pay.spec.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 通用项目支付 - 查询支付状态响应。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralProjectPaymentStatusResponse {
/** 支付状态INIT / PENDING / PAID / FAILED / CLOSED */
private String status;
/** 支付渠道WxPay / AliPay / UnionPay */
private String payChannel;
/** 支付模式scan / h5 / minipay */
private String payMode;
/** 订单金额(单位:分) */
private Long orderAmount;
/** 支付完成时间 */
private String paidAt;
}

View File

@@ -0,0 +1,20 @@
package com.xspaceagi.pay.spec.support;
import com.xspaceagi.pay.sdk.support.PayAppWebViewDetector;
import com.xspaceagi.system.spec.enums.ErrorCodeEnum;
import com.xspaceagi.system.spec.exception.BizException;
import com.xspaceagi.system.spec.exception.BizExceptionCodeEnum;
/**
* App 原生支付仅允许在 App WebView 内调起;系统/手机浏览器应使用 H5 接口。
*/
public final class PayAppNativeInAppGuard {
private PayAppNativeInAppGuard() {}
public static void assertAppNativePayRequired(String clientTypeHeader, String userAgent) {
if (!PayAppWebViewDetector.isAppWebView(clientTypeHeader, userAgent)) {
throw BizException.of(ErrorCodeEnum.INVALID_PARAM, BizExceptionCodeEnum.pay_app_native_requires_app);
}
}
}

View File

@@ -0,0 +1,20 @@
package com.xspaceagi.pay.spec.support;
import com.xspaceagi.pay.sdk.support.PayAppWebViewDetector;
import com.xspaceagi.system.spec.enums.ErrorCodeEnum;
import com.xspaceagi.system.spec.exception.BizException;
import com.xspaceagi.system.spec.exception.BizExceptionCodeEnum;
/**
* App WebView 内禁止调起 H5 支付(渠道违规);应使用 App 原生 SDK 接口。
*/
public final class PayH5InAppGuard {
private PayH5InAppGuard() {}
public static void assertH5PayAllowed(String clientTypeHeader, String userAgent) {
if (PayAppWebViewDetector.isAppWebView(clientTypeHeader, userAgent)) {
throw BizException.of(ErrorCodeEnum.INVALID_PARAM, BizExceptionCodeEnum.pay_h5_not_allowed_in_app);
}
}
}