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

02-支付消费

原文 · 72 段(高亮 = 已被卡片引用)
p1# 02 · 支付消费(Consumption / Spending)
p2> 事实来源 = SDK 代码仓 `ifes-resm` + 产品口径。费率/比例以最新 PRD/PM 为准。 > 2026-07-16 增补 D 节「消费支付全链路编排」:基于分支 `vibe-coding-case/K-S-2607-opt-20260710` 代码逐行查实。
p3## 模块定位
p4消费是 PayLater 的**主要用信场景**:外部商户/场景调起,用户用 PayLater 额度完成支付,并在后续按账单还款。负责"支付确认 + 分期选择 + 密码验证 + 结果回调",具体收单链路由商户/原生侧承接。
p5## 业务视角:一笔 PayLater 支付是怎么发生的
p6> 本节用产品语言描述业务全貌;每条规则的代码证据见下方 D 节。
p7### 用户旅程(五步)
p81. **发起**:用户在商户/App 场景选择"用 PayLater 付",商户把订单送进 PayLater SDK——用户看到的是一个支付确认页,订单金额由商户订单决定,**用户不能改金额**。 2. **决定怎么还**:页面给用户两个决策——①是否用积分抵扣(**积分先抵、剩余走 PayLater**,抵掉的部分不产生借据、不收费);②从系统实时给出的分期档里选一档。每档标明期数、每期金额、admin fee 费率;**1 期 = 下月账单一次还清,多期 = 按月分期**。档位由定价引擎按"这个用户 × 这笔金额"实时试算,不是固定的 1/3/6/12。默认选中第一档。 3. **确认身份**:输入 PIN。**每笔 PL 支付都要过后端决策引擎(反欺诈引擎 + 刷脸引擎)**——放行则直接支付;判定可疑则下发挑战,用户被**加验一次人脸**后再放行。 4. **等待结果**:放款与扣款在后台完成,页面最多等约 20 秒,给出三种结果之一——**成功 / 失败 / 处理中**(后台仍在处理,稍后以账单为准)。失败时用户只能回到商户重新发起,页面内没有重试。 5. **回到商户**:SDK 关闭回宿主。**支付结果不随关闭动作回传**,商户靠自己的订单查询确认收款——这是接入契约的一部分(见"经营关注点")。之后这笔消费进入账期,出账/还款见 [04 账单](04-账单与账期.md)、[05 还款](05-灵活还款.md)。
p9### 业务规则速览
p10| 维度 | 规则(产品口径) | |---|---| | 谁能用 | 已开通 PayLater 的用户;**额度够不够由交易时后台判定**,前端不预检 | | 金额 | 商户订单决定,用户不可改;积分可抵扣一部分 | | 分期档位 | **每次展示试算都实时调用定价引擎,价格与期限均由引擎返回**(PM 确认 2026-07-16,无本地档位/费率表;常见 1/3/6/12,最长可到 36),随用户资质与金额、时点变化 | | 费用 | **两费结构(PM 2026-07-16 复核)**:**service fee**(首月一次性额外服务费,仅首月收,如 PL 交易分期首月)+ **admin fee**(月费,每月收)。付款页每档仅展示 admin fee 百分比,**service fee 不在付款页单独列示**(费用拆分见 [R4](../参考/R4-定价与费率.md) 与 RIPLAY 披露)| | 积分 | 先抵后贷;开关默认开,用户可关掉全额走 PayLater | | 优惠券 | **支付确认流程内不选券**;立减(SMP)、免息等优惠在收单侧/营销侧生效,用户在这一步感知不到券 | | 身份验证 | PIN 必验;**PL 支付过两个决策引擎:反欺诈引擎 + 刷脸引擎**(引擎矩阵见下),判定可疑时加验人脸 | | 结果 | 成功/失败/处理中三态;失败须回商户重新下单 |
p11### 支用决策引擎矩阵(PM 口径,2026-07-16)
p12支用交易在后端按产品线过不同的**决策引擎组合**,引擎本体全部在后端,前端只见"放行/挑战"结果:
p13| 产品线 | 决策引擎组合 | |---|---| | **PL(消费支付)** | 反欺诈引擎 + 刷脸引擎 | | **CL(取现 Instant Cash)** | 反欺诈引擎 + 刷脸引擎 + **首借引擎 + 复借引擎**(见 [03](03-取现与Instant-Cash.md))|
p14- **引擎为串行过闸**(PM 确认 2026-07-16):逐个引擎依次通过才放行,任一引擎可下发挑战或拒绝。 - 前端可见的对应痕迹:PL 支付挑战出口 = `coreTransPayUnionPay` 返回 `0004` 触发刷脸(见"付款页能力");CL 侧首借/复借在前端也有独立形态(首借 Intro 教育页分流、`isClFirstPurchase` 首借定位上报,见 03 篇)。 - **引擎决策 vs 字段强控是两类机制**:DBDP 单笔单批**不走引擎,是字段强控**(直接读用户 riskCode 上的 DBDP 标签硬拦截,见 03 篇)——业务规则既可能来自引擎实时决策,也可能来自风控预先打在用户身上的标签位。 - 引擎内部规则(风控变量、挑战升级策略)属风控域,前端不可见,以风控口径为准。
p15### 经营与体验关注点(供产品/运营决策)
p16- **商户对账依赖查单**:SDK 不回传支付结果,商户接入方必须实现订单状态查询,否则会出现"用户付成功、商户不知道"的体验断层。 - **支付漏斗目前不可度量**:确认页→选档→提交→结果全程无行为埋点,无法回答"多少用户在选档时流失"这类经营问题——补埋点是数据侧的一个立项候选。 - **准入体验不一致**:从首页进入的用户会被提前拦截(冻结/逾期/邮箱未验证给明确弹窗),但**从商户深链直达的用户没有前置检查**,会一路走到输完 PIN 才被后台拒绝——同一个不合格用户在两个入口得到两种体验。 - **失败即流失**:失败页无重试按钮,转化找回只能靠商户侧重新发起。
p17## 消费渠道
p18| 场景 | 说明 | 本仓承载 | |---|---|---| | **通用消费付款** | 商户带订单调起(`query.scene=PAY_LATER_PAY`)→ 拉订单详情 → 选分期 + 是否用积分 → 密码验证 → 结果页回调商户。分期试算 `coreTransTryLoan`(LOAN_CODE=9012),落地 `service/payment/Index.vue` | 本仓 H5 承载(支付确认/分期/积分/提交页) | | **QRIS 支付** | 扫码付款,主扫分**两种形态:固定金额(动态码,金额随码带出不可改)/ 用户输入金额(静态码,扫后自输金额)**,见下方专节;本仓仅是**跳原生的入口按钮**,经原生桥唤起(Allo App `goQrCode`,合作 App 走 OneLink 深链,`home/Index.vue:96-111`→`goQris`→`native.goQrCode`,`view.js:199-226`)。首页 QRIS 入口整体由 `showQrisEnter` 控制显隐(`home/Index.vue:697-698` = `isSubprimeUser && cashLimitRate==='0'`),非次级用户根本不显示该入口;显示后在 `availableLimit<2000` 时**置灰**(`home/Index.vue:104`)。生成 QRIS 码有上限值,超过上限值不可生成 — 《QRIS被扫流程优化0428.docx》 | 入口在本仓;**QRIS 收单/展示页非本仓承载**,由原生/外部 H5 承载 | | **Merchant CPM(付款码)** | 付款码模式(Consumer-Presented Mode):用户出示付款码、商户扫码完成消费 | **本前端 SDK 未承载**,由原生/外部 H5/后端承载 | | **Billpayment(账单代付)** | 用 PayLater 额度通过 VA 支付各类账单(话费、水电、宽带等 biller)| **本前端 SDK 未承载**,由原生/外部 H5/后端承载 | | **线上 VISA / VDC(虚拟借记卡)** | 发放虚拟借记卡号,用于线上/绑卡支付,背后用 PayLater 额度;余额不足时由 VDC Auto top-up 自动补足(见 [03](03-取现与Instant-Cash.md))| VDC 卡支付与 Auto top-up **本前端 SDK 未承载**(全仓 grep 零命中),由原生/外部 H5/后端承载 | | **Indomaret** | 在 Indomaret 便利店柜台用生成的参考码完成支付 | **本前端 SDK 未承载**,由原生/外部 H5/后端承载 |
p19> **分期档位非前端写死**:分期可选档位不由前端固定为 `1/3/6/12`,而是由后端 `coreTransTryLoan` 返回的 `LOAN_LIST` 驱动渲染(`payment/Index.vue:166-216`、`InstallmentCell.vue:4-13`,mock 实际含 18/24/36 等档)。
p20## 关键字段与门槛
p21- **分发条件**:`query.scene === PAY_LATER_PAY`(消费付款入口,落地 `service/payment/Index.vue`)。注意:`pages/service/Payment.vue` 实体是 `name:'PageCommonPassword'`(PIN 验密+组合支付页,`pages/service/Payment.vue:42`),全仓零路由注册、零组件引用,是孤儿/未路由文件,并非 Allo Pay 落地页。`scene=ALLO_PAY` 在本仓**无已注册落地页**——`App.vue:363-364` 把 ALLO_PAY 映射到路由名 `SERVICE_PAYMENT`,而该路由名从未在任何 router 注册(router 只注册了 `PAY_LATER_SERVICE_PAYMENT`),故 ALLO_PAY 会导航到不存在的路由。 - **试算接口**:`coreTransTryLoan`,消费场景 `LOAN_CODE=9012`。 - **账户准入**:`checkAccountBeforeWithdrawAndPay()`(`utils/view.js:389`)——邮箱未验证 / blockCode 冻结 / 逾期等会拦截,详见 [07](07-Limit-Up与额度成长.md) 的 BLOCK_CODE 段。该校验仅由**首页内发起的支付/取现入口**调用(`home/Home.vue:1275`、`home/HomeV2.vue:898`、`home/AppGuidedTour.vue:169`);商户深链直达的 `payment/Index.vue` 不经过它(`App.vue:366-367` 直接跳 `payment/Index.vue`,绕过守卫)。 - **结果**:成功 → `COMMON_RESULT` 页 + 外部回调;失败 → 错误提示可重试。
p22### 付款页能力(`service/payment/Index.vue`)
p23- **积分抵扣开关 `use_allo_points`**:付款页提供积分抵扣开关,开/关分别走两套分期试算(`payment/Index.vue:9-12,148-216`)。是否用积分会影响分期试算结果。 - **提交=组合支付 `coreTransPayUnionPay`**:提交走组合支付接口,含三态结果(`Index.vue:230-342`): - **刷脸分支 = 支付反欺诈引擎的挑战出口**(PM 口径 2026-07-16 + 代码印证):使用 PL 的支付**必过支付反欺诈引擎**,引擎判定可疑时接口返回 `0004`(NEED_FACE)+ `faceScanAppNo` → 触发 `COMMON_FACE` 刷脸验证,通过后续回结果轮询。反欺诈引擎本体在后端,前端只见"放行/挑战"两种结果;配套接口 `amsAccountSubmitAntifraud`(`/ams/account/submit/antifraud`,serviceCode `ANTI_FRAUD/REPORT_DATA/QUERY_INDICATOR`,`api.js:2609-2627`,VB 面签流内轮询反欺诈结果亦用它); - **PENDING 轮询**:返回 PENDING 时进入轮询,按轮询结果落定成功/失败。 - **埋点组 `PAY_USING_PAYLATER`**:定义于 `stats/pay-later.js:329-338`(`QRIS_GO` / `BILL_PAYMENT_GO` / `VA_PAYLATER_GO` / `PAGEVIEW`),全仓**唯一消费方是"用 PayLater 支付"引导页 `pages/pay-later/home/AppGuidedTour.vue`**(QRIS_GO:144 / BILL_PAYMENT_GO:151 / VA_PAYLATER_GO:165 / PAGEVIEW:197),非首页 `home/Index.vue`。注意该引导页 `goQris()` 走 `closeSDK({params:CLOSE_SDK_EVENT.QR_CODE})`,与首页 Index.vue 的 `handleClickQris→view.js goQris→native.goQrCode` 是两条不同实现。
p24## QRIS 支付页的低价权益与免息展示
p25> **本前端 SDK 未承载**:本仓 QRIS 仅为跳原生的入口按钮,**整节"QRIS 支付页低价/免息/会员提额比例展示"在本仓无承载页**(本仓 `home/Index.vue:96-111`→`goQris`→`native.goQrCode` 只把用户带到原生 QRIS 流程)。以下为产品能力知识,由原生/外部 H5/后端承载,本知识库保留以说明完整业务,但前端 SDK 内找不到对应渲染代码。
p26### QRIS 主扫的两种形态(PM 口径,2026-07-16 确认)
p27QRIS 主扫(用户扫商户码)分两种业务形态,均在原生收单侧承载:
p28| 形态 | 交互 | 典型场景 | |---|---|---| | **固定金额**(动态码) | 商户按订单生成动态二维码,金额随码带出,用户扫码后**不可改金额**,直接进支付确认 | 收银台按单收款 | | **用户输入金额**(静态码) | 商户张贴静态收款码,用户扫码后**自行输入支付金额**再确认 | 小商户贴码收款 |
p29> 两种形态进入支付确认后共用同一套 PL 选项/分期/低价展示逻辑(下方"低价感知"各条对两种形态均适用)。另有第三种交互 = **被扫(CPM 付款码)**:用户出示付款码由商户扫,见上方渠道表与"立减权益与门槛"节。 > 来源:PM 口径(2026-07-16 用户确认);源 PRD 三篇 QRIS 文档未显式记载主扫两形态,待后续 PRD 归档补源。
p30### QRIS 监管限额(刚性约束,非运营参数)
p31QRIS 支付限额来自**监管规定**,对两种主扫形态与被扫一体适用,产品/营销不可配置调整:
p32| 维度 | 限额 | |---|---| | **单笔(Per Trx)** | Rp 10.000.000 | | **单日(Per Day)** | Rp 100.000.000 |
p33- 这解释了「生成 QRIS 码有金额上限、超上限不可生成」(《QRIS被扫流程优化0428》)的校验来源——**监管红线,不是可调的运营参数**。 - 来源:监管口径(PM 提供,2026-07-16)。数值以监管最新文告为准,若监管调整须同步更新本表。
p34### 低价感知优化(PRD 查实)
p35QRIS 支付页对贷款用户做了"低价感知"优化,让用户在选择支付方式与分期时即可看到 0% 利率权益与会员提额能力。
p36- **0% interest 展示条件**:用户选择钱包支付时,判断 PL 是否有低价权益,**有则展示 0% interest** 标识。读取试算接口,若用户有 0 利率权益,则在 PL 选项处展示用户当前 **0 利率的剩余可用额度** 及其适用期数 — 《QRIS支付流程低价感知优化方案0328.docx》 - **期数默认收起**:选择 PL 选项时,**默认只展示前两个期数选项**,点击"展开更多"时再出现全部期数;如果只有两个期数则不展示展开/隐藏按钮 — 《QRIS支付流程低价感知优化方案0328.docx》 - **会员提额比例展示**:limit up 用户在 QRIS 主扫页面,判断当前是否处于 limit up 会员有效期内: - 在有效期内 → 展示会员的还款提额比例,取值**基于 Market code 第 3~4 位**(前端直读整数,`06`=6%,见 [R1 速查表](../参考/R1-业务码位段速查表.md)); - 会员失效 → 保留原查询机制,读取营销系统配置的比例; - **支付结果页弹窗**同样按"是否有效会员"用对应比例计算后,展示"按时还款后可提额的额度金额"。 - — 《QRIS支付页展示会员提额比例1105.docx》
p37## 立减权益与门槛(CPM / Indomaret)
p38> **本前端 SDK 未承载**:CPM / Indomaret 收单链路与其立减权益展示在本仓无承载页,由原生/外部 H5/后端承载。以下为产品能力知识,保留以说明完整业务边界。
p39- **立减权益超门槛 toast**:用户勾选了立减权益支付,但最终订单金额**超过权益门槛**导致无法使用权益时,以 toast 提示告知用户(**5 秒后消失**),**toast 文案可配置** — 《QRIS被扫流程优化0428.docx》 - **CPM 期数排序**:CPM 的 PL 期数选项按**从小到大**排序(原为从大到小)— 《QRIS被扫流程优化0428.docx》 - **CPM 支付成功页**:CPM 支付完成后进入 CPM 专属支付成功页 — 《QRIS被扫流程优化0428.docx》 - 立减权益在 Indomaret/CPM 场景以**优惠券(coupon)**形式应用,记账上立减部分计入 `Payment Discount CPM Expense`(如购买 5.4K 商品立减 3.4K,PL 实际放款 2K)— 《Payment QRIS Indomaret and Merchant CPM v.211024.pptx》
p40## 低价权益适用于全支付场景
p41> **本前端 SDK 未承载**:低价权益/立减/0% 免息叠加的展示与计算逻辑在本仓无承载页(本仓 QRIS/CPM 等收单页本就不在前端 SDK),由原生/外部 H5/后端承载。以下为产品能力知识,保留以说明完整业务边界。
p42低价权益从"优惠券形式"解耦为额度属性,目标是**为用户发放低价权益后,对应额度的低价可在全支付场景自动生效**,无需逐个支付场景页面改造 — 《低价权益适用于全支付场景0320.docx》
p43- **与利率优惠券兼容叠加**:低价权益与贷款利率优惠券可同时使用,且利率券基于低价权益的价格计算。例:原始利率 5%、低价利率 3%,叠加 7 折利率券后,若支用额度属于低价额度,则按 `3% × 0.7 = 2.1%` 执行。 - **作为流程判断条件**:低价权益字段仍可作为"是否进入新取现流程"的判断条件;支持营销系统对低价权益的**批量及实时发放**机制。 - **有效期**:低价权益有效期可配置为**永久有效**,并可随时作废。
p44## VDC Auto top-up(PayLater 自动补足)
p45> **本前端 SDK 未承载**:VDC Auto top-up 整节在本仓 SDK 中全仓 grep 零命中(无开通入口、T&C、激活、限额等任何前端代码),由原生/外部 H5/后端承载。以下为产品能力知识,完整保留以说明业务,但前端 SDK 内不实现。
p46VDC(虚拟借记卡)支付以 **Allo Prime 钱包为主资金源、PayLater 额度为辅资金源**。当钱包余额不足时,由 PayLater 自动放款到钱包补足差额,使 VDC 交易无摩擦成功(详见 [03](03-取现与Instant-Cash.md))。
p47**开通入口与首次激活流程** — 《VDC支付PL支付0711.docx》《[1205] PRD - VDC - Automatic Disbursement Instant Cash》
p48- 入口位于 **卡设置 > 支付设置**,新增 Auto top-up(自动充值)按钮;从未激活过的用户入口展示 **New 标记**。 - 点击进入功能介绍页,页面含"每日 PL 支付限额上限值"(**读取自后台配置**)+ 底部三个可点击图标跳详细说明页。 - 激活时判断是否已开通 PL 账户: - **未开通** → 弹窗引导申请 PL,点击"申请"跳 PL SDK,点击"关闭"关弹窗; - **已开通** → 弹窗展示每日 PL 支付限额上限值,**默认期数 1 期**,调用定价引擎试算接口展示该 1 期(默认传入 100K)对应的 admin fee 价格;确认后进入 T&C 节点。 - **T&C 页**:展示协议内容,**首个勾选框默认选中,第二个勾选框需用户主动勾选**,勾选后"继续"按钮高亮;点击进入**验 PIN**,PIN 成功后展示激活结果页。 - 激活成功后入口状态:**从未激活=New / 当前激活中=Active / 曾激活已关闭=Inactive**。 - 若验 PIN 后 **PL 账户处于上码状态**,则展示激活失败页面。
p49**关闭 / 重启激活** — 《VDC支付PL支付0711.docx》
p50- 已激活(Active):点击进入自动充值主页,顶部为 Visa 卡标准样式 + 卡号后四位,下半部分展示开启状态、文案与每日支付限额值。点击关闭后出现 save 按钮 → 验 PIN → 关闭成功并返回,toast 提示。 - 已关闭(Inactive):点击进入主页,点击开启 → save → 验 PIN → 返回并 toast 提示。 - 每日支付限额旁有"!"说明,点击展示每日限额及当前 1 期利率(调定价引擎试算,默认传入 100K 的 admin fee)。
p51**自动失效机制**:通过 **VDC 最新一次支付时间 + 90 天后自动失效**,即连续 90 天不再使用 VDC 支付(任何支付,包括钱包支付)则自动关闭此功能 — 《VDC支付PL支付0711.docx》
p52**每日限额** — 《[1205] PRD - VDC - Automatic Disbursement Instant Cash》
p53- 自动放款的 Instant Cash **每日上限默认 2 Mio(Rp3.000.000 为可调上限)**,且**不得超过用户的 VDC limit**。 - 默认值规则:VDC limit ≥ 2 Mio → Instant Cash 限额默认 2 Mio;VDC limit < 2 Mio → Instant Cash 限额默认等于 VDC limit。 - 用户可在 VDC 卡设置内手动调整 Instant Cash 限额。期数与每日上限均在后台(BE)可参数化配置。 - **无最低放款金额**(NO MINIMUM DISBURSEMENT)。 - PL 需支付部分若**超过 3M 则支付失败**并推送 PN。
p54**支付扣款流程(prime 先扣、PL 补足)** — 《VDC支付PL支付0711.docx》《[1205] PRD》
p551. 订单金额 ≤ prime 余额 → 直接按现有流程处理(仅扣 prime)。 2. 订单金额 > prime 余额 → 判断是否已激活自动充值:未激活 → **支付失败**并触发 push(PL 用户与非 PL 用户两份模版)。 3. 已激活 → 检查(订单金额 − prime 余额)是否大于"每日剩余 PL 支付上限":大于 → 支付失败;否则判断当前可用额度是否足够: - 足够 → 差额部分通过 PL 额度支付,触发 PL 支付的 **RIPLAY 邮件**; - 不足 → 支付失败。 4. 实际调用 PL 消费接口,先支付到用户 **prime 账户**,再由 prime 账户支付给外部。 5. **异常**:prime 账户处于**冻结/锁定**状态,统一视为支付失败。
p56**Push 通知模版**(支付失败场景)— 《VDC支付PL支付0711.docx》
p57- Binding VDC(PL 已开通但未绑定激活):EN "Shop online with Allo Visa + Allo PayLater" / "Link your card & shop with Allo PayLater. Tap now!" - PL Not Active(PL 未开通):EN "Transaction failed: PayLater not active" / "Activate Allo PayLater or change your source of fund and try again"
p58**记账规则**:VDC 因余额不足支付失败时,若 prime 账户余额不足以撤销该笔 PL 支付订单,则按撤销失败处理;足够则完成 PL 支付撤销。此为 Allo 认可的 VDC+PL 支付资金流转规则 — 《VDC支付PL支付0711.docx》
p59## D. 消费支付全链路编排(代码查实,2026-07-16)
p60> 源:`ifes-resm` 分支 `vibe-coding-case/K-S-2607-opt-20260710`。主页面 `service/payment/Index.vue`,深链分发 `App.vue:358-383`,API 定义 `constants/api.js`。
p61### D.1 入口契约(商户/原生调起)
p62- **深链分发**(`App.vue:358-383` `_redirect` 按 `query.scene`):`PAY_LATER_PAY` → `PAY_LATER_SERVICE_PAYMENT`(本篇主线);`ALLO_PAY` → `SERVICE_PAYMENT`(钱包支付,**路由未注册,导航必失败**,见前文);`PAY_LATER_HOME/COUPONS/WITHDRAW` 与 default → `PAY_LATER`。路由不可达时直接 `closeSDK()` 退出。支付相关 scene 仅 `PAY_LATER_PAY` 一个。 - **调起参数**:`scene`、`order_no`(订单号)、`channel`(渠道 id,如 ALLO_OMNI_SDK)、`app_id`(白名单仅 ALLO/BIMA/IM3)、`user_id`、`token`、`locale_lang`。**金额不由 URL 传入**——进入页面后由订单接口返回。 - **第一步拉订单**:`coreTransPayOrderDetail`(`/core/trans/pay/order_detail`,入参仅 `mpcOrderNo`)→ 返回 `totalAmt`(订单总额)+ `goodsList`(商品清单)。`totalAmt` 缺失 → toast "order error" → `closeSDK()` 退出(防外部传入金额与后台不一致)。
p63### D.2 页面编排:积分 → 双试算 → 选档
p641. 并发拉订单 + 积分余额 `amsCardpointQueryPointBal`(返回 `avlScoreAmount` 可用积分)。 2. **两套并发试算**(`Index.vue:166-216`),同一接口 `coreTransTryLoan`,入参仅 `AMOUNT/TERM(空)/LOAN_CODE('9012'硬编码)` 三个: - 用积分档:`AMOUNT = total − 积分`(积分先抵扣,分期只对剩余部分试算); - 不用积分档:`AMOUNT = total`。 - `use_allo_points` 开关(默认开)**只切换展示哪套结果,不重新请求**。 3. **选档**:后端 `LOAN_LIST` 按返回顺序渲染(前端不排序),**默认选首档**;每档展示 `LOAN_INIT_TERM`(期数)/ `FIRST_BILL_AMT`(每期)/ `UPFRONT_ADMIN_FEE%`(admin fee)。**无免息档特殊标识**——0% 只表现为 "0% admin fee" 文本。首档的 `BILLING_CYCLE`/`FIRST_BILL_DATE` 填 Due date 与首期还款日。
p65### D.3 提交与结果:验密 → 组合支付 → 三态
p66- **验密前置**(`COMMON_PASSWORD_VERIFY`,scene=OTHER):PIN 校验只是门禁,**验密 session 不进支付接口**(与取现不同——取现的 session 随 `coreTransApplyLoan` 上送)。 - **组合支付 `coreTransPayUnionPay`** 入参:`totalAmt`(须 = 积分 + 钱包 + PL 三者之和)、`pointsAmt`/`pointsCashValue`(积分抵扣)、`balanceAmt`(钱包,此页恒 0)、`paylaterAmt`(PL 支付额)、`loanTerm`(1=不分期)、`channelId`、`orderNo`、`goodsList`。**无券、无密码字段**。 - **状态码三态**(`PAYMENT_STATUS`):`0000` 成功 → 轮询确认;`0004` 需刷脸 → `COMMON_FACE`(scene=LOAN),**刷脸成功后续回轮询**、失败进失败页;异常 → 失败页。 - **轮询** `coreTransPayUnionPayQuery`(入参 `bizSeqNo`):2s 间隔 × 最多 10 次;`0000`→成功页、`0002`→失败页、第 10 次仍 `0003`→「Processing」处理中页。 - **结果回传商户 = 无**:成功/失败/处理中三个结果页的按钮都是**无参 `closeSDK()`**——SDK 只关闭返回宿主,不回传任何状态/金额参数,**商户须自行查单确认结果**(与 QRIS 引导的 `closeSDK({params})` code=103 带跳转目标不同)。 - **失败不可页内重试**:失败页唯一按钮回宿主,用户需从商户侧重新发起。
p67### D.4 准入与结构性风险点(代码查实)
p68- **payment 页无任何前置准入**:不调 `checkAccountBeforeWithdrawAndPay`、不校验可用额度/账户状态/单笔限额,唯一门禁是 PIN。额度是否足够完全由后端 `coreTransPayUnionPay` 判定。深链直达 + 页面无兜底 = **准入校验的结构性缺口**(首页入口有守卫、商户深链没有)。 - **消费支付流程不含券逻辑**:`service/payment/` 目录 grep coupon/免息零业务命中,提交无 couponId——立减券/免息券的应用不在本前端流程(SMP 立减在收单侧)。 - **全程零埋点**:payment 页拉单→试算→提交→结果全程无 stats 埋点(重要监控空白)。 - 轮询守卫 `isUpScene` 变量未定义(恒走轮询),为死分支遗留;`coreTransPayUnionPayLoanResult` 接口已定义但页面未调用。
p69### D.5 辅路径与交易详情
p70- **「用 PayLater 支付」引导页**(`AppGuidedTour.vue`)三个出口,先 `checkBeforePay()`(含 checkAccount + 额度>0)再 `closeSDK({params})`(code=103 带目标地址):QRIS → App 扫码页;Bill payment → billh5 账单代付 H5;E-commerce → App 电商引导页。 - **消费交易详情** `transaction/Spending.vue`:query 契约 `type(S/T)/orderId(BIZ_SEQ_NO)/partnerOrderId(MER_BIZ_NO)/receiptId(可选)`,缺参不请求;取数 `coreTransQueryTransactionDetail`;展示商户名/商品/分期数/商户订单号/交易时间/支付方式/参考号/金额 + 退款历史 + 还款计划;**Repay 按钮**仅交易 SUCCESSFUL 且有未还期时出现 → 提前还款流(`EARLY_REPAYMENT`)。
p71## 待确认
p72- 各渠道(QRIS / CPM / Billpayment / VDC / Indomaret)的现网开通范围、收单链路归属与口径,以 PM 确认为准(部分渠道由原生/其他仓承载)。 - 消费分期的 admin fee 口径以 PRD 为准;积分抵扣的**前端行为已查实**(积分优先抵扣、剩余走 PL 分期,见 D.2),积分兑换率/上限等业务规则仍以 PRD 为准。 - Merchant CPM 的准确业务定义(付款码 vs 商户优惠位)待 PM 确认。 - **商户如何感知支付结果**(D.3:SDK 关闭时不回传状态)——商户侧查单机制/回调契约在收单侧,需 PM/后端补充。 - payment 页零埋点、深链绕过准入两项结构性问题(D.4)是否立项修复,待产品/研发决策。
抽出的卡片 · 108
定义DOC-2026-006#p4pending_review

