背景
十幾年前我們去商鋪買東西是一個什么樣的場景呢锌仅?一手交錢一手交貨,我們把鈔票給店主店主把貨交給我們良蒸。交易是在雙方都認可的情況下的等價值交換技扼。
自從支付寶等電子支付手段出現(xiàn)后,我們直接用手機掃一掃就可以完成一筆交易嫩痰,此時錢就從你的電子賬戶轉到了對方賬戶中剿吻。該過程這本質就是把隨身攜帶的現(xiàn)金轉化為存放在遠端服務器上電子貨幣(當然你把錢放在第三方平臺的同時也給別人竊取你財富提供一個渠道)。
如果當時沒有網(wǎng)絡你也沒有帶現(xiàn)金串纺,此時交易是否完成呢丽旅?交易本質要達到的目的是可靠安全的等價值交換。所以本文探討在沒有網(wǎng)絡情況下如何完成等價值交換(從技術上解決信任問題)纺棺。
在線支付邏輯推導
有網(wǎng)絡的情況下榄笙,店主d的掃碼槍掃描用戶u的二維碼。此時錢從用戶u是否已經(jīng)轉移到d是可以立刻知道的祷蝌,因為該筆交易能夠立馬完成茅撞。
首先我們知道掃碼支付是免密小額支付,由于是免密為了安全性我們需要從時間維度進行控制。比如動態(tài)口令(二維碼)是一次性的且每個幾分鐘刷新一次米丘,防止被被人拿去掃描剑令。
具體交互邏輯見如下圖:
離線支付是一種什么樣的情況
離線就是沒有網(wǎng)絡,離線有兩種情況拄查。1).用戶u手機網(wǎng)絡斷了(與支付寶服務器連接不上了)吁津。2).店主D掃碼槍與用戶u的網(wǎng)絡都斷了(都連不了支付寶服務器)
網(wǎng)絡斷了結果就是如下圖所示打+型號的信息就走不通了,請看下圖:
下面會根據(jù)這兩種斷網(wǎng)情況分別討論堕扶。
case1:只有用戶u手機斷網(wǎng)情形
沒有網(wǎng)絡的時候碍脏,支付寶app對應的二維碼如何生成的呢?用掃碼槍掃描的時候我如何保證用戶不會搞一個假的二維碼稍算,我如何知道二維碼不是假造的合法的呢典尾? 很自然想到在有網(wǎng)絡的時候,支付寶app就可以把預先把一些令牌緩存起來邪蛔,這樣使用的時候從支付寶app本地提取二維碼就可以急黎。
其交互邏輯就是如下圖所示:
該邏輯的本質是,通過扣款電腦搭橋做安全驗證侧到。
case2:用戶手機和掃碼槍都斷網(wǎng)的情況
我們知道用戶手機斷網(wǎng)的情況,可以從支付寶app本地獲取可用二維碼(如沒有用光且可用的話)淤击。但是如果掃碼槍斷網(wǎng)我們又如何處理呢匠抗?
斷網(wǎng)就不能支付么,讓我們思考一下污抬。其實我們對時間不是非常嚴格的要求汞贸,等有網(wǎng)絡了一兩天之后再拿到錢也是可以的。我們要考慮的是店主d確實可以拿到這么多錢印机,我們不一定需要同期等價值交換矢腻,我們需要的等價值交換(同期、跨期都可以)射赛。
怎么保證一定是等價值交換呢多柑?怎么保證等網(wǎng)絡連上之后一定會從用戶u的賬戶扣錢轉入店主d的賬戶中。很自然的想到該扣錢動作不是用戶u控制的楣责,而是具有權威和公信的第三方機構保障的竣灌。
怎么控制這個動作呢?由于網(wǎng)絡沒有聯(lián)通信息沒有辦法閉環(huán)秆麸,所以我們可以想著把該筆交易記錄存放在本地終端(比如在掃碼槍終端執(zhí)行一筆記賬操作)初嘹,等網(wǎng)絡連通之后再通過該記記錄完成資金的轉移。
該邏輯的本質就是先記賬等聯(lián)網(wǎng)后再做安全驗證沮趣,其目前大部分支付系統(tǒng)中的記賬模塊原理是一樣的(只是需要記賬的原因不一樣)屯烦。
說在后面的話
突然想到這個問題,帶著好奇心把其邏輯梳理了一遍。我們面對陌生的場景會感覺摸不著邊驻龟,一個好辦法是逐步的從簡單到復雜把場景再現(xiàn)分析甸箱,比如這里的單向斷網(wǎng)到這里的雙向斷網(wǎng)。