移動支付方式要被這壺老酒顛覆了

  • 2019 年 10 月 28 日
  • 筆記

最近華為推出了一種"新穎"的支付方式:碰一碰支付。用戶使用手機接觸一下支付標籤,就可以調起支付程式,輸入密碼就可以完成支付。這一支付方式被一眾KOL捧上了天:「移動支付的未來」,"顛覆支付寶和微信的支付方式"…講真的,你們難道忘記了Apple pay么?新壺老酒也值得炒一番?不過這酒真香…

今天我們就來喝一喝這壺老酒!

先聞酒香

碰一碰支付,Apple Pay,Google Pay,Samsung Pay,Mi Pay, 華為Pay… 這些碰一下就能支付的方式到底是什麼呢?答案就是近場通訊,簡稱NFC。近場通訊又稱近距離無線通訊,其本身來說就是一套通訊協議,能讓兩個電子設備在相距幾厘米之內進行通訊。

NFC早期進入我們生活中應用場景多見於交通卡,各種會員卡以及門禁卡。最早由諾基亞在2006年推出了帶NFC功能的手機,但是由於比較小眾,並沒有被大眾所熟悉。大眾對NFC功能的手機有所了解和應用還是在Google的Android Beam和三星的S beam推出之後,NFC主要用來傳輸網址,地圖資訊,聯繫人以及Wi-Fi Direct的預連接。然而代替銀行卡和信用卡的支付功能卻遲遲沒有推出,一方面是局限於銀行的合作,另一方面用戶也一片看衰,認為不夠安全,以至於直到15年各廠商才正式推出。同期中國的終端廠商和移動運營商另闢蹊徑,用NFC的技術使手機代替了公交卡和門禁卡,這一「黑科技」受到很多人的歡迎和追捧。現在很多品牌都在開發自己的錢包應用,讓自己的設備支援近場支付,近場支付開始逐漸普及開來。

幹了這壺老酒

要實現這種碰一碰的支付方式是非常複雜的,裡面涉及到很多金融方面的問題。但是其本質還是在碰一碰的過程中傳輸了用戶的賬戶ID(虛擬賬戶ID),因此今天我們就通過Android上實現NFC數據交換來了解下這種碰一碰支付的原理。

基礎知識

開始之前,我們先來了解一些乾貨(請自帶水壺,很乾難以下噎)。

01

NFC的工作原理

完成一次近場通訊必須得有兩個設備,NFC發起設備(主設備),NFC接收設備(從設備)。主設備提供射頻場,它可以選擇不同的傳輸速度。從設備本身不必要產生射頻場。在接受到主設備的射頻場後,自身通過負載調製技術,即可以通過相同的速度將數據傳回發起設備。

02

NFC的工作模式

01

讀寫模式: 設備本身作為主設備,提供射頻磁場,用來讀寫卡片,標籤等等。比如POS機,手機,門禁…

02

卡模擬模式: 設備本身作為從設備(被當做是某種射頻技術的卡片),本身不提供射頻場。 比如:Apply pay,Google pay…

03

點對點模式: 兩個設備之間建立連接並傳輸數據。如: Android Beam

講到這裡了,就要解釋下,為什麼前有Apply pay,Google pay以及各種其他pay,華為的碰一碰還會被各KOL炒起來呢?因為區別於其他pay的工作模式,碰一碰pay是利用了讀寫模式,而非卡模擬模式。這其中的區別就在於碰一碰這種支付方式,收款方只要有一個標籤(卡片)即可,而Apply pay等其他支付方式,收款方則需要一個pos機。一張卡片的成本也就是幾毛錢,而一個pos機的成本要大得多。

那麼我為什麼要說這是一壺老酒呢?因為其工作原理是一樣的。只不過一個是作為主設備,一個是作為從設備,工作的模式不同而已。

03

NFC TAG

NFC TAG也就是NFC 標籤,NFC工作中的從設備,淘寶上可以買到各種各樣的標籤,有紙片狀的,也有卡片狀的。價格低廉,白卡可自行寫入讀取。有興趣的可以買來玩一玩。

Tips:一般標籤內只會記錄用戶的ID資訊,而不會將其他資訊或者金額記錄在卡片內

NFC的實現

一般來說,完成一次Apple pay之類的模擬支付,需要一台手機和一個pos機; 完成一次碰一碰的模擬支付,需要一台手機和一個標籤。但是我現在既沒有pos機,也沒有NFC標籤。但是通過上面的介紹可以知道,這兩種支付方式里,手機一個是作為主設備的,一個是作為從設備的。那麼我們就可以通過兩台Android手機來模擬一次支付場景。

01

主設備的實現

