1. 程式人生 > >支付系統設計:銀行卡支付(三)

支付系統設計:銀行卡支付(三)

這一期,回到支付系統的核心業務,即支付。每個電商公司的支付系統都已經或多或少的實現了交易核心功能,可也都是一直在改進,總是不斷的有新的需求冒出來。所以這一期開始,我們梳理一下:到底有哪些支付方式?每種支付方式都是怎麼運作的?

zhifuxitong

支付和交易

說到支付就不得不提交易。這兩個概念在不同公司中是不一樣的。我們的定義是,交易是生成訂單;支付是對訂單進行付款。 訂單生成過程我們以後另開話題來說。這一次重點介紹支付。而就支付行為來說,我們碰到的大部分都是單次支付,其次還有轉賬和退款。在蘋果推出訂閱支付後,國內支付寶等也在陸續跟進。 單次支付是我們用的最多的支付方式了,即一次結清所有款項。把單次支付走通了,其他支付方式也容易處理。 本期重點介紹單次支付。

銀行卡支付

先說大家比較熟悉的銀行卡支付,它分為線上支付和線下支付兩種形式。線下支付就是通常說的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介面,有兩套介面,一套是銀聯側開通,一套是商戶側開通。前者類似網銀支付,後者類似快捷支付。 務必要求接入後者介面啊。基本上讀完介面文件就知道怎麼寫程式碼了。