feat(risk): 风控配置页新增拦截级别与海外IP拦截占位项

- RiskConfig.vue 新增「拦截策略」分区, 含 openId 拦截级别 RadioGroup(normal/enhanced) 与海外 IP 拦截 Switch(disabled + 敬请期待 tooltip)
- summaryItems 增加拦截级别与海外 IP 概要标签
- security.api.ts PaySecurityConfig 增加 riskOpenIdLevel 与 blockOverseasIp 字段
- 同步 10 语种 pay-security.json(含 label/desc/comingSoon 等)
This commit is contained in:
DaxPay Dev
2026-07-20 15:51:15 +08:00
parent 431d27540d
commit 8dfa09b062
12 changed files with 234 additions and 22 deletions

View File

@@ -213,4 +213,8 @@ export interface PaySecurityConfig {
riskBlockBeforePay?: boolean;
/** 支付成功后是否补录命中(用于事后分析) */
riskCheckAfterPay?: boolean;
/** openId 拦截级别normal=正常拦截 / enhanced=增强拦截) */
riskOpenIdLevel?: string;
/** 海外 IP 拦截(占位字段, 默认关闭, 后续接入) */
blockOverseasIp?: boolean;
}

View File

@@ -13,10 +13,14 @@
"blockOn": "Hit: Block Order",
"blockOff": "Hit: Log Only",
"afterOn": "Post-Pay Log: On",
"afterOff": "Post-Pay Log: Off"
"afterOff": "Post-Pay Log: Off",
"levelNormal": "Level: Normal",
"levelEnhanced": "Level: Enhanced",
"overseasOn": "Overseas IP: Block"
},
"section": {
"switch": "Risk Control"
"switch": "Risk Control",
"strategy": "Interception Strategy"
},
"riskEnabled": {
"label": "Risk Control Master Switch",
@@ -29,6 +33,17 @@
"riskCheckAfterPay": {
"label": "Post-Pay Hit Logging",
"desc": "When enabled, hits are recorded after successful payment for post-event analysis, without affecting funds."
},
"riskOpenIdLevel": {
"label": "openId Interception Level",
"desc": "Normal: only block JSAPI/Mini native methods. Enhanced: also force OAuth to acquire openId for H5/QR-code in recognizable environments.",
"normal": "Normal",
"enhanced": "Enhanced"
},
"blockOverseasIp": {
"label": "Overseas IP Blocking",
"desc": "Block payment requests from overseas IPs (outside mainland China), a common risk control strategy for the China region.",
"comingSoon": "This feature will be available in a future release."
}
}
}

View File

@@ -13,10 +13,14 @@
"blockOn": "Hit: Blokir Pesanan",
"blockOff": "Hit: Catat Saja",
"afterOn": "Catatan Pascabayar: Aktif",
"afterOff": "Catatan Pascabayar: Nonaktif"
"afterOff": "Catatan Pascabayar: Nonaktif",
"levelNormal": "Level: Normal",
"levelEnhanced": "Level: Ditingkatkan",
"overseasOn": "IP Luar Negeri: Blokir"
},
"section": {
"switch": "Saklar Kontrol Risiko"
"switch": "Saklar Kontrol Risiko",
"strategy": "Strategi Intersepsi"
},
"riskEnabled": {
"label": "Saklar Utama Kontrol Risiko",
@@ -29,6 +33,17 @@
"riskCheckAfterPay": {
"label": "Pencatatan Hit Pasca Pembayaran",
"desc": "Saat aktif, hit dicatat setelah pembayaran berhasil untuk analisis pasca-peristiwa, tanpa memengaruhi dana."
},
"riskOpenIdLevel": {
"label": "Level Intersepsi openId",
"desc": "Normal: hanya blokir metode native JSAPI/Mini. Ditingkatkan: juga memaksa OAuth untuk mendapatkan openId pada H5/QR dalam lingkungan yang dikenali.",
"normal": "Normal",
"enhanced": "Ditingkatkan"
},
"blockOverseasIp": {
"label": "Pemblokiran IP Luar Negeri",
"desc": "Blokir permintaan pembayaran dari IP luar negeri (di luar Tiongkok daratan), strategi pengendalian risiko umum di wilayah Tiongkok.",
"comingSoon": "Fitur ini akan tersedia di rilis mendatang."
}
}
}

View File

@@ -13,10 +13,14 @@
"blockOn": "ヒット:注文拒否",
"blockOff": "ヒット:記録のみ",
"afterOn": "事後記録:オン",
"afterOff": "事後記録:オフ"
"afterOff": "事後記録:オフ",
"levelNormal": "レベル:通常",
"levelEnhanced": "レベル:強化",
"overseasOn": "海外 IPブロック"
},
"section": {
"switch": "リスク管理スイッチ"
"switch": "リスク管理スイッチ",
"strategy": "ブロック戦略"
},
"riskEnabled": {
"label": "リスク管理メインスイッチ",
@@ -29,6 +33,17 @@
"riskCheckAfterPay": {
"label": "決済後ヒット記録",
"desc": "オンの場合、決済成功後にヒットを記録し、事後分析に使用します。資金状態には影響しません。"
},
"riskOpenIdLevel": {
"label": "openId ブロック レベル",
"desc": "通常ブロックJSAPI/ミニなどネイティブ方式のみブロック。強化ブロックH5/QR 決済など識別可能環境でも OAuth を強制し openId を取得してブロック。",
"normal": "通常ブロック",
"enhanced": "強化ブロック"
},
"blockOverseasIp": {
"label": "海外 IP ブロック",
"desc": "中国本土以外の海外 IP からの決済リクエストをブロック。中国地域で一般的なリスク管理戦略。",
"comingSoon": "この機能は今後のバージョンで提供されます。"
}
}
}

View File

@@ -13,10 +13,14 @@
"blockOn": "히트: 주문 차단",
"blockOff": "히트: 기록만",
"afterOn": "사후 기록: 켜짐",
"afterOff": "사후 기록: 꺼짐"
"afterOff": "사후 기록: 꺼짐",
"levelNormal": "레벨: 일반",
"levelEnhanced": "레벨: 강화",
"overseasOn": "해외 IP: 차단"
},
"section": {
"switch": "리스크 관리 스위치"
"switch": "리스크 관리 스위치",
"strategy": "차단 전략"
},
"riskEnabled": {
"label": "리스크 관리 마스터 스위치",
@@ -29,6 +33,17 @@
"riskCheckAfterPay": {
"label": "결제 후 히트 기록",
"desc": "켜면 결제 성공 후 히트를 기록하여 사후 분석에 사용합니다. 자금 상태에 영향을 주지 않습니다."
},
"riskOpenIdLevel": {
"label": "openId 차단 레벨",
"desc": "일반 차단: JSAPI/미니 등 네이티브 방식만 차단. 강화 차단: H5/QR 결제 등 인식 가능 환경에서 OAuth 를 강제하여 openId 를 획득 후 차단.",
"normal": "일반 차단",
"enhanced": "강화 차단"
},
"blockOverseasIp": {
"label": "해외 IP 차단",
"desc": "중국 본토 외 해외 IP 에서의 결제 요청을 차단. 중국 지역에서 일반적인 리스크 관리 전략.",
"comingSoon": "이 기능은 향후 버전에서 제공됩니다."
}
}
}

View File

