本体协作平台
M 2 · DOC-2026-005 · extracted

01-开通申请与实名认证

原文 · 43 段(高亮 = 已被卡片引用)
p1# 01 · 开通申请与实名认证(Apply / KYC)
p2> 事实来源 = SDK 代码仓 `ifes-resm`(已实现行为)。准入规则/材料字段以最新 PRD/PM 为准。 > 2026-07-16 增补 D 节「开户全流程编排」:基于分支 `vibe-coding-case/K-S-2607-opt-20260710` 代码逐行查实,原 C 节各存疑分支多数已由代码证实并入 D 节。
p3## 模块定位
p4用户**首次获得 PayLater 用信资格**的前置链路:开通申请(授信)+ 实名认证(KYC)。是整条产品的入口,决定用户能否进入消费/取现/还款。
p5## A. 开通申请 / 授信(Apply)
p6| 能力 | 路由 | 文件 | |---|---|---| | 申请入口 | `PAY_LATER_APPLY` | `apply/Index.vue`(展示预授信额度 + 产品概览;Y001 用户不同 UI,`isFlexibleLimitUser`)| | 表单分发 | `PAY_LATER_APPLY_FORM` | `apply/form/Index.vue`(通用 Continue 落地页:验密 → `onNext` 续流)——**全仓无任何路由跳入,判定为死代码/遗留**(2026-07-16 代码查实)| | 贷款申请 | `PAY_LATER_APPLY_FORM_LOAN` | `apply/form/Loan.vue`(金额 + 用途 + 期限)| | 定存申请 | `PAY_LATER_APPLY_FORM_DEPOSTI` | `apply/form/Deposit.vue`(质押 Top-up 金额)| | 复申/再申 | `PAY_LATER_APPLY_FORM_REAPPLY` | `apply/form/Reapply.vue`(被拒/提额场景)| | 申请结果 | `COMMON_RESULT_REAPPLY` | `result/ReapplyResult.vue`(通过/审核中/拒绝)|
p7**关键字段/门槛**: - 预授信:`accountInfo.preCreditLimit` / `marketingCreditLimit`(可申请额度)。 - 推荐码:`referralCodeSwitch === 'Y'` + `isAllo`。 - 结果态:提交成功/授信发放 · 审核中 · 拒绝(带原因码)。
p8**申请表单字段(`apply/form/Loan.vue:99-272`)**: - 收入:Monthly Income(月收入)。 - 工作单位:Company Name / Company Address / Company Phone 等 Company* 系列字段(不止行业/职业/雇佣类型)。 - 紧急联系人:Emergency Contact(姓名 + 关系 + 电话)。 - 资金来源:Source of Fund。 - 婚姻状况:Marital Status。 - 税号:NPWP。 - 地址:含 RT/RW/邮编/省/市/区/街道。 - 工作:行业/职业/雇佣类型。
p9## B. 实名认证 / KYC
p10| 能力 | 路由 | 文件 | |---|---|---| | OCR 证件识别(KTP)| `COMMON_OCR` / `COMMON_SCANNING` / `COMMON_OCR_CONFIRM` | `common/ocr/{Index,Scanning,Confirm}.vue`(拍证件 → 抽取姓名/证件号/生日/地址 → 确认)| | 人脸活体 | `COMMON_FACE` / `COMMON_FACE_QUESTION` | `common/face/{Index,Question}.vue`(活体检测 + 安全问答)| | 人脸结果 | `COMMON_RESULT_KTP_FACE` | `result/KtpFace.vue` | | OTP 验证 | `COMMON_OTP` | `common/otp/Index.vue`(短信/邮件一次性码)| | 邮箱验证 | `COMMON_EMAIL_VERIFY` | `common/email/EmailVerify.vue` |
p11**关键门槛**: - 邮箱验证拦截:`accountInfo.emailVerifyRequired` 为真时,**直接拦消费/取现**(`view.js#checkAccountBeforeWithdrawAndPay` 先查邮箱)。 - GPS 留痕:KYC 人脸/开户/首借场景采集经纬度(见 [13-埋点与监控](13-埋点与监控.md))。 - 风控/CNC 上报:进入落地页、T&C、OCR、活体各步均上报(`report-to-cnc.js`)。
p12### OCR SDK Advance II 升级(v3.0.3)
p13为提升 KTP 证件信息抽取准确率(旧版"出生地误并入姓名字段"等问题集中在姓名与出生地),onboarding OCR SDK 由 V1 升级至 Advance v3.0.3。— 《_PRD User Onboarding - Upgrade OCR SDK Advance II 2024-09-13》
p14**字段口径**:V3 在 V1 既有字段(`idNumber`/NIK、`name`、`bloodType`、`religion`、`gender`、`province`、`city`、`district`、`village`、`rtrw`、`address`、`occupation`、`expiryDate`、`nationality`、`maritalStatus`)基础上,将原"出生地+出生日期合一"的 `birthPlaceBirthday` 拆为出生地与出生日期两路输出。PRD 文案将这两路写作 `placeOfBirth` / `birthday`。— 《_PRD User Onboarding - Upgrade OCR SDK Advance II 2024-09-13》
p15代码中 OCR 输出字段为 `birthPlace`(出生地)/ `birthDate`(出生日期)。OCR 模型 `models/ocrResult.js` 以 `birthPlaceBirthday`(原始合一串,`row.TempatTglLahir`)入参,由前端函数 `splitBirthPlaceBirthDay` 切分后落到 `birthPlace`、`birthDate` 两个属性(`models/ocrResult.js:3,63,75-76`)。回填 KTP 表单用 `ocrRes.birthPlace` / `ocrRes.birthDate`(`ocr/Index.vue:312-313`,其上 310-311 行按 `.split('.')` 直接切串的旧写法已注释屏蔽)。切分动作发生在前端,SDK 不直接给出两个字段。
p16**扫描与回填流程**(KTP 教育页 → 表单 → 确认 → 风控): 1. 用户在 Scan KTP 教育页点击"I'm ready",在 App 内拉起 Scan KTP SDK,拍摄/上传 KTP。 2. 识别成功后展示 KTP 表单,OCR 结果回填到各数据字段。 3. 容错:**至少 1 个 OCR 参数为 null** → 展示表单但相应字段留空,由用户手工补填;**全部参数为 null** → 直接展示错误页。 4. 用户在表单点提交 → 弹出 KTP 确认弹窗;确认弹窗再次点提交 → KTP 数据落库,并按 OCR 风控引擎结果分流:被拒展示对应 RC 失败页,通过则进入人脸活体(liveness)步骤。 — 《_PRD User Onboarding - Upgrade OCR SDK Advance II 2024-09-13》
p17**KTP 确认页字段口径**:确认页 `ocr/Confirm.vue` 承载 **8 个字段**——Full Name、KTP(NIK)、BirthPlace、DoB、Gender、Postal Code、Mother's Maiden Name、Email(`ocr/Confirm.vue:16-108`,逐项带 `_check*` 校验)。其中 Mother's Maiden Name、Email、Postal Code、Gender 为 OCR 回填之外的必填补全项。
p18## C. 其他开通环节(均已代码查实,细节见 D 节对应小节)
p19- **白名单校验**:`amsAccountCheckWhitelist`,命中/未命中走向见 D.1。 - **IM3 / BIMA 渠道专用 OTP**:`COMMON_IOH_OTP`,见 D.5 分支表。 - **Video Banking 面签分支**、**钱包升级中级/高级户**、**存量 KTP(5000)**、**推荐码 / MES_MGM**、**App List 灰度采集**、**Y001 授信独立结果页族**:触发条件与回流路径全部见 D.5 分支表。
p20(后台侧命中人群圈选规则仍属风控域,前端只见状态位;前端行为已在 D 节钉到 file:line。)
p21## D. 开户全流程编排(代码查实,2026-07-16)
p22> 源:`ifes-resm` 分支 `vibe-coding-case/K-S-2607-opt-20260710`。编排核心 = `apply/Index.vue`(applyNow / `_startPaylaterFlow` / `_queryPaylaterFlow`)+ 中转分发 `pay-later/Index.vue` + 表单/提交 `apply/form/Loan.vue`。API 定义在 `constants/api.js`。
p23### D.1 准入与入口
p24- **入口**:首页 CTA(`home/Index.vue:1166` → `PAY_LATER_APPLY`);或中转页 `pay-later/Index.vue:111-121` 按 `accountInfo.payLaterStatus` 分发(见 D.6 状态表)。路由层**无全局准入守卫**。 - **落地页准入**(`apply/Index.vue`):钱包冻结/锁定(`mpcStatus ∈ {Locked '20', Frozen '30'}`)弹窗阻断(:608-621);`withoutUaAndMpc` 直接放行(:587)。**邮箱强制校验在开户主流程已被注释禁用**(:602-605)——`emailVerifyRequired` 拦截只作用于消费/取现(B 节),不拦开户。 - **白名单**:点 Apply(`applyNow` :514)→ `amsAccountCheckWhitelist`(`/ams/account/check_whitelist`,入参 `phoneNo`+`ti`)。命中 `whitelistFlag='Y'`:IOH 渠道(`query.app_id ∈ {IM3, BIMA}`)→ `COMMON_IOH_OTP`;否则未设密(`PASSWORD_STATUS='0'`)→ 设密页,已设密 → 验密页 `COMMON_PASSWORD_VERIFY`(scene=APPLY)。未命中 → 「currently not eligible」结果页(`_viewNotWhiteList` :690)。异常码 `80430228` 有专属文案(:565-568)。
p25### D.2 驱动机制:后端 flow 状态驱动,前端 switch 分发(非写死链)
p26「下一步」由 **`amsAccountCheckFlow`**(`/ams/account/check/flow`,入参 `bizServiceId='OPEN_PAYLATER'`+`channel`+`sdkVersion`+`session`)返回的 `{flowId, status, nextAction, flowContext}` 决定,分发在 `_startPaylaterFlow`(`apply/Index.vue:1129-1198`):
p27| 返回 | 走向 | |---|---| | 本地 `OPEN_STATUS='T017'`(WAIT_VIDEO_BANKING)| 直接 `_viewVideoBanking`(不调 checkFlow)| | 本地 `OPEN_STATUS='T215'`(CREDITING)/ `'T217'`(REJECT)| processing 页 / 失败页 | | `status='0000'` | 直接进申请表单 `PAY_LATER_APPLY_FORM_LOAN` | | `status='0002'` + `nextAction='OCR'` | `COMMON_OCR`(`flowContext.ocrOrg` 决定 OCR 厂商)| | `status='0002'` + `nextAction='FACE_SCANNING'` | `COMMON_FACE`(`flowContext.isRealNameFaceScanning='1'` 决定实名刷脸场景)| | `status='0002'` + `nextAction='QUESTION_VALIDATE'` | `COMMON_FACE_QUESTION` 安全问答 | | `ret_code` 匹配 `B201/B256/B222/B221/B211/B701/B111/B901$` | 失败页(:1181-1190)|
p28每个 KYC 子步完成后回调 **`_queryPaylaterFlow`**(:715-768,调 `amsAccountQueryFlow` `/ams/account/query/flow` 按 flowId)再次分发——它只处理 FACE_SCANNING/QUESTION_VALIDATE 与 `0000`→表单,不会回退到 OCR。`STEPS` 常量(KTP→Face→Form,:251)仅 UI 进度条用,不驱动流程。
p29### D.3 主流程链(典型 Prime/中级户)
p30``` 落地页 PAY_LATER_APPLY → 勾选 TnC(PDF 协议页 COMMON_PDF_VIEWER)→ 点 Apply → 白名单 → [IOH OTP | 设密/验密 COMMON_PASSWORD_VERIFY(APPLY)] → checkFlow ⇒ OCR KTP(教育页→原生SDK→回填→Confirm 8字段提交) → queryFlow ⇒ 人脸活体 COMMON_FACE [→ 安全问答 COMMON_FACE_QUESTION] →(初级户 mpcLevel='01' 先 amsAccountUpgradeMiddleAccount 升中级) → queryFlow status=0000 ⇒ 申请表单 Loan.vue →(非 Prime 且 flowContext.canOpenPrimeAcct='Y' 先升高级户 amsAccountUpgradeHighAccount) →(needVb 时先 Video Banking 面签) → 提交授信 amsAccountApplyCredit → COMMON_LOADING 轮询 → 结果分流 ```
p31### D.4 提交与授信结果
p32- **提交** `amsAccountApplyCredit`(`/ams/account/apply/credit`,`Loan.vue:930-973`):`BIZ_TYPE = skipVb ? 'FI' : 'VB_FI'`;`INVITER_INFO.INVITE_CODE`=MES_MGM 邀请码;`EXT_INFO`={EMAIL,INCOME,MARITAL_STATUS};`CUSTOMER_EXT_INFO`=20+ 表单字段;`appListData`=App List 采集结果。提交前 `amsAccountSaveExtInfo` 暂存表单(:854)。GPS 不随此接口,走独立 `amsGpsReportEvents`(D.7)。 - **轮询**:`COMMON_LOADING`(22s 视觉)→ `amsAccountQueryApplyResult`(`/ams/account/query/apply_result`,`BIZ_TYPE='APP'`+`APP_NO`),2s 间隔 × 最多 10 次。 - **结果分流**(`Loan.vue:1006-1069`):`1006`/`1008` 拒绝 → 失败页;`1016` 成功 → `_viewTarget`:先 `reportOpenAccount`(外部平台开户成功事件,`utils/report.js:142`,事件清单来自 `amsEventReportConfig(OPEN_ACCT)`,报完 `amsAccountOpenAcctEventMarkReported` 防重);`RISK_CODE` 含 Y001 → FlexLimit 结果页族(D.5),否则回 `PAY_LATER_HOME`;其余码 → processing 页。
p33### D.5 分支路径表
p34| 分支 | 触发条件 | 走向/回流 | |---|---|---| | **IOH 专用 OTP** | 白名单命中且 `app_id ∈ {IM3, BIMA}` | `COMMON_IOH_OTP` → 成功回 `queryMemberInfo → _checkAccountStatus → _apply(session)`(`apply/Index.vue:537-543`)| | **Video Banking 面签** | `OPEN_STATUS='T017'`(进场即 VB);或表单提交时 `needVb`:`currentPlaylaterStatus ∈ {'1022','1017'}` 或 `payLaterStatus='T022'`(`Loan.vue:842-844`)| `COMMON_VIDEO`(scene 按 `mpcLevel='03'` 分 PRIME/MIDDLE_APPLY_PAYLATER);成功:apply 版报 `amsAccountSubmitVbResult(BIZ_TYPE='VB_NOTIFY')` 回首页,Loan 版续 `_checkAppList → applyCredit(VB_FI)`;失败/取消 → 失败页,pending → processing | | **升中级户** | 初级户 `mpcLevel='01'` 刷脸成功后 | `amsAccountUpgradeMiddleAccount`(`apply/Index.vue:1109`)→ 续 queryFlow | | **升高级户** | 表单提交时非 Prime 且 `flowContext.canOpenPrimeAcct='Y'` | `amsAccountUpgradeHighAccount`(传全表单,`Loan.vue:760`)→ 成功再 applyCredit,失败 → 失败页 | | **存量 KTP「5000」** | OCR 提交后 `ret_data.status='5000'`(`FlowStatus.AnotherAccount`)| 报 `APPLY_OCR_FAIL` → 独立「e-KTP already registered」结果页,主按钮回申请落地页(`apply/Index.vue:1057,1089`)| | **推荐码** | 落地页卡片 `referralCodeSwitch='Y' && isAllo`;校验 `/^[a-zA-Z0-9]{6}$/` | `amsAccountPaylaterReferralCodeSubmit`(`apply/Index.
p35vue:401`)| | **MES_MGM 邀请码** | URL query `MES_MGM_INVITE_CODE` | 随 applyCredit 的 `INVITER_INFO` 上送(`Loan.vue:936-944`)| | **App List 采集** | 灰度 `commonGrayConfigCheck(moduleId='APP_LIST_COLLECTION')`;TnC 时查授权态,表单提交时 Android 实采(iOS 跳过)| `amsAppListQuery` 查 `agreeFlag='Y'` → native `getAppList` → 随 applyCredit `appListData` 上送(`Loan.vue:886-926`)| | **Y001 授信结果页族** | 授信成功且 `RISK_CODE ∋ Y001` | `FlexLimitUserResult`(入口)→ V1 链 = Survey 问卷 → Bonus → `FlexLimitUserResultFlowFinal`(拉 `coreTransFlexibleLimitLimits`,去 ENTER_LIMIT/首页);**V2 Onboarding 仅 Beta**(marketCode 第20位='4',`isV2OnboardingEligible`,`limit-up-utils.js:40`)渲染 `FlexLimitV2Onboarding`,Gamma('5')/NONE 回退 V1——注意与首页 HomeV2 全量放开([07](07-Limit-Up与额度成长.md))不同,**授信结果页 V2 灰度仍只对 Beta** |
p36### D.6 断点续传(状态机)
p37- **主恢复点** = 后端下发的 `accountInfo.payLaterStatus`(`pay-later/Index.vue:111-129`):
p38| payLaterStatus | 语义 | 续到 | |---|---|---| | `T211` NotOpened / `T017` NotOpened_VB / `T022` NotOpened_VB_form / `T023` NotOpened_form | 未开通/开到一半 | 申请落地页(统一进 apply,旧 `_breakPointRedirect` 细分逻辑已注释)| | `T215` applying | 审核中 | processing 页 | | `T217` Controlled | 被拒/管控 | 失败页 |
p39- **流程内断点** = `amsAccountCheckFlow` 返回的 `{status, nextAction}` 本身(OCR 没过回 OCR、Face 没过回 Face),**前端不本地存进度**;`accountStatus.OPEN_STATUS` 来自 `amsAccountQueryAccountStatus`。 - **表单断点续填**:`Loan.vue:1157-1206` 有本地 `customerExtInfo` 则回填,否则 `amsAccountQueryExtCustInfo` 拉后端暂存(对应提交前的 `amsAccountSaveExtInfo`)。
p40### D.7 风控与埋点挂点(开户段)
p41- **report-to-cnc 点位**:`ENTER_LANDINGPAGE`(:595) → `ENTER_TC`(:371) → `CLICK_TC_CONTINUE_BUTTON`(:489) → `CLICK_LANDINGPAGE_APPLY_BUTTON`(:517) → `CLICK_OCR_VERIFY_BUTTON`(Confirm) → `APPLY_OCR_SUCCESS/FAIL`(:1063/:1059,1068) → `APPLY_FACIAL_RECOGNITION_SUCCESS/FAIL`(:797/:810) → `CLICK_ADDITIONAL_INFORMATION_CONFIRM_BUTTON`(`Loan.vue:718`)。另有 reportToOutside 外部上报(REJECTED_*、APPROVAL_IN_PROGRESS、开户成功 OPEN_ACCT 事件组)。 - **GPS 采集**(`reportLocation` → `amsGpsReportEvents`):落地页 `LANDING_PAGE_POSITION`(:593)、OCR `OCR_POSITION`、刷脸 `FACE_SCANNING_POSITION`/`REAL_NAME_FACE_SCANNING_POSITION`(按 isRealName 二选一)。门控三层:`sdk_version≥1.0.2` 且 `isAllo` 且 scene ∈ 后台 `locationReportScenes`;强制授权弹窗另需 `sdk_version≥1.0.6` + `openPaylaterScanFaceSwitch='Y'`(刷脸场景)。开关详见[后台开关与配置项](../参考/R6-后台开关与配置项.md)。 - OCR Confirm 提交前有图灵校验(`getTuringToken` → `amsAccountSubmitTuringToken(scene='OCR')`)。
p42## 待确认 / 风险
p43- OCR 识别、人脸活体、Video Banking 面签均由 App **原生 SDK** 承载,H5 仅做拉起与回填;"Advance v3.0.3"为 PRD 中的 SDK 版本号,前端代码内**无该版本串可证**,版本以原生侧为准(见 `_待PM确认清单-20260624.md`)。 - 拒绝码**前端枚举**已查实(checkFlow 段 `B201/B256/B222/B221/B211/B701/B111/B901`、授信结果 `1006/1008`,见 D 节),但各码的**业务语义与命中规则**在后台,仍以风控/PRD 为准;预授信来源、复申间隔同。 - 安全问答的**前端机制**已查实(`QUESTION_VALIDATE` → 取题 `amsAccountQueryQuestionList` → 提交 `amsAccountSubmitFlow(action='QUESTION_VALIDATE')`),题库与判定规则在后台待补。 - 申请与最终额度发放的后台决策逻辑不在前端,需 PM/风控提供。 - 白名单 `whitelistFlag` 的圈选规则(谁在白名单里)为后台/风控口径,前端只见 Y/N。
抽出的卡片 · 49
定义DOC-2026-005#p4pending_review