消费是 PayLater 的主要用信场景,由外部商户/场景调起,用户用 PayLater 额度完成支付,之后按账单还款。

"消费是 PayLater 的**主要用信场景**:外部商户/场景调起,用户用 PayLater 额度完成支付,并在后续按账单还款。"

规则DOC-2026-006#p8pending_review

支付订单金额由商户订单决定,用户不能修改金额。

"订单金额由商户订单决定,**用户不能改金额**"

规则DOC-2026-006#p8pending_review

积分抵扣采取积分先抵、剩余走 PayLater 的方式;被积分抵掉的部分不产生借据、不收费。

"①是否用积分抵扣(**积分先抵、剩余走 PayLater**,抵掉的部分不产生借据、不收费)"

定义DOC-2026-006#p8pending_review

分期档位中,1 期指下月账单一次还清,多期指按月分期。

"**1 期 = 下月账单一次还清,多期 = 按月分期**"

规则DOC-2026-006#p8pending_review

分期档位由定价引擎按用户与该笔金额实时试算,不是固定的 1/3/6/12,默认选中第一档。

"档位由定价引擎按"这个用户 × 这笔金额"实时试算,不是固定的 1/3/6/12。默认选中第一档。"

规则DOC-2026-006#p8pending_review

每笔 PL 支付都要经过后端决策引擎(反欺诈引擎+刷脸引擎):放行则直接支付,判定可疑则下发挑战、加验一次人脸后再放行。

