refactor(risk): 用户可见文案统一为「用户标识」(兼容支付宝 userId 语义)

- PayRiskOpenIdLevelEnum/PlatformPaySecurityConfig 等用户可见注释与 Schema description: 'openId 拦截级别' → '用户标识拦截级别'
- 3 处主链路 service(AggregatePayService/CashierPayService/CodePayAssistService) 方法注释统一术语
- 后端 validation.json × 10 语种文案同步调整
- 技术字段名(riskOpenIdLevel/hasOpenIdBlacklist/isEnhancedOpenIdLevel)保留, 维持 API/接口兼容
This commit is contained in:
DaxPay Dev
2026-07-20 15:59:19 +08:00
parent 68fb2b9cf9
commit 879a3f1f76
17 changed files with 33 additions and 33 deletions

View File

@@ -39,7 +39,7 @@ public class AggregatePayService {
private final GatewayAggregateConfigManager aggregateConfigManager;
/// 风控检查器(可选 SPI用于判断是否存在 openId 黑名单, 决定是否触发强制 OAuth
private final ObjectProvider<PayRiskChecker> payRiskCheckerProvider;
/// 平台安全配置(读取 openId 拦截级别, 决定 NORMAL 模式下不触发强制 OAuth
/// 平台安全配置(读取用户标识拦截级别, 决定 NORMAL 模式下不触发强制 OAuth
private final PlatformSecurityConfigService platformSecurityConfigService;
/// H5 聚合元数据: autoLaunch / needOpenId(不下发敏感路由字段)
@@ -83,9 +83,9 @@ public class AggregatePayService {
/// openId 触发判定
///
/// 1. JSAPI/MINI 类方式: 业务必需, 永远 true与历史行为一致
/// 2. 主扫/H5 等免 openId 方式: 仅当 openId 拦截级别为 ENHANCED,
/// 且存在 openId 黑名单, 且当前 clientEnv 可 OAuth 时 true,
/// 实现 openId 黑名单在聚合网关内的全局拦截
/// 2. 主扫/H5 等免用户标识方式: 仅当用户标识拦截级别为 ENHANCED,
/// 且存在用户标识黑名单, 且当前 clientEnv 可 OAuth 时 true,
/// 实现用户标识黑名单在聚合网关内的全局拦截
private boolean resolveNeedOpenId(String method, ClientEnvEnum clientEnv) {
if (PayMethodOpenIdSupport.needsOpenId(method)) {
return true;
@@ -97,7 +97,7 @@ public class AggregatePayService {
return PayMethodOpenIdSupport.canAcquireOpenId(method, clientEnv);
}
/// openId 拦截级别是否为增强模式NORMAL 时跳过强制 OAuth, 保留用户体验)
/// 用户标识拦截级别是否为增强模式NORMAL 时跳过强制 OAuth, 保留用户体验)
private boolean isEnhancedOpenIdLevel() {
String level = platformSecurityConfigService.getPaySecurityConfig().getRiskOpenIdLevel();
return PayRiskOpenIdLevelEnum.ENHANCED.getCode().equals(level);

View File

@@ -50,7 +50,7 @@ public class CashierPayService {
private final GatewayCashierItemManager gatewayCashierItemManager;
/// 风控检查器(可选 SPI用于判断是否存在 openId 黑名单, 决定是否触发强制 OAuth
private final ObjectProvider<PayRiskChecker> payRiskCheckerProvider;
/// 平台安全配置(读取 openId 拦截级别, 决定 NORMAL 模式下不触发强制 OAuth
/// 平台安全配置(读取用户标识拦截级别, 决定 NORMAL 模式下不触发强制 OAuth
private final PlatformSecurityConfigService platformSecurityConfigService;
/// 公开支付项列表(落地页展示)
@@ -172,8 +172,8 @@ public class CashierPayService {
/// openId 触发判定(与聚合/码牌同源逻辑)
///
/// 1. JSAPI/MINI 类方式: 业务必需, 永远 true
/// 2. 主扫/H5 等免 openId 方式: 仅当 openId 拦截级别为 ENHANCED,
/// 且存在 openId 黑名单且当前 clientEnv 可 OAuth 时 true
/// 2. 主扫/H5 等免用户标识方式: 仅当用户标识拦截级别为 ENHANCED,
/// 且存在用户标识黑名单且当前 clientEnv 可 OAuth 时 true
private boolean resolveItemNeedOpenId(String method, ClientEnvEnum clientEnv) {
if (PayMethodOpenIdSupport.needsOpenId(method)) {
return true;
@@ -185,7 +185,7 @@ public class CashierPayService {
return PayMethodOpenIdSupport.canAcquireOpenId(method, clientEnv);
}
/// openId 拦截级别是否为增强模式NORMAL 时跳过强制 OAuth, 保留用户体验)
/// 用户标识拦截级别是否为增强模式NORMAL 时跳过强制 OAuth, 保留用户体验)
private boolean isEnhancedOpenIdLevel() {
String level = platformSecurityConfigService.getPaySecurityConfig().getRiskOpenIdLevel();
return PayRiskOpenIdLevelEnum.ENHANCED.getCode().equals(level);

View File

@@ -66,7 +66,7 @@ public class CodePayAssistService {
private final NormalPayOrderManager normalPayOrderManager;
/// 风控检查器(可选 SPI用于判断是否存在 openId 黑名单, 决定是否触发强制 OAuth
private final ObjectProvider<PayRiskChecker> payRiskCheckerProvider;
/// 平台安全配置(读取 openId 拦截级别, 决定 NORMAL 模式下不触发强制 OAuth
/// 平台安全配置(读取用户标识拦截级别, 决定 NORMAL 模式下不触发强制 OAuth
private final PlatformSecurityConfigService platformSecurityConfigService;
/// 根据码牌编码查询支付信息(公开接口, 脱敏返回)
@@ -272,9 +272,9 @@ public class CodePayAssistService {
/// openId 触发判定
///
/// 1. JSAPI/MINI 类方式: 业务必需, 永远 true与历史行为一致
/// 2. 主扫/H5 等免 openId 方式: 仅当 openId 拦截级别为 ENHANCED,
/// 且存在 openId 黑名单且当前 clientEnv 可 OAuth 时 true,
/// 实现 openId 黑名单在码牌场景的全局拦截
/// 2. 主扫/H5 等免用户标识方式: 仅当用户标识拦截级别为 ENHANCED,
/// 且存在用户标识黑名单且当前 clientEnv 可 OAuth 时 true,
/// 实现用户标识黑名单在码牌场景的全局拦截
private boolean resolveNeedOpenId(String method, ClientEnvEnum clientEnv) {
if (PayMethodOpenIdSupport.needsOpenId(method)) {
return true;
@@ -286,7 +286,7 @@ public class CodePayAssistService {
return PayMethodOpenIdSupport.canAcquireOpenId(method, clientEnv);
}
/// openId 拦截级别是否为增强模式NORMAL 时跳过强制 OAuth, 保留用户体验)
/// 用户标识拦截级别是否为增强模式NORMAL 时跳过强制 OAuth, 保留用户体验)
private boolean isEnhancedOpenIdLevel() {
String level = platformSecurityConfigService.getPaySecurityConfig().getRiskOpenIdLevel();
return PayRiskOpenIdLevelEnum.ENHANCED.getCode().equals(level);

View File

@@ -792,7 +792,7 @@
"notNull": "Post-pay logging toggle cannot be empty"
},
"riskOpenIdLevel": {
"notNull": "openId interception level cannot be empty"
"notNull": "User identifier interception level cannot be empty"
},
"blockOverseasIp": {
"notNull": "Overseas IP block toggle cannot be empty"

View File

@@ -799,7 +799,7 @@
"notNull": "Pilihan pemeriksaan setelah pembayaran wajib diisi"
},
"riskOpenIdLevel": {
"notNull": "Level intercept openId tidak boleh kosong"
"notNull": "Level intersepsi identifier pengguna tidak boleh kosong"
},
"blockOverseasIp": {
"notNull": "Saklar blokir IP luar negeri tidak boleh kosong"

View File

@@ -792,7 +792,7 @@
"notNull": "決済後記録スイッチは必須です"
},
"riskOpenIdLevel": {
"notNull": "openId ブロック レベルは必須です"
"notNull": "ユーザー識別子ブロック レベルは必須です"
},
"blockOverseasIp": {
"notNull": "海外 IP ブロック スイッチは必須です"

View File

@@ -792,7 +792,7 @@
"notNull": "결제 후 기록 스위치는 필수입니다"
},
"riskOpenIdLevel": {
"notNull": "openId 차단 레벨은 필수입니다"
"notNull": "사용자 식별자 차단 레벨은 필수입니다"
},
"blockOverseasIp": {
"notNull": "해외 IP 차단 스위치는 필수입니다"

View File

@@ -799,7 +799,7 @@
"notNull": "Pilihan semakan selepas pembayaran tidak boleh kosong"
},
"riskOpenIdLevel": {
"notNull": "Tahap sekatan openId tidak boleh kosong"
"notNull": "Tahap sekatan pengecam pengguna tidak boleh kosong"
},
"blockOverseasIp": {
"notNull": "Suis sekatan IP luar negara tidak boleh kosong"

View File

@@ -799,7 +799,7 @@
"notNull": "ตัวเลือกการตรวจสอบหลังชำระเงินต้องไม่เป็นค่าว่าง"
},
"riskOpenIdLevel": {
"notNull": "ระดับการบล็อก openId ต้องไม่ว่าง"
"notNull": "ระดับการบล็อกตัวระบุผู้ใช้ต้องไม่ว่าง"
},
"blockOverseasIp": {
"notNull": "สวิตช์บล็อก IP ต่างประเทศต้องไม่ว่าง"

View File

@@ -799,7 +799,7 @@
"notNull": "Tùy chọn kiểm tra sau thanh toán là bắt buộc"
},
"riskOpenIdLevel": {
"notNull": "Cấp độ chặn openId không được để trống"
"notNull": "Cấp độ chặn mã định danh người dùng không được để trống"
},
"blockOverseasIp": {
"notNull": "Công tắc chặn IP nước ngoài không được để trống"

View File

@@ -792,7 +792,7 @@
"notNull": "事后补录开关不能为空"
},
"riskOpenIdLevel": {
"notNull": "openId 拦截级别不能为空"
"notNull": "用户标识拦截级别不能为空"
},
"blockOverseasIp": {
"notNull": "海外 IP 拦截开关不能为空"

View File

@@ -792,7 +792,7 @@
"notNull": "事後補錄開關不能為空"
},
"riskOpenIdLevel": {
"notNull": "openId 攔截級別不能為空"
"notNull": "使用者識別碼攔截級別不能為空"
},
"blockOverseasIp": {
"notNull": "海外 IP 攔截開關不能為空"

View File

@@ -792,7 +792,7 @@
"notNull": "事後補錄開關不能為空"
},
"riskOpenIdLevel": {
"notNull": "openId 攔截級別不能為空"
"notNull": "使用者識別碼攔截級別不能為空"
},
"blockOverseasIp": {
"notNull": "海外 IP 攔截開關不能為空"

View File

@@ -13,7 +13,7 @@ import lombok.experimental.Accessors;
/// - 风控总开关: 关闭后支付主链路跳过所有风控检查
/// - 命中阻断: 支付前命中黑名单是否拒绝下单(关闭则仅记录不拦截)
/// - 事后补录: 支付成功后是否补充记录命中(用于事后分析,不阻断资金态)
/// - openId 拦截级别: 是否对 H5 / 主扫等免 openId 方式强制 OAuth, 见 [PayRiskOpenIdLevelEnum]
/// - 用户标识拦截级别: 是否对 H5 / 主扫等免用户标识方式强制 OAuth, 见 [PayRiskOpenIdLevelEnum]
/// - 海外 IP 拦截: 占位字段, 后续接入 IP 地理位置库后实现
@Data
@Accessors(chain = true)
@@ -28,7 +28,7 @@ public class PlatformPaySecurityConfig {
/// 支付成功后是否补录命中(用于事后分析)
private Boolean riskCheckAfterPay = Boolean.TRUE;
/// openId 拦截级别(默认增强拦截, 保持历史行为)
/// 用户标识拦截级别(默认增强拦截, 保持历史行为)
/// @see PayRiskOpenIdLevelEnum
private String riskOpenIdLevel = PayRiskOpenIdLevelEnum.ENHANCED.getCode();

View File

@@ -7,20 +7,20 @@ import lombok.RequiredArgsConstructor;
import java.util.Arrays;
import java.util.Optional;
/// # openId 拦截级别
/// # 用户标识拦截级别
///
/// 控制 openId 黑名单对「原本免 openId 支付方式H5 / 主扫)」是否触发强制 OAuth。
/// JSAPI / 小程序原生方式业务本身就要 openId, 不受此开关影响。
/// 控制用户标识黑名单(微信 openId / 支付宝 userId 等)对「原本免用户标识支付方式H5 / 主扫)」
/// 是否触发强制 OAuth。JSAPI / 小程序原生方式业务本身就要用户标识, 不受此开关影响。
///
/// - [NORMAL]: 仅做 IP + 事后补录, 不为风控额外触发 OAuth保留用户体验
/// - [ENHANCED]: 存在 openId 名单时, 对 H5 / 主扫等可 OAuth 方式强制静默授权
/// - [ENHANCED]: 存在用户标识名单时, 对 H5 / 主扫等可 OAuth 方式强制静默授权
@Getter
@RequiredArgsConstructor
public enum PayRiskOpenIdLevelEnum implements I18nSupport {
/// 正常拦截(仅 IP + 事后补录)
NORMAL("normal"),
/// 增强拦截(对 H5 / 主扫强制 OAuth
/// 增强拦截(对 H5 / 主扫强制 OAuth 取用户标识
ENHANCED("enhanced");
private final String code;

View File

@@ -24,7 +24,7 @@ public class PlatformPaySecurityConfigParam {
@NotNull(message = "{validation.field.riskCheckAfterPay.notNull}")
private Boolean riskCheckAfterPay;
@Schema(description = "openId 拦截级别normal=正常拦截 / enhanced=增强拦截)")
@Schema(description = "用户标识拦截级别normal=正常拦截 / enhanced=增强拦截)")
@NotNull(message = "{validation.field.riskOpenIdLevel.notNull}")
private String riskOpenIdLevel;

View File

@@ -23,7 +23,7 @@ public class PlatformPaySecurityConfigResult extends BaseResult {
@Schema(description = "支付成功后是否补录命中(用于事后分析)")
private Boolean riskCheckAfterPay;
@Schema(description = "openId 拦截级别normal=正常拦截 / enhanced=增强拦截)")
@Schema(description = "用户标识拦截级别normal=正常拦截 / enhanced=增强拦截)")
private String riskOpenIdLevel;
@Schema(description = "海外 IP 拦截(占位字段, 默认关闭, 后续接入)")