开通申请(授信)与实名认证(KYC)是用户首次获得 PayLater 用信资格的前置链路,是整条产品的入口,决定用户能否进入消费/取现/还款。

"用户**首次获得 PayLater 用信资格**的前置链路:开通申请(授信)+ 实名认证(KYC)。是整条产品的入口,决定用户能否进入消费/取现/还款。"

状态DOC-2026-005#p7pending_review

申请结果态包含三种取值:提交成功/授信发放、审核中、拒绝(带原因码)。

"结果态:提交成功/授信发放 · 审核中 · 拒绝(带原因码)"

规则DOC-2026-005#p11pending_review

当 accountInfo.emailVerifyRequired 为真时,直接拦截消费/取现(消费与取现前先校验邮箱)。

"邮箱验证拦截:`accountInfo.emailVerifyRequired` 为真时,**直接拦消费/取现**(`view.js#checkAccountBeforeWithdrawAndPay` 先查邮箱)。"

规则DOC-2026-005#p11pending_review

在 KYC 人脸、开户、首借场景采集经纬度进行 GPS 留痕。

"GPS 留痕:KYC 人脸/开户/首借场景采集经纬度"

规则DOC-2026-005#p11pending_review

进入落地页、T&C、OCR、活体各步均需向风控/CNC 上报。