"**每笔 PL 支付都要过后端决策引擎(反欺诈引擎 + 刷脸引擎)**——放行则直接支付;判定可疑则下发挑战,用户被**加验一次人脸**后再放行。"

状态DOC-2026-006#p8pending_review

支付结果有三种状态:成功、失败、处理中(处理中表示后台仍在处理,稍后以账单为准),页面最多等约 20 秒。

"页面最多等约 20 秒,给出三种结果之一——**成功 / 失败 / 处理中**(后台仍在处理,稍后以账单为准)"

动作条件DOC-2026-006#p8pending_review

支付失败时用户只能回到商户重新发起,页面内没有重试功能。

"失败时用户只能回到商户重新发起,页面内没有重试。"

规则DOC-2026-006#p8pending_review

SDK 关闭回宿主时支付结果不随关闭动作回传,商户须靠自己的订单查询确认收款,这是接入契约的一部分。

"**支付结果不随关闭动作回传**,商户靠自己的订单查询确认收款——这是接入契约的一部分"

规则DOC-2026-006#p10pending_review

消费支付的准入对象为已开通 PayLater 的用户;额度是否足够由交易时后台判定,前端不预检。

"已开通 PayLater 的用户;**额度够不够由交易时后台判定**,前端不预检"

规则DOC-2026-006#p10pending_review

