iOS 9: Day by Day 第八天 Apple Pay集成

本文翻譯自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職業教育!緊跟時代潮流,不弄虛作假!不忘初心!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容