"风控/CNC 上报:进入落地页、T&C、OCR、活体各步均上报(`report-to-cnc.js`)。"

边界DOC-2026-005#p13pending_review

为提升 KTP 证件信息抽取准确率(旧版出生地误并入姓名字段等问题集中在姓名与出生地),onboarding OCR SDK 由 V1 升级至 Advance v3.0.3。

"为提升 KTP 证件信息抽取准确率(旧版"出生地误并入姓名字段"等问题集中在姓名与出生地),onboarding OCR SDK 由 V1 升级至 Advance v3.0.3。"

定义DOC-2026-005#p14pending_review

V3 在 V1 既有字段基础上,将原出生地与出生日期合一的 birthPlaceBirthday 拆为出生地与出生日期两路输出(PRD 文案写作 placeOfBirth / birthday)。

"将原"出生地+出生日期合一"的 `birthPlaceBirthday` 拆为出生地与出生日期两路输出。PRD 文案将这两路写作 `placeOfBirth` / `birthday`。"

定义DOC-2026-005#p15pending_review

OCR 以合一串 birthPlaceBirthday 入参,由前端函数 splitBirthPlaceBirthDay 切分后落到 birthPlace、birthDate 两个属性;切分动作发生在前端,SDK 不直接给出两个字段。

"由前端函数 `splitBirthPlaceBirthDay` 切分后落到 `birthPlace`、`birthDate` 两个属性"

