Apple Pay 應用內支付流程分析

接入方式算法

 Apple Pay接入方式的選擇上有兩種。一種是使用 CUP SDK(CUP 就是 China Union Pay)等第三方的 SDK。另一種就是使用 iOS 的 PassKit Framework 和銀聯的接口來接入。本質上來講,第三方 SDK 就是對 PassKit Framework 和傳輸信息的加密解密過程作了一層封裝,讓開發者能夠輕鬆完成 Apple Pay 的接入。兩種接入方式對比:第一種使用第三方 SDK 接入的方式開發成本較低,但缺點在於對 Payment Sheet 定製化程度不夠。而第二種形式的缺點就是開發成本較高。不只 iOS 端要處理好 Payment Sheet 的顯示和隱藏的邏輯,還要對各類異常狀況作好相應的 UI 處理。同時在後臺也須要處理好如下狀況:支付信息的解密,銀聯接口的交互,以及訂單狀態的處理。安全

支付流程分析
服務器

要理解 Apple Pay 的支付流程,其中最關鍵一點就是:Apple 不處理跟扣款相關的邏輯,它只負責支付信息的傳遞。Apple 經過 Touch ID 來驗證銀行卡卡持有者身份。實際的扣款行爲則是發生在銀聯端,接入了 Apple Pay 的商戶組織好 Apple 返回的支付信息,向銀聯發出扣款請求以後,該筆交易纔會真正發生扣款。因此,商戶仍是要跟銀聯進行結算的,Apple Pay 只是提供了一種支付渠道。app

Apple Pay 應用內支付流程以下異步

1.App 根據使用場景顯示 Payment Sheet。函數

2.用戶選擇須要進行支付的卡以及支付須要的我的信息後,進行指紋驗證,以後根據狀況,有些銀行卡還須要輸入卡對應的密碼(PIN 碼)加密

3.iOS 將支付相關信息發送到 Apple 的服務器,進行加密。而後經過回調函數將加密後的支付信息返回給對應 App。spa

4.App 在收到回調以後,將對應信息發送到本身的服務器。code

5.服務器在收到 App 發送來的支付信息後,對數據進行解密操做,提取其中須要的信息,組織銀聯接口報文,調用銀聯的接口,完成扣款orm

下面對過程當中的關鍵地方作一些說明。

App 收到的 Payment sheet 回調信息中,包含了一個 PKPayment 的對象,該對象包含了全部跟 Apple Pay 支付相關全部信息。好比用戶的手機號或者收貨地址等等,其中最重要的就是 payment token,它的 paymentData 字段數據就是須要發送給服務器的內容。用戶信息部分是明文的,而支付信息也就是 paymentData 部分則是被加密過的。

paymentData 的內容是 Json 格式的二進制流,服務器在收到這個數據以後進行解析,其中的 header.wrappedKey 是使用非對稱加密算法加密過的對稱祕鑰。使用在蘋果開發者後臺配置 merchant 時的私鑰進行解密,會獲得這個對稱祕鑰。而後用這個對稱祕鑰對 data 字段所包含的加密數據進行解密,能夠獲得 Apple 返回的與支付相關的信息。此支付信息是加密過的,包含了用戶支付的卡號和 PIN 碼等信息,理論上只有銀聯才能解析出來真正的內容,咱們做爲商戶是看不到具體信息的。服務器端須要將這些解密過的信息組織成銀聯所需的報文內容,而後調用銀聯的扣款接口,完成扣款。

以上的服務器端對 paymentData 的解密流程,咱們後臺的同窗近期會整理並開源出來,方便你們使用。有一點須要特別注意:paymentData 裏的有一個交易金額字段,但該字段返回的數據並非實際支付的金額。在組織銀聯報文的時候必定要注意不要直接使用該字段的內容做爲扣款金額的值。

調用銀聯接口時也有一些須要注意的事項。拿調用銀聯扣款接口舉例,在組織好報文並調用銀聯接口發送給銀聯以後,銀聯的接口返回結果同時有同步和異步兩種形式。注意:若是同步結果返回成功,說明銀聯成功收到並開始處理扣款請求,並非表明扣款成功。扣款是否成功,是經過異步形式來通知的。扣款不成功的緣由可能有不少,好比卡被凍結,PIN 碼錯誤,餘額不足等等。爲了保證交易狀態的準確,推薦的作法是這樣:在調用扣款接口後,若是 3 秒內沒有收到本次調用的異步結果回調,則使用銀聯的流水號,開始輪詢銀聯的交易狀態接口來確保拿到確切的交易結果。

總結

Apple Pay 是很重視數據安全的。從上面的流程能夠看到,爲了保證整個交易的安全,Apple Pay 對每一個關鍵流程都有加密處理。同時對每一個綁定了 Apple Pay 的銀行卡生成一個虛擬卡號,這個卡號的部分信息能夠在 wallet 裏綁定的卡片詳情裏看到。在實際支付中是用的這個卡號來作交易,這樣能夠在必定程度上保證咱們銀行卡的信息安全。

最後,如何將 Apple Pay 接入到 App 中,要結合自身的產品作出選擇。若是隻是將 Apple Pay 做爲現有支付手段的一種補充,那麼使用第三方 SDK 是一種省時省力的選擇。若是須要跟 Apple Pay 作深度集成以及 Payment Sheet 的高度定製化,那麼就須要使用 PassKit Framework 和銀聯接口方式來接入。

相關文章
相關標籤/搜索