订单与支付设计
最后更新于:2022-04-02 04:32:29
## 订单与支付设计
### 支付与订单的生命周期
1. 订单创建,待支付(支付单创建)
... 支付回执来了
2. 支付单 达成 [支付确认 pay_ack]
3. 业务单 达成 [支付确认 pay_ack]
4. 业务单 履行业务职责(如果有业务职责的话)
5. 业务单 如果履行业务职责 失败,那么 要针对 此 支付单进行退款
6. 业务单 如果顺利履行了,那么处理佣金发放
#### 幂等性:
1. 支付单/业务单 [支付确认 pay_ack] 只能达成一次
2. 退款是针对 支付单 一对一的,一个支付单只能创建一次退款单(退款记录)
其他说明:
```
1. 组合支付单表示 业务单最终的 [支付确认 pay_ack] 可能由多个支付单共同达成
2. 业务单的 每个不同 支付渠道/金额 对应一个 支付单
3. 支付单 直面第三方支付(流水号即为商户订单号),业务单 与 支付单 是 可能一对多的(组合支付的情况)
4. 业务单的成功支付记录:满足条件:达成 [支付确认 pay_ack] 且 没有退款记录,的支付单
```
----
### 表重要字段
```
业务订单表:
status: 订单状态:0-创建,1-完成,2-关闭
pay_status: 支付状态:0-待支付,1-已支付,2-已取消支付(订单取消/关闭时 标记为取消支付)
is_there_refund: 订单是否有退款记录(注意不一定有退款记录就表示此订单无效)
amount: 应付金额
```
```
支付单(流水)表
pay_status: 支付状态:0-待支付,1-已支付,2-已取消支付(订单取消/关闭时 标记为取消支付)
is_compose: 是否为组合支付订单
is_there_refund: 订单是否有退款记录(注意不一定有退款记录就表示此订单无效)
order_id: 业务单id
amount: 应付金额
```
```
退款记录表
flowing_id: 支付单id
desc: 退款说明原因
```
注意:
1. 如果系统提供 “标记为已支付” 这样的功能,那么这个操作 只能更改业务订单表,不能更新支付单表,否则回执时 对支付单支付状态检查时,我们不知道是否为渠道重试了
2. 对于业务单,系统其他后台功能 “标记为已支付” 等功可能会更新其支付状态
3. 对于 支付单,pay_status 是否 达成了 [支付确认 pay_ack] (达成 是由用户完成支付后渠道回执来的)
----
### 收到回执时,如何区分重试和重复支付
#### 有支付单的设计:
1. 发现 支付单 已经达成 [支付确认 pay_ack] 就为重试
2. 发现 业务单 已经达成 [支付确认 pay_ack] 就为重复支付(可能是由于旧支付单,如砍价造成的,或者是多渠道重复支付了)
#### 没有支付单设计的:
1. [支付确认 pay_ack] 达成时 记录下对应的渠道
2. 收到回执时判断达成的渠道是否为当前渠道
3. 是 即为重试,否就为其它渠道重复支付,应该安排退款。
----
### 扩展
[聊聊对账系统的设计方案](https://mp.weixin.qq.com/s/47s0YdRM6u1JNngNe6yghg)(楼下小黑哥)
[聊聊对账系统的设计方案 - 知乎](https://zhuanlan.zhihu.com/p/55573709)(楼下小黑哥)
[支付对账系统怎么设计?](https://mp.weixin.qq.com/s?__biz=MzU3NDY4NzQwNQ==&mid=2247483860&idx=1&sn=e5b8a68b7ede74dae33e60fa69ddedca&scene=21#wechat_redirect)(无敌码农)
[咱们聊聊对账系统该如何设计](https://juejin.cn/post/6844903618680733704)(AskHarries - 掘金)
> 广义的对账,所有跨应用的数据交互,理论上都应该进行对账。所以对账也**可以分为信息流对账,资金流对账。信息流对账也一般用在自己内部系统的对账**,比如支付系统的**支付数据和业务系统的业务数据进行对账,保证资金交易和业务交易的一致性**。资金流对账也就是支付系统和银行或者第三方支付系统之间的资金交易对账。
[对账处理 - Cocolian Framework | 可可链](http://doc.cocolian.cn/essay/recon/2016/10/10/account-2-reconciliation/)(凤凰老熊)
[移动端支付系统如何设计有效地防重失效机制?](https://mp.weixin.qq.com/s?__biz=MzU3NDY4NzQwNQ==&mid=2247483673&idx=1&sn=abc81adf43f999f9ba535721a73de702&chksm=fd2fd0dbca5859cd7a90e09e6b4a3af7b5e8a8a89b09fbaf73f987d4def3a5cfe6f33c4c161d&scene=21#wechat_redirect)(无敌码农)
[## 锁住余额,为何还会更新异常?](https://mp.weixin.qq.com/s?__biz=MzIzMTgwODgyMw==&mid=2247483935&idx=1&sn=176c01be1a220071e78d60e6d295c34e&chksm=e89fc847dfe841515bf8901ec7ee7ca3102731cdb475275093f2d07ac9a6bb10d54ce37beed9&scene=178&cur_album_id=1337216649245655040#rd)(楼下小黑哥)
[Redis 分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!](https://mp.weixin.qq.com/s/oQKK83Syi29JLzWkEM0P2g)
[财务对账系统 | 人人都是产品经理](http://www.woshipm.com/tag/%E8%B4%A2%E5%8A%A1%E5%AF%B9%E8%B4%A6%E7%B3%BB%E7%BB%9F)
-----
';