前言
做支付一年多了,公司的支付平台剛搭建好進的公司,經歷了從一開始的各處漏洞,到代碼重構后系統穩定運行,再到功能的逐漸完善和易用性提升,最后到現在追求系統效率的提升,我也從當初對支付一臉懵逼的實習生到成為了解支付的各個方面能順利解決各種問題的開發工程師,感觸頗多。
在做的是一個典型的聚合支付平台,主要跟第三方支付公司(也有銀行)交互。 開發語言是 PHP。可能大家印象中,支付作為一個重型業務,應該用 java 這種重型語言來開發。但在小型公司初期業務迅速擴展時期,跟得上業務的發展至關重要,PHP 作為敏捷開發的代表,自然在技術選型上有着很大的優勢。可能跟業務量相關,平台目前在一個阿里雲小機器上暫時沒有效率壓力,日處理二三百萬交易沒有問題。
本系列准備分三篇來介紹,支付相關的基本概念、支付系統的設計和我做支付時遇到的一些坑,可能會偏業務一些,也不往首頁上放了,留給有緣人。
支付概念
支付是個概念性很強的領域,其業務方面有許多專業詞匯,技術上也比其他業務要求要嚴格,畢竟牽涉到錢,這里先簡單地介紹幾個概念,便於后面文章理解。
聚合支付
聚合支付,聚合的是第三方支付公司(如支付寶、網銀在線、快錢等,下簡稱三方公司)。
我們支付最終處理方都是銀行,但銀行並不是誰都有資質接入的,這就需要第三方支付公司。第三方支付公司對接多個銀行通道,但業務參差不齊,商戶若直接對接多個第三方支付公司成本也會很高。這時便需要聚合支付平台了,聚合支付平台對接多個商戶,作為中間人角色,本身並無業務。但商戶只需要對接到一個聚合支付平台便能方便地接入支付功能,目前市場上比較成功的聚合支付平台有 ping++、付錢拉等。
冪等性
冪等更多的是一個計算機概念,在計算機領域也有多種應用,如 HTTP 的 PUT 方法(也被應用於 RESTFUL API 的概念中)。特點是其任意多次執行所產生的影響均與一次執行的影響相同,也就是說一個動作,做多少次都不會影響到最終的結果,保持交易處理的冪等性在支付系統中特別重要。
支付通道
對支付平台來說,支付通道是指 一個三方支付公司分配的一個商戶號,當然它也可以更細地划分,如添加卡類型、銀行等維度,具體要考慮到支付路由系統的設計。
終態
終態,顧名思義,是最終的不會再改變的狀態。相較於其他業務,支付系統對終態的定義要更清晰一些,它代表着一筆交易的最終狀態,要么成功,要么失敗,不會有其他狀態。
異步
異步與同步對應,是指一個請求發出后,結果由回調或通知來處理。由於支付處理的復雜性和嚴密性,一筆交易往往無法在很短的時間內確認終態,而長時間的阻塞等待也是不可接受的,所以支付系統對異步特別依賴。
風控
風險控制,是識別異常交易並加以額外驗證的模塊,一般牽涉重要些的系統都會有。風控並不能完全避免資金損失,只能盡量減少損失。簡單的包括頻繁相同請求控制,時間段內交易金額限制等,復雜的會包括慣性分析,用戶畫像等。
風控的嚴密性和交易的安全性成正向相關,但同時也會影響系統流程的復雜性,越嚴密的風控必然會導致更長的流程,更差的用戶體驗,甚至會需要運營人員介入。
對賬
對賬嚴格來說並不是支付流程中不可缺少的步驟,它是一種確認和補救機制,它通過對比交易雙方的記錄匯總來發現支付問題。
虛擬賬戶
虛擬賬戶是一個很巧妙的設計,它是遠程賬戶金額在本地的映射,只要保證在遠程所有的支出和收入在本地有同樣的記錄,就能通過本地金額來確認遠程賬戶的金額,這樣就避免了頻繁的賬戶金額查詢操作。此設計一般被用在代付和退款業務中,這兩種業務通常需要在支付發起方在支付受理方設立一個賬戶並充值維持其金額可用。
支付網關
支付網關是支付發起方與支付受理方的接口,通常有復雜的報文處理,如參數映射、參數強驗證、加密、簽名等。 支付網關中將三方公司的狀態碼映射為自己系統的狀態碼這一步驟是重中之重。
支付要素
指支持中起決定性的信息,一般為人信息或交易主體銀行卡的信息。
- 二要素:姓名、身份證號;
- 三要素:姓名、身份證號、卡號;
- 四要素:姓名、身份證號、卡號、手機號;
- 六要素(信用卡):姓名、身份證號、卡號、手機號、cvv2、expire_date;
數據設計
交易表的設計
交易表需要考慮多通道,在一條業務記錄在一條支付通道交易時可能會失敗,如果有重試機制的話,那么一條業務記錄會對應多條三方公司的請求記錄。另外一定要考慮擴展字段,后續會以此字段來緩沖字段的擴充。
用戶和綁卡表
很多時候支付系統需要對支付要素進行驗證,每次都去請求支付通道驗證顯然會造成浪費,那么我們需要對數據進行緩存。
為什么是緩存呢,因為這些支付要素都是有有效期限的,一個人會改名,卡會換綁定手機號,如果無腦使用以前的數據會造成一部分信息判斷錯誤。設置合適的過期機制或重試機制才能使降低成本和提高准確率之間達成平衡。
日志數據庫
日志在支付系統內有着非比尋常系統的重要性,它除了肩負着問題定位和分析,交易跟蹤的重任,在與外部的接口處更有着請求憑證的作用,良好的日志管理系統可以幫助技術人員快速定位和解決問題,也能在與三方公司扯皮時准確扔出憑證,完善的日志系統也可以直接給運營使用,以此減輕開發人員的工作壓力。
小結
之前曾多次想過總結一下,可總因為覺得沉淀不夠而擱置下來,如今大膽寫下來吧,有時間和機會的話,再慢慢修訂。
可能一時考慮的並不全,也可能由於見識原因,所介紹的東西難免有遺漏,慢慢進步吧~
初稿:2017-03-20