產(chǎn)品設(shè)計(jì):解讀銀行卡支付背后的原理

0 評(píng)論 8299 瀏覽 65 收藏 16 分鐘

現(xiàn)代生活已經(jīng)離不開(kāi)的銀行卡支付,背后的產(chǎn)品設(shè)計(jì)還是大有門道的。本文作者對(duì)銀行卡支付的原理進(jìn)行了分析梳理,與大家分享。

上次寫了一篇『輕輕一掃,立刻扣款,付款碼背后的原理你不想知道嗎』 ,今天小黑哥再來(lái)跟大家聊聊支付。

雖然現(xiàn)在我們主流的支付方式是使用支付寶/微信支付,但是當(dāng)我們余額不足,或者選擇從銀行卡扣款時(shí),將就會(huì)使用到銀行卡支付。

所以今天我們就來(lái)來(lái)講講銀行卡支付的相關(guān)原理,科普一下銀行卡支付整個(gè)流程。

銀行卡支付可以將其分為線上支付與線下支付。其中線下支付分類就比較簡(jiǎn)單,就是我們平常在商城購(gòu)物時(shí),POS 機(jī)刷卡支付。

而線上支付分類就比較多了,根據(jù)銀行卡類別,可以分為信用卡支付與借記卡支付。按照支付行為,我們又可以將其分為快捷支付,網(wǎng)銀支付,Token 支付。

今天我們主要來(lái)聊聊快捷支付與網(wǎng)銀支付,這兩種方式是目前比較流行的方式。其他幾種方式,我們可以后面再來(lái)聊聊。

一、網(wǎng)銀支付

首先我們來(lái)聊聊網(wǎng)銀支付,這種方式在 10 年前,應(yīng)該是最主流線上支付方式。

我們以電商購(gòu)物為例,我們?cè)诰W(wǎng)站上下單之后,選擇銀行卡支付通常會(huì)跳轉(zhuǎn)到一個(gè)收銀臺(tái)頁(yè)面。然后在收銀臺(tái)頁(yè)面我們選擇相關(guān)銀行,點(diǎn)擊到銀行支付最后將會(huì)跳轉(zhuǎn)到相應(yīng)的銀行頁(yè)面。

這個(gè)收銀臺(tái)頁(yè)面可能是商戶的頁(yè)面,也可能是支付機(jī)構(gòu)的頁(yè)面,這個(gè)跟網(wǎng)銀支付對(duì)接模式有關(guān)。

跳轉(zhuǎn)到銀行頁(yè)面之后,我們首先需要下載按照銀行安全控件,這樣我們才能輸入銀行卡的相關(guān)信息。其次我們還需要使用銀行給的安全設(shè)備,比如 USB 盾,令牌器,令牌碼等。

在銀行網(wǎng)站支付成功之后,就可以點(diǎn)擊返回同步跳回到電商的網(wǎng)站,整個(gè)流程如下圖所示:

網(wǎng)銀支付流程

后臺(tái)支付流程如下:

可以看到網(wǎng)銀支付整個(gè)鏈路非常長(zhǎng),任何一步都可能發(fā)生失敗,所以支付成功率不會(huì)很高。另外有部分銀行網(wǎng)銀頁(yè)面只能在 IE 中打開(kāi),而且還有可能是很老版本的 IE。再加上網(wǎng)銀支付為了保證安全性,還需要使用 U 盾,安裝安全插件。

這個(gè)過(guò)程說(shuō)實(shí)話還是很復(fù)雜,還記得當(dāng)年使用某行網(wǎng)銀充值購(gòu)買黃鉆的時(shí)候,搞了一下午都沒(méi)成功的,各種證書安裝失敗啥的。第一次在線充值,就這么失敗告終。

感謝某行為我省下 10 元零花錢~

二、快捷支付

快捷支付,指的用戶提供卡信息給電商等商戶,商戶會(huì)在后臺(tái)將卡信息傳遞給支付機(jī)構(gòu),然后進(jìn)行協(xié)議綁定。一旦綁定成功,下次支付,無(wú)需再讓用戶提供卡號(hào)等信息。

還是以電商購(gòu)物支付為例,首次支付,需要經(jīng)歷綁卡過(guò)程。


扣款成功之后,前往銀行 APP 可以查到該卡與支付機(jī)構(gòu)綁定記錄。


歷次在電商網(wǎng)站下單支付時(shí),由于電商網(wǎng)站已保存記錄,所以無(wú)需再輸入卡信息。歷次支付流程如下:


上圖展示歷次支付過(guò)程還需要輸入驗(yàn)證碼的情況,這一步其實(shí)還可以做到一定額度的免密支付。

快捷支付接口一般可以歸為兩類:

  1. 簽約/支付
  2. 代扣支付

1. 簽約/支付

簽約/支付需要分為兩個(gè)步驟:

  1. 簽約申請(qǐng)/簽約驗(yàn)證
  2. 支付

簽約過(guò)程需要傳入銀行卡信息,銀行卡號(hào),戶名,身份證號(hào),手機(jī)號(hào),信用卡的話可能還需要傳入 cvv2 以及有效期。這個(gè)過(guò)程主要是為了鑒權(quán),校驗(yàn)銀行卡信息的正確性。

一旦支付機(jī)構(gòu)/銀行端信息校驗(yàn)成功,將會(huì)下發(fā)短信。用戶回填短信,就代表同意開(kāi)通快捷支付,建立綁定關(guān)系。綁定成功之后,支付機(jī)構(gòu)將會(huì)返回給商戶協(xié)議號(hào)

支付過(guò)程,商戶就可以拿著協(xié)議號(hào)進(jìn)行扣款。

整個(gè)后臺(tái)流程如下所示:

2. 代扣支付

代扣支付的過(guò)程相比簽約/支付就比較簡(jiǎn)單,每次直接上送銀行卡信息,就可以直接扣款。代扣支付原則上可以做到整個(gè)過(guò)程無(wú)密支付,即不需輸入驗(yàn)證碼,完成扣款。

流程較為簡(jiǎn)單,詳情可以參考快捷支付支付過(guò)程。

相比于簽約/支付過(guò)程,代扣支付看起來(lái)更快捷,但是這種方式安全風(fēng)險(xiǎn)就會(huì)比簽約支付大,可能就會(huì)出現(xiàn)盜刷現(xiàn)象。原本代扣接口本應(yīng)適用于水電煤等扣費(fèi)場(chǎng)景,但是發(fā)展過(guò)程一度被用于金融支付等場(chǎng)景。

現(xiàn)在這類接口正在慢慢下線,正在被新的商業(yè)委托接口(類似于簽約/支付)所代替。

雖然快捷支付支付體驗(yàn)好,整個(gè)流程無(wú)需跳轉(zhuǎn)到銀行頁(yè)面,支付過(guò)程不會(huì)被打斷,支付成功率高。

但是易用跟安全性,永遠(yuǎn)都是矛盾。由于這個(gè)過(guò)程用戶向商戶提供銀行卡相關(guān)信息,這些數(shù)據(jù)如果一旦被竊取,資金就可能會(huì)被盜取。另外,快捷支付,手機(jī)驗(yàn)證碼可能是最后一道防線,手機(jī)如果丟失,那么銀行卡資金也可能被盜取。

三、銀行支付相關(guān)問(wèn)題

總得來(lái)說(shuō),對(duì)接銀行卡支付渠道,整個(gè)過(guò)程不是很難的,無(wú)非就是按照接口文檔,拼接參數(shù),然后做一些相應(yīng)的調(diào)試。但是這個(gè)過(guò)程有些點(diǎn)需要特別注意。

1. 加簽/驗(yàn)簽

銀行卡支付一般通過(guò)互聯(lián)網(wǎng)傳輸,這個(gè)過(guò)程為了防止報(bào)文被串改,通常會(huì)采用 RSA2 ,國(guó)密等加密算法加密報(bào)文,得到簽名串,然后一起上送給支付機(jī)構(gòu)。

支付機(jī)構(gòu)方會(huì)進(jìn)行相應(yīng)的驗(yàn)簽,驗(yàn)簽失敗,就會(huì)駁回支付請(qǐng)求,這樣可以有效保證支付請(qǐng)求是從合法商戶發(fā)起。所以對(duì)于商戶來(lái)說(shuō),一定要保存好相應(yīng)公私鑰,不要隨意泄漏。

