支付系统
本章节介绍支付系统的核心设计,包括幂等性、对账与异常处理。
核心设计原则
- 幂等性:同一笔支付请求多次提交结果一致
- 一致性:资金变动与订单状态强一致
- 安全性:防篡改、防重放攻击
- 可追溯:完整的支付流水记录
支付流程
创建订单 → 发起支付 → 调用第三方支付 → 异步回调 → 更新订单状态 → 对账幂等性实现
java
// 基于唯一支付单号实现幂等
public PayResult pay(PayRequest request) {
String payNo = request.getPayNo();
// 查询是否已处理
PayOrder existing = payOrderDao.findByPayNo(payNo);
if (existing != null) {
return buildResult(existing);
}
// 分布式锁防并发
try (Lock lock = redisLock.lock("pay:" + payNo)) {
return doPayment(request);
}
}对账设计
| 对账类型 | 说明 |
|---|---|
| 日切对账 | 每日凌晨与第三方平台核对流水 |
| 实时对账 | 支付回调时立即校验金额与状态 |
| 差错处理 | 长款/短款自动告警,人工介入 |
常见异常处理
- 回调超时:主动轮询第三方查单接口
- 重复回调:幂等处理,返回成功不重复处理
- 部分退款:记录退款流水,支持多次部分退款