@@ -13,10 +13,14 @@
"blockOn": "Hit: Sekat Pesanan",
"blockOff": "Hit: Rekod Sahaja",
"afterOn": "Rekod Pasca-Bayar: Aktif",
"afterOff": "Rekod Pasca-Bayar: Mati"
"afterOff": "Rekod Pasca-Bayar: Mati",
"levelNormal": "Tahap: Biasa",
"levelEnhanced": "Tahap: Diperkuat",
"overseasOn": "IP Luar Negara: Sekat"
},
"section": {
"switch": "Suis Kawalan Risiko"
"switch": "Suis Kawalan Risiko",
"strategy": "Strategi Sekatan"
},
"riskEnabled": {
"label": "Suis Utama Kawalan Risiko",
@@ -29,6 +33,17 @@
"riskCheckAfterPay": {
"label": "Rekod Hit Selepas Pembayaran",
"desc": "Apabila aktif, hit direkod selepas pembayaran berjaya untuk analisis pasca-peristiwa, tanpa menjejaskan dana."
},
"riskOpenIdLevel": {
"label": "Tahap Sekatan openId",
"desc": "Biasa: hanya sekat kaedah native JSAPI/Mini. Diperkuat: juga memaksa OAuth untuk mendapatkan openId pada H5/QR dalam persekitaran yang dikenali.",
"normal": "Biasa",
"enhanced": "Diperkuat"
},
"blockOverseasIp": {
"label": "Sekatan IP Luar Negara",
"desc": "Sekat permintaan pembayaran dari IP luar negara (luar tanah besar China), strategi kawalan risiko biasa di wilayah China.",
"comingSoon": "Ciri ini akan tersedia dalam keluaran akan datang."
}
}
}

View File

@@ -13,10 +13,14 @@
"blockOn": "ตรง: บล็อกคำสั่ง",
"blockOff": "ตรง: บันทึกอย่างเดียว",
"afterOn": "บันทึกหลังชำระ: เปิด",
"afterOff": "บันทึกหลังชำระ: ปิด"
"afterOff": "บันทึกหลังชำระ: ปิด",
"levelNormal": "ระดับ: ปกติ",
"levelEnhanced": "ระดับ: เข้มข้น",
"overseasOn": "IP ต่างประเทศ: บล็อก"
},
"section": {
"switch": "สวิตช์ควบคุมความเสี่ยง"
"switch": "สวิตช์ควบคุมความเสี่ยง",
"strategy": "กลยุทธ์การบล็อก"
},
"riskEnabled": {
"label": "สวิตช์หลักควบคุมความเสี่ยง",
@@ -29,6 +33,17 @@
"riskCheckAfterPay": {
"label": "บันทึกการตรงหลังชำระเงิน",
"desc": "เมื่อเปิด การตรงจะถูกบันทึกหลังชำระเงินสำเร็จเพื่อวิเคราะห์ภายหลัง โดยไม่กระทบสถานะเงิน"
},
"riskOpenIdLevel": {
"label": "ระดับการบล็อก openId",
"desc": "ปกติ: บล็อกเฉพาะ JSAPI/Mini แบบเนทีฟ. เข้มข้น: บังคับ OAuth เพื่อรับ openId สำหรับ H5/QR ในสภาพแวดล้อมที่ระบุได้.",
"normal": "ปกติ",
"enhanced": "เข้มข้น"
},
"blockOverseasIp": {
"label": "การบล็อก IP ต่างประเทศ",
"desc": "บล็อกคำขอชำระเงินจาก IP ต่างประเทศ (นอกจีนแผ่นดินใหญ่) กลยุทธ์ควบคุมความเสี่ยงที่พบได้ทั่วไปในภูมิภาคจีน",
"comingSoon": "คุณลักษณะนี้จะพร้อมใช้งานในรุ่นถัดไป."
}
}
}

View File

@@ -13,10 +13,14 @@
"blockOn": "Trúng: Chặn đơn",
"blockOff": "Trúng: Chỉ ghi nhận",
"afterOn": "Ghi nhận sau: Bật",
"afterOff": "Ghi nhận sau: Tắt"
"afterOff": "Ghi nhận sau: Tắt",
"levelNormal": "Cấp độ: Bình thường",
"levelEnhanced": "Cấp độ: Tăng cường",
"overseasOn": "IP nước ngoài: Chặn"
},
"section": {
"switch": "Công tắc kiểm soát rủi ro"
"switch": "Công tắc kiểm soát rủi ro",
"strategy": "Chiến lược chặn"
},
"riskEnabled": {
"label": "Công tắc chính kiểm soát rủi ro",
@@ -29,6 +33,17 @@
"riskCheckAfterPay": {
"label": "Ghi nhận trúng sau thanh toán",
"desc": "Khi bật, trúng được ghi nhận sau thanh toán thành công để phân tích sự cố, không ảnh hưởng trạng thái tiền."
},
"riskOpenIdLevel": {
"label": "Cấp độ chặn openId",
"desc": "Bình thường: chỉ chặn phương thức native JSAPI/Mini. Tăng cường: ép OAuth lấy openId cho H5/QR trong môi trường nhận diện được.",
"normal": "Bình thường",
"enhanced": "Tăng cường"
},
"blockOverseasIp": {
"label": "Chặn IP nước ngoài",
"desc": "Chặn yêu cầu thanh toán từ IP nước ngoài (ngoài Trung Quốc đại lục), chiến lược kiểm soát rủi ro phổ biến tại khu vực Trung Quốc.",
"comingSoon": "Tính năng này sẽ có trong bản phát hành sau."
}
}
}

