主题
面试速答(先看这里)
**一句话结论:**在电商场景中,创建了一个支付单之后,会通过支付工具进行支付,比如微信支付、支付宝、银行卡等,那么在特殊场景中,会出现,用户先通过微信支付尝试支付,因为网络延迟导致一直未支付成功,后面用户又再用支付宝支付成功了,可是过了一会,微信支付那面又回调通知支付成功了,这种该怎么处理呢?
60秒标准回答:
在电商场景中,创建了一个支付单之后,会通过支付工具进行支付,比如微信支付、支付宝、银行卡等,那么在特殊场景中,会出现,用户先通过微信支付尝试支付,因为网络延迟导致一直未支付成功,后面用户又再用支付宝支付成功了,可是过了一会,微信支付那面又回调通知支付成功了,这种该怎么处理呢?
其实,这个问题和之前我们讨论的另一个问题的解决思路差不多,但是也有一定的差别
要想解决这个问题,首先需要有明确的状态机和支付单状态的流转控制,这个不详细展开了,可以参考上面这个文章
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**其实,这个问题和之前我们讨论的另一个问题的解决思路差不多,但是也有一定的差别。
- **要点2:**要想解决这个问题,首先需要有明确的状态机和支付单状态的流转控制,这个不详细展开了,可以参考上面这个文章。
- **要点3:**这个场景存在一个特殊的地方,那就是已经支付成功的单据,下一次支付成功的回调过来的时候,如何做幂等控制。
- **要点4:**在接收到支付成功回调的时候,先检查状态,如果发现已经支付成功,则比对支付渠道和渠道单号是否一致,如果一致,则幂等成功。
- **要点5:**冲退的流程及异常情况处理,在上面的链接中也展开讲过,这里不再赘述了。
**记忆锚点:**一个支付单
加分表达:
- 在电商场景中,创建了一个支付单之后,会通过支付工具进行支付,比如微信支付、支付宝、银行卡等,那么在特殊场景中,会出现,用户先通过微信支付尝试支付,因为网络延迟导致一直未支付成功,后面用户又再用支付宝支付成功了,可是过了一会,微信支付那面又回调通知支付成功了,这种该怎么处理呢?
- 这个场景存在一个特殊的地方,那就是已经支付成功的单据,下一次支付成功的回调过来的时候,如何做幂等控制。
- 在接收到支付成功回调的时候,先检查状态,如果发现已经支付成功,则比对支付渠道和渠道单号是否一致,如果一致,则幂等成功。
追问准备:
- 围绕「一个支付单」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
在电商场景中,创建了一个支付单之后,会通过支付工具进行支付,比如微信支付、支付宝、银行卡等,那么在特殊场景中,会出现,用户先通过微信支付尝试支付,因为网络延迟导致一直未支付成功,后面用户又再用支付宝支付成功了,可是过了一会,微信支付那面又回调通知支付成功了,这种该怎么处理呢?
其实,这个问题和之前我们讨论的另一个问题的解决思路差不多,但是也有一定的差别。
📄 ✅一个订单,在11:00超时关闭,但在11:00也支付成功了,怎么办?
打开文档:✅一个订单,在11:00超时关闭,但在11:00也支付成功了,怎么办?
要想解决这个问题,首先需要有明确的状态机和支付单状态的流转控制,这个不详细展开了,可以参考上面这个文章。
这个场景存在一个特殊的地方,那就是已经支付成功的单据,下一次支付成功的回调过来的时候,如何做幂等控制。
好的做法是,在支付单中冗余一个支付渠道和渠道支付单号,在支付成功的时候,把支付渠道返回的渠道支付单号记录下来。
在接收到支付成功回调的时候,先检查状态,如果发现已经支付成功,则比对支付渠道和渠道单号是否一致,如果一致,则幂等成功。如果不一致,说明发生了重复支付,则执行退款流程。
冲退的流程及异常情况处理,在上面的链接中也展开讲过,这里不再赘述了。