每次展示分期试算都实时调用定价引擎,价格与期限均由引擎返回,无本地档位/费率表;常见 1/3/6/12,最长可到 36,随用户资质、金额与时点变化。

"**每次展示试算都实时调用定价引擎,价格与期限均由引擎返回**(PM 确认 2026-07-16,无本地档位/费率表;常见 1/3/6/12,最长可到 36),随用户资质与金额、时点变化"

定义DOC-2026-006#p10pending_review

费用为两费结构:service fee 是首月一次性额外服务费仅首月收,admin fee 是每月收的月费;付款页每档仅展示 admin fee 百分比,service fee 不在付款页单独列示。

"**两费结构(PM 2026-07-16 复核)**:**service fee**(首月一次性额外服务费,仅首月收,如 PL 交易分期首月)+ **admin fee**(月费,每月收)。付款页每档仅展示 admin fee 百分比,**service fee 不在付款页单独列示**"

规则DOC-2026-006#p10pending_review

积分先抵后贷,抵扣开关默认打开,用户可关掉后全额走 PayLater。

"先抵后贷;开关默认开,用户可关掉全额走 PayLater"

边界DOC-2026-006#p10pending_review

支付确认流程内不选优惠券;立减(SMP)、免息等优惠在收单侧/营销侧生效,用户在此步感知不到券。