View File

@@ -13,10 +13,14 @@
"blockOn": "命中:拦截下单",
"blockOff": "命中:仅记录",
"afterOn": "事后补录:开",
"afterOff": "事后补录:关"
"afterOff": "事后补录:关",
"levelNormal": "拦截级别:正常",
"levelEnhanced": "拦截级别:增强",
"overseasOn": "海外 IP拦截"
},
"section": {
"switch": "风控开关"
"switch": "风控开关",
"strategy": "拦截策略"
},
"riskEnabled": {
"label": "风控总开关",
@@ -29,6 +33,17 @@
"riskCheckAfterPay": {
"label": "事后补录命中",
"desc": "开启后,支付成功后会补充记录命中情况,用于事后分析,不影响资金态。"
},
"riskOpenIdLevel": {
"label": "openId 拦截级别",
"desc": "正常拦截:仅对 JSAPI/小程序等原生方式拦截;增强拦截:对 H5/主扫等可识别环境也强制 OAuth 取 openId 拦截。",
"normal": "正常拦截",
"enhanced": "增强拦截"
},
"blockOverseasIp": {
"label": "海外 IP 拦截",
"desc": "拦截境外 IP中国大陆以外发起的支付请求中国区常用风控策略。",
"comingSoon": "该功能将在后续版本接入。"
}
}
}

View File

@@ -13,10 +13,14 @@
"blockOn": "命中:攔截下單",
"blockOff": "命中:僅記錄",
"afterOn": "事後補錄:開",
"afterOff": "事後補錄:關"
"afterOff": "事後補錄:關",
"levelNormal": "攔截級別:正常",
"levelEnhanced": "攔截級別:增強",
"overseasOn": "海外 IP攔截"
},
"section": {
"switch": "風控開關"
"switch": "風控開關",
"strategy": "攔截策略"
},
"riskEnabled": {
"label": "風控總開關",
@@ -29,6 +33,17 @@
"riskCheckAfterPay": {
"label": "事後補錄命中",
"desc": "開啟後,支付成功後會補充記錄命中情況,用於事後分析,不影響資金態。"
},
"riskOpenIdLevel": {
"label": "openId 攔截級別",
"desc": "正常攔截:僅對 JSAPI/小程式等原生方式攔截;增強攔截:對 H5/主掃等可識別環境也強制 OAuth 取 openId 攔截。",
"normal": "正常攔截",
"enhanced": "增強攔截"
},
"blockOverseasIp": {
"label": "海外 IP 攔截",
"desc": "攔截境外 IP中國大陸以外發起的支付請求中國區常用風控策略。",
"comingSoon": "該功能將在後續版本接入。"
}
}
}

View File

