異步處理在支付環節的應用
本文主要向初步接觸支付業務的讀者簡要普及同步與異步處理的基本概念、關于異步處理在支付環節的應用、支付系統向商戶通知支付結果時,為什么要使用“異步通知”?異步處理方式在支付環節可能會產生的哪些問題?在產品設計上如何避免這些問題的發生?
第三方支付平臺在處理支付環節時,一般采用異步回調的方式將支付結果及用戶信息通過數據流的形式發送給商戶,商戶需要接收處理,并按文檔規范返回應答。
一、什么是同步處理、異步處理?
同步和異步是開發技術中的兩個概念:
同步:
指消息請求方發出請求后,必須要等待消息接收方返回結果,才能執行下一個任務。
這種情況下,消息請求方會說:兄弟,你現在就處理我的請求,我啥事都不干,就等你反饋處理結果。
異步:
指“消息請求方”發出請求后,“消息接收方”并不立即準備處理,而告知消息受理結果。“消息請求方”不需要等待“消息接收方”返回處理結果,隨時可以觸發下一個請求,去執行其他程序。
這種情況下,“消息接收方”會說:兄弟,你的請求我收到了,我會處理的,你該干嘛就干嘛去,等我回復就可以了。
二、關于異步處理在支付環節的應用
第三方支付機構在處理電商平臺提交上來的支付請求時,一般都是采用異步處理的方式,在其接口文檔上都會說明支付結果以異步通知為準。
下面我們先通過一張系統交互圖來了解第三方支付平臺在處理支付環節時的一般處理流程。當你在某個電商APP購物并支付訂單時,若該電商APP對接的第三方支付平臺是微信,那么整個流程大致如下圖:
支付時序交互圖
上圖是在微信支付時序圖的基礎上繪制出來的,主要補充了網聯/銀聯清算機構以及合作銀行的系統交互流程,便于大家了解整個支付環節。
主要交互說明如下:
步驟一:用戶在商戶APP中選擇商品并提交訂單。
步驟二:用戶選擇微信支付并開始支付訂單。
步驟三:商戶后臺調用微信支付統一下單支付接口,生成支付訂單推送給微信支付。
步驟四:商戶APP調起微信支付。
步驟五:用戶輸入密碼完成驗證,微信支付同步返回支付受理成功,但是最終支付結果仍然要以異步通知為準。
步驟六:微信支付發送扣款請求給網聯,網聯轉接給發卡行。
步驟七:發卡行完成扣款,反饋成功消息給網聯,網聯再通知微信支付。
步驟八:微信支付異步通知商戶支付成功,商戶后臺也可以主動查詢支付結果。
注:以上流程是假設電商平臺直接對接微信支付,如果是電商平臺接入的是其他第三方支付平臺(該平臺聚合了微信支付方式)或者第四方聚合支付平臺,那么在中間的系統交互則會多了一個環節。
三、支付系統為什么要使用“異步通知”?
1. 受上游渠道的影響
從支付交互時序圖可以看出,在商戶端提交支付訂單后,支付結果的返回需要經過各合作銀行-網聯-第三方支付平臺,最終才能到達商戶端后臺。當上游渠道無法保證系統的及時性與穩定性時,采用異步通知機制就顯得尤為重要。
2. 同步通知的弊端
試想一下,如果采用同步通知機制,在上游渠道質量較差的情況下,或自身系統存在問題,支付機構短時間內獲取不到交易終態,若強行要求同步返回交易終態,進程會一直掛在這里,非常耗費系統資源,得不償失。
3. 其他原因
有時候因為商戶端的網絡異常、延遲、用戶的異常操作,比如關閉了瀏覽器、app等,導致無法及時接收同步通知,這時候就非常需要異步通知了。
像微信這樣的支付機構,一方面能夠接入優質的上游渠道,另一方面自身的技術能力也很強大,所以往往能夠在短時間內做到同步返回支付結果。
但是也無法百分百擔保,所以微信支付最終還是以異步通知的結果為準。
其他第三方支付機構,就更加無法保證能夠同步返回支付結果了。
所以更通用的做法是同步返回“交易已受理”狀態,代表支付機構已受理這筆交易,最終交易狀態依賴支付機構的查詢接口或回調通知獲取。
當然,第三方支付機構除了異步通知外,還會支持商戶端做主動查詢,即商戶端通過查詢接口,調用某筆交易的支付結果,然后扭轉訂單狀態。
這算是異步通知的一個補償機制,有時候因為商戶端網絡延遲的問題、或者第三方支付機構系統的問題,導致異步通知失敗,由于第三支付機構的異步通知頻率會逐漸增大,所以有可能商戶端會遲遲接收不到通知,這時候如果能夠提早做主動查詢,能夠有效提高用戶體驗。
四、異步處理方式在支付環節可能產生的問題?
1. 重復支付問題
當用戶支付成功后,若當中出現了網絡延遲,導致第三方支付機構回調支付結果延遲。雖然用戶的銀行卡已經扣款了,但是由于電商平臺沒有接收到第三方支付機構的交易成功結果,導致訂單還是處于未支付狀態。用戶誤以為沒有支付成功,再次進行支付,導致重復支付問題的發生。(在這種情況下,如果用戶覺得自己沒有支付成功,不排除用戶會主動取消訂單,或者系統超時取消訂單,影響還是很大的。)
2. 交易掉單問題
這主要是本地未正確接收到渠道下發的異步通知導致。即一筆交易,用戶實際上已經完成了支付,銀行也扣款了,但是由于支付機構的問題,異步通知失敗,導致該筆交易在第三方支付機構已經是交易成功,但是訂單在電商平臺仍然是未支付。
五、如何通過產品設計避免上述問題的發生?
方法一:交互方式的優化
這種方法更多的是針對網頁端,在收銀臺中選擇對應的渠道并開始支付后,有的電商平臺會選擇打開一個新網頁界面,而原有的界面則會顯示一個彈窗,引導用戶在新打開的界面中進行支付。具體交互如下:
首先,在調用支付接口之前(例如用戶在訂單列表點擊付款按鈕或者進入收銀臺選擇支付渠道后點擊支付按鈕),系統需要先確認該訂單的支付狀態,可以調用主動查詢接口確認訂單是否已經完成支付,若未完成支付,才允許進行支付,避免商戶端重復提交支付訂單給到第三方。不管是電商平臺網頁端或者是移動端,這樣的一個校驗動作都是不可缺少的。
然后,當用戶在收銀臺點擊“立即支付”按鈕,若打開了新的網頁界面,則原有界面顯示付款提示彈窗,當用戶點擊“已完成付款”時,系統會再去第三方支付平臺查詢支付結果,如果支付成功,隱藏掉這個彈窗,展示支付成功界面。如果未查詢到支付成功結果,則可以提示未檢測到支付信息,然后關閉此彈窗或者可以返回訂單詳情頁。
當然,有些電商平臺也會采用在收銀臺點擊支付時,直接刷新當前界面,進入付款界面,這樣在一定程度上也是能夠避免用戶重復支付的問題。
下面列舉幾個案例:
當當收銀臺
在當當收銀臺中,當使用網銀支付時,會打開新的網頁界面進入銀行網關界面,同時原有收銀臺會顯示一個支付提示彈窗。
騰訊云
在騰訊云中,在訂單界面點擊立即支付可以進入收銀臺,當使用網銀支付方式打開新的網頁界面時,原有訂單界面也會顯示一個支付提示彈窗。
方法二:自動補單機制
電商平臺未收到第三方支付平臺的通知,可以是由于網絡問題,或者其他異常掉單。
這時候我們可以利用第三方支付平臺提供的查詢接口,主動到第三方平臺輪詢該訂單的支付狀態(要考慮系統性能,這個跟開發兄弟做好溝通即可),通過這種機制,在一定程度也是可以避免重復支付的問題。
當然,以上方案并不能百分百避免重復支付的問題,最根本的還是在于上游渠道返回支付信息的及時性。
當真的出現用戶重復支付的問題時,就要通過后續的對賬,查出該筆訂單下面的多筆支付記錄(財務上稱為長款),然后走人工或者自動的退款流程了。關于跟第三方支付平臺的對賬跟差錯處理,后面有機會再跟大家分享。
六、寫在最后
電商平臺在處理支付流程的時候,最重要的還是要對第三方支付平臺的業務邏輯有清楚的了解,知道第三方支付平臺能夠提供什么樣的接口能力,我們再結合自身的實際業務,制定支付方案。
作者:小狼人,微信公眾號:人稱產品汪。不定期更新本人在對接第三方支付平臺與銀行存管系統中的經驗心得、支付知識、產品心得等。
本文由 @ 小狼人? 原創發布于人人都是產品經理,未經作者許可,禁止轉載。
題圖來自Unsplash,基于CC0協議。
我個人作為用戶在付款的時候,感覺使用在淘寶下單時付款,是同步處理呢。微信也是。
最后的支付結果彈窗點擊叉號,處理邏輯是什么
銀行卡類交易,一般都可以使用 API 完成支付,這類接口一般都是同步得到支付結果。
而微信/支付寶/網銀支付,這類都需要跳轉到類似網關的頁面才能完成支付,這樣就脫離原先的同步支付流程,這樣就只能通過異步通知獲取支付結果了。
學習了
一般代扣業務同步得到支付結果。
2-7為什么不放在8之后?會不會影響支付營銷的使用~
2-7步驟可以稱之為‘下單’操作。一般這個下單操作都是有一個過期時間的,一旦過期,系統會關閉這個訂單。所以是不會影響的