一筆訂單,但是誤付了兩筆錢!這種重復(fù)付款異常到底該如何解決?
編輯導讀:有時會遇到這樣的情況:同樣一筆訂單,扣了用戶兩筆錢。這是屬于重復(fù)扣款的異常,對于被扣款的用戶來說,是極差的用戶體驗,所以我們要避免這樣的情況發(fā)生。本文將對此展開分析,希望對你有幫助。
今天的文章我們接著上次的話題,繼續(xù)聊聊支付系統(tǒng)異常解決辦法。
在上篇文章中「支付掉單異常解決方案」,我們主要提到的是支付過程中掉單的場景,用戶明明付款成功,銀行卡都扣款了,但是訂單卻還顯示待付款。
而在今天的文章中,我們將聊到重復(fù)付款的異常,即同一筆訂單,扣了用戶兩筆錢。
另外我們還將會提到另外一種異常,用戶扣款成功,但是訂單卻支付失敗的場景。
以上兩種異常對于被扣款的用戶來講,使用體驗極差,自己多付了錢,訂單卻還不成功。所以如果不及時處理這兩類異常,那就真的等著被投訴吧。
一、重復(fù)付款異常
1. 異常場景
重復(fù)付款異常一般常見于網(wǎng)銀支付,微信支付,支付寶等這類需要跳轉(zhuǎn)到一個支付網(wǎng)關(guān)頁(網(wǎng)銀支付),或者跳轉(zhuǎn)到錢包 APP(支付寶、微信),從而異步完成扣款的支付場景。
網(wǎng)銀支付流程
這種支付場景下,只能通過接受異步通知才能知道支付結(jié)果,我們一般將其稱為異步支付。
PS:有了異步支付,那么同步支付是什么?
其實同步支付指的就是調(diào)用支付接口之后,就可以立刻返回支付結(jié)果的,比如銀行卡類快捷/代扣等支付就是同步支付。
當然也有一些奇葩的銀行卡支付渠道,同步支付結(jié)果為受理成功,只能接受異步通知或者查詢返回支付結(jié)果。
由于銀行卡支付需要返回明確支付結(jié)果,對于這類渠道只能內(nèi)部設(shè)計將異步轉(zhuǎn)為同步,感興趣可以看下之前歷史文章:
架構(gòu)設(shè)計|異步請求如何同步處理?
后臺支付流程如下:
網(wǎng)關(guān)支付
2. 為什么會發(fā)生重復(fù)付款?
主要原因其實跟上次內(nèi)部掉單異常一樣,跟業(yè)務(wù)表設(shè)計有關(guān)。
上次我們提到,支付系統(tǒng)主要表結(jié)構(gòu)如下:
在這個表結(jié)構(gòu)下,只要支付訂單未成功,商戶就可以重復(fù)使用其內(nèi)部同一訂單號調(diào)用支付接口。
假設(shè)這樣一個場景,用戶在收銀臺支付時選擇招行進行網(wǎng)銀支付,當他點擊支付之后,商戶系統(tǒng)將會調(diào)用支付公司的網(wǎng)銀接口。
這時支付系統(tǒng)內(nèi)部將會創(chuàng)建一筆支付單以及關(guān)聯(lián)的渠道訂單,并且調(diào)用招行系統(tǒng)的接口。
然后用戶的瀏覽器頁面將會打開一個新頁面,然后跳轉(zhuǎn)到招行網(wǎng)站。
這時如果此時用戶再次在收銀臺點擊支付,將會再次調(diào)用支付系統(tǒng)接口。這時候由于支付單已存在,所以僅僅會再創(chuàng)建一條渠道訂單記錄,并且調(diào)用招行系統(tǒng)的接口。這時用戶的瀏覽器將會再次打開一個招行的網(wǎng)站。
如果用戶在兩個招行網(wǎng)銀頁都完成支付,這時就發(fā)生了重復(fù)付款。
上面這種場景看起來有點傻,但是真實用戶操作真的會發(fā)生。除了這種,博客園上的小伙伴還提到這么下面這種情況:
3. 解決辦法
重復(fù)付款異常的主要的解決辦法有兩種,分為事前與事后。
事前主要的目是盡可能防止用戶重復(fù)付款,主要解決辦法為優(yōu)化付款頁面,盡可能做好提示。
「第一種優(yōu)化方式,付款頁面直接跳轉(zhuǎn)到第三方/銀行的網(wǎng)銀頁面,不要打開新的頁面去跳轉(zhuǎn)?!?/p>
網(wǎng)銀同步跳轉(zhuǎn)
這種方式可以防止用戶誤打開兩個網(wǎng)銀付款的頁面,從而導致重復(fù)付款。
但是這里會有一個問題,銀行網(wǎng)銀頁面付款成功之后,用戶如何知道其在商戶側(cè)訂單狀態(tài)也成功了?
其實很簡單,現(xiàn)在網(wǎng)銀支付接口,一般都會有一個參數(shù) 「return_url:同步跳轉(zhuǎn)地址」 。
來自支付寶開發(fā)文檔
只要在接口傳入這個地址,當支付成功之后,頁面最終就會跳轉(zhuǎn)到這個傳入的地址,商戶側(cè)就可以在地址顯示訂單是否支付成功。
支付系統(tǒng)異常處理-同步跳轉(zhuǎn)
上面我們提到,用戶有可能會使用瀏覽器回退功能,跳轉(zhuǎn)到支付頁,從而導致重復(fù)付款。
對于這種情況,我們可以在其回退支付頁時,首先向后臺查詢這筆訂單支付結(jié)果,如果已支付成功,那就直接顯示成功頁面。
「第二種優(yōu)化,對于這種重新打開一個頁面跳轉(zhuǎn)到銀行網(wǎng)站,我們可以在頁面加入彈窗提示,詢問用戶是否已支付完成。」
比如上面這種處理方式,當用戶點擊確認完成充值,可以馬上向后臺發(fā)起查詢訂單狀態(tài)。
下面來聊聊事后的解決辦法,「其實解決辦法很簡單,發(fā)起內(nèi)部退款,將多余支付的一筆反向退款回去」。
支付系統(tǒng)內(nèi)部可以有個定時任務(wù),定時掃描支付單下有多條成功渠道訂單的記錄,然后選擇將重復(fù)支付渠道訂單發(fā)起退款。
這種方式是支付公司系統(tǒng)內(nèi)部的操作,不需要商戶側(cè)發(fā)起指令。
二、訂單失效異常
1. 異常場景
這種場景一般常見于電商購物,秒殺等購物場景。當用戶下單之后,頁面將會開始倒計時,用戶需要在有效期內(nèi)支付成功。
假設(shè)用戶點擊跳轉(zhuǎn)到支付寶,但是其沒有立刻支付,而是停留了很久,在訂單最后一秒時間內(nèi)完成了支付,但是這個時候訂單早已因為時間到期而被自動取消。
這樣就發(fā)生用戶扣款已經(jīng)成功,但是訂單卻是失敗或關(guān)閉的場景的。
另外還有一種情況,用戶在有效期內(nèi)支付成功,但是因為網(wǎng)絡(luò)、內(nèi)部應(yīng)用等問題,支付結(jié)果的異步通知過了很久才收到,這時內(nèi)部訂單的早因為時間到期而被取消。
2. 解決辦法
「第一種解決辦法,上送有效期給支付渠道?!?/p>
一般支付接口都會有一個支付有效期的字段,表明這筆支付最晚可以支付的時間。如果超時未支付,這筆支付將會被關(guān)閉。
來自支付寶開發(fā)文檔
當然一般情況下,如果未上送,這個字段內(nèi)部一般會有個默認的有效期,比如 3 天,這個時間就比較長了。
所以當調(diào)用支付接口時,可以將訂單剩余有效期傳入支付接口。這樣用戶如果在超時時間內(nèi)未完成支付,支付將會失敗。
「第二種解決辦法,內(nèi)部發(fā)起退款?!?/p>
這個解決辦法依然事后托底的解決辦法,對于支付訂單已關(guān)閉,但是支付卻成功的情況,發(fā)起內(nèi)部退款,將錢退給用戶。
內(nèi)部可以有個定時任務(wù),定時掃描支付訂單已關(guān)閉但是支付卻成功的情況,然后發(fā)起退款指令。
三、最后
最后用思維導圖方式幫大家總結(jié)一下支付系統(tǒng)可能會碰到的異常。
作者:樓下小黑哥;微信公號@程序通事,支付行業(yè),后端技術(shù)
本文由 @樓下小黑哥 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自Unsplash,基于CC0協(xié)議
文章:架構(gòu)設(shè)計|異步請求如何同步處理,沒有找到誒
“這時候由于支付單已存在,所以僅僅會再創(chuàng)建一條渠道訂單記錄,并且調(diào)用招行系統(tǒng)的接口。”請問這里為什么不會創(chuàng)建新訂單呢
重復(fù)付款講的不嚴謹
寫的很不錯~