2014 年 10 月 - 捷克共和国,布拉格。

Maria 在 15 分钟内有一个重要会议。

但她没有现金打车。

所以她打开了叫车应用 Uber 并请求乘车。

Uber 乘车流程

虽然 Uber 处理支付令人惊叹,但”大规模”处理支付极其困难。

以下是其中一些问题:

核心挑战

1. 安全存储支付详情

用户在移动应用上添加支付详情。

但移动设备可能被盗,或者 Uber 服务器可能被入侵……

所以在移动设备和 Uber 服务器上存储敏感信息非常危险。

2. 分账

单笔支付必须分给不同的乘车参与者:

  • 司机
  • Uber 平台
  • 税费等

即,钱不能简单地直接从乘客转移到司机。

3. 外部系统集成

支付包括”外部系统”如银行、卡网络和支付提供商。

但存在网络故障、超时和部分中断的风险。

这可能会造成可怕的用户体验。

Uber 支付架构

以下是 Uber 支付架构的工作原理:

1. 令牌化

用户在移动应用上添加支付详情,如信用卡号和 CVV。

但对他们来说存储这些数据是危险的,因为:

  • 难以保护
  • 需要繁重的法律合规

所以他们使用移动应用中的支付提供商 SDK 来收集敏感详情。

软件开发工具包(SDK)不会将卡信息发送到 Uber 服务器。

相反,它”安全地”收集信用卡信息并直接发送到支付提供商,以及上下文元数据。元数据包括 Uber 账户详情、支付方式类型(卡或钱包)等。

令牌化流程

支付提供商然后返回一个唯一的令牌,它充当信用卡的”安全引用”。令牌代表卡;把它想象成(可重复使用的)充电卡的权限。

此外,支付提供商将接收的元数据绑定到令牌以限制其使用和验证。

从这一点开始,移动应用使用令牌而不是信用卡。

即,Uber 或移动设备没有敏感数据。

重要说明

被盗的令牌是无用的,因为它由支付提供商创建,绑定到 Uber 的账户和应用,并限制于特定用途(如仅由 Uber 进行的收费)。所以其他移动设备或应用不能使用它来充电卡。

2. 分账

当乘车完成时,支付系统必须:

  • 向乘客收费
  • 向司机支付
  • 向 Uber 支付平台费用
  • 处理税费

这需要:

  • 原子性(全部成功或全部失败)
  • 幂等性(防止重复收费)
  • 审计跟踪(合规性)

3. 外部系统集成

支付系统必须与:

  • 银行
  • 卡网络(Visa、Mastercard)
  • 支付网关(Stripe、PayPal)
  • 反欺诈系统

这引入了:

  • 网络延迟
  • 超时处理
  • 重试逻辑
  • 最终一致性

关键设计决策

1. 令牌化 vs. 直接存储

令牌化(Uber 使用):

  • ✅ 减少合规负担(PCI DSS)
  • ✅ 降低数据泄露风险
  • ✅ 支付提供商处理安全
  • ❌ 依赖第三方

直接存储

  • ✅ 完全控制
  • ✅ 无第三方依赖
  • ❌ 繁重合规要求
  • ❌ 高安全风险

2. 同步 vs. 异步处理

同步

  • ✅ 即时反馈
  • ✅ 简单实现
  • ❌ 高延迟
  • ❌ 易受超时影响

异步

  • ✅ 低延迟用户体验
  • ✅ 更好的错误处理
  • ✅ 可重试
  • ❌ 复杂实现
  • ❌ 最终一致性

3. 数据库选择

SQL(如 PostgreSQL):

  • ✅ ACID 事务
  • ✅ 强一致性
  • ✅ 复杂查询
  • ❌ 水平扩展困难

NoSQL(如 DynamoDB):

  • ✅ 水平扩展
  • ✅ 高吞吐
  • ❌ 最终一致性
  • ❌ 复杂事务

本文为学习目的的个人翻译,译文仅供参考。

原文链接:Payment System Design

版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。