想要解決支付掉單問(wèn)題?這有兩種系統(tǒng)設(shè)計(jì)方案

3 評(píng)論 9841 瀏覽 38 收藏 10 分鐘

編輯導(dǎo)語(yǔ):在訂單支付的過(guò)程中,我們常常會(huì)遇到這樣的問(wèn)題:明明付了錢(qián),也扣了款,但是訂單卻并沒(méi)有成功。上文中,作者為我們分享了一次解決方案。在本篇文章中,作者又結(jié)合實(shí)際情況和案例,總結(jié)出了兩種系統(tǒng)設(shè)計(jì)方案。

上次在文章《錢(qián)被扣走了,但是訂單卻未成功!支付掉單異常最全解決方案》提到,支付過(guò)程會(huì)出現(xiàn)「掉單、卡單」的情況,這種情況對(duì)于用戶(hù)來(lái)講,體驗(yàn)非常差,明明自己付了錢(qián),扣了款,但是訂單卻未成功。

上篇文章我們簡(jiǎn)單說(shuō)了下解決方案,這次小黑哥就結(jié)合生產(chǎn)實(shí)際碰到的情況,給出兩種詳細(xì)設(shè)計(jì)的方案:

  1. 定時(shí)輪詢(xún)補(bǔ)償方案
  2. 延遲消息補(bǔ)償方案

大家可以根據(jù)自己系統(tǒng)的實(shí)際情況,選擇性參考。

「當(dāng)然了,以下設(shè)計(jì)方案可能并不完美,如果各位讀者還有其他解決方案,歡迎留言指出,一起討論,一起成長(zhǎng)~」

一、定時(shí)輪詢(xún)補(bǔ)償方案

1. 整體流程

這個(gè)方案主要采用定時(shí)任務(wù),批量查詢(xún)掉單記錄,從而驅(qū)動(dòng)查詢(xún)具體支付支付結(jié)果,然后更新內(nèi)部訂單。

整體方案流程圖如下:

定時(shí)任務(wù)補(bǔ)償

定時(shí)任務(wù)補(bǔ)償

前三步流程沒(méi)什么好說(shuō)的,正常的支付流程,咱們針對(duì)后面幾步具體詳細(xì)說(shuō)下。

第三步調(diào)用支付通道之后,如果支付通道端返回「支付受理成功或者支付處理中」,我們就需要調(diào)用第四步,將這類(lèi)訂單插入掉單表。

如果支付直接成功了,那就正常流程返回即可。

復(fù)習(xí)一下,網(wǎng)關(guān)類(lèi)支付,比如支付寶、微信支付、網(wǎng)銀支付,這種支付模式,支付通道僅僅返回支付受理成功,具體支付結(jié)果需要接收支付通道端的支付通知,這類(lèi)支付我們將其稱(chēng)為異步支付。

相應(yīng)的還有同步支付,比如銀行卡支付,微信、支付寶代扣類(lèi)支付,這類(lèi)支付,同步就能返回支付結(jié)果。

第五步,補(bǔ)單應(yīng)用將會(huì)定時(shí)查詢(xún)數(shù)據(jù)庫(kù),批量查詢(xún)掉單記錄;第六步,補(bǔ)單應(yīng)用使用線(xiàn)程池,多線(xiàn)程異步的方式發(fā)起掉單查詢(xún);第七步,調(diào)用支付通道支付查詢(xún)接口。

重點(diǎn)來(lái)了,如果第七步支付結(jié)果查詢(xún)?yōu)橐韵聽(tīng)顟B(tài):

  • 「支付結(jié)果為扣款成功」
  • 「支付結(jié)果為明確失敗」
  • 「掉單記錄查詢(xún)達(dá)到最大次數(shù)」

「第八步就會(huì)刪除掉單記錄。」

最后,如果掉單查詢(xún)依舊還是處理中,那么經(jīng)過(guò)一定的延時(shí)之后,重復(fù)第五步,再次重新掉單補(bǔ)償,直到成功或者查詢(xún)到達(dá)最大次數(shù)。

2. 相關(guān)問(wèn)題

「為什么需要新建一張掉單表?不能直接使用支付訂單表,查詢(xún)未成功的訂單嗎?」

這個(gè)問(wèn)題,實(shí)際上確實(shí)可以直接使用的支付訂單表,然后批量查詢(xún)當(dāng)天未成功的訂單,補(bǔ)單程序發(fā)起支付查詢(xún)。

那為什么需要新建一張掉單表?

主要是因?yàn)閿?shù)據(jù)庫(kù)查詢(xún)效率問(wèn)題,因?yàn)橹Ц队唵伪砻刻於紩?huì)大量記錄新增,隨著時(shí)間,這張表記錄將會(huì)越來(lái)越多,越來(lái)越大。

「支付記錄越多,批量范圍查詢(xún)效率就會(huì)變低,查詢(xún)速度將會(huì)變慢?!?/p>

所以為了查詢(xún)效率,新建一張掉單表。這張表里僅記錄支付未成功的訂單,所以數(shù)據(jù)量就會(huì)很小,那么查詢(xún)效率就會(huì)很高。

另外,掉單表里的記錄,不會(huì)被永久保存,只是臨時(shí)性。當(dāng)支付結(jié)果查詢(xún)成功,或者支付結(jié)果明確失敗,再或者查詢(xún)次數(shù)到達(dá)規(guī)定最大次數(shù),就會(huì)刪除掉單記錄。

「這就是第八步為什么需要?jiǎng)h除掉單表的原因?!?/p>