"**支付确认流程内不选券**;立减(SMP)、免息等优惠在收单侧/营销侧生效,用户在这一步感知不到券"

规则DOC-2026-006#p10pending_review

身份验证中 PIN 必验;PL 支付经过反欺诈引擎与刷脸引擎两个决策引擎,判定可疑时加验人脸。

"PIN 必验;**PL 支付过两个决策引擎:反欺诈引擎 + 刷脸引擎**(引擎矩阵见下),判定可疑时加验人脸"

规则DOC-2026-006#p13pending_review

PL(消费支付)产品线的决策引擎组合为反欺诈引擎 + 刷脸引擎。

"| **PL(消费支付)** | 反欺诈引擎 + 刷脸引擎 |"

规则DOC-2026-006#p13pending_review

CL(取现 Instant Cash)产品线的决策引擎组合为反欺诈引擎 + 刷脸引擎 + 首借引擎 + 复借引擎。

"| **CL(取现 Instant Cash)** | 反欺诈引擎 + 刷脸引擎 + **首借引擎 + 复借引擎**"

规则DOC-2026-006#p14pending_review

决策引擎为串行过闸,逐个引擎依次通过才放行,任一引擎可下发挑战或拒绝。

"**引擎为串行过闸**(PM 确认 2026-07-16):逐个引擎依次通过才放行,任一引擎可下发挑战或拒绝。"

规则DOC-2026-006#p14pending_review

DBDP 单笔单批不走决策引擎,而是字段强控,直接读用户 riskCode 上的 DBDP 标签硬拦截。

"DBDP 单笔单批**不走引擎,是字段强控**(直接读用户 riskCode 上的 DBDP 标签硬拦截,见 03 篇)"

边界DOC-2026-006#p16pending_review

从首页进入的用户会被提前拦截(冻结/逾期/邮箱未验证给弹窗),但从商户深链直达的用户没有前置检查,会走到输完 PIN 才被后台拒绝。

"从首页进入的用户会被提前拦截(冻结/逾期/邮箱未验证给明确弹窗),但**从商户深链直达的用户没有前置检查**,会一路走到输完 PIN 才被后台拒绝"

规则DOC-2026-006#p18pending_review

通用消费付款由商户带订单调起(scene=PAY_LATER_PAY),流程为拉订单详情→选分期+是否用积分→密码验证→结果页回调商户,分期试算用 coreTransTryLoan(LOAN_CODE=9012),由本仓 H5 承载。

"商户带订单调起(`query.scene=PAY_LATER_PAY`)→ 拉订单详情 → 选分期 + 是否用积分 → 密码验证 → 结果页回调商户。分期试算 `coreTransTryLoan`(LOAN_CODE=9012),落地 `service/payment/Index.vue`"

状态DOC-2026-006#p18pending_review

QRIS 主扫有两种形态:固定金额(动态码,金额随码带出不可改)和用户输入金额(静态码,扫后自输金额)。

"主扫分**两种形态:固定金额(动态码,金额随码带出不可改)/ 用户输入金额(静态码,扫后自输金额)**"

动作条件DOC-2026-006#p18pending_review

首页 QRIS 入口由 showQrisEnter 控制显隐(isSubprimeUser && cashLimitRate==='0'),非次级用户不显示该入口;显示后在 availableLimit<2000 时置灰。

"首页 QRIS 入口整体由 `showQrisEnter` 控制显隐(`home/Index.vue:697-698` = `isSubprimeUser && cashLimitRate==='0'`),非次级用户根本不显示该入口;显示后在 `availableLimit<2000` 时**置灰**"

规则DOC-2026-006#p18pending_review

生成 QRIS 码有上限值,超过上限值不可生成。

"生成 QRIS 码有上限值,超过上限值不可生成"

边界DOC-2026-006#p18pending_review

QRIS 入口在本仓,但 QRIS 收单/展示页非本仓承载,由原生/外部 H5 承载。

"**QRIS 收单/展示页非本仓承载**,由原生/外部 H5 承载"

边界DOC-2026-006#p18pending_review

Merchant CPM(付款码)、Billpayment(账单代付)、Indomaret 等渠道本前端 SDK 未承载,由原生/外部 H5/后端承载。

"**本前端 SDK 未承载**,由原生/外部 H5/后端承载"

定义DOC-2026-006#p18pending_review

线上 VISA/VDC(虚拟借记卡)发放虚拟借记卡号用于线上/绑卡支付,背后用 PayLater 额度,余额不足时由 VDC Auto top-up 自动补足。

"**线上 VISA / VDC(虚拟借记卡)** | 发放虚拟借记卡号,用于线上/绑卡支付,背后用 PayLater 额度;余额不足时由 VDC Auto top-up 自动补足"

规则DOC-2026-006#p19pending_review

分期可选档位不由前端固定为 1/3/6/12,而是由后端 coreTransTryLoan 返回的 LOAN_LIST 驱动渲染(mock 实际含 18/24/36 等档)。

"分期可选档位不由前端固定为 `1/3/6/12`,而是由后端 `coreTransTryLoan` 返回的 `LOAN_LIST` 驱动渲染"

动作条件DOC-2026-006#p21pending_review

当 query.scene 等于 PAY_LATER_PAY 时,分发到消费付款入口,落地 service/payment/Index.vue。

"`query.scene === PAY_LATER_PAY`(消费付款入口,落地 `service/payment/Index.vue`)"

