④ 还款
H5 为主(
h5/wp_h5/src/views/repayment、earlyRepay、afterRepayment)。核心子流程是 Plutus 网页支付:生成支付订单→跳收银台→回跳轮询结果。
概述
| 项 | 内容 |
|---|---|
| 起点 | 借据进入还款期 / 首页还款入口 |
| 终点 | 支付成功,借据销账(结清凭证后置主动申请) |
| 发起端 | H5(WebView)为主;原生壳入口 + 结果页(RepayWinActivity) |
| 后端 | blc-service(query/、apply/、cust/、plutus/)+ cfk-service(fcs) + Plutus 收银台(外部) |
| 重点 | Plutus 网页支付子流程 |
时序图
sequenceDiagram autonumber actor U as 用户 participant NAT as 原生壳 participant H5 as H5 还款页(WebView) participant PAY as Plutus 收银台(外部) participant BLC as blc-service participant FCS as cfk-service(fcs) NAT->>H5: 拉起 WebView 加载 /repaymentIndex Note over U,FCS: 初始化(借据/计划/应还) H5->>BLC: query/v1/queryLoanList4nc H5->>BLC: query/v1/queryLoanDetils4nc H5->>BLC: query/v1/queryRepayPlanDetailList(含 direct2Plutus) H5->>BLC: query/v1/queryPassAmount(应还/通道费) BLC-->>H5: 借据/计划/金额 Note over U,FCS: 主动还款(主路径直生成 Plutus 订单) U->>H5: 选金额/优惠券, 确认还款 H5->>BLC: plutus/v1/generatePlutusWebOrder4nc(repay-only 或 repay-re-loan) BLC-->>H5: 支付订单 url H5->>PAY: location.href = url(跳收银台) U->>PAY: 完成支付(银行卡/钱包) PAY->>H5: redirect 回跳 /afterRepayment?reference=xxx Note over U,FCS: 轮询支付结果(直连 cfk-service) H5->>FCS: cfk-service/inner/v1/activeQueryPlutusPaymentResult(reference) FCS-->>H5: payStatus(SUCC/FAIL/PENDING) alt PENDING H5->>FCS: 定时轮询(最长约 30 分钟) end H5->>U: 展示还款结果 Note over U,FCS: 结清凭证(后置, 主动申请) U->>H5: 借据历史申请结清凭证 H5->>BLC: apply/v1/applySettleVoucher(loanId) BLC-->>H5: 凭证 url → 打开
接口落地
| 步骤 | 接口(真实路径) | 发起 | 目标后端 |
|---|---|---|---|
| 借据列表 | query/v1/queryLoanList4nc | H5 | blc-service |
| 借据详情 | query/v1/queryLoanDetils4nc | H5 | blc-service |
| 还款计划 | query/v1/queryRepayPlanDetailList | H5 | blc-service |
| 应还/通道费 | query/v1/queryPassAmount | H5 | blc-service |
| 当前还款信息 | cust/queryCustRepayInfo | H5 | blc-service |
| 生成支付订单 | plutus/v1/generatePlutusWebOrder4nc | H5 repaymentIndexMixins | blc-service |
| 查支付结果 | cfk-service/inner/v1/activeQueryPlutusPaymentResult | H5 afterRepaymentMixins | cfk-service(fcs) |
| 还款历史 | query/v1/queryRepayHistory | H5 | blc-service |
| 合同 | query/v1/getContractPath4nc | H5 | blc-service |
| 结清凭证 | apply/v1/applySettleVoucher | H5 loanHistory | blc-service |
| 复借生成 | apply/v1/loanAgainGenMultiOrder / cancelLoanPreStatus | H5 | blc-service |
| 还款反馈 | user/v1/submitRepayRequestion | H5 feedback.vue | blc-service |
还款并复借(repay-re-loan)
现金贷核心留存设计:还款入口直接转化复借,一次 Plutus 支付既还旧借据、后端在还款成功后放新借款。
- 入口:
showReloan = haveReloan && reLoanIngress === 'Y'(复借资格 + 复借入口开关,开关来自query/v1/popAPPConfig)。 - loanType 两类:
AGAIN_LOAN(还款再借)/BOOK_LOAN(预约借款,倒数第二期未还havePreRepayment时走 bookNextLoan 页)。
sequenceDiagram autonumber actor U as 用户 participant H5 as H5 还款页 participant PAY as Plutus 收银台(外部) participant BLC as blc-service participant FCS as cfk-service(fcs) U->>H5: 选「还款并复借」 H5->>BLC: apply/v1/loanAgainGenMultiOrder(loanType=AGAIN_LOAN, 复借明细) BLC-->>H5: applyNo(复借订单已生成) H5->>BLC: plutus/v1/generatePlutusWebOrder4nc(repay-re-loan, isRepayToLoanFlag=true) BLC-->>H5: 支付 url H5->>PAY: location.href 跳收银台 U->>PAY: 支付(还旧借据) PAY->>H5: 回跳 /afterRepayment?reference H5->>FCS: cfk-service/inner/v1/activeQueryPlutusPaymentResult(轮询) FCS-->>H5: SUCC Note over BLC: 后端按 isRepayToLoanFlag, 还款成功后放新借款(复借订单已生成)
- 只还款分支:用户不复借 →
cancelLoanPreStatus(取消预约复借状态)→ generatePlutusWebOrder4nc(‘repay-only’)。 - 顺序关键:先
loanAgainGenMultiOrder生成复借订单(拿 applyNo)→ 再generatePlutusWebOrder4nc('repay-re-loan')生成还款支付订单(带 isRepayToLoanFlag)。两步都在 Plutus 跳转之前完成,支付只发一次。 - 优惠券:最后一期才传
loans用于优惠券计算(还款复借可混用券)。
分支清单(穷举还款全部分支)
出处 repayment/repaymentIndexMixins.js、afterRepayment/afterRepaymentMixins.js(除注明)。
| # | 分支 | 触发条件 | 处理 | 接口/出处 | 状态 |
|---|---|---|---|---|---|
| 1 | 数据加载 | 进还款页 | 借据/计划/应还/配置 | queryLoanList4nc/queryLoanDetils4nc/queryRepayPlanDetailList | 已展开 |
| 2 | 仅还款 | judgeOnlyRepay 非复借 | cancelLoanPreStatus + generatePlutusWebOrder4nc(repay-only) | :993 | 已展开 |
| 3 | 还款并复借 | showReloan=haveReloan && reLoanIngress=Y | loanAgainGenMultiOrder + generatePlutusWebOrder4nc(repay-re-loan) | 见上节 | 已展开 |
| 4 | 预约借款 BOOK_LOAN | havePreRepayment(倒数第二期 N) | bookNextLoan 页 loanAgainGenMultiOrder | bookNextLoanMixins | 已展开/链 05-提额复借重授信 |
| 5 | 提前还款 | earlySettleIngress=Y 且剩余期数≤2 | earlyRepay 页, 取最后一期利息 + earlyCoupon | earlyRepayIndex.js | 已展开 |
| 6 | 部分还款 | canChangeRepayAmt 可编辑 | 金额可改, 受最小额约束 | :147/562 | 已展开 |
| 7 | 最小还款额 | 还款额 < minRepayAmount(₦50) | 阻断提示 | :188/491 | 已展开 |
| 8 | 优惠券 | 最后一期 + useScene=2/3 | A 固定/R 百分比, 减免≤利息, 入参带 couponId | discountAmt :70 | 已展开 |
| 9 | direct2Plutus 直通 | productFee.direct2Plutus=true | 跳过中间步直接生成 Plutus 订单 | :977/1346 | 已展开 |
| 10 | Plutus 支付跳转 | 生成订单成功 | location.href = res.url 跳收银台 | :1016 | 已展开 |
| 11 | 支付结果-成功 | payStatus=SUCC | 成功页(显额度提升/复借入口) | afterRepayment:34 | 已展开 |
| 12 | 支付结果-失败 | payStatus=FAIL | 失败页(客服) | afterRepayment:41 | 已展开 |
| 13 | 支付结果-处理中 | payStatus=PENDING | 轮询(count=15, 最长~30min) | afterRepayment:48/82 | 已展开 |
| 14 | 还款反馈/挽留 | 用户放弃还款 | feedback 弹窗 → submitRepayRequestion | feedback.vue:132 | 已展开 |
| 15 | 逾期 | termStatus=O | 金额标红/不可编辑, 逾期 banner | :550/579 | 已展开 |
| 16 | 诉讼公告 | showVerdictAnnouncement | 跳判决书页 | :213 | 已展开 |
| 17 | 多期/单期展示 | plans.length | 多期仅最后一期展示复借/券(dealNcPlanList) | :507 | 已展开 |
| 18 | 结清凭证 | 借据还清后主动 | applySettleVoucher → 凭证 url | loanHistory.vue | 已展开(后置) |
| 19 | 自动代扣 | 后端定时任务 | 前端不触发, 仅展示状态(queryCustRepayInfo) | — | 已展开(说明) |
| 20 | 还款历史 | 查历史 | queryRepayHistory | repaymentHistory.vue | 已展开 |
| 21 | 合同查看 | 查合同 | getContractPath4nc | — | 已展开 |
要点与缺口
- 还款主路径 =
generatePlutusWebOrder4nc(不经 submitRepayRequestion):direct2Plutus(从 queryRepayPlanDetailList 的 productFee 读)控制直通;submitRepayRequestion只在feedback.vue(还款反馈)调用,不是还款主流程。 - 发现:H5 个别接口直连 cfk-service(fcs),绕过 blc-service:支付结果轮询
afterRepaymentMixins.js:74硬编码/cfk-service/inner/v1/activeQueryPlutusPaymentResult(cfk-service = fcs 账务)。即「前端只打 blc-service」不绝对——还款结果查询直连 fcs。其余还款接口仍走 blc-service。 - Plutus 网页支付子流程:generatePlutusWebOrder4nc 返回支付 url →
location.href跳收银台 → 用户支付 → redirect 回跳/afterRepayment?reference→ 轮询 activeQueryPlutusPaymentResult(SUCC/FAIL/PENDING,PENDING 定时轮询最长约 30 分钟)。与绑卡跳转同构(跳外部页 + 回跳)。 - 提前还款(earlyRepay):复用 generatePlutusWebOrder4nc,差异是取最后一期利息、用 earlyCoupon;入口条件
earlySettleIngress=Y+ 剩余期数≤2。 - 结清凭证后置:applySettleVoucher 不在还款流程内触发,是借据还清后用户在 loanHistory 主动申请。
- 自动代扣前端不触发:代扣是后端定时任务(见后端 05-还款 RP/AP),前端仅展示代扣状态(queryCustRepayInfo)。
- 逾期:逾期期数/应还/罚息由后端 queryRepayPlanDetailList 返回,前端展示逾期 banner、金额标红、跳诉讼公告。
- 复借:还款页可「还款 + 预约复借」(repay-re-loan,loanAgainGenMultiOrder),见 05-提额复借重授信。
- 原生还款接口(activeRepayment4nc)定义在但无调用:还款主走 H5 Plutus,原生 RepayWinActivity 是结果页壳。
- 原生↔H5:还款主体在 H5;原生壳入口拉起 + 支付完成回原生首页(
gotoHomeActivity,native.js JSBridge)。