@@ -13,10 +13,14 @@
"blockOn": "命中:攔截下單",
"blockOff": "命中:僅記錄",
"afterOn": "事後補錄:開",
"afterOff": "事後補錄:關"
"afterOff": "事後補錄:關",
"levelNormal": "攔截級別:正常",
"levelEnhanced": "攔截級別:增強",
"overseasOn": "海外 IP攔截"
},
"section": {
"switch": "風控開關"
"switch": "風控開關",
"strategy": "攔截策略"
},
"riskEnabled": {
"label": "風控總開關",
@@ -29,6 +33,17 @@
"riskCheckAfterPay": {
"label": "事後補錄命中",
"desc": "開啟後,支付成功後會補充記錄命中情況,用於事後分析,不影響資金態。"
},
"riskOpenIdLevel": {
"label": "openId 攔截級別",
"desc": "正常攔截:僅對 JSAPI/小程式等原生方式攔截;增強攔截:對 H5/主掃等可識別環境也強制 OAuth 取 openId 攔截。",
"normal": "正常攔截",
"enhanced": "增強攔截"
},
"blockOverseasIp": {
"label": "海外 IP 攔截",
"desc": "攔截境外 IP中國大陸以外發起的支付請求中國區常用風控策略。",
"comingSoon": "該功能將在後續版本接入。"
}
}
}

View File

@@ -20,13 +20,13 @@
const formState = ref<PaySecurityConfig>({} as PaySecurityConfig);
// 概要标签:总开关关闭仅展示关闭态;开启时同步展示阻断/事后补录
// 概要标签:总开关关闭仅展示关闭态;开启时同步展示阻断/事后补录/拦截级别
const summaryItems = computed(() => {
if (!formState.value.riskEnabled) {
// 风控:已关闭
return [$t('system.security.pay-security.risk.summary.disabled')];
}
return [
const items = [
// 风控:已开启
$t('system.security.pay-security.risk.summary.enabled'),
// 命中:拦截下单 / 仅记录
@@ -37,7 +37,16 @@
formState.value.riskCheckAfterPay
? $t('system.security.pay-security.risk.summary.afterOn')
: $t('system.security.pay-security.risk.summary.afterOff'),
// openId 拦截级别
formState.value.riskOpenIdLevel === 'enhanced'
? $t('system.security.pay-security.risk.summary.levelEnhanced')
: $t('system.security.pay-security.risk.summary.levelNormal'),
];
// 海外 IP 拦截(占位, 默认关闭, 仅开启时展示)
if (formState.value.blockOverseasIp) {
items.push($t('system.security.pay-security.risk.summary.overseasOn'));
}
return items;
});
/**
@@ -180,6 +189,55 @@
/>
</div>
</div>
<!-- 拦截策略 -->
<div class="config-section">
<div class="config-section__title">
{{ $t('system.security.pay-security.risk.section.strategy') }}
</div>
<!-- openId 拦截级别 -->
<div class="config-item">
<div class="config-item__main">
<!-- openId 拦截级别标签 -->
<div class="config-item__label">{{
$t('system.security.pay-security.risk.riskOpenIdLevel.label')
}}</div>
<!-- openId 拦截级别描述 -->
<div class="config-item__desc">{{ $t('system.security.pay-security.risk.riskOpenIdLevel.desc') }}</div>
</div>
<a-radio-group
v-model:value="formState.riskOpenIdLevel"
button-style="solid"
:disabled="!isEditing || !formState.riskEnabled"
>
<!-- 正常拦截 -->
<a-radio-button value="normal">
{{ $t('system.security.pay-security.risk.riskOpenIdLevel.normal') }}
</a-radio-button>
<!-- 增强拦截 -->
<a-radio-button value="enhanced">
{{ $t('system.security.pay-security.risk.riskOpenIdLevel.enhanced') }}
</a-radio-button>
</a-radio-group>
</div>
<!-- 海外 IP 拦截占位, 后续接入 -->
<div class="config-item">
<div class="config-item__main">
<!-- 海外 IP 拦截标签 -->
<div class="config-item__label">{{
$t('system.security.pay-security.risk.blockOverseasIp.label')
}}</div>
<!-- 海外 IP 拦截描述 -->
<div class="config-item__desc">{{ $t('system.security.pay-security.risk.blockOverseasIp.desc') }}</div>
</div>
<!-- 海外 IP 拦截: 后续版本接入, 当前禁用 -->
<a-tooltip :title="$t('system.security.pay-security.risk.blockOverseasIp.comingSoon')">
<a-switch v-model:checked="formState.blockOverseasIp" disabled />
</a-tooltip>
</div>
</div>
</a-form>
</div>
</a-spin>