01-开通申请与实名认证
开通申请(授信)与实名认证(KYC)是用户首次获得 PayLater 用信资格的前置链路,是整条产品的入口,决定用户能否进入消费/取现/还款。
"用户**首次获得 PayLater 用信资格**的前置链路:开通申请(授信)+ 实名认证(KYC)。是整条产品的入口,决定用户能否进入消费/取现/还款。"
当 accountInfo.emailVerifyRequired 为真时,直接拦截消费/取现(消费与取现前先校验邮箱)。
"邮箱验证拦截:`accountInfo.emailVerifyRequired` 为真时,**直接拦消费/取现**(`view.js#checkAccountBeforeWithdrawAndPay` 先查邮箱)。"
进入落地页、T&C、OCR、活体各步均需向风控/CNC 上报。
"风控/CNC 上报:进入落地页、T&C、OCR、活体各步均上报(`report-to-cnc.js`)。"
为提升 KTP 证件信息抽取准确率(旧版出生地误并入姓名字段等问题集中在姓名与出生地),onboarding OCR SDK 由 V1 升级至 Advance v3.0.3。
"为提升 KTP 证件信息抽取准确率(旧版"出生地误并入姓名字段"等问题集中在姓名与出生地),onboarding OCR SDK 由 V1 升级至 Advance v3.0.3。"
V3 在 V1 既有字段基础上,将原出生地与出生日期合一的 birthPlaceBirthday 拆为出生地与出生日期两路输出(PRD 文案写作 placeOfBirth / birthday)。
"将原"出生地+出生日期合一"的 `birthPlaceBirthday` 拆为出生地与出生日期两路输出。PRD 文案将这两路写作 `placeOfBirth` / `birthday`。"
OCR 以合一串 birthPlaceBirthday 入参,由前端函数 splitBirthPlaceBirthDay 切分后落到 birthPlace、birthDate 两个属性;切分动作发生在前端,SDK 不直接给出两个字段。
"由前端函数 `splitBirthPlaceBirthDay` 切分后落到 `birthPlace`、`birthDate` 两个属性"
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 结果回填到各数据字段。"
OCR 容错规则:至少 1 个 OCR 参数为 null 时展示表单但相应字段留空由用户手工补填;全部参数为 null 时直接展示错误页。
"容错:**至少 1 个 OCR 参数为 null** → 展示表单但相应字段留空,由用户手工补填;**全部参数为 null** → 直接展示错误页。"
在 KTP 确认弹窗再次点提交后 KTP 数据落库,并按 OCR 风控引擎结果分流:被拒展示对应 RC 失败页,通过则进入人脸活体(liveness)步骤。
"用户在表单点提交 → 弹出 KTP 确认弹窗;确认弹窗再次点提交 → KTP 数据落库,并按 OCR 风控引擎结果分流:被拒展示对应 RC 失败页,通过则进入人脸活体(liveness)步骤。"
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"
Mother's Maiden Name、Email、Postal Code、Gender 为 OCR 回填之外的必填补全项。
"Mother's Maiden Name、Email、Postal Code、Gender 为 OCR 回填之外的必填补全项。"
表单分发(PAY_LATER_APPLY_FORM)为通用 Continue 落地页,全仓无任何路由跳入,判定为死代码/遗留。
"通用 Continue 落地页:验密 → `onNext` 续流)——**全仓无任何路由跳入,判定为死代码/遗留**"
开户落地页准入时,若钱包处于锁定(mpcStatus='20')或冻结(mpcStatus='30')状态,则弹窗阻断,不允许继续开户。
"钱包冻结/锁定(`mpcStatus ∈ {Locked '20', Frozen '30'}`)弹窗阻断"
邮箱强制校验在开户主流程已被注释禁用,emailVerifyRequired 拦截只作用于消费/取现场景,不拦截开户流程。
"`emailVerifyRequired` 拦截只作用于消费/取现(B 节),不拦开户"
白名单校验命中(whitelistFlag='Y')且为 IOH 渠道(app_id∈{IM3,BIMA})时,走 IOH 专用 OTP(COMMON_IOH_OTP)。
"命中 `whitelistFlag='Y'`:IOH 渠道(`query.app_id ∈ {IM3, BIMA}`)→ `COMMON_IOH_OTP`"
白名单命中的非 IOH 渠道:未设密(PASSWORD_STATUS='0')进入设密页,已设密进入验密页 COMMON_PASSWORD_VERIFY(scene=APPLY)。
"否则未设密(`PASSWORD_STATUS='0'`)→ 设密页,已设密 → 验密页 `COMMON_PASSWORD_VERIFY`"
白名单校验未命中时,跳转到「currently not eligible」结果页。
"未命中 → 「currently not eligible」结果页"
开户流程的下一步由后端 amsAccountCheckFlow 返回的 {flowId, status, nextAction, flowContext} 决定,前端按此分发(后端 flow 状态驱动,非前端写死链)。
"「下一步」由 **`amsAccountCheckFlow`**(`/ams/account/check/flow`,入参 `bizServiceId='OPEN_PAYLATER'`+`channel`+`sdkVersion`+`session`)返回的 `{flowId, status, nextAction, flowContext}` 决定"
本地 OPEN_STATUS='T017'(WAIT_VIDEO_BANKING)时直接进入 Video Banking 页面,不再调用 checkFlow。
"本地 `OPEN_STATUS='T017'`(WAIT_VIDEO_BANKING)| 直接 `_viewVideoBanking`(不调 checkFlow)"
checkFlow 返回 status='0000' 时,直接进入申请表单 PAY_LATER_APPLY_FORM_LOAN。
"`status='0000'` | 直接进申请表单 `PAY_LATER_APPLY_FORM_LOAN`"
checkFlow 返回 status='0002' 且 nextAction='OCR' 时进入 OCR 步骤(COMMON_OCR),OCR 厂商由 flowContext.ocrOrg 决定。
"`status='0002'` + `nextAction='OCR'` | `COMMON_OCR`(`flowContext.ocrOrg` 决定 OCR 厂商)"
checkFlow 返回 status='0002' 且 nextAction='FACE_SCANNING' 时进入人脸活体步骤(COMMON_FACE)。
"`status='0002'` + `nextAction='FACE_SCANNING'` | `COMMON_FACE`"
KYC 子步完成后回调 _queryPaylaterFlow 再次分发,只处理 FACE_SCANNING/QUESTION_VALIDATE 及 0000→表单,不会回退到 OCR。
"它只处理 FACE_SCANNING/QUESTION_VALIDATE 与 `0000`→表单,不会回退到 OCR"
STEPS 常量(KTP→Face→Form)仅用于 UI 进度条展示,不驱动实际开户流程。
"`STEPS` 常量(KTP→Face→Form,:251)仅 UI 进度条用,不驱动流程"
典型 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]"
提交授信 amsAccountApplyCredit 时,BIZ_TYPE 取值:跳过 Video Banking(skipVb)为 'FI',否则为 'VB_FI'。
"`BIZ_TYPE = skipVb ? 'FI' : 'VB_FI'`"
授信结果轮询 amsAccountQueryApplyResult 以 2s 间隔进行,最多 10 次。
"`amsAccountQueryApplyResult`(`/ams/account/query/apply_result`,`BIZ_TYPE='APP'`+`APP_NO`),2s 间隔 × 最多 10 次"
授信结果码分流:1006/1008 为拒绝进失败页,1016 为成功进入 _viewTarget,其余码进 processing 页。
"`1006`/`1008` 拒绝 → 失败页;`1016` 成功 → `_viewTarget`"
授信成功后若 RISK_CODE 含 Y001,则进入 FlexLimit 结果页族,否则回 PAY_LATER_HOME。
"`RISK_CODE` 含 Y001 → FlexLimit 结果页族"
触发 Video Banking 面签的条件:OPEN_STATUS='T017'(进场即 VB),或表单提交时 needVb 为真(currentPlaylaterStatus∈{'1022','1017'} 或 payLaterStatus='T022')。
"`OPEN_STATUS='T017'`(进场即 VB);或表单提交时 `needVb`:`currentPlaylaterStatus ∈ {'1022','1017'}` 或 `payLaterStatus='T022'`"
初级户(mpcLevel='01')刷脸成功后触发升中级户 amsAccountUpgradeMiddleAccount,再续 queryFlow。
"初级户 `mpcLevel='01'` 刷脸成功后"
表单提交时若非 Prime 且 flowContext.canOpenPrimeAcct='Y',则触发升高级户 amsAccountUpgradeHighAccount,成功后再提交授信,失败进失败页。
"表单提交时非 Prime 且 `flowContext.canOpenPrimeAcct='Y'`"
存量 KTP 情形:OCR 提交后 ret_data.status='5000'(AnotherAccount)时,进入独立「e-KTP already registered」结果页,主按钮回申请落地页。
"OCR 提交后 `ret_data.status='5000'`(`FlowStatus.AnotherAccount`)"
推荐码入口在落地页卡片 referralCodeSwitch='Y' 且 isAllo 时展示,推荐码需通过 6 位字母数字校验(/^[a-zA-Z0-9]{6}$/)后提交。
"落地页卡片 `referralCodeSwitch='Y' && isAllo`;校验 `/^[a-zA-Z0-9]{6}$/`"
payLaterStatus 为 T211/T017/T022/T023(未开通或开到一半)时,统一续到申请落地页。
"`T211` NotOpened / `T017` NotOpened_VB / `T022` NotOpened_VB_form / `T023` NotOpened_form | 未开通/开到一半 | 申请落地页"
payLaterStatus 为 T215(applying/审核中)时,续到 processing 页。
"`T215` applying | 审核中 | processing 页"
payLaterStatus 为 T217(Controlled/被拒或管控)时,续到失败页。
"`T217` Controlled | 被拒/管控 | 失败页"
流程内断点由 amsAccountCheckFlow 返回的 {status, nextAction} 决定(OCR 未过回 OCR、Face 未过回 Face),前端不本地存储进度。
"OCR 没过回 OCR、Face 没过回 Face),**前端不本地存进度**"
表单断点续填:有本地 customerExtInfo 则回填,否则调用 amsAccountQueryExtCustInfo 拉取后端暂存(对应提交前的 amsAccountSaveExtInfo)。
"`Loan.vue:1157-1206` 有本地 `customerExtInfo` 则回填,否则 `amsAccountQueryExtCustInfo` 拉后端暂存"
GPS 位置采集(reportLocation)触发需同时满足:sdk_version≥1.0.2、isAllo 为真、且当前 scene 属于后台配置的 locationReportScenes。
"门控三层:`sdk_version≥1.0.2` 且 `isAllo` 且 scene ∈ 后台 `locationReportScenes`"
刷脸场景下弹出强制授权弹窗,另需满足 sdk_version≥1.0.6 且 openPaylaterScanFaceSwitch='Y'。
"强制授权弹窗另需 `sdk_version≥1.0.6` + `openPaylaterScanFaceSwitch='Y'`(刷脸场景)"
刷脸场景的 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 二选一)"
OCR Confirm 提交前须先完成图灵校验:getTuringToken 后调用 amsAccountSubmitTuringToken(scene='OCR')。
"OCR Confirm 提交前有图灵校验(`getTuringToken` → `amsAccountSubmitTuringToken(scene='OCR')`)"
OCR 识别、人脸活体、Video Banking 面签均由 App 原生 SDK 承载,H5 仅负责拉起与回填。
"OCR 识别、人脸活体、Video Banking 面签均由 App **原生 SDK** 承载,H5 仅做拉起与回填"
前端已枚举拒绝码(checkFlow 段 B201/B256/B222/B221/B211/B701/B111/B901、授信结果 1006/1008),但各码的业务语义与命中规则在后台,以风控/PRD 为准。
"拒绝码**前端枚举**已查实(checkFlow 段 `B201/B256/B222/B221/B211/B701/B111/B901`、授信结果 `1006/1008`,见 D 节),但各码的**业务语义与命中规则**在后台"
安全问答前端流程:进入 QUESTION_VALIDATE → 取题 amsAccountQueryQuestionList → 提交 amsAccountSubmitFlow(action='QUESTION_VALIDATE');题库与判定规则在后台。
"安全问答的**前端机制**已查实(`QUESTION_VALIDATE` → 取题 `amsAccountQueryQuestionList` → 提交 `amsAccountSubmitFlow(action='QUESTION_VALIDATE')`)"
白名单 whitelistFlag 的圈选规则由后台/风控决定,前端仅可见其取值 Y/N。
"白名单 `whitelistFlag` 的圈选规则(谁在白名单里)为后台/风控口径,前端只见 Y/N"