判断 / 决策节点
成功路径(直接扣款)
换汇路径(BuildWarehouse)
降级路径(Billing Currency)
拒付 / 终止
兜底 / 系统路径
flowchart TD START(["🔔 收到刷卡 Auth 请求\n获取 Acquirer Currency"]) style START fill:#1e40af,stroke:#1e3a8a,color:#fff,rx:24 WL{"用户在\n白名单 2 内?\n(Payment Priority\nTab 功能白名单)"} style WL fill:#dbeafe,stroke:#93c5fd,color:#1e3a8a DEFAULT_ONLY["直接走 Default Account\n(无优先级配置)"] style DEFAULT_ONLY fill:#f3f4f6,stroke:#d1d5db,color:#374151 NCL{"Acquirer Currency\n∈ 本币结算币种列表?\nAUD/USD/NZD/JPY\nSGD/EUR/GBP"} style NCL fill:#dbeafe,stroke:#93c5fd,color:#1e3a8a BASIS_LOCAL["settlement_basis\n= Acquirer Currency\n✦ 本币结算模式"] style BASIS_LOCAL fill:#eff6ff,stroke:#2563eb,color:#1d4ed8 BASIS_BILLING["settlement_basis\n= Billing Currency\n由 MC 传入,与卡默认币种关联\n⚠ 降级模式"] style BASIS_BILLING fill:#fffbeb,stroke:#fbbf24,color:#92400e TRAVERSE["获取用户激活的\n优先级账户列表\n按用户设定顺序遍历"] style TRAVERSE fill:#f9fafb,stroke:#e5e7eb,color:#374151 NEXT_ACC["取下一个账户\n按优先级顺序"] style NEXT_ACC fill:#f9fafb,stroke:#e5e7eb,color:#374151 BAL{"账户余额\n≥ 整笔金额?\n以 settlement_basis 计价\n⚑ 不拆单"} style BAL fill:#dbeafe,stroke:#93c5fd,color:#1e3a8a MORE{"还有下一个\n账户?"} style MORE fill:#dbeafe,stroke:#93c5fd,color:#1e3a8a DECLINE(["❌ 拒付\nInsufficient Funds\n所有账户余额均不足"]) style DECLINE fill:#fef2f2,stroke:#fca5a5,color:#991b1b MATCH{"账户币种\n== settlement_basis?"} style MATCH fill:#dbeafe,stroke:#93c5fd,color:#1e3a8a DIRECT["✅ 直接扣款\n0 次 Bano 内部换汇\n账户币种 = 收单币种"] style DIRECT fill:#f0fdf4,stroke:#86efac,color:#166534 FX["🔄 BuildWarehouse 换汇\nsettlement_basis ↔ 账户币种\n整笔金额,不拆单"] style FX fill:#f5f3ff,stroke:#c4b5fd,color:#5b21b6 ORDER_MAIN["生成主刷卡订单"] style ORDER_MAIN fill:#f9fafb,stroke:#e5e7eb,color:#374151 ORDER_FX["生成 Exchange From 订单\n生成 Exchange To 订单\n↕ 双向关联主刷卡订单"] style ORDER_FX fill:#f5f3ff,stroke:#c4b5fd,color:#5b21b6 SUCCESS(["✅ 扣款成功 · 交易完成\nFunded by 区块记录实际扣款账户\n及换汇明细(如有)"]) style SUCCESS fill:#14532d,stroke:#15803d,color:#fff,rx:24 START --> WL WL -- "否" --> DEFAULT_ONLY WL -- "是" --> NCL DEFAULT_ONLY --> ORDER_MAIN NCL -- "是" --> BASIS_LOCAL NCL -- "否" --> BASIS_BILLING BASIS_LOCAL --> TRAVERSE BASIS_BILLING --> TRAVERSE TRAVERSE --> NEXT_ACC NEXT_ACC --> BAL BAL -- "否,余额不足\n跳过此账户" --> MORE MORE -- "是" --> NEXT_ACC MORE -- "否\n已遍历全部账户" --> DECLINE BAL -- "是,余额充足" --> MATCH MATCH -- "是\n币种完全匹配" --> DIRECT MATCH -- "否\n需要换汇" --> FX DIRECT --> ORDER_MAIN FX --> ORDER_FX ORDER_FX --> ORDER_MAIN ORDER_MAIN --> SUCCESS
本币结算触发条件
Acquirer Currency ∈ 动态配置的本币币种列表时进入本币结算模式,以收单币种作为 settlement_basis。列表初始值:AUD · USD · NZD · JPY · SGD · EUR · GBP,可由运营随时在 Bano RM 中后台增减,无需发版。
降级路径说明
Acquirer Currency ∉ 本币列表时,settlement_basis 降级为 Billing Currency。Billing Currency 由上游 MC 传入,与卡默认币种(Card Currency)关联,通过 BIN 注册表镜像 MC 端实际配置,并非 Bano 侧写死。
不拆单约束
整笔交易金额必须由同一账户完整承担。某账户余额不足时直接跳过,继续遍历下一优先级账户,不做部分扣款。所有账户均不足则拒付。
白名单 2 说明
未在白名单 2 内的用户无优先级配置,扣款直接走 Default Account,行为与 Phase 1 前一致。白名单 2 与白名单 1(USDT 开户)相互独立,不互相依赖。
拒付条件
遍历用户激活列表中所有账户后(包括 Default Account 兜底),仍无法找到余额充足的账户,则本笔交易拒付,返回 Insufficient Funds。
换汇订单关联关系
触发换汇时,Build 生成一对订单:Exchange From(换出侧)与 Exchange To(换入侧),均双向关联主刷卡订单。Build 侧汇率与 Bano 侧展示汇率可能不同,符合预期。