规则DOC-2026-006#p21pending_review

scene=ALLO_PAY 被映射到路由名 SERVICE_PAYMENT,但该路由名从未注册,故 ALLO_PAY 会导航到不存在的路由。

"`scene=ALLO_PAY` 在本仓**无已注册落地页**——`App.vue:363-364` 把 ALLO_PAY 映射到路由名 `SERVICE_PAYMENT`,而该路由名从未在任何 router 注册(router 只注册了 `PAY_LATER_SERVICE_PAYMENT`),故 ALLO_PAY 会导航到不存在的路由"

定义DOC-2026-006#p21pending_review

消费付款的试算接口为 coreTransTryLoan,消费场景 LOAN_CODE 取值 9012。

"**试算接口**:`coreTransTryLoan`,消费场景 `LOAN_CODE=9012`"

规则DOC-2026-006#p21pending_review

账户准入校验 checkAccountBeforeWithdrawAndPay:邮箱未验证、blockCode 冻结、逾期等情形会拦截支付/取现。

"**账户准入**:`checkAccountBeforeWithdrawAndPay()`(`utils/view.js:389`)——邮箱未验证 / blockCode 冻结 / 逾期等会拦截"

边界DOC-2026-006#p21pending_review

账户准入校验仅由首页内发起的支付/取现入口调用;商户深链直达 payment/Index.vue 不经过该校验,绕过守卫。

"该校验仅由**首页内发起的支付/取现入口**调用(`home/Home.vue:1275`、`home/HomeV2.vue:898`、`home/AppGuidedTour.vue:169`);商户深链直达的 `payment/Index.vue` 不经过它(`App.vue:366-367` 直接跳 `payment/Index.vue`,绕过守卫)"

状态DOC-2026-006#p21pending_review

付款结果:成功进入 COMMON_RESULT 页并触发外部回调;失败则给出错误提示可重试。

"**结果**:成功 → `COMMON_RESULT` 页 + 外部回调;失败 → 错误提示可重试"

规则DOC-2026-006#p23pending_review

付款页提供积分抵扣开关 use_allo_points,开与关分别走两套分期试算,是否用积分会影响分期试算结果。

"**积分抵扣开关 `use_allo_points`**:付款页提供积分抵扣开关,开/关分别走两套分期试算(`payment/Index.vue:9-12,148-216`)。是否用积分会影响分期试算结果"

定义DOC-2026-006#p23pending_review

付款页提交走组合支付接口 coreTransPayUnionPay,返回三态结果。

"**提交=组合支付 `coreTransPayUnionPay`**:提交走组合支付接口,含三态结果(`Index.vue:230-342`)"

规则DOC-2026-006#p23pending_review

使用 PL 的支付必过支付反欺诈引擎;引擎判定可疑时接口返回 0004(NEED_FACE)加 faceScanAppNo,触发 COMMON_FACE 刷脸验证,通过后回到结果轮询。

"使用 PL 的支付**必过支付反欺诈引擎**,引擎判定可疑时接口返回 `0004`(NEED_FACE)+ `faceScanAppNo` → 触发 `COMMON_FACE` 刷脸验证,通过后续回结果轮询"

状态DOC-2026-006#p23pending_review

组合支付返回 PENDING 时进入轮询,按轮询结果落定为成功或失败。

"**PENDING 轮询**:返回 PENDING 时进入轮询,按轮询结果落定成功/失败"

定义DOC-2026-006#p28pending_review

QRIS 主扫固定金额(动态码)形态:商户按订单生成动态二维码,金额随码带出,用户扫码后不可改金额,直接进支付确认。

"**固定金额**(动态码) | 商户按订单生成动态二维码,金额随码带出,用户扫码后**不可改金额**,直接进支付确认"

定义DOC-2026-006#p28pending_review

QRIS 主扫用户输入金额(静态码)形态:商户张贴静态收款码,用户扫码后自行输入支付金额再确认。

"**用户输入金额**(静态码) | 商户张贴静态收款码,用户扫码后**自行输入支付金额**再确认"

边界DOC-2026-006#p29pending_review

QRIS 主扫两种形态进入支付确认后共用同一套 PL 选项、分期与低价展示逻辑,低价感知各条对两种形态均适用。

"两种形态进入支付确认后共用同一套 PL 选项/分期/低价展示逻辑(下方"低价感知"各条对两种形态均适用)"

定义DOC-2026-006#p29pending_review

第三种交互为被扫(CPM 付款码):用户出示付款码由商户扫。

"另有第三种交互 = **被扫(CPM 付款码)**:用户出示付款码由商户扫"

规则DOC-2026-006#p31pending_review

QRIS 支付限额来自监管规定,对两种主扫形态与被扫一体适用,产品/营销不可配置调整。

"QRIS 支付限额来自**监管规定**,对两种主扫形态与被扫一体适用,产品/营销不可配置调整"

规则DOC-2026-006#p32pending_review

QRIS 单笔(Per Trx)限额为 Rp 10.000.000。

"**单笔(Per Trx)** | Rp 10.000.000"

规则DOC-2026-006#p32pending_review

QRIS 单日(Per Day)限额为 Rp 100.000.000。

"**单日(Per Day)** | Rp 100.000.000"

规则DOC-2026-006#p33pending_review

生成 QRIS 码有金额上限、超上限不可生成,其校验来源是监管红线,不是可调的运营参数。

"这解释了「生成 QRIS 码有金额上限、超上限不可生成」(《QRIS被扫流程优化0428》)的校验来源——**监管红线,不是可调的运营参数**"

动作条件DOC-2026-006#p36pending_review

用户选择钱包支付时判断 PL 是否有低价权益,有则展示 0% interest 标识。

"**0% interest 展示条件**:用户选择钱包支付时,判断 PL 是否有低价权益,**有则展示 0% interest** 标识"

规则DOC-2026-006#p36pending_review

读取试算接口,若用户有 0 利率权益,则在 PL 选项处展示当前 0 利率的剩余可用额度及其适用期数。

"读取试算接口,若用户有 0 利率权益,则在 PL 选项处展示用户当前 **0 利率的剩余可用额度** 及其适用期数"

规则DOC-2026-006#p36pending_review

选择 PL 选项时默认只展示前两个期数选项,点击展开更多才出现全部期数;如果只有两个期数则不展示展开/隐藏按钮。

"**期数默认收起**:选择 PL 选项时,**默认只展示前两个期数选项**,点击"展开更多"时再出现全部期数;如果只有两个期数则不展示展开/隐藏按钮"

状态DOC-2026-006#p36pending_review

limit up 会员在有效期内,展示会员的还款提额比例,取值基于 Market code 第 3~4 位(前端直读整数,如 06=6%)。

"在有效期内 → 展示会员的还款提额比例,取值**基于 Market code 第 3~4 位**(前端直读整数,`06`=6%"

状态DOC-2026-006#p36pending_review

会员失效时保留原查询机制,读取营销系统配置的提额比例。

"会员失效 → 保留原查询机制,读取营销系统配置的比例"

规则DOC-2026-006#p36pending_review

支付结果页弹窗按是否有效会员用对应比例计算后,展示按时还款后可提额的额度金额。

"**支付结果页弹窗**同样按"是否有效会员"用对应比例计算后,展示"按时还款后可提额的额度金额""

规则DOC-2026-006#p39pending_review

用户勾选立减权益支付但最终订单金额超过权益门槛无法使用权益时,以 toast 提示告知用户,5 秒后消失,toast 文案可配置。

"**立减权益超门槛 toast**:用户勾选了立减权益支付,但最终订单金额**超过权益门槛**导致无法使用权益时,以 toast 提示告知用户(**5 秒后消失**),**toast 文案可配置**"

规则DOC-2026-006#p39pending_review

CPM 的 PL 期数选项按从小到大排序。

"**CPM 期数排序**:CPM 的 PL 期数选项按**从小到大**排序(原为从大到小)"

流程步骤DOC-2026-006#p39pending_review

CPM 支付完成后进入 CPM 专属支付成功页。

"**CPM 支付成功页**:CPM 支付完成后进入 CPM 专属支付成功页"

规则DOC-2026-006#p39pending_review

立减权益在 Indomaret/CPM 场景以优惠券(coupon)形式应用,记账上立减部分计入 Payment Discount CPM Expense(如购买 5.4K 商品立减 3.4K,PL 实际放款 2K)。

"立减权益在 Indomaret/CPM 场景以**优惠券(coupon)**形式应用,记账上立减部分计入 `Payment Discount CPM Expense`(如购买 5.4K 商品立减 3.4K,PL 实际放款 2K)"

规则DOC-2026-006#p12pending_review

支用交易在后端按产品线经过不同的决策引擎组合,引擎本体全部在后端,前端只能看到"放行/挑战"结果

"支用交易在后端按产品线过不同的**决策引擎组合**,引擎本体全部在后端,前端只见"放行/挑战"结果"

边界DOC-2026-006#p25pending_review

前端 SDK 本仓的 QRIS 仅为跳转原生的入口按钮,QRIS 支付页低价/免息/会员提额比例展示在本仓无承载页

"本仓 QRIS 仅为跳原生的入口按钮,**整节"QRIS 支付页低价/免息/会员提额比例展示"在本仓无承载页**"

定义DOC-2026-006#p27pending_review

QRIS 主扫指用户扫商户码,分两种业务形态,均在原生收单侧承载

"QRIS 主扫(用户扫商户码)分两种业务形态,均在原生收单侧承载"

规则DOC-2026-006#p30pending_review

QRIS 存在监管限额,属于刚性约束,而非运营参数

"### QRIS 监管限额(刚性约束,非运营参数)"

动作条件DOC-2026-006#p35pending_review

QRIS 支付页对贷款用户做低价感知优化,用户在选择支付方式与分期时即可看到 0% 利率权益与会员提额能力

"QRIS 支付页对贷款用户做了"低价感知"优化,让用户在选择支付方式与分期时即可看到 0% 利率权益与会员提额能力"

边界DOC-2026-006#p38pending_review

CPM / Indomaret 收单链路及其立减权益展示在本前端 SDK 仓中无承载页,由原生/外部 H5/后端承载。

"CPM / Indomaret 收单链路与其立减权益展示在本仓无承载页,由原生/外部 H5/后端承载"

边界DOC-2026-006#p41pending_review

低价权益/立减/0% 免息叠加的展示与计算逻辑在本前端 SDK 仓无承载页,由原生/外部 H5/后端承载。

"低价权益/立减/0% 免息叠加的展示与计算逻辑在本仓无承载页"

定义DOC-2026-006#p42pending_review

低价权益从优惠券形式解耦为额度属性,目的是为用户发放低价权益后对应额度的低价可在全支付场景自动生效,无需逐个支付场景页面改造。

"低价权益从"优惠券形式"解耦为额度属性"

规则DOC-2026-006#p43pending_review

低价权益与贷款利率优惠券可同时使用叠加,利率券基于低价权益的价格计算;如原始利率5%、低价利率3%叠加7折利率券,若支用额度属于低价额度则按3%×0.7=2.1%执行。

"低价权益与贷款利率优惠券可同时使用,且利率券基于低价权益的价格计算"

动作条件DOC-2026-006#p43pending_review

低价权益字段可作为是否进入新取现流程的判断条件。

"低价权益字段仍可作为"是否进入新取现流程"的判断条件"

规则DOC-2026-006#p43pending_review

支持营销系统对低价权益进行批量及实时发放。

"支持营销系统对低价权益的**批量及实时发放**机制"

规则DOC-2026-006#p43pending_review

低价权益有效期可配置为永久有效,并可随时作废。

"低价权益有效期可配置为**永久有效**,并可随时作废"

边界DOC-2026-006#p45pending_review

VDC Auto top-up 相关功能(开通入口、T&C、激活、限额等)在本前端 SDK 内无任何代码,不实现,由原生/外部 H5/后端承载。

"VDC Auto top-up 整节在本仓 SDK 中全仓 grep 零命中(无开通入口、T&C、激活、限额等任何前端代码),由原生/外部 H5/后端承载"

定义DOC-2026-006#p46pending_review

VDC(虚拟借记卡)支付以 Allo Prime 钱包为主资金源、PayLater 额度为辅资金源。

"VDC(虚拟借记卡)支付以 **Allo Prime 钱包为主资金源、PayLater 额度为辅资金源**"

动作条件DOC-2026-006#p46pending_review

当 Prime 钱包余额不足时,由 PayLater 自动放款到钱包补足差额,使 VDC 交易无摩擦成功。

"当钱包余额不足时,由 PayLater 自动放款到钱包补足差额,使 VDC 交易无摩擦成功"

动作条件DOC-2026-006#p48pending_review

VDC Auto top-up 激活时先判断是否已开通 PL 账户:未开通则弹窗引导申请 PL;已开通则弹窗展示每日 PL 支付限额上限值。

"激活时判断是否已开通 PL 账户"

规则DOC-2026-006#p48pending_review

已开通 PL 账户时弹窗展示每日 PL 支付限额上限值,默认期数为1期,调用定价引擎试算接口展示该1期(默认传入100K)对应的 admin fee 价格。

"展示每日 PL 支付限额上限值,**默认期数 1 期**,调用定价引擎试算接口展示该 1 期(默认传入 100K)对应的 admin fee 价格"

规则DOC-2026-006#p48pending_review

T&C 页首个勾选框默认选中,第二个勾选框需用户主动勾选,勾选后继续按钮高亮,点击进入验 PIN。

"**首个勾选框默认选中,第二个勾选框需用户主动勾选**,勾选后"继续"按钮高亮"

状态DOC-2026-006#p48pending_review

VDC Auto top-up 入口激活状态取值:从未激活=New、当前激活中=Active、曾激活已关闭=Inactive。

"**从未激活=New / 当前激活中=Active / 曾激活已关闭=Inactive**"

例外DOC-2026-006#p48pending_review

若验 PIN 后 PL 账户处于上码状态,则展示激活失败页面。

"若验 PIN 后 **PL 账户处于上码状态**,则展示激活失败页面"

规则DOC-2026-006#p51pending_review

VDC Auto top-up 自动失效机制:以 VDC 最新一次支付时间加90天为失效点,连续90天不再使用 VDC 支付(任何支付含钱包支付)则自动关闭此功能。

"通过 **VDC 最新一次支付时间 + 90 天后自动失效**,即连续 90 天不再使用 VDC 支付(任何支付,包括钱包支付)则自动关闭此功能"

规则DOC-2026-006#p53pending_review

自动放款的 Instant Cash 每日上限默认 2 Mio(Rp3.000.000 为可调上限),且不得超过用户的 VDC limit。

"自动放款的 Instant Cash **每日上限默认 2 Mio(Rp3.000.000 为可调上限)**,且**不得超过用户的 VDC limit**"

规则DOC-2026-006#p53pending_review

Instant Cash 限额默认值规则:VDC limit≥2 Mio 时默认2 Mio;VDC limit<2 Mio 时默认等于 VDC limit。

"VDC limit ≥ 2 Mio → Instant Cash 限额默认 2 Mio;VDC limit < 2 Mio → Instant Cash 限额默认等于 VDC limit"

规则DOC-2026-006#p53pending_review

Instant Cash 自动放款无最低放款金额。

"**无最低放款金额**(NO MINIMUM DISBURSEMENT)"

规则DOC-2026-006#p53pending_review

PL 需支付部分若超过 3M 则支付失败并推送 PN。

"PL 需支付部分若**超过 3M 则支付失败**并推送 PN"

动作条件DOC-2026-006#p55pending_review

订单金额小于等于 prime 余额时,直接按现有流程处理,仅扣 prime。

"订单金额 ≤ prime 余额 → 直接按现有流程处理(仅扣 prime)"

动作条件DOC-2026-006#p55pending_review

订单金额大于 prime 余额时判断是否已激活自动充值:未激活则支付失败并触发 push(PL 用户与非 PL 用户两份模版)。

"订单金额 > prime 余额 → 判断是否已激活自动充值:未激活 → **支付失败**并触发 push"

流程步骤DOC-2026-006#p55pending_review

已激活时检查(订单金额−prime余额)是否大于每日剩余 PL 支付上限:大于则支付失败;否则判断可用额度是否足够,足够则差额部分由 PL 额度支付并触发 PL 支付的 RIPLAY 邮件,不足则支付失败。

"已激活 → 检查(订单金额 − prime 余额)是否大于"每日剩余 PL 支付上限":大于 → 支付失败;否则判断当前可用额度是否足够"

流程步骤DOC-2026-006#p55pending_review

实际调用 PL 消费接口时,先支付到用户 prime 账户,再由 prime 账户支付给外部。

"实际调用 PL 消费接口,先支付到用户 **prime 账户**,再由 prime 账户支付给外部"

例外DOC-2026-006#p55pending_review

当 prime 账户处于冻结/锁定状态时,统一视为支付失败。

"prime 账户处于**冻结/锁定**状态,统一视为支付失败"

规则DOC-2026-006#p58pending_review

VDC 因余额不足支付失败时,若 prime 账户余额不足以撤销该笔 PL 支付订单则按撤销失败处理;余额足够则完成 PL 支付撤销。

"VDC 因余额不足支付失败时,若 prime 账户余额不足以撤销该笔 PL 支付订单,则按撤销失败处理;足够则完成 PL 支付撤销"

动作条件DOC-2026-006#p62pending_review

深链分发中 ALLO_PAY 映射到 SERVICE_PAYMENT(钱包支付),但该路由未注册,导航必失败。

"`ALLO_PAY` → `SERVICE_PAYMENT`(钱包支付,**路由未注册,导航必失败**"

规则DOC-2026-006#p62pending_review

深链路由不可达时直接调用 closeSDK() 退出。

"路由不可达时直接 `closeSDK()` 退出"

规则DOC-2026-006#p62pending_review

支付金额不由 URL 调起参数传入,进入页面后由订单接口返回。

"**金额不由 URL 传入**——进入页面后由订单接口返回"

边界DOC-2026-006#p62pending_review

调起参数 app_id 白名单仅包含 ALLO、BIMA、IM3。

"`app_id`(白名单仅 ALLO/BIMA/IM3)"

动作条件DOC-2026-006#p62pending_review

拉订单接口返回的 totalAmt 缺失时,toast "order error" 并 closeSDK() 退出,以防外部传入金额与后台不一致。

"`totalAmt` 缺失 → toast "order error" → `closeSDK()` 退出(防外部传入金额与后台不一致)"

流程步骤DOC-2026-006#p64pending_review

页面第一步并发拉订单与积分余额(amsCardpointQueryPointBal 返回 avlScoreAmount 可用积分)。

"并发拉订单 + 积分余额 `amsCardpointQueryPointBal`(返回 `avlScoreAmount` 可用积分)"

规则DOC-2026-006#p64pending_review

用积分档试算时 AMOUNT = 订单总额 − 积分,即积分先抵扣,分期只对剩余部分试算。

"用积分档:`AMOUNT = total − 积分`(积分先抵扣,分期只对剩余部分试算)"

规则DOC-2026-006#p64pending_review

use_allo_points 开关默认开启,只切换展示哪套试算结果,不重新请求试算接口。

"`use_allo_points` 开关(默认开)**只切换展示哪套结果,不重新请求**"

规则DOC-2026-006#p64pending_review

选档时后端 LOAN_LIST 按返回顺序渲染,前端不排序,默认选中首档。

"后端 `LOAN_LIST` 按返回顺序渲染(前端不排序),**默认选首档**"

规则DOC-2026-006#p64pending_review

分期档位无免息档特殊标识,0% 只表现为 "0% admin fee" 文本。

"**无免息档特殊标识**——0% 只表现为 "0% admin fee" 文本"

规则DOC-2026-006#p66pending_review

消费支付的 PIN 验密只是门禁,验密 session 不进支付接口;与取现不同,取现的 session 随 coreTransApplyLoan 上送。

"PIN 校验只是门禁,**验密 session 不进支付接口**(与取现不同——取现的 session 随 `coreTransApplyLoan` 上送)"

规则DOC-2026-006#p66pending_review

组合支付 coreTransPayUnionPay 入参 totalAmt 须等于积分、钱包、PL 三者之和。

"`totalAmt`(须 = 积分 + 钱包 + PL 三者之和)"

状态DOC-2026-006#p66pending_review

组合支付 PAYMENT_STATUS 三态:0000 成功进入轮询确认;0004 需刷脸,刷脸成功回轮询、失败进失败页;异常进失败页。

"`0000` 成功 → 轮询确认;`0004` 需刷脸 → `COMMON_FACE`(scene=LOAN),**刷脸成功后续回轮询**、失败进失败页;异常 → 失败页"

状态DOC-2026-006#p66pending_review

轮询 coreTransPayUnionPayQuery 2s 间隔最多 10 次:0000 成功页、0002 失败页、第 10 次仍 0003 进「Processing」处理中页。

"2s 间隔 × 最多 10 次;`0000`→成功页、`0002`→失败页、第 10 次仍 `0003`→「Processing」处理中页"

规则DOC-2026-006#p66pending_review

成功/失败/处理中三个结果页按钮均为无参 closeSDK(),SDK 只关闭返回宿主不回传状态/金额参数,商户须自行查单确认结果。

"成功/失败/处理中三个结果页的按钮都是**无参 `closeSDK()`**——SDK 只关闭返回宿主,不回传任何状态/金额参数,**商户须自行查单确认结果**"

规则DOC-2026-006#p66pending_review

支付失败不可页内重试,失败页唯一按钮回宿主,用户需从商户侧重新发起。

"**失败不可页内重试**:失败页唯一按钮回宿主,用户需从商户侧重新发起"

边界DOC-2026-006#p68pending_review

payment 页无任何前置准入,不校验可用额度/账户状态/单笔限额,唯一门禁是 PIN,额度是否足够完全由后端 coreTransPayUnionPay 判定。

"**payment 页无任何前置准入**:不调 `checkAccountBeforeWithdrawAndPay`、不校验可用额度/账户状态/单笔限额,唯一门禁是 PIN"

边界DOC-2026-006#p68pending_review

消费支付前端流程不含券逻辑,提交无 couponId,立减券/免息券的应用不在本前端流程(SMP 立减在收单侧)。

"**消费支付流程不含券逻辑**:`service/payment/` 目录 grep coupon/免息零业务命中,提交无 couponId——立减券/免息券的应用不在本前端流程(SMP 立减在收单侧)"

动作条件DOC-2026-006#p70pending_review

「用 PayLater 支付」引导页三个出口,先 checkBeforePay()(含 checkAccount 与额度>0)再 closeSDK({params}) code=103 带目标地址跳转。

"三个出口,先 `checkBeforePay()`(含 checkAccount + 额度>0)再 `closeSDK({params})`(code=103 带目标地址)"

动作条件DOC-2026-006#p70pending_review

消费交易详情的 Repay 按钮仅在交易 SUCCESSFUL 且有未还期时出现,点击进入提前还款流 EARLY_REPAYMENT。

"**Repay 按钮**仅交易 SUCCESSFUL 且有未还期时出现 → 提前还款流(`EARLY_REPAYMENT`)"

规则DOC-2026-006#p70pending_review

消费交易详情页 query 契约为 type(S/T)、orderId(BIZ_SEQ_NO)、partnerOrderId(MER_BIZ_NO)、receiptId(可选),缺参不请求。

"query 契约 `type(S/T)/orderId(BIZ_SEQ_NO)/partnerOrderId(MER_BIZ_NO)/receiptId(可选)`,缺参不请求"