一筆訂單,但是誤付了兩筆錢!這種重復付款異常到底該如何解決?


封面送給我狗哥~

Hello,大家好,我是樓下小黑哥~

今天的文章我們接着上次的話題,繼續聊聊支付系統異常解決辦法。

在上篇文章中「支付掉單異常解決方案」,我們主要提到的是支付過程中掉單的場景,用戶明明付款成功,銀行卡都扣款了,但是訂單卻還顯示待付款。

而在今天的文章中,我們將聊到重復付款的異常,即同一筆訂單,扣了用戶兩筆錢。

另外我們還將會提到另外一種異常,用戶扣款成功,但是訂單卻支付失敗的場景。

以上兩種異常對於被扣款的用戶來講,使用體驗極差,自己多付了錢,訂單卻還不成功。所以如果不及時處理這兩類異常,那就真的等着被投訴吧。

歡迎關注我的公眾號:程序通事,獲得日常干貨推送。如果您對我的專題內容感興趣,也可以關注我的博客:studyidea.cn

重復付款異常

異常場景

重復付款異常一般常見於網銀支付,微信支付,支付寶等這類需要跳轉到一個支付網關頁(網銀支付),或者跳轉到錢包 APP(支付寶、微信),從而異步完成扣款的支付場景。

網銀支付流程

這種支付場景下,只能通過接受異步通知才能知道支付結果,我們一般將其稱為異步支付。

PS:有了異步支付,那么同步支付是什么?

其實同步支付指的就是調用支付接口之后,就可以立刻返回支付結果的,比如銀行卡類快捷/代扣等支付就是同步支付。

當然也有一些奇葩的銀行卡支付渠道,同步支付結果為受理成功,只能接受異步通知或者查詢返回支付結果。

由於銀行卡支付需要返回明確支付結果,對於這類渠道只能內部設計將異步轉為同步,感興趣可以看下之前歷史文章:

架構設計|異步請求如何同步處理?

后台支付流程如下:

圖片來自之前的文章:銀行卡支付原理

網關支付

為什么會發生重復付款?

主要原因其實跟上次內部掉單異常一樣,跟業務表設計有關。

上次我們提到,支付系統主要表結構如下:

在這個表結構下,只要支付訂單未成功,商戶就可以重復使用其內部同一訂單號調用支付接口。

假設這樣一個場景,用戶在收銀台支付時選擇招行進行網銀支付,當他點擊支付之后,商戶系統將會調用支付公司的網銀接口。

這時支付系統內部將會創建一筆支付單以及關聯的渠道訂單,並且調用招行系統的接口。

然后用戶的瀏覽器頁面將會打開一個新頁面,然后跳轉到招行網站。

這時如果此時用戶再次在收銀台點擊支付,將會再次調用支付系統接口。這時候由於支付單已存在,所以僅僅會再創建一條渠道訂單記錄,並且調用招行系統的接口。這時用戶的瀏覽器將會再次打開一個招行的網站。

如果用戶在兩個招行網銀頁都完成支付,這時就發生了重復付款。

上面這種場景看起來有點傻,但是真實用戶操作真的會發生。除了這種,博客園上的小伙伴還提到這么下面這種情況:

解決辦法

重復付款異常的主要的解決辦法有兩種,分為事前與事后。

事前主要的目是盡可能防止用戶重復付款,主要解決辦法為優化付款頁面,盡可能做好提示。

第一種優化方式,付款頁面直接跳轉到第三方/銀行的網銀頁面,不要打開新的頁面去跳轉。

網銀同步跳轉

這種方式可以防止用戶誤打開兩個網銀付款的頁面,從而導致重復付款。

但是這里會有一個問題,銀行網銀頁面付款成功之后,用戶如何知道其在商戶側訂單狀態也成功了?

其實很簡單,現在網銀支付接口,一般都會有一個參數 return_url:同步跳轉地址

來自支付寶開發文檔

只要在接口傳入這個地址,當支付成功之后,頁面最終就會跳轉到這個傳入的地址,商戶側就可以在地址顯示訂單是否支付成功。

支付系統異常處理-同步跳轉

上面我們提到,用戶有可能會使用瀏覽器回退功能,跳轉到支付頁,從而導致重復付款。

對於這種情況,我們可以在其回退支付頁時,首先向后台查詢這筆訂單支付結果,如果已支付成功,那就直接顯示成功頁面。

第二種優化,對於這種重新打開一個頁面跳轉到銀行網站,我們可以在頁面加入彈窗提示,詢問用戶是否已支付完成。

比如上面這種處理方式,當用戶點擊確認完成充值,可以馬上向后台發起查詢訂單狀態。

下面來聊聊事后的解決辦法,其實解決辦法很簡單,發起內部退款,將多余支付的一筆反向退款回去

支付系統內部可以有個定時任務,定時掃描支付單下有多條成功渠道訂單的記錄,然后選擇將重復支付渠道訂單發起退款。

這種方式是支付公司系統內部的操作,不需要商戶側發起指令。

訂單失效異常

異常場景

這種場景一般常見於電商購物,秒殺等購物場景。當用戶下單之后,頁面將會開始倒計時,用戶需要在有效期內支付成功。

假設用戶點擊跳轉到支付寶,但是其沒有立刻支付,而是停留了很久,在訂單最后一秒時間內完成了支付,但是這個時候訂單早已因為時間到期而被自動取消。

這樣就發生用戶扣款已經成功,但是訂單卻是失敗或關閉的場景的。

另外還有一種情況,用戶在有效期內支付成功,但是因為網絡、內部應用等問題,支付結果的異步通知過了很久才收到,這時內部訂單的早因為時間到期而被取消。

解決辦法

第一種解決辦法,上送有效期給支付渠道。

一般支付接口都會有一個支付有效期的字段,表明這筆支付最晚可以支付的時間。如果超時未支付,這筆支付將會被關閉。

來自支付寶開發文檔

當然一般情況下,如果未上送,這個字段內部一般會有個默認的有效期,比如 3 天,這個時間就比較長了。

所以當調用支付接口時,可以將訂單剩余有效期傳入支付接口。這樣用戶如果在超時時間內未完成支付,支付將會失敗。

第二種解決辦法,內部發起退款。

這個解決辦法依然事后托底的解決辦法,對於支付訂單已關閉,但是支付卻成功的情況,發起內部退款,將錢退給用戶。

內部可以有個定時任務,定時掃描支付訂單已關閉但是支付卻成功的情況,然后發起退款指令。

最后

最后用思維導圖方式幫大家總結一下支付系統可能會碰到的異常。

歷史支付系統相關文章

  1. 收款神器!解讀聚合收款碼背后的原理|原創
  2. 手機沒網了,卻還能支付,這是什么原理?|原創
  3. 輕輕一掃,立刻扣款,付款碼背后的原理你不想知道嗎?|原創
  4. 支付渠道路由系統進化史
  5. 從零開始設計對賬系統

歡迎關注我的公眾號:程序通事,獲得日常干貨推送。如果您對我的專題內容感興趣,也可以關注我的博客:studyidea.cn


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM