④ 还款

H5 为主h5/wp_h5/src/views/repaymentearlyRepayafterRepayment)。核心子流程是 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/queryLoanList4ncH5blc-service
借据详情query/v1/queryLoanDetils4ncH5blc-service
还款计划query/v1/queryRepayPlanDetailListH5blc-service
应还/通道费query/v1/queryPassAmountH5blc-service
当前还款信息cust/queryCustRepayInfoH5blc-service
生成支付订单plutus/v1/generatePlutusWebOrder4ncH5 repaymentIndexMixinsblc-service
查支付结果cfk-service/inner/v1/activeQueryPlutusPaymentResultH5 afterRepaymentMixinscfk-service(fcs)
还款历史query/v1/queryRepayHistoryH5blc-service
合同query/v1/getContractPath4ncH5blc-service
结清凭证apply/v1/applySettleVoucherH5 loanHistoryblc-service
复借生成apply/v1/loanAgainGenMultiOrder / cancelLoanPreStatusH5blc-service
还款反馈user/v1/submitRepayRequestionH5 feedback.vueblc-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=YloanAgainGenMultiOrder + generatePlutusWebOrder4nc(repay-re-loan)见上节已展开
4预约借款 BOOK_LOANhavePreRepayment(倒数第二期 N)bookNextLoan 页 loanAgainGenMultiOrderbookNextLoanMixins已展开/链 05-提额复借重授信
5提前还款earlySettleIngress=Y 且剩余期数≤2earlyRepay 页, 取最后一期利息 + earlyCouponearlyRepayIndex.js已展开
6部分还款canChangeRepayAmt 可编辑金额可改, 受最小额约束:147/562已展开
7最小还款额还款额 < minRepayAmount(₦50)阻断提示:188/491已展开
8优惠券最后一期 + useScene=2/3A 固定/R 百分比, 减免≤利息, 入参带 couponIddiscountAmt :70已展开
9direct2Plutus 直通productFee.direct2Plutus=true跳过中间步直接生成 Plutus 订单:977/1346已展开
10Plutus 支付跳转生成订单成功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 弹窗 → submitRepayRequestionfeedback.vue:132已展开
15逾期termStatus=O金额标红/不可编辑, 逾期 banner:550/579已展开
16诉讼公告showVerdictAnnouncement跳判决书页:213已展开
17多期/单期展示plans.length多期仅最后一期展示复借/券(dealNcPlanList):507已展开
18结清凭证借据还清后主动applySettleVoucher → 凭证 urlloanHistory.vue已展开(后置)
19自动代扣后端定时任务前端不触发, 仅展示状态(queryCustRepayInfo)已展开(说明)
20还款历史查历史queryRepayHistoryrepaymentHistory.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)。