從上面的工作原理圖中可以看出,主設備需要在從設備靠近時,發現從設備,向從設備發送初始命令,接受從設備應答

發現從設備

當TAG靠近時,支援NFC功能的Android設備系統內的TAG分發系統會將TAG資訊通過Intent的方式發送到相關應用,相關應用通過過濾Itnent就可以接受到TAG的資訊,如果說有多個應用能夠處理Intent的話,那麼系統將會彈出選項讓用戶選擇處理TAG。

Android提供了三個Action用來過濾Intent:

  • ACTION_NDEF_DISCOVERED
  • ACTION_TECH_DISCOVERED
  • ACTION_TAG_DISCOVERED

優先順序由高到低

從設備過濾

對於不同的Action有不同的過濾方式:

對於 ACTION_NDEF_DISCOVERED的Action,過濾方式有兩種,一種是MIME TYPE 一種是URL

對於 ACTION_TECH_DISCOVERED的Action,則是通過TAG的Tech來過濾的

獲取從設備資訊

NFC Service將TAG發現的Intent發送到各個應用時,是附加了TAG的資訊的。Intent中包含了三個資訊:

  • EXTRA_TAG Tag的對象
  • EXTRA_NDEF_MESSAGE NDEF Message的數組,在發送NDEF_DISCOVERED Action的intent時,這個是必須的
  • EXTRA_ID 一個低級別的標籤標識

獲取TAG對象

解析NDEF Message數據

從設備讀寫

獲取從設備的對象之後,就可以對從設備進行讀寫操作,對於不同標準的從設備,讀寫的命令不同。詳細的命令需要參照各個從設備對應的標準規範,例如IsoDep遵守的是ISO/IEC 7816-4定義的應用數據協議單元規範,而NfcA 遵守的是ISO/IEC 14443 type A的協議

IosDep選擇AID的命令發送與接收

很慚愧,對於ISO/IEC 7816-4的協議不夠了解,所以這裡只有參考google sample里的 SELECT AID的命令

Android官網上也提供了對 MIFARE Ultralight TAG 讀寫的例子,有興趣的童鞋可以看看。

02

從設備的實現

手機被當做一個從設備被其他設備讀取,這種工作模式叫做卡模擬模式,這種模式的實現方式有兩種:

  1. 帶有安全單元的模擬卡模式
  2. 基於主機的模擬卡模式。

這兩種實現方式區別在於,在交易時,帶有安全單元的模式不會調起應用,而是讀取設備跟安全單元交互,完成後應用可以通過訪問安全單元來獲取交易狀態。而基於主機的模擬模式則是在交易時調用了相關的應用。

我們這裡先實現基於主機的模擬卡模式(Host-base Card Emulation),簡稱HCE。要實現這種方式,也比較簡單!

繼承HostApduService

首先,繼承HostApduService的服務,實現裡面兩個方法: processCommandApdu和onDeactivated;

  • processCommandApdu 這個方法是用來接受讀取設備發送過來的命令,並做出相應的回應。
  • onDeactivated 是在設備斷開連接時調用的。

processCommandApdu的具體實現

然後需要在Manifest文件中註冊此服務:

註冊服務

需要注意這裡有一個permission,表示具有BIND_NFC_SERVICE許可權的應用才能調起此服務,此許可權是系統許可權,其他應用無法申請此許可權,因此也保證了安全性。

服務指向了一個apdu服務的配置文件:

apdu配置

  • description:簡短的描述,有可能會展示在setting中
  • apduServiceBanner:一個圖片,規定大小為:260*96 dp,會展示在setting中
  • requireDeviceUnlock:服務響應是否需要螢幕解鎖
  • aid-group: 定義了能夠相應的AID,也就是說如果不是這些AID,這個服務不會被調起
  • category:AID的用途,一般payment 或者 other

03

許可權申請

無論是主設備還是從設備的實現,都必須要具有NFC功能的手機,因此許可權申請必不可少:

04

申明

由於對NFC通訊協議認知的局限性,文中沒有過多的展示主從設備通訊的程式碼。文中的程式碼也參考了Google Sample中關於CardReader和CardEmulation的實現。

聊聊這壺老酒

相比二維碼支付方式,近場支付便捷的地方在於,用戶不用事先打開支付APP和掃碼頁面,只需要將手機靠近收款設備即可調用出支付頁面。在凡事求快的生活節奏里,這樣的支付方式是必然的趨勢。但目前來說個人覺得近場支付想要取代二維碼的支付方式還需要很長一段時間,畢竟支援NFC的手機還沒普及。

咦?為什麼說話越來越像一眾的KOL了…我可是一名嚴謹的軟體工程師啊,skr~~

馮文龍

一個不怎麼專業的享米所屬前端開發