流程步骤DOC-2026-005#p16pending_review

KTP 扫描与回填流程:用户在 Scan KTP 教育页点击 I'm ready 拉起 Scan KTP SDK 拍摄/上传 KTP;识别成功后展示 KTP 表单并将 OCR 结果回填到各数据字段。

"1. 用户在 Scan KTP 教育页点击"I'm ready",在 App 内拉起 Scan KTP SDK,拍摄/上传 KTP。 2. 识别成功后展示 KTP 表单,OCR 结果回填到各数据字段。"

例外DOC-2026-005#p16pending_review

OCR 容错规则:至少 1 个 OCR 参数为 null 时展示表单但相应字段留空由用户手工补填;全部参数为 null 时直接展示错误页。

"容错:**至少 1 个 OCR 参数为 null** → 展示表单但相应字段留空,由用户手工补填;**全部参数为 null** → 直接展示错误页。"

动作条件DOC-2026-005#p16pending_review

在 KTP 确认弹窗再次点提交后 KTP 数据落库,并按 OCR 风控引擎结果分流:被拒展示对应 RC 失败页,通过则进入人脸活体(liveness)步骤。

"用户在表单点提交 → 弹出 KTP 确认弹窗;确认弹窗再次点提交 → KTP 数据落库,并按 OCR 风控引擎结果分流:被拒展示对应 RC 失败页,通过则进入人脸活体(liveness)步骤。"

规则DOC-2026-005#p17pending_review

KTP 确认页承载 8 个字段:Full Name、KTP(NIK)、BirthPlace、DoB、Gender、Postal Code、Mother's Maiden Name、Email。

"确认页 `ocr/Confirm.vue` 承载 **8 个字段**——Full Name、KTP(NIK)、BirthPlace、DoB、Gender、Postal Code、Mother's Maiden Name、Email"

规则DOC-2026-005#p17pending_review

Mother's Maiden Name、Email、Postal Code、Gender 为 OCR 回填之外的必填补全项。

"Mother's Maiden Name、Email、Postal Code、Gender 为 OCR 回填之外的必填补全项。"

边界DOC-2026-005#p6pending_review

表单分发(PAY_LATER_APPLY_FORM)为通用 Continue 落地页,全仓无任何路由跳入,判定为死代码/遗留。

"通用 Continue 落地页:验密 → `onNext` 续流)——**全仓无任何路由跳入,判定为死代码/遗留**"

动作条件DOC-2026-005#p24pending_review

开户落地页准入时,若钱包处于锁定(mpcStatus='20')或冻结(mpcStatus='30')状态,则弹窗阻断,不允许继续开户。

"钱包冻结/锁定(`mpcStatus ∈ {Locked '20', Frozen '30'}`)弹窗阻断"

