Skip to content

面试速答(先看这里)

**一句话结论:**在电商场景中,创建了一个支付单之后,会通过支付工具进行支付,比如微信支付、支付宝、银行卡等,那么在特殊场景中,会出现,用户先通过微信支付尝试支付,因为网络延迟导致一直未支付成功,后面用户又再用支付宝支付成功了,可是过了一会,微信支付那面又回调通知支付成功了,这种该怎么处理呢?

60秒标准回答:

在电商场景中,创建了一个支付单之后,会通过支付工具进行支付,比如微信支付、支付宝、银行卡等,那么在特殊场景中,会出现,用户先通过微信支付尝试支付,因为网络延迟导致一直未支付成功,后面用户又再用支付宝支付成功了,可是过了一会,微信支付那面又回调通知支付成功了,这种该怎么处理呢?

其实,这个问题和之前我们讨论的另一个问题的解决思路差不多,但是也有一定的差别

要想解决这个问题,首先需要有明确的状态机和支付单状态的流转控制,这个不详细展开了,可以参考上面这个文章

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**其实,这个问题和之前我们讨论的另一个问题的解决思路差不多,但是也有一定的差别。
  • **要点2:**要想解决这个问题,首先需要有明确的状态机和支付单状态的流转控制,这个不详细展开了,可以参考上面这个文章。
  • **要点3:**这个场景存在一个特殊的地方,那就是已经支付成功的单据,下一次支付成功的回调过来的时候,如何做幂等控制。
  • **要点4:**在接收到支付成功回调的时候,先检查状态,如果发现已经支付成功,则比对支付渠道和渠道单号是否一致,如果一致,则幂等成功。
  • **要点5:**冲退的流程及异常情况处理,在上面的链接中也展开讲过,这里不再赘述了。

**记忆锚点:**一个支付单

加分表达:

  • 在电商场景中,创建了一个支付单之后,会通过支付工具进行支付,比如微信支付、支付宝、银行卡等,那么在特殊场景中,会出现,用户先通过微信支付尝试支付,因为网络延迟导致一直未支付成功,后面用户又再用支付宝支付成功了,可是过了一会,微信支付那面又回调通知支付成功了,这种该怎么处理呢?
  • 这个场景存在一个特殊的地方,那就是已经支付成功的单据,下一次支付成功的回调过来的时候,如何做幂等控制。
  • 在接收到支付成功回调的时候,先检查状态,如果发现已经支付成功,则比对支付渠道和渠道单号是否一致,如果一致,则幂等成功。

追问准备:

  • 围绕「一个支付单」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

在电商场景中,创建了一个支付单之后,会通过支付工具进行支付,比如微信支付、支付宝、银行卡等,那么在特殊场景中,会出现,用户先通过微信支付尝试支付,因为网络延迟导致一直未支付成功,后面用户又再用支付宝支付成功了,可是过了一会,微信支付那面又回调通知支付成功了,这种该怎么处理呢?

其实,这个问题和之前我们讨论的另一个问题的解决思路差不多,但是也有一定的差别。

📄 ✅一个订单,在11:00超时关闭,但在11:00也支付成功了,怎么办?

打开文档:✅一个订单,在11:00超时关闭,但在11:00也支付成功了,怎么办?

要想解决这个问题,首先需要有明确的状态机和支付单状态的流转控制,这个不详细展开了,可以参考上面这个文章。

这个场景存在一个特殊的地方,那就是已经支付成功的单据,下一次支付成功的回调过来的时候,如何做幂等控制。

好的做法是,在支付单中冗余一个支付渠道和渠道支付单号,在支付成功的时候,把支付渠道返回的渠道支付单号记录下来。

在接收到支付成功回调的时候,先检查状态,如果发现已经支付成功,则比对支付渠道和渠道单号是否一致,如果一致,则幂等成功。如果不一致,说明发生了重复支付,则执行退款流程。

冲退的流程及异常情况处理,在上面的链接中也展开讲过,这里不再赘述了。