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