另外,對(duì)于支付請(qǐng)求的響應(yīng)信息/網(wǎng)銀結(jié)果異步通知,支付機(jī)構(gòu)端也會(huì)進(jìn)行加簽。商戶端一定要進(jìn)行驗(yàn)簽,只有驗(yàn)簽通過(guò)才能進(jìn)行下一步。

ps:發(fā)送請(qǐng)求由于不加簽,交易無(wú)法進(jìn)行,所以這一步肯定會(huì)做的。

但是返回信息你不進(jìn)行驗(yàn)簽,也能處理報(bào)文,這個(gè)可能就會(huì)被忽略。

我第一次對(duì)接相關(guān)支付渠道的時(shí)候,嫌麻煩,就沒(méi)進(jìn)行驗(yàn)簽?,F(xiàn)在想想,真的是心大。。。

2. 終態(tài)判定

對(duì)于快捷支付這類同步接口,對(duì)于支付接口請(qǐng)求響應(yīng)消息,我們需要判定請(qǐng)求是否成功,需要根據(jù)接口返回的響應(yīng)碼。有些接口也可能返回響應(yīng)碼與支付狀態(tài),那么我們就需要根據(jù)兩者結(jié)合起來(lái)一起判斷。

這個(gè)過(guò)程,不是說(shuō)除了成功的響應(yīng)碼之外,其他都算失敗。我們需要根據(jù)相關(guān)的接口文檔進(jìn)行相應(yīng)的分類,有些如余額不足,卡要素不正確等錯(cuò)誤碼,當(dāng)然可以明確歸類為失敗。

但是比如一些處理中,或者系統(tǒng)異常等返回碼,這種無(wú)法明確到底是成功還是失敗的,我們不能置為失敗,需要結(jié)合支付查詢或者異步通知結(jié)果,然后在做處理。

對(duì)于網(wǎng)銀支付這類同步接口,這類只能等待渠道端的異步通知。一般來(lái)說(shuō),渠道端只會(huì)通知的成功的支付訂單。

這個(gè)具體根據(jù)渠道端接口文檔。

一般來(lái)說(shuō)渠道異步通知接口,若沒(méi)有給渠道端異步通知返回成功響應(yīng),該通知將會(huì)重復(fù)通知,直到到達(dá)一定次數(shù)或者得到成功的相應(yīng)。

所以接受到異步通知之后,一定要內(nèi)部邏輯處理成功之后,才能返回成功響應(yīng)碼給渠道端。這樣即使內(nèi)部邏輯處理錯(cuò)誤,還能再次通過(guò)異步通知處理內(nèi)部邏輯。

另外還需要注意內(nèi)部處理邏輯的冪等性

3. 請(qǐng)求參數(shù)相關(guān)

(1)支付金額

請(qǐng)求過(guò)程一定要注意接口文檔中支付金額的單位,是分,還是元。如果不注意單位,很有可能造成少收,多收的情況。

對(duì)于成功響應(yīng)的信息,我們還需要注意校驗(yàn)上送金額與扣款金額(如果有返回的話)一致性。如果不一致,**一定不要將訂單更新為成功,**及時(shí)人工介入查單。

最后支付渠道上線之后,還需要做一些真實(shí)扣款,比如小額 0.1,渠道最大額度測(cè)試??劭畛晒χ?,還要及時(shí)查看銀行卡真實(shí)扣款金額是否與上送金額一致,原因見(jiàn)下文。

(2)請(qǐng)求流水號(hào)(訂單號(hào))

除了支付金額,我們還需要注意請(qǐng)求流水號(hào)/訂單號(hào)唯一性,需要使用唯一 id 當(dāng)做請(qǐng)求流水號(hào),切勿使用時(shí)間戳等方式。

對(duì)于重復(fù)流水號(hào),如果未成功,是允許重復(fù)支付的。如果成功,不允許再次支付的。但是也不乏有些機(jī)構(gòu)接口沒(méi)做好這部分校驗(yàn)。

舉一個(gè)自己趟過(guò)的坑,一個(gè)幾萬(wàn)的教訓(xùn)。之前對(duì)對(duì)接過(guò)某銀行的系統(tǒng),測(cè)試的時(shí)候?yàn)榱朔奖?,直接采用時(shí)間戳當(dāng)流水號(hào)。

