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