如果需要保存每次掉單表查詢(xún)?cè)斍?,那么這里建議再新增一張掉單查詢(xún)記錄表,保存每一次的查詢(xún)記錄。針對(duì)這個(gè)方案,如果還有其他問(wèn)題,歡迎留言。

3. 方案優(yōu)缺點(diǎn)

定時(shí)輪詢(xún)補(bǔ)償方案,最大的優(yōu)點(diǎn)可能就是系統(tǒng)架構(gòu)方案比較簡(jiǎn)單,比較容易實(shí)施,那么這個(gè)方案的缺點(diǎn)主要在于「定時(shí)任務(wù)」上。定時(shí)任務(wù)輪詢(xún)方案天然會(huì)存在以下不足:

  1. 「輪詢(xún)效率稍低」;
  2. 每次查詢(xún)數(shù)據(jù)庫(kù),已經(jīng)被執(zhí)行過(guò)記錄,仍然會(huì)被掃描(補(bǔ)單程序?qū)?huì)根據(jù)一定策略決定是否發(fā)起支付通道查詢(xún)),有「重復(fù)計(jì)算」的嫌疑;
  3. 「時(shí)效性不夠好」,如果每小時(shí)輪詢(xún)一次,最差的情況下,時(shí)間誤差會(huì)達(dá)到1小時(shí);
  4. 如果為了解決時(shí)效性問(wèn)題,增加定時(shí)任務(wù)查詢(xún)效率,那么 1 中查詢(xún)效率跟 2 的重復(fù)計(jì)算問(wèn)題將會(huì)更加明顯。

二、延遲消息補(bǔ)償方案

下面介紹另外一種掉單補(bǔ)償方案,延遲消息補(bǔ)償方案,這個(gè)方案整體流程與定時(shí)任務(wù)方案類(lèi)似,最大區(qū)別可能在于,從一種「拉模式」變成一種「推模式」。

整體方案流程圖如下:

這個(gè)方案主要流程跟定時(shí)方案類(lèi)似,主要區(qū)別在于第四步、第五步、第八步。

第四步的流程從插入掉單表變更為往「延遲隊(duì)列發(fā)送掉單消息」;第五步,補(bǔ)單程序接收掉單消息,然后觸發(fā)支付掉單查詢(xún);第八步,如果第七步支付結(jié)果查詢(xún)?yōu)橐韵聽(tīng)顟B(tài):

  • 支付結(jié)果為扣款成功
  • 支付結(jié)果為明確失敗
  • 掉單記錄查詢(xún)達(dá)到最大次數(shù)

補(bǔ)單程序?qū)?huì)告知延遲隊(duì)列消費(fèi)成功,延遲隊(duì)列將會(huì)刪除這條掉單消息。其他狀態(tài)將會(huì)告知消費(fèi)失效,延遲隊(duì)列將會(huì)在一定延時(shí)之后,再次發(fā)送掉單消息,然后繼續(xù)重復(fù)第五步。

方案優(yōu)缺點(diǎn):

延遲消息的方案相對(duì)于定時(shí)輪詢(xún)方案來(lái)講:

  • 無(wú)需再查詢(xún)?nèi)坑唵?/li>
  • 效率高時(shí)效性較好

不過(guò)延遲消息這種方案,需要基于「延遲隊(duì)列」,實(shí)現(xiàn)起來(lái)比較復(fù)雜,目前開(kāi)源實(shí)現(xiàn)也比較少。

三、小結(jié)

支付掉單、卡單是支付過(guò)程中經(jīng)常會(huì)碰到的事,我們可以采用異步補(bǔ)償?shù)姆桨?,解決該問(wèn)題,異步補(bǔ)償方案可以采用如下兩種:

  1. 定時(shí)輪詢(xún)補(bǔ)償方案
  2. 延遲消息補(bǔ)償方案

定時(shí)輪詢(xún)補(bǔ)償方案實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,但是時(shí)效性稍差。而延遲消息補(bǔ)償方案總體來(lái)說(shuō)比較優(yōu)秀,但是實(shí)現(xiàn)起來(lái)比較復(fù)雜。如果沒(méi)有自定義的延遲時(shí)間的需求,可以直接采用 RocketMQ 延遲消息,簡(jiǎn)單快捷。

另外「延遲隊(duì)列」使用場(chǎng)景還是比較多,不僅僅能用在掉單補(bǔ)償上,還可以用于支付關(guān)單等場(chǎng)景。所以有能力開(kāi)發(fā)的團(tuán)隊(duì),可以開(kāi)發(fā)一個(gè)通用的延遲隊(duì)列。

歷史支付文章推薦:

1.?“輕輕一掃,立刻扣款”,解讀付款碼背后的原理

2.?產(chǎn)品設(shè)計(jì):解讀銀行卡支付背后的原理

3.?手機(jī)沒(méi)網(wǎng)了,卻還能支付,這是什么原理?

4.?錢(qián)被扣走了,但是訂單卻未成功!支付掉單異常最全解決方案

5.?一筆訂單,但是誤付了兩筆錢(qián)!這種重復(fù)付款異常到底該如何解決?

 

作者:樓下小黑哥;微信公號(hào)@程序通事,支付行業(yè),后端技術(shù)

本文由 @樓下小黑哥 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載

題圖來(lái)自Unsplash,基于CC0協(xié)議

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. “支付掉單異常解決方案”文章鏈接錯(cuò)了

    回復(fù)
  2. 看完啦,我猜是后臺(tái)技術(shù)果然,我是支付產(chǎn)品,向您學(xué)習(xí)!

    來(lái)自廣東 回復(fù)
    1. 哈哈,是的。

      來(lái)自浙江 回復(fù)