糟糕,訂單超時關閉成功,用戶也支付成功了,我該怎么辦?
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
在電商及金融類的系統中,用戶在下完單之后沒有立即付款,訂單處于未支付狀態,默認情況下訂單會有30分鐘或者1小時左右(具體時間可以設置)的超時時間。在此期間用戶可以選擇立即付款,支付成功后訂單進入待發貨狀態,等待商家發貨。若超過規定的付款時間,那么訂單會被關閉,庫存及使用到的優惠(包含優惠券、積分)都將會被返還。那么如果訂單超時時間到期需要關閉訂單,并且此時正好用戶也支付成功了,對于訂單服務來說該如何處理呢? 明確訂單終態正常情況下,支付業務只有支付成功和支付失敗(用戶取消)兩種狀態,兩者中必有一個能進入到終態。必須明確一點的是,無論哪一個都代表著業務的最終態,不能被改變。如果終態隨便轉換,那么在設計上一定是不合理的。 業務處理有兩種情況:
針對上面的這兩種情況,如果用戶已經支付成功,面對訂單超時關閉的請求可以直接拒絕,也符合正常的業務邏輯。不過,要是出現訂單超時關閉成功,但支付成功處理失敗了,這樣的情況該如何處理呢?用戶的錢怎么處理?原路返回嗎? 沒錯,就是原路返回。訂單超時關閉了,用戶支付成功會觸發支付回調,開發人員可以在回調處理的過程中,如果發現訂單已經被關閉了,那么就得觸發退款流程,把錢退給用戶。 這樣,即使訂單超時關閉了,但是用戶付過的錢已經退回了,對用戶來說也并不存在損失。
對賬機制類似這些與支付有關的業務,引入對賬機制是必要的。根據支付流水以及支付單的狀態以及用戶的支付、退款情況,逐一比對(支付金額=沖退金額)。如果發現不一致的情況,要根據用戶的實付金額進行退款重試,直到完全一致。 加鎖具體來說就是出現了并發問題,無論是用戶支付成功回調還是訂單即將超時關閉訂單,在執行業務邏輯之前,都需要加鎖控制,并且一定是分布式鎖。誰搶到了這筆單子的鎖,誰先處理,沒搶到的只能等待下次重試。這樣做不僅能夠解決并發問題,而且也能夠避免異常情況的出現。 總結上面的方案整體看下來,能夠很好的解決訂單超時到期關閉,同時用戶也支付成功出現的并發問題,不過除此之外,仍需做好冪等以及兜底方案,確保實際業務系統能夠正常穩定運行。 作者:程序員淺夢 鏈接:https://juejin.cn/post/7325728181248606245 來源:稀土掘金 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 該文章在 2024/1/27 17:25:45 編輯過 |
關鍵字查詢
相關文章
正在查詢... |