你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> Apple Pay 應用內支付流程分析

Apple Pay 應用內支付流程分析

編輯:IOS開發基礎

1.jpg

作者:webfrogs

簡介

Apple Pay 已經正式上線,ENJOY 作為國內首批接入 Apple Pay 應用內支付的 App,並且是為數不多的直接使用 PassKit Framework 和銀聯接口的形式接入的應用,我們在產品上與 Apple Pay 做了深度集成。接下來把我們在接入過程中的一些經驗分享一下。本文並不涉及具體代碼,也不是講解 Apple Pay 如何接入的教程,只是結合我們的開發過程,介紹下在接入過程中需要注意的地方。

Apple Pay 是 Apple 推出的支付服務,支持線上支付和線下支付,對我們開發者而言,線下支付跟我們沒有太多關系。而線上支付的接入也並不復雜,關鍵在於要理解 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 只是提供了一種支付渠道。

Apple Pay 應用內支付流程如下

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

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

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

  4. App 在收到回調之後,將對應信息發送到自己的服務器。

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

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

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 和銀聯接口方式來接入。

參考資料

Apple Pay Programming Guide


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved