基于微信支付、退款的一个取消预约的方案
生活随笔
收集整理的這篇文章主要介紹了
基于微信支付、退款的一个取消预约的方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、前提
本方案是基于 「微信非付款碼支付」 進行設計的。
二、業務場景
首先,大家先大概了解下「預約」和「取消預約」兩個流程。
三、遇到的問題
試想如下場景:
用戶預約,拉起微信支付后選擇支付,但是在支付回調通知前,用戶又發起了取消。此時該如何實現取消邏輯呢?此時,訂單的狀態處于 “待支付”,是允許取消還是不允許取消呢?首先,說下 “不允許取消” 這種情況在業務上是不可能成立的,為什么這么說呢?因為,只有那些處于 “支付中” 狀態的訂單不允許取消才合理,而我們只有 “待支付”、“支付成功” 狀態,我們無法得到 “支付中” 這個狀態。
所以,只能允許取消!!!!
如果允許取消的話,是退款還是不退款呢?通過當前訂單狀態 “待支付”,我們也沒辦法判斷用戶是取消支付了(未發生真正的支付不需要進行退款),還是支付了但我方系統還未得到支付回調通知(發生了真正的支付需要進行退款)。
分別在 “取消支付”、“支付了我方系統還未得到支付回調通知” 兩個場景下分別進行 退款、不退款 都會出現那些問題呢?
| 不退款 | 待支付 => 取消 | 因為根本沒發生實際的支付,所以不退款是合理的 | 訂單雖然成功取消了,但由于不退款,造成用戶無法得到退款的錢 |
| 退款 | 待支付 => 取消 | 因為根本沒發生實際的支付,所以所有退款都會失敗 | 1、退款失敗(那些在微信端還在支付中的訂單);2、退款成功(剛好支付完成且成功) |
四、方案設計
用戶在前端觸發「取消」
支付回調通知
判斷 “支付成功” 的交易是否有對應的「由于取消產生的待退款任務」,如果存在,則需要進行退庫退款。
至此,通過以上 2 步,我們來看看可能會出現的所有場景,如下:
這里需要重點說明的是 場景四。由于并發的情況,會造成一個本該被處理的「由于取消產生的待退款任務」可能永遠都無法被處理的情況產生。
定時任務
為了解決 場景四 的問題,我們還需要一個定時任務來進行最后的兜底處理。
總結
以上是生活随笔為你收集整理的基于微信支付、退款的一个取消预约的方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IP、子网掩码
- 下一篇: ThreadPoolExecutor(一