支付系統設計:銀行卡支付(三)
這一期,回到支付系統的核心業務,即支付。每個電商公司的支付系統都已經或多或少的實現了交易核心功能,可也都是一直在改進,總是不斷的有新的需求冒出來。所以這一期開始,我們梳理一下:到底有哪些支付方式?每種支付方式都是怎么運作的?
支付和交易
說到支付就不得不提交易。這兩個概念在不同公司中是不一樣的。我們的定義是,交易是生成訂單;支付是對訂單進行付款。 訂單生成過程我們以后另開話題來說。這一次重點介紹支付。而就支付行為來說,我們碰到的大部分都是單次支付,其次還有轉賬和退款。在蘋果推出訂閱支付后,國內支付寶等也在陸續跟進。 單次支付是我們用的最多的支付方式了,即一次結清所有款項。把單次支付走通了,其他支付方式也容易處理。 本期重點介紹單次支付。
銀行卡支付
先說大家比較熟悉的銀行卡支付,它分為線上支付和線下支付兩種形式。線下支付就是通常說的POS收單,這里不介紹這個內容。對線上支付,按照卡的類別,分為貸記卡支付,也叫motopay、ePOS,即信用卡支付;和借記卡支付。按照支付形態,又分為認證支付、網銀支付、快捷支付幾種形態。銀行卡網銀支付要求銀行卡必須開通在線支付功能,而快捷支付并不需要開通在線支付功能。主要利用支付驗證要素(卡號、密碼、手機號、CVN2、CVV2等),結合安全認證(例如短信驗證碼),讓持卡人完成互聯網支付。
認證支付
指用戶在綁卡時,將卡信息提供給電商。這樣在支付時,用戶無需再輸入這些信息,由電商在服務器側保留用戶的賬戶信息,比如身份證號,卡號,手機號。在用戶支付時,無需再輸入這些內容,最多就提供個密碼或者校驗碼,就可以完成支付。這基本不會打斷用戶的使用體驗,所以也是電商喜歡的支付方式。但認證支付最讓人詬病的就是安全性。一方面需要向電商暴露個人信息,一旦被竊取,資金就容易被盜走。還有在手機上執行支付,一旦手機丟失,竊取者就可以輕而易舉的使用或者轉移資金。
快捷支付
快捷支付和認證支付類似,不同點在于綁卡之后,有些銀行接口會返回token,后續使用token來作為支付憑證,無需提供卡號信息,這樣電商也不需要本地保留卡號了。目前主要是銀聯有提供token接口。
網銀支付
相對來說,網銀支付要安全很多。網銀支付是由銀聯或者銀行提供支付界面,用戶必須在頁面上輸入卡號,密碼等驗證信息才可以執行支付。大部分銀行還要求用戶使用U盾或者其它安全硬件。但安全和易用永遠是個矛盾。網銀使用會打斷用戶體驗,增加用戶使用難度。對使用硬件加密的支付,不可能天天帶著U盤跑。另外網銀主要用在web端,在手機端,嵌入網銀頁面,還是比較難看的
支付流程
走一個具體的例子看看吧。比如用戶在電商系統中買了200塊錢的東西,然后通過浦發銀行卡做結算,用的是快捷支付。這個過程是:
用戶在交易界面上,提交訂單到交易系統中; 交易系統確認訂單無誤后,請求支付系統進行結算。這是在交易系統做的,后面工作就進入支付系統。
用戶被引導到收銀臺頁面, 讓用戶確認交易金額,選擇支付方式,調用支付系統接口。
支付系統接收到支付請求,驗證請求的各個字段是否有問題,確認無誤后,調用支付網關執行支付。
支付網關請求浦發銀行的快捷支付接口執行支付。
支付網關接收到支付結果報文后,對結果報文做解析,獲取結果,并將結果告知交易系統。這可以通過URL或者RPC調用來實現。
商城系統收到支付結果后,開始執行后續操作。如果是支付成功,則開始準備出庫。這一步在交易系統中處理,這里不做介紹。
網銀支付,和快捷相比,就在第4步,插入一個步驟,將用戶導航到網銀頁面輸入支付信息,后續步驟是一樣的。在資金流上也是相同的。 而在第五步獲取返回結果上,一般銀行就直接同步返回,銀聯是分為同步和異步返回。同步告知操作成功或者失敗,異步告知扣款成功或者失敗。同步操作和異步操作都需要調用方提供一個回調的URL地址,銀聯會將參數附加在這個地址上。通過解析這些參數可以得到執行結果。異步操作一般有2-3秒的延遲,取決于網絡,以及該交易處理的復雜度。
資金流
上一節說的是支付的信息流,那資金流應該是怎么走的? 在第三步,會觸發資金流。資金從用戶個人賬戶上轉移到電商公司的賬戶。當然,銀行也不是活雷鋒,這一筆交易是要收手續費的。資金是實時到賬的,手續費一般是按月結算。有按交易筆數計費的,但大部分還是按照交易金額來收費。
同行快捷支付是比較簡單的場景,讓我們來逐步增加難度。如果支付系統沒有對接浦發銀行,那對浦發卡,就得走其它支付方式:銀聯或者第三方支付。
先說銀聯快捷。銀聯提供的多種接入方式,常說的快捷支付,在銀聯文檔中叫商戶側開通token接口。通過這個接口,可以實現同行和跨行資金結算。不管收款行是浦發還是其它行,都可以完成結算。對本地和用戶來說,體驗是一樣的。而在銀聯側,后臺資金流處理卻不一樣。了解這個資金流,有助于在異常情況下,了解資金到底跑到哪里了。
如果收款行也是浦發銀行,銀聯發報文給浦發,浦發使用內部系統完成兩個賬戶間的轉帳,即時完成。
如果收款行是他行,比如工行。銀聯發指令給浦發和工行,分別完成各自賬戶上資金余額的增減,對個人和電商來說,這筆資金算是落地了。但實際資金流并不是立即發生。銀聯會在半夜做清結算后處理這筆資金。這個過程就是金融機構之間的清結算了,一般不需要關注。
如果使用的是第三方支付,對用戶來說,處理的流程和銀聯一樣。但資金流會不一樣。 第三方支付在浦發和工行一般都會有落地的托管資金。 發生交易后,一般來說不會產生跨行資金流動。用戶在浦發行的錢會被結算到第三方支付在浦發行的托管賬戶,而在工行的錢,會由第三方支付在工行的賬戶打到客戶賬戶上。 這就降低了跨行資金流動成本。
目前國內主要銀行都提供快捷和直聯的接口。對電商來說,要對接哪些銀行是個需要考慮的問題。怎么對接銀行,渠道和第三方支付。
銀聯Token支付
一般來說,大部分銀行都提供直聯和網銀接口,但不需要直接對接所有銀行。銀聯和第三方支付也提供直聯接口,可以直接對接國內主要銀行。也不是所有銀行都被銀聯支持,這和銀聯簽約的接口有關,需要在對接時咨詢銀聯。從我們使用情況看, 浦發借記卡、郵儲銀行卡是不支持的。 另外 交行、平安(含原深發)、上海銀行、浦發、北京銀行,上述銀行卡需通過 這個地址 開通銀聯在線支付業務。
對接銀行
大部分銀行提供的銀行卡支付接口,借記卡支付和貸記卡支付是不一樣的。但也有幾個好心的銀行,可以用一套接口同時開通借記卡和貸記卡。點名贊一下這些銀行: 宇宙第一大行工商銀行和建設銀行。其他同學對接中如果也發現借記卡和貸記卡用一個接口的,也請及時告知。 作為國內最保守的軟件團隊,和銀行對接時務必做好足夠的準備。在商務談判完成、拿到銀行的接口文檔后,需要考慮兩個問題:專線問題、加密問題。
專線問題
首先是專線問題。 大部分銀行對接是需要專線的。 與銀行溝通的時候,注意收集如下信息:
- 專線類型: MSTP類型或者SDH類型。
- 專線接入點:目前國內主要是聯通、電信。
- 封裝類型: HDLC或者PPP
- 專線代寬:默認是2M
前置機IP,這個需要在銀行側和電商側進行配置。 專線其實是在銀行和電商之間建立一個局域網,需要雙方分配通訊IP。 其實這兩組IP都是NAT后的IP,銀行分配給我們的是電商真實的前置機IP經過最外端的網絡防火墻轉換后的IP段,后者也是對方的真實前置機IP經過轉換后的IP段。 出于安全考慮,雙方都不會將真實IP暴露出去,所以要NAT。
接入地址:即電商這邊機房的地址。
這些專業名詞,可以自己檢索,太專業了,其實我也不懂。從可靠性角度考慮,一般建議從聯通、電信各拉一條線路出來。一旦有一個線路出問題了,也不會導致所有交易被終止了。不需要專線的銀行接口有:浦發、工行、交行信用卡等。 需要專線的有中行、農行、建行等。一般專線需要1個月左右的時間,包括銀行側的申請、施工時間。
加密問題
其次是加密問題。部分銀行,如中行,前置要求使用加密機。此處加密機的常用功能有三方面:
- MAC加密(完整性);
- 支付會話\密碼加密(安全性);
- 密鑰交換加密(防截?。?。
對開發來說,加密機的主要作用,是讓黑客都無法從內存中看到密碼。 不是做廣告,國內對接銀行一般就用江南天安的加密機了
對接銀聯
對接銀聯比對接銀行簡單, 不需要專線,不需要加密機。 不過需要獲取ADSS認證。 銀聯最近在推Token接口,有兩套接口,一套是銀聯側開通,一套是商戶側開通。前者類似網銀支付,后者類似快捷支付。 務必要求接入后者接口啊?;旧献x完接口文檔就知道怎么寫代碼了。
接下來,這里將分別介紹如何對接第三方支付、應用內支付等內容。敬請關注。
相關閱讀
作者:鳳凰牌老熊,程序員 & 架構師,來自中科大的本科,研究生在軟件所學習。先后在中科輔龍、三星(中國)研究院和國內一些大型的互聯網公司呆過。在中科輔龍公司負責電子政務內容管理系統建設,負責研發龍馭系列產品的研發,這款產品最終實施到2000多個電子政務網站上,期間也參與了一些支付反洗錢以及支付系統的建設。之后在三星中國研究院,負責自然語言處理(NLP)以及智能家居相關項目。智能家居項目在2014CES消費電子展上作為三星重點項目推介。2014年開始加入愛奇藝公司,負責數據倉庫和支付系統的建設。
本文由@鳳凰牌老熊(微信公眾號:shamphone) 原創發布于人人都是產品經理 。未經許可,禁止轉載。
2c問題不大,2b未夠。企業級支付的場景更復雜,托管、大額小額、賬期、票據、聚合、直付、金融代收付。。。單一個對賬能搞死人。
作者的寫的文章很有深度!~
一看就是有研發 和 產品 + 其他領域的 老司機;
順便問下:支付流程啥的 第一步、第二步 能否標出來,或者有個時序圖啥的。??粗X袋疼。。。
信息量好大受教了,樓主辛苦
如果使用的是第三方支付,對用戶來說,處理的流程和銀聯一樣。但資金流會不一樣。 第三方支付在浦發和工行一般都會有落地的托管資金。 發生交易后,一般來說不會產生跨行資金流動。用戶在浦發行的錢會被結算到第三方支付在浦發行的托管賬戶,而在工行的錢,會由第三方支付在工行的賬戶打到客戶賬戶上。 這就降低了跨行資金流動成本。
—— 這個有點迷惑,如果第三方在浦發跟工行都有資金賬戶,那在使用第三方支付的時候,根據支付銀行選擇相應的收款行做資金結算?只有這樣才不會有跨行資金流動,那這樣浦發支付的資金到浦發托管賬戶很好理解,為什么最后還會有一步,工行的錢打到客戶賬戶,不是已經選用浦發做結算銀行了?
我也這段沒看懂
如果我沒看錯的話,應該是當用戶的付款賬戶是“浦發”,收款賬戶是“工行”時。當使用的是第三方支付渠道時,該第三方支付對接了浦發和工行,在這兩個地方都有資金賬戶,當用戶發起付款或收款操作時,對于第三方來說資金是直接在不同行的資金賬戶中先流轉,而后再跟不同行進行結算平賬?!具@里的用戶不一定是個人用戶可能是某平臺,平臺的付款和收款賬戶不一致的情況下,發生的資金流轉就會不一樣?!?/p>
一手入金,一手墊付,支付機構內部做賬
因為按照背景,用戶的開戶行(發卡行)是浦發銀行,商戶的開戶行是工行,而第三方支付機構在浦發銀行和工行都開了戶。
以下是資金流:
1. 用戶在浦發銀行開通的賬戶 -> 第三方支付機構在浦發銀行開通的托管資金賬戶
2. 第三方支付機構在工行開通的托管資金賬戶 -> 商家在工行開通的資金賬戶
因此,免去了從浦發銀行到工行的跨行資金流動。
資金是實時到賬的,手續費一般是按月結算?—資金是實時到達商家賬戶的么?從清結算那幾篇文章看,中間應該還有個清結算的過程,一般不是T+1結算的么?
這里說的資金到賬是說的持卡人賬戶的錢是實時的,商戶賬戶的收入是等夜里等銀聯清算完第二天才入賬,銀聯要扣除手續費,是月結。我是這么理解的。
您好,我能加下你微信嗎?,我想更好的向您學習。我微信號是chenjie85691699
加油
不錯,學習了
熊哥一看就是老司機。
LZ能否談下第三方支付,感覺接觸過很多創業公司,剛開始的時候根本用不上這么多支付路由,前期流水也不高,量也不大。對接銀行的支付系統的話,還要專人去跑,流程復雜。相反現在第三方支付做的比較成熟,支付場景和安全性都有提高,部署更快。
近期會出一個,謝謝關注。