边界DOC-2026-005#p24pending_review

邮箱强制校验在开户主流程已被注释禁用,emailVerifyRequired 拦截只作用于消费/取现场景,不拦截开户流程。

"`emailVerifyRequired` 拦截只作用于消费/取现(B 节),不拦开户"

动作条件DOC-2026-005#p24pending_review

白名单校验命中(whitelistFlag='Y')且为 IOH 渠道(app_id∈{IM3,BIMA})时,走 IOH 专用 OTP(COMMON_IOH_OTP)。

"命中 `whitelistFlag='Y'`:IOH 渠道(`query.app_id ∈ {IM3, BIMA}`)→ `COMMON_IOH_OTP`"

动作条件DOC-2026-005#p24pending_review

白名单命中的非 IOH 渠道:未设密(PASSWORD_STATUS='0')进入设密页,已设密进入验密页 COMMON_PASSWORD_VERIFY(scene=APPLY)。

"否则未设密(`PASSWORD_STATUS='0'`)→ 设密页,已设密 → 验密页 `COMMON_PASSWORD_VERIFY`"

动作条件DOC-2026-005#p24pending_review

白名单校验未命中时,跳转到「currently not eligible」结果页。

"未命中 → 「currently not eligible」结果页"

规则DOC-2026-005#p26pending_review

开户流程的下一步由后端 amsAccountCheckFlow 返回的 {flowId, status, nextAction, flowContext} 决定,前端按此分发(后端 flow 状态驱动,非前端写死链)。

"「下一步」由 **`amsAccountCheckFlow`**(`/ams/account/check/flow`,入参 `bizServiceId='OPEN_PAYLATER'`+`channel`+`sdkVersion`+`session`)返回的 `{flowId, status, nextAction, flowContext}` 决定"

状态DOC-2026-005#p27pending_review

本地 OPEN_STATUS='T017'(WAIT_VIDEO_BANKING)时直接进入 Video Banking 页面,不再调用 checkFlow。

"本地 `OPEN_STATUS='T017'`(WAIT_VIDEO_BANKING)| 直接 `_viewVideoBanking`(不调 checkFlow)"

动作条件DOC-2026-005#p27pending_review

checkFlow 返回 status='0000' 时,直接进入申请表单 PAY_LATER_APPLY_FORM_LOAN。

"`status='0000'` | 直接进申请表单 `PAY_LATER_APPLY_FORM_LOAN`"

动作条件DOC-2026-005#p27pending_review

checkFlow 返回 status='0002' 且 nextAction='OCR' 时进入 OCR 步骤(COMMON_OCR),OCR 厂商由 flowContext.ocrOrg 决定。

"`status='0002'` + `nextAction='OCR'` | `COMMON_OCR`(`flowContext.ocrOrg` 决定 OCR 厂商)"

动作条件DOC-2026-005#p27pending_review

checkFlow 返回 status='0002' 且 nextAction='FACE_SCANNING' 时进入人脸活体步骤(COMMON_FACE)。

"`status='0002'` + `nextAction='FACE_SCANNING'` | `COMMON_FACE`"

边界DOC-2026-005#p28pending_review

KYC 子步完成后回调 _queryPaylaterFlow 再次分发,只处理 FACE_SCANNING/QUESTION_VALIDATE 及 0000→表单,不会回退到 OCR。

"它只处理 FACE_SCANNING/QUESTION_VALIDATE 与 `0000`→表单,不会回退到 OCR"

边界DOC-2026-005#p28pending_review

STEPS 常量(KTP→Face→Form)仅用于 UI 进度条展示,不驱动实际开户流程。

"`STEPS` 常量(KTP→Face→Form,:251)仅 UI 进度条用,不驱动流程"

流程步骤DOC-2026-005#p30pending_review

典型 Prime/中级户开户主流程:落地页→勾选 TnC→点 Apply→白名单→(IOH OTP 或设密/验密)→checkFlow 触发 OCR KTP→queryFlow 触发人脸活体(可含安全问答)→(初级户先升中级)→表单→(非 Prime 满足条件先升高级)→(needVb 先 Video Banking)→提交授信→轮询→结果分流。

"落地页 PAY_LATER_APPLY → 勾选 TnC(PDF 协议页 COMMON_PDF_VIEWER)→ 点 Apply → 白名单 → [IOH OTP | 设密/验密 COMMON_PASSWORD_VERIFY(APPLY)] → checkFlow ⇒ OCR KTP(教育页→原生SDK→回填→Confirm 8字段提交) → queryFlow ⇒ 人脸活体 COMMON_FACE [→ 安全问答 COMMON_FACE_QUESTION]"

规则DOC-2026-005#p32pending_review

提交授信 amsAccountApplyCredit 时,BIZ_TYPE 取值:跳过 Video Banking(skipVb)为 'FI',否则为 'VB_FI'。

"`BIZ_TYPE = skipVb ? 'FI' : 'VB_FI'`"

规则DOC-2026-005#p32pending_review

授信结果轮询 amsAccountQueryApplyResult 以 2s 间隔进行,最多 10 次。

"`amsAccountQueryApplyResult`(`/ams/account/query/apply_result`,`BIZ_TYPE='APP'`+`APP_NO`),2s 间隔 × 最多 10 次"

状态DOC-2026-005#p32pending_review

授信结果码分流:1006/1008 为拒绝进失败页,1016 为成功进入 _viewTarget,其余码进 processing 页。

"`1006`/`1008` 拒绝 → 失败页;`1016` 成功 → `_viewTarget`"

动作条件DOC-2026-005#p32pending_review

授信成功后若 RISK_CODE 含 Y001,则进入 FlexLimit 结果页族,否则回 PAY_LATER_HOME。

"`RISK_CODE` 含 Y001 → FlexLimit 结果页族"

动作条件DOC-2026-005#p34pending_review

触发 Video Banking 面签的条件:OPEN_STATUS='T017'(进场即 VB),或表单提交时 needVb 为真(currentPlaylaterStatus∈{'1022','1017'} 或 payLaterStatus='T022')。

"`OPEN_STATUS='T017'`(进场即 VB);或表单提交时 `needVb`:`currentPlaylaterStatus ∈ {'1022','1017'}` 或 `payLaterStatus='T022'`"

动作条件DOC-2026-005#p34pending_review

初级户(mpcLevel='01')刷脸成功后触发升中级户 amsAccountUpgradeMiddleAccount,再续 queryFlow。

"初级户 `mpcLevel='01'` 刷脸成功后"

动作条件DOC-2026-005#p34pending_review

表单提交时若非 Prime 且 flowContext.canOpenPrimeAcct='Y',则触发升高级户 amsAccountUpgradeHighAccount,成功后再提交授信,失败进失败页。

"表单提交时非 Prime 且 `flowContext.canOpenPrimeAcct='Y'`"

例外DOC-2026-005#p34pending_review

存量 KTP 情形:OCR 提交后 ret_data.status='5000'(AnotherAccount)时,进入独立「e-KTP already registered」结果页,主按钮回申请落地页。

"OCR 提交后 `ret_data.status='5000'`(`FlowStatus.AnotherAccount`)"

