跳转到内容

Scenario 23: Payment System 支付系统

你想理解支付流程的基本交互,做一个模拟支付Demo。

  • 支付表单页面(卡号、有效期、CVV)
  • 支付状态流转动画(输入→处理中→成功/失败)
  • localStorage记录支付历史
  • 基本的卡号格式校验

用HTML+CSS+JS做一个模拟支付页面。包含:1)订单信息展示(商品名、金额) 2)支付表单(卡号自动加空格格式化、有效期MM/YY格式、CVV 3位) 3)点击支付后显示loading动画(3秒),随机80%成功20%失败 4)成功页展示订单号和支付时间,失败页提供重试按钮。 支付历史存localStorage,历史页面展示所有支付记录(时间、金额、状态)。 Luhn算法校验卡号格式。

  • 卡号自动格式化(4位加空格)
  • Luhn算法校验卡号
  • 支付状态流转动画流畅
  • 支付历史正确记录和展示
  • 表单格式化与校验 → Module: 表单处理
  • 状态机UI展示 → Module: 交互设计
  • Luhn算法 → Module: 数据校验

需要真实的订单和支付记录管理,模拟支付网关回调。

  • 订单表+支付记录表
  • 支付流程:创建支付单→模拟网关→回调确认
  • 支付状态机(pending→processing→success/failed)
  • 简单的对账功能

Go+Gin后端,SQLite。订单表(id, amount, status, created_at), 支付表(id, order_id, amount, method, status, gateway_txn_id, created_at)。 支付流程:POST /api/pay 创建支付单(pending),模拟调用支付网关 (内部goroutine延迟3秒后回调),POST /api/callback 处理网关回调 (验签+更新状态)。网关回调带签名(HMAC-SHA256),后端验签。 支付状态查询API(前端轮询)。简单对账:比对支付表和模拟网关记录,列出差异。

  • 支付单正确创建,状态为pending
  • 模拟回调后状态更新为success
  • 签名验证拒绝伪造回调
  • 对账能发现不一致记录
  • 支付状态机 → Module: 状态机设计
  • Webhook回调处理 → Module: 异步通信
  • HMAC签名验证 → Module: 安全认证

V3 — 100人用:真实支付集成+幂等

Section titled “V3 — 100人用:真实支付集成+幂等”

接入真实支付渠道,必须保证不重复扣款。

  • Stripe/支付宝沙箱环境集成
  • Webhook可靠处理(重试+幂等)
  • 支付幂等性(同一订单不重复扣款)
  • 掉单处理(主动查询补偿)

集成Stripe(沙箱模式)。创建PaymentIntent时带idempotency_key(用order_id), 防止重复创建。Webhook处理:验证Stripe签名,payment_intent.succeeded事件 更新订单状态。幂等处理:Webhook可能重复投递,用payment_intent_id做幂等键, 重复事件直接返回200。PostgreSQL存储,支付记录加唯一索引(gateway_txn_id)。 掉单补偿:定时任务每5分钟扫描pending超过10分钟的支付单, 主动调用Stripe API查询状态,更新本地记录。

  • Stripe沙箱支付成功走通
  • 重复Webhook不重复处理
  • 同一订单重复支付请求不重复扣款
  • 掉单5分钟内被补偿任务修复
  • 支付网关集成 → Module: Stripe API
  • 幂等性设计模式 → Module: 分布式系统
  • 补偿机制 → Module: 最终一致性

需要完善的退款流程和每日对账保证资金安全。

  • 退款流程(申请→审核→执行→确认)
  • 每日对账Job(本地 vs 网关)
  • 异常订单告警
  • 资金流水记录

退款流程:用户申请退款(POST /api/refund, 带reason),管理员审核通过后 调用Stripe Refund API,Webhook确认退款成功后更新状态。部分退款支持。 退款状态:requested→approved→processing→refunded/failed。 每日对账:凌晨2点Job拉取Stripe前一天的所有交易,与本地支付记录逐条比对。 差异类型:本地有网关无(掉单)、网关有本地无(漏记录)、金额不一致。 差异记录存表,金额差异>0自动告警(发邮件)。 资金流水表:每笔资金变动(收入/退款/手续费)记录,余额可追溯。

  • 退款流程完整,部分退款金额正确
  • 对账Job正确发现差异
  • 金额差异触发告警
  • 资金流水余额与实际一致
  • 退款流程设计 → Module: 支付逆向流
  • 对账系统 → Module: 资金安全
  • 资金流水 → Module: 账务系统

V5 — 1万人用:多渠道+熔断降级

Section titled “V5 — 1万人用:多渠道+熔断降级”

单一支付渠道不够可靠,需要多渠道路由和容错。

  • 多支付渠道(银行卡/微信/支付宝)
  • 智能路由(成功率、成本、用户偏好)
  • 渠道熔断降级(失败率高自动切换)
  • 支付渠道监控Dashboard

支付网关抽象层:统一的PaymentGateway接口(CreatePayment, QueryPayment, Refund), 实现Stripe、模拟微信、模拟支付宝三个适配器。 支付路由:根据规则选择渠道——用户选择>历史偏好>成功率最高>成本最低。 熔断器:统计每个渠道最近100次请求的失败率,>30%触发熔断(10分钟内不发请求), 10分钟后半开状态放10%流量试探,成功率恢复则关闭熔断。 降级策略:主渠道熔断后自动切换备选渠道。 Dashboard:各渠道实时成功率、响应时间P99、熔断状态。

  • 三个渠道都能正常支付
  • 路由策略按优先级选择渠道
  • 熔断器正确触发和恢复
  • 降级自动切换到备选渠道
  • 策略模式+适配器模式 → Module: 设计模式
  • 熔断器模式 → Module: 容错设计
  • 支付路由 → Module: 支付架构

V6 — 10万+用户:资金账户+风控引擎

Section titled “V6 — 10万+用户:资金账户+风控引擎”

平台需要内部账户体系、分账和实时风控。

  • 内部账户体系(用户余额、商户余额、平台账户)
  • 余额充值/消费/提现
  • 分账系统(订单金额按规则分给多方)
  • 实时风控引擎

账户系统:每个用户/商户有内部账户(id, owner_type, owner_id, balance, frozen_balance)。 转账用双记账法:每笔交易生成两条记录(借方、贷方),保证总额不变。 充值:外部支付→增加余额。消费:余额支付(先冻结→确认扣除/释放)。提现:T+1到银行卡。 分账:订单支付后按规则分账(平台5%手续费→平台账户,商户95%→商户账户), 分账记录可追溯。风控引擎:实时规则(单日累计>5万需二次验证、 异地登录支付需短信验证、频率异常(1分钟>5次)拦截),风控结果:通过/拦截/人工审核。 风控日志全量记录,可回溯分析。

  • 双记账法借贷平衡
  • 余额冻结→扣除/释放流程正确
  • 分账金额精确到分,无精度丢失
  • 风控规则实时拦截异常交易
  • 所有资金变动可审计追溯
  • 复式记账 → Module: 账务系统设计
  • 余额系统 → Module: 资金账户
  • 风控引擎 → Module: 实时风控