本文翻譯自Chris Grant的《iOS9 Day-by-Day :: Day8 :: Apple Pay》(https://www.shinobicontrols.com/blog/ios9-day-by-day-day8-apple-pay)。感謝Chris Grant的辛苦工作!
iOS 8開始引入的Apple Pay是一種簡單、安全的支付方式,支持在應用內購買實際物品和服務。它允許用戶在支付的時候通過指紋進行授權。
只有部分iOS設備支持Apple Pay,其中包括iPhone 6、iPhone 6+、iPad Air以及iPad mini 3(本文翻譯的時候增加了iPhone 6S/iPhone 6S+和iPhone SE)。這是因為Apple Pay需要一個特殊的安全芯片的支持。該芯片用于存儲和加密關鍵數據。
我們不應該使用應用內購買(IAP)而不是Apple Pay解鎖程序功能。Apple Pay使用來購買實際商品和服務的,例如俱樂部會員、酒店預訂以及購票等。
為什么要使用Apple Pay
Apple Pay讓開發者變得更輕松。我們不再需要保存和處理卡號,也不需要用戶登錄。整個購買和付費信息和Apple Pay令牌一起被自動發送到支付處理器。這意味著更加簡單的支付流程,并將導致更高的轉化率。
在WWDC session 702(Apple Pay Within Apps)中,Nick Shearer給出了一些關于轉化率的統計數據。
- Stubhub的Apple Pay客戶的交易比普通客戶多20%。
- OpenTable整合Apple Pay后,交易增加了50%。
- Staples使用Apple Pay后,預訂增加到原來的109%。
創建一個簡單的商店應用
我們將通過在程序中設置一個簡單的商店來演示如何使用Apple Pay處理交易。這個只有一個商品的應用程序通過整合Apple Pay來演示Apple Pay的設置和使用。

上面就是我們將要創建的程序。當我們點擊購買按鈕,它會彈出顯示一個Apple Pay的表單。
啟用Apple Pay
在開始寫代碼之前,我們需要設置應用程序,使之支持Apple Pay。創建新的項目后,打開項目設置并跳轉到“Capabilities”標簽。

找到Apple Pay,并將它設置為啟用狀態。Xcode會讓我們選擇一個開發團隊。一般來說,一旦啟用Apple Pay,Xcode會自動完成所有的設置。
我們必須設置一個商家ID(Merchant ID),這樣蘋果就能知道如何給支付過程進行加密。在商家ID區域點擊添加按鈕,輸入一個唯一的商家。在這個例子里,我們使用merchat.com.shinobistore.applepay
。

這樣就完成了Apple Pay的設置,并且可以在應用程序中進行使用。
使用Apple Pay
到目前為止,我們已經設置好所有配置信息,下面開始構建一個允許用戶進行購買商品的界面。打開程序的故事板(Storyboard),添加一些控件來表示我們的商品。

由于只是進行演示,我們在界面上僅放置了一個圖片、標題和描述信息。然后在界面的底部添加一個購買按鈕PKPaymentButton
。該控件是iOS 8.3引入的。這個Apple Pay的支付按鈕進行了本地化。它給用戶提供了一個標準的指示器,表示支持Apple Pay。蘋果強烈建議我們使用這個按鈕來啟用Apple Pay。
該按鈕有三種可用樣式:
- White
- WhiteOutline
- Black
以及兩種不同的按鈕形式:
- Plain
- Buy
不過可惜的是,目前還不支持直接可視化的添加該按鈕。因此我們只能打開ViewController.swift
,并且修改viewDidLoad
方法如下。
override func viewDidLoad() {
super.viewDidLoad()
let paymentButton = PKPaymentButton(type:.Buy, style:.Black)
paymentButton.translatesAutoresizingMaskIntoConstraints = false
paymentButton.addTarget(self, action: "buyNowButtonTapped", forControlEvents: .TouchUpInside)
bottomToolbar.addSubview(paymentButton)
bottomToolbar.addConstraint(NSLayoutConstraint(item: paymentButton, attribute: .CenterX, relatedBy: .Equal, toItem: bottomToolbar, attribute: .CenterX, multiplier: 1, constant: 0))
bottomToolbar.addConstraint(NSLayoutConstraint(item: paymentButton, attribute: .CenterY, relatedBy: .Equal, toItem: bottomToolbar, attribute: .CenterY, multiplier: 1, constant: 0))
}
這段代碼是自說明的,因此我們繼續往下看。注意,我們真正關注的界面元素是這個支付按鈕。一旦點擊按鈕,調用buyNowButtonTapped:
,從而出發支付流程。

到這里,我們已經設置好應用程序界面。下面開始處理購買流程。在開始之前,我們需要先對Apple Pay支付流程中所使用到的各個類有一個深刻的理解。
PKPaymentSummaryItem
該對象簡化對Apple Pay支付中商品的表示。它可以表示任何的商品。
PKPaymentRequest
PKPaymentRequest
包含了客戶購買的商品以及支付所需的比如商家、國家碼以及現金代碼等信息。
PKPaymentAuthorisationViewController
PKPaymentAuthorisationViewController
提示用戶授權PKPaymentRequest
,并且選擇郵寄地址以及合法的支付卡。
PKPayment
PKPayment
包含支付過程中所需的所有信息和確認信息。
上面的所有類都來自PassKit
框架(以PK
開頭),因此在使用的時候,我們需要引入這個框架。
設置一個支付
設置支付的第一步是創建一個PKPaymentRequest
對象,見一下代碼:
func buyNowButtonTapped(sender: UIButton) {
// Networks that we want to accept.
let paymentNetworks = [PKPaymentNetworkAmex,
PKPaymentNetworkMasterCard,
PKPaymentNetworkVisa,
PKPaymentNetworkDiscover]
第一個需要設置的是可以使用的支付網絡。它設置了允許使用的信用卡種類。
if PKPaymentAuthorizationViewController.canMakePaymentsUsingNetworks(paymentNetworks) {
然后檢查該設備是否支持Apple Pay。如果返回YES
表示支持:
let request = PKPaymentRequest()
// This merchantIdentifier should have been created for you in Xcode when you set up the ApplePay capabilities.
request.merchantIdentifier = "shinobistore.com.day-by-day."
request.countryCode = "US" // Standard ISO country code. The country in which you make the charge.
request.currencyCode = "USD" // Standard ISO currency code. Any currency you like.
request.supportedNetworks = paymentNetworks
request.merchantCapabilities = .Capability3DS // 3DS or EMV. Check with your payment platform or processor.
如果該設備支持支付功能,我們就可以使用上面的代碼啟動支付請求。注釋說明了每一行代碼的功能。
// Set the items that you are charging for. The last item is the total amount you want to charge.
let shinobiToySummaryItem = PKPaymentSummaryItem(label: "Shinobi Cuddly Toy", amount: NSDecimalNumber(double: 22.99), type: .Final)
let shinobiPostageSummaryItem = PKPaymentSummaryItem(label: "Postage", amount: NSDecimalNumber(double: 3.99), type: .Final)
let shinobiTaxSummaryItem = PKPaymentSummaryItem(label: "Tax", amount: NSDecimalNumber(double: 2.29), type: .Final)
let total = PKPaymentSummaryItem(label: "Total", amount: NSDecimalNumber(double: 29.27), type: .Final)
這些是我們希望在Apple Pay列表中顯示的產品,將用于設置支付請求對象。
request.paymentSummaryItems = [shinobiToySummaryItem, shinobiPostageSummaryItem, shinobiTaxSummaryItem, total]
有意思的是,這個數組的最后一個元素將是用戶最終需要支付的內容。這樣做剛開始的時候并不是很明確。但是Apple Pay確實是按照表單中的最后一條的金額進行支付。因此我們如果有多條記錄時,需要計算總和,并添加一個額外的PKPaymentSummary
對象到列表的最后。
// Create a PKPaymentAuthorizationViewController from the request
let authorizationViewController = PKPaymentAuthorizationViewController(paymentRequest: request)
// Set its delegate so we know the result of the payment authorization
authorizationViewController.delegate = self
// Show the authorizationViewController to the user
presentViewController(authorizationViewController, animated: true, completion: nil)
最后剩下來的就是創建一個PKPaymentAuthorizationViewController
對象來支付列表。記得設置它的代理來獲取支付結果。

實現PKPaymentAuthorizationViewController
的代理方法來獲取支付的結果是否成功以及完成時機。
我們需要在paymentAuthorizationViewController:didAuthorizePayment
中處理支付數據,并將它們的結果返回給應用程序。在方法中獲取到的PKPayment
對象有一個PKPaymentToken
令牌屬性,需要我們發送給支付提供者。這是一個安全的加密數據:
func paymentAuthorizationViewController(controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, completion: (PKPaymentAuthorizationStatus) -> Void) {
paymentToken = payment.token
// You would typically use a payment provider such as Stripe here using payment.token
completion(.Success)
// Once the payment is successful, show the user that the purchase has been successful.
self.performSegueWithIdentifier("purchaseConfirmed", sender: self)
}
我們需要在paymentAuthorizationViewControllerDidFinish
隱藏視圖控制器。
func paymentAuthorizationViewControllerDidFinish(controller: PKPaymentAuthorizationViewController) {
self.dismissViewControllerAnimated(true, completion: nil)
}
這就是整個Apple Pay的支付流程。很明顯,在顯示世界中,我們需要將支付令牌返回給支付提供者,比如Stripe
,但這不是本課程需要討論的內容。我們還可以添加一個簡單的視圖控制器來顯示訂單以及支付令牌的ID。這是一個用于表示這次交易的全球唯一的字符串。

更多信息
關于Apple Pay的更多信息,建議觀看WWDC session 702(Apple Pay Within Apps)。這將是很長的一課,但是如果對集成Apple Pay感興趣的話,非常值得我們去觀看。中間有一節介紹了如何改進支付流程中的用戶體驗。
同樣,在蘋果的開發者網站上有一個Apple Pay指南。它包含了許多關于Apple Pay集成的有用信息。
別忘了還可以在GitHub上下載本課程的示例代碼。
戴維營教育
戴維營教育(Dive In Education),潛心做IT職業教育!緊跟時代潮流,不弄虛作假!不忘初心!