动作条件DOC-2026-005#p34pending_review

推荐码入口在落地页卡片 referralCodeSwitch='Y' 且 isAllo 时展示,推荐码需通过 6 位字母数字校验(/^[a-zA-Z0-9]{6}$/)后提交。

"落地页卡片 `referralCodeSwitch='Y' && isAllo`;校验 `/^[a-zA-Z0-9]{6}$/`"

状态DOC-2026-005#p38pending_review

payLaterStatus 为 T211/T017/T022/T023(未开通或开到一半)时,统一续到申请落地页。

"`T211` NotOpened / `T017` NotOpened_VB / `T022` NotOpened_VB_form / `T023` NotOpened_form | 未开通/开到一半 | 申请落地页"

状态DOC-2026-005#p38pending_review

payLaterStatus 为 T215(applying/审核中)时,续到 processing 页。

"`T215` applying | 审核中 | processing 页"

状态DOC-2026-005#p38pending_review

payLaterStatus 为 T217(Controlled/被拒或管控)时,续到失败页。

"`T217` Controlled | 被拒/管控 | 失败页"

规则DOC-2026-005#p39pending_review

流程内断点由 amsAccountCheckFlow 返回的 {status, nextAction} 决定(OCR 未过回 OCR、Face 未过回 Face),前端不本地存储进度。

"OCR 没过回 OCR、Face 没过回 Face),**前端不本地存进度**"

动作条件DOC-2026-005#p39pending_review

表单断点续填:有本地 customerExtInfo 则回填,否则调用 amsAccountQueryExtCustInfo 拉取后端暂存(对应提交前的 amsAccountSaveExtInfo)。

"`Loan.vue:1157-1206` 有本地 `customerExtInfo` 则回填,否则 `amsAccountQueryExtCustInfo` 拉后端暂存"

动作条件DOC-2026-005#p41pending_review

GPS 位置采集(reportLocation)触发需同时满足:sdk_version≥1.0.2、isAllo 为真、且当前 scene 属于后台配置的 locationReportScenes。

"门控三层:`sdk_version≥1.0.2` 且 `isAllo` 且 scene ∈ 后台 `locationReportScenes`"

动作条件DOC-2026-005#p41pending_review

刷脸场景下弹出强制授权弹窗,另需满足 sdk_version≥1.0.6 且 openPaylaterScanFaceSwitch='Y'。

"强制授权弹窗另需 `sdk_version≥1.0.6` + `openPaylaterScanFaceSwitch='Y'`(刷脸场景)"

动作条件DOC-2026-005#p41pending_review

刷脸场景的 GPS 采集事件按 isRealName 在 FACE_SCANNING_POSITION 与 REAL_NAME_FACE_SCANNING_POSITION 之间二选一。

"落地页 `LANDING_PAGE_POSITION`(:593)、OCR `OCR_POSITION`、刷脸 `FACE_SCANNING_POSITION`/`REAL_NAME_FACE_SCANNING_POSITION`(按 isRealName 二选一)"

流程步骤DOC-2026-005#p41pending_review

OCR Confirm 提交前须先完成图灵校验:getTuringToken 后调用 amsAccountSubmitTuringToken(scene='OCR')。

"OCR Confirm 提交前有图灵校验(`getTuringToken` → `amsAccountSubmitTuringToken(scene='OCR')`)"

边界DOC-2026-005#p43pending_review

OCR 识别、人脸活体、Video Banking 面签均由 App 原生 SDK 承载,H5 仅负责拉起与回填。

"OCR 识别、人脸活体、Video Banking 面签均由 App **原生 SDK** 承载,H5 仅做拉起与回填"

边界DOC-2026-005#p43pending_review

前端已枚举拒绝码(checkFlow 段 B201/B256/B222/B221/B211/B701/B111/B901、授信结果 1006/1008),但各码的业务语义与命中规则在后台,以风控/PRD 为准。

"拒绝码**前端枚举**已查实(checkFlow 段 `B201/B256/B222/B221/B211/B701/B111/B901`、授信结果 `1006/1008`,见 D 节),但各码的**业务语义与命中规则**在后台"

流程步骤DOC-2026-005#p43pending_review

安全问答前端流程:进入 QUESTION_VALIDATE → 取题 amsAccountQueryQuestionList → 提交 amsAccountSubmitFlow(action='QUESTION_VALIDATE');题库与判定规则在后台。

"安全问答的**前端机制**已查实(`QUESTION_VALIDATE` → 取题 `amsAccountQueryQuestionList` → 提交 `amsAccountSubmitFlow(action='QUESTION_VALIDATE')`)"

边界DOC-2026-005#p43pending_review

白名单 whitelistFlag 的圈选规则由后台/风控决定,前端仅可见其取值 Y/N。

"白名单 `whitelistFlag` 的圈选规则(谁在白名单里)为后台/风控口径,前端只见 Y/N"