背景
十幾年前我們?nèi)ド啼佡I東西是一個(gè)什么樣的場景呢?一手交錢一手交貨,我們把鈔票給店主店主把貨交給我們。交易是在雙方都認(rèn)可的情況下的等價(jià)值交換。
自從支付寶等電子支付手段出現(xiàn)后,我們直接用手機(jī)掃一掃就可以完成一筆交易,此時(shí)錢就從你的電子賬戶轉(zhuǎn)到了對方賬戶中。該過程這本質(zhì)就是把隨身攜帶的現(xiàn)金轉(zhuǎn)化為存放在遠(yuǎn)端服務(wù)器上電子貨幣(當(dāng)然你把錢放在第三方平臺的同時(shí)也給別人竊取你財(cái)富提供一個(gè)渠道)。
如果當(dāng)時(shí)沒有網(wǎng)絡(luò)你也沒有帶現(xiàn)金,此時(shí)交易是否完成呢?交易本質(zhì)要達(dá)到的目的是可靠安全的等價(jià)值交換。所以本文探討在沒有網(wǎng)絡(luò)情況下如何完成等價(jià)值交換(從技術(shù)上解決信任問題)。
在線支付邏輯推導(dǎo)
有網(wǎng)絡(luò)的情況下,店主d的掃碼槍掃描用戶u的二維碼。此時(shí)錢從用戶u是否已經(jīng)轉(zhuǎn)移到d是可以立刻知道的,因?yàn)樵摴P交易能夠立馬完成。
首先我們知道掃碼支付是免密小額支付,由于是免密為了安全性我們需要從時(shí)間維度進(jìn)行控制。比如動態(tài)口令(二維碼)是一次性的且每個(gè)幾分鐘刷新一次,防止被被人拿去掃描。
具體交互邏輯見如下圖:

離線支付是一種什么樣的情況
離線就是沒有網(wǎng)絡(luò),離線有兩種情況。1).用戶u手機(jī)網(wǎng)絡(luò)斷了(與支付寶服務(wù)器連接不上了)。2).店主D掃碼槍與用戶u的網(wǎng)絡(luò)都斷了(都連不了支付寶服務(wù)器)
網(wǎng)絡(luò)斷了結(jié)果就是如下圖所示打+型號的信息就走不通了,請看下圖:

下面會根據(jù)這兩種斷網(wǎng)情況分別討論。
case1:只有用戶u手機(jī)斷網(wǎng)情形
沒有網(wǎng)絡(luò)的時(shí)候,支付寶app對應(yīng)的二維碼如何生成的呢?用掃碼槍掃描的時(shí)候我如何保證用戶不會搞一個(gè)假的二維碼,我如何知道二維碼不是假造的合法的呢? 很自然想到在有網(wǎng)絡(luò)的時(shí)候,支付寶app就可以把預(yù)先把一些令牌緩存起來,這樣使用的時(shí)候從支付寶app本地提取二維碼就可以。
其交互邏輯就是如下圖所示:

該邏輯的本質(zhì)是,通過扣款電腦搭橋做安全驗(yàn)證。
case2:用戶手機(jī)和掃碼槍都斷網(wǎng)的情況
我們知道用戶手機(jī)斷網(wǎng)的情況,可以從支付寶app本地獲取可用二維碼(如沒有用光且可用的話)。但是如果掃碼槍斷網(wǎng)我們又如何處理呢?
斷網(wǎng)就不能支付么,讓我們思考一下。其實(shí)我們對時(shí)間不是非常嚴(yán)格的要求,等有網(wǎng)絡(luò)了一兩天之后再拿到錢也是可以的。我們要考慮的是店主d確實(shí)可以拿到這么多錢,我們不一定需要同期等價(jià)值交換,我們需要的等價(jià)值交換(同期、跨期都可以)。
怎么保證一定是等價(jià)值交換呢?怎么保證等網(wǎng)絡(luò)連上之后一定會從用戶u的賬戶扣錢轉(zhuǎn)入店主d的賬戶中。很自然的想到該扣錢動作不是用戶u控制的,而是具有權(quán)威和公信的第三方機(jī)構(gòu)保障的。
怎么控制這個(gè)動作呢?由于網(wǎng)絡(luò)沒有聯(lián)通信息沒有辦法閉環(huán),所以我們可以想著把該筆交易記錄存放在本地終端(比如在掃碼槍終端執(zhí)行一筆記賬操作),等網(wǎng)絡(luò)連通之后再通過該記記錄完成資金的轉(zhuǎn)移。

該邏輯的本質(zhì)就是先記賬等聯(lián)網(wǎng)后再做安全驗(yàn)證,其目前大部分支付系統(tǒng)中的記賬模塊原理是一樣的(只是需要記賬的原因不一樣)。
說在后面的話
突然想到這個(gè)問題,帶著好奇心把其邏輯梳理了一遍。我們面對陌生的場景會感覺摸不著邊,一個(gè)好辦法是逐步的從簡單到復(fù)雜把場景再現(xiàn)分析,比如這里的單向斷網(wǎng)到這里的雙向斷網(wǎng)。