上線時(shí)未及時(shí)發(fā)現(xiàn)這個(gè)問(wèn)題,某天恰好同一秒產(chǎn)生兩筆流水號(hào)一樣的單子,上送給銀行。然后對(duì)方返回兩筆都收款成功,但是第二天對(duì)賬時(shí)發(fā)現(xiàn)僅收到一筆單子的資金。所幸最后通過(guò)人工追回這筆資金,不然當(dāng)時(shí)賣了我,也賠不起啊。。。

雖然這個(gè)例子銀行端肯定也是存在問(wèn)題的,未做防重處理,但是只要我們做好唯一流水號(hào)的邏輯,也能避免該問(wèn)題。

真實(shí)慘痛例子

上面注意的問(wèn)題聊了這么多,其實(shí)想引起對(duì)接渠道技術(shù)同學(xué)注意。不要片面認(rèn)為支付機(jī)構(gòu)或銀行等系統(tǒng)很穩(wěn),不會(huì)有問(wèn)題。

程序畢竟是人寫的,一次升級(jí)改動(dòng),就有可能引起血崩。

所以不要過(guò)分相信對(duì)方系統(tǒng)的穩(wěn)定性,我們能做的就是做好我們自己系統(tǒng)的穩(wěn)定性,加入各種參數(shù)校驗(yàn),盡量降低風(fēng)險(xiǎn)的發(fā)生。

給大家舉幾個(gè)慘痛的例子:

曾經(jīng)對(duì)接過(guò)某銀行,小額測(cè)試,完全沒(méi)問(wèn)題。但是我們?cè)跍y(cè)試限額的時(shí)候,比如說(shuō)限額 1000 元,我們測(cè)試 1000.01 的時(shí)候,講道理這筆支付應(yīng)該會(huì)失敗。

但是這筆扣款成功了,并且查看銀行扣款記錄,僅僅只扣了 0.01 ??吹竭@個(gè),你是否有很多問(wèn)號(hào)???這 TM 竟然發(fā)生限額溢出。。。

哎,這種問(wèn)題,只能緊急下線該渠道,然后等待銀行端修復(fù)。

最后再舉幾個(gè)來(lái)自網(wǎng)上的例子,關(guān)于支付的漏洞。

來(lái)源:https://wooyun.js.org/drops/在線支付邏輯漏洞總結(jié).html

總結(jié)

今天我們主要聊了下銀行卡支線上支付的兩種主流模式,快捷支付與網(wǎng)銀支付。

快捷支付目前是現(xiàn)在最主流銀行卡支付方式,因?yàn)槭褂皿w驗(yàn)最好,支付流程不易被打斷。但是該模式相對(duì)來(lái)說(shuō)安全性較低。不過(guò)現(xiàn)在支付機(jī)構(gòu)端與銀行端會(huì)有相應(yīng)的風(fēng)控手段,大家不用過(guò)分擔(dān)心。

另外一點(diǎn)快捷支付,一般額度較小,通常最高額度可能只有幾萬(wàn)。

所以對(duì)于支付金額較大的場(chǎng)景,只能采用網(wǎng)銀支付這種方案。

最后聊了下銀行卡支付對(duì)接過(guò)程中一些問(wèn)題,有些例子,可以集成到測(cè)試案例中。每當(dāng)對(duì)接一個(gè)渠道時(shí),就可以按照案例執(zhí)行。

最后

支付系列的文章,小黑哥已經(jīng)更新幾篇,歷史文章可以查看下面相關(guān)閱讀。

后續(xù),小黑哥還會(huì)更新幾篇,聊聊支付寶/微信支付相關(guān)支付方式,聊聊支付過(guò)程中重復(fù)扣款等等。

如果各位同學(xué)還想了解其他支付相關(guān)的話題,可以在評(píng)論區(qū)留言。

參考文檔:

支付系統(tǒng)設(shè)計(jì):銀行卡支付(三)

#相關(guān)閱讀#

“輕輕一掃,立刻扣款”,解讀付款碼背后的原理

 

作者:樓下小黑哥;微信公號(hào)@程序通事,支付行業(yè),后端技術(shù)

本文由 @樓下小黑哥 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載

題圖來(lái)自Unsplash,基于CC0協(xié)議

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒(méi)評(píng)論,等你發(fā)揮!