天天看點

【轉】iOS開發 -- Apple Pay

技術部落格原位址:http://www.cnblogs.com/dashunzi/p/ApplePay.html#top

原技術部落格中有源碼和視訊,有感興趣的朋友可以研究一下!

一、什麼是Apple Pay?

  1. 概念

    Apple Pay,簡單來說, 就是一種移動支付方式。通過Touch ID/ Passcode,使用者可使用存儲在iPhone 6, 6p等裝置上的信用卡和借記卡支付證書來授權支付; 它是蘋果公司在2014蘋果秋季新品釋出會上釋出的一種基于NFC的手機支付功能,于2014年10月20日在美國正式上線,2016年2月18日淩晨5:00, Apple Pay 業務在中國上線。

  2. 使用前提

    (1). 支援裝置

Apple Pay支援的硬體裝置 (表1)

線上 線下 線上&線下
iPad Pro Apple Watch iPhone 6
iPad Air 2 iPhone 6 Plus
iPad mini 3  iPhone 6s
iPad mini 4 iPhone 6s Plus

    (2). 系統支援(iOS8.0+版本, 注意:iOS9.2才真正的支援“銀聯支付”, 意味着iOS9.2以後才可以在中國市場使用)

    (3). 銀行支援

        需要将被支援銀行的銀行卡, 添加到手機wallet應用當中

        

【轉】iOS開發 -- Apple Pay

二、 應用場景?

  1. 線下支付

    > 除下使用前提之外, 還要求      

    > 商家支援(要求必須有支援NFC的刷卡機)

      如果發現以下辨別,就代表該商家支援Apple Pay

      

【轉】iOS開發 -- Apple Pay

      蘋果公開的Apple Pay商家有: 

【轉】iOS開發 -- Apple Pay

  2. 線上支付

    > 除下使用前提之外, 還要求

    > App 支援

      目前支援Apple Pay支付方式的App并不多。很多公司也在內建當中,這也是寫這篇部落格的目的。

唯品會   大衆點評  
【轉】iOS開發 -- Apple Pay
【轉】iOS開發 -- Apple Pay

       目前, 蘋果公開的支援Apple Pay的APP清單

【轉】iOS開發 -- Apple Pay

 三、 與微信支付以及支付寶等第三方支付平台的差別?

  1. 硬體方面

    Apple Pay:必須是iOS裝置, 而且是按照線上支付和線下支付區分不同的真機裝置(具體參考表1)

    微信、支付寶: 基本跟硬體裝置無關, 支援大多數的隻能手機

  2. 網絡環境要求

    Apple Pay:線上支付需要聯網, 線下支付無需聯網就可以支付

    微信、支付寶: 無論是線上還是線下支付, 都需要聯網使用

  3. 使用技術

    Apple Pay:線下支付使用的是 基于NFC的近場通訊技術

    微信、支付寶: 線下支付使用的是 掃碼支付(條形碼、二維碼)

  4. 主要功能

    Apple Pay:線上支付、線下支付、部分更新後的ATM機可以取款

    微信、支付寶: 線上支付、線下支付、轉賬、理财等

  5. 安全性能

    Apple Pay:不保留銀行卡資訊,并且不會暴漏給外界、不分流銀行存款(不需要從銀行卡轉錢到另外一個平台)、不能充值  安全性較高

    微信、支付寶: 密碼保護,身份驗證等手段保護賬戶  安全性相對稍差

  6. 支付時長

    Apple Pay:無論是線上支付,還是線下支付, 隻需要驗證指紋即可支付。非常迅速

    微信、支付寶: 需要掃碼支付, 流程相對繁瑣,是以時長較長

  7. 各自弊端

    Apple Pay:隻适用于蘋果裝置, 支付場景單一,無轉賬理财等業務

    微信、支付寶: 安全性較差, 必須聯網操作,需要充值到對應平台

 四、線上支付內建步驟

 1. 配置支付環境

  • 使用XCode建立一個工程, 并設定好對應的BundleID
  • 注冊并配置一個商業标示符
    • 添加一個App ID
    • 配置Merchant ID
    • 為Merchant ID 配置證書, 并下載下傳證書安裝到鑰匙串
    • 檢查安裝到鑰匙串中的證書是否有效
    • 綁定Merchant ID 到 APP ID

 2. 配置Xcode 項目

    • 調整系統最低部署版本(iOS8.0)
    • 開啟Apple Pay功能

 3. 代碼實作

  • 判斷目前裝置是否可以支付
  • 判斷"Wallet有沒有添加該支付網絡的儲蓄卡/信用卡"
  • 建立一個支付請求, 并配置各項資訊
  • 彈出授權控制器,讓使用者給支付授權
  • 處理支付憑證

 4. 伺服器處理

五、 具體步驟實作

   1. 配置支付環境

       

【轉】iOS開發 -- Apple Pay

      (1)添加一個App ID, 并勾選Apple Pay功能

          

【轉】iOS開發 -- Apple Pay

 

【轉】iOS開發 -- Apple Pay

      (2)配置Merchant ID

【轉】iOS開發 -- Apple Pay
【轉】iOS開發 -- Apple Pay

      (3)為Merchant ID 配置證書, 并下載下傳證書安裝到鑰匙串

【轉】iOS開發 -- Apple Pay
【轉】iOS開發 -- Apple Pay
【轉】iOS開發 -- Apple Pay

      (4)檢查安裝到鑰匙串中的證書是否有效

        問題描述: 有可能會出現

【轉】iOS開發 -- Apple Pay

提示

        問題原因: 系統根證書/中級證書頒發機構過期

        解決方案:   重新下載下傳證書, 并安裝,具體下載下傳清單看下圖

【轉】iOS開發 -- Apple Pay

     

      (5)綁定Merchant ID 到 APP ID

【轉】iOS開發 -- Apple Pay
【轉】iOS開發 -- Apple Pay

  

         

【轉】iOS開發 -- Apple Pay
【轉】iOS開發 -- Apple Pay
【轉】iOS開發 -- Apple Pay
【轉】iOS開發 -- Apple Pay
【轉】iOS開發 -- Apple Pay

     注意: 以上步驟截圖, 隻是關鍵處截圖, 如果在具體細節處遇到問題, 歡迎關注公衆号(王順子),共同探讨。或者參照具體視訊教程, 連結位址, 後續附上。

  3. 代碼實作    

    (1)判斷目前裝置是否可以支付

       

1

2

3

4

5

if

(![PKPaymentAuthorizationViewController canMakePayments])

{

NSLog

(@

"不能支付"

);

return

;

}

    (2)判斷"Wallet有沒有添加該支付網絡的儲蓄卡/信用卡"

       

6

7

8

9

10

11

12

if

(![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay]]) {

NSLog

(@

"Wallet沒有添加該支付網絡的儲蓄卡/信用卡"

);

// 建立一個設定按鈕

//        PKPaymentButton *button = [PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline];

//        [button addTarget:self action:@selector(jump) forControlEvents:UIControlEventTouchUpInside];

//        button.center = self.view.center;

//        [self.view addSubview:button];

return

;

}

    (3)建立一個支付請求, 并配置各項資訊

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

// 1. 建立一個支付請求

PKPaymentRequest *request = [[PKPaymentRequest alloc] init];

// 2. 參數配置

// 2.1 商店辨別

request.merchantIdentifier = @

"merchant.520it.com"

;

// 2.2 貨币代碼

request.currencyCode = @

"CNY"

;

// 2.3 國家編碼

request.countryCode = @

"CN"

;

// 2.4 支援的支付網絡(PKPaymentNetworkChinaUnionPay iOS9.2開始支援)

request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay];

// 2.5 支付請求包含一個支付摘要項目的清單

NSDecimalNumber

*price1 = [

NSDecimalNumber

decimalNumberWithString:@

"2"

];

PKPaymentSummaryItem *item1 = [PKPaymentSummaryItem summaryItemWithLabel:@

"手榴彈"

amount:price1];

NSDecimalNumber

*price2 = [

NSDecimalNumber

decimalNumberWithString:@

"6"

];

PKPaymentSummaryItem *item2 = [PKPaymentSummaryItem summaryItemWithLabel:@

"炸彈"

amount:price2 type:PKPaymentSummaryItemTypePending];

NSDecimalNumber

*totalAmount = [

NSDecimalNumber

zero];

totalAmount = [totalAmount decimalNumberByAdding:price1];

totalAmount = [totalAmount decimalNumberByAdding:price2];

PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@

"小碼哥财務中心"

amount:totalAmount type:PKPaymentSummaryItemTypePending];

// 注意: 數組最後一個是總價格

request.paymentSummaryItems = @[item1, item2, total];

// 2.6 運輸方式

NSDecimalNumber

*shippingPrice = [

NSDecimalNumber

decimalNumberWithString:@

"18.0"

];

PKShippingMethod *method = [PKShippingMethod summaryItemWithLabel:@

"順豐快遞"

amount:shippingPrice];

method.detail = @

"24小時送到!"

;

method.identifier = @

"shunfeng"

;

request.shippingMethods = @[method];

request.shippingType = PKShippingTypeServicePickup;

// 2.7 通過指定merchantCapabilities屬性來指定你支援的支付處理标準,3DS支付方式是必須支援的,EMV方式是可選的,

request.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV | PKMerchantCapabilityCredit | PKMerchantCapabilityDebit;

// 2.8 需要的配送資訊和賬單資訊

request.requiredBillingAddressFields = PKAddressFieldAll;

request.requiredShippingAddressFields = PKAddressFieldAll;

// 2.9 存儲額外資訊

// 使用applicationData屬性來存儲一些在你的應用中關于這次支付請求的唯一辨別資訊,比如一個購物車的辨別符。在使用者授權支付之後,這個屬性的哈希值會出現在這次支付的token中。

request.applicationData = [@

"購物車ID: 123456"

dataUsingEncoding:

NSUTF8StringEncoding

];

    (4)彈出授權控制器,讓使用者給支付授權

// 3. 開始支付

PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];

if

(paymentPane == 

nil

) {

NSLog

(@

"授權控制器建立失敗"

);

return

;

}

paymentPane.delegate = 

self

;

[

self

presentViewController:paymentPane animated:

YES

completion:

nil

];

    (5)處理支付憑證(token)

/**

*  當授權成功之後會調用這個代理方法

*/

- (

void

)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller

didAuthorizePayment:(PKPayment *)payment

completion:(

void

(^)(PKPaymentAuthorizationStatus status))completion;

{

//    PKPayment *temp = payment;

NSLog

(@

"驗證授權---%@"

, payment.token);

NSLog

(@

"驗證通過後, 需要開發者繼續完成交易"

);

// 它需要你連接配接伺服器并上傳支付令牌和 其他資訊,以完成整個支付流程。

BOOL

isSuccess = 

YES

;

if

(isSuccess) {

completion(PKPaymentAuthorizationStatusSuccess);

}

else

{

completion(PKPaymentAuthorizationStatusFailure);

}

}

    (6)關閉授權控制器

/**

*  當授權成功之後或者取消授權之後會調用這個代理方法

*/

- (

void

)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller

{

NSLog

(@

"取消或者交易完成"

);

[

self

dismissViewControllerAnimated:

YES

completion:

nil

];

}

     * 支付授權的流程:

    • 架構發送支付請求給安全子產品,隻有安全子產品可以通路存儲在裝置上的标記化的卡資訊。 
    • 安全子產品把特定的卡和商家等支付資料加密,以保證隻有蘋果可以讀取,然後發送給架構。架構會将這些資料發送給蘋果。 
    • 蘋果伺服器再次加密這些支付資料,以保證隻有商家可以讀取。然後伺服器對它進行簽名,生成支付token,然後發送給裝置。 
    • 架構調用相應的代理方法并傳入這個token,然後你的代理方法傳送token給你的伺服器。

    

【轉】iOS開發 -- Apple Pay

  4. 伺服器接收到token後的一般處理流程

    • 驗證支付資料的哈希表和簽名 
    • 為加密過的支付資料解碼  
    • 向支付處理系統送出支付資料 
    • 向訂單追蹤系統送出訂單 

   處理支付請求時,你有兩個選擇;你既可以利用支付平台處理支付請求,也可以自己實作支付請求處理流程。一個常用的支付平台可以完成上述大部分操作。

   關于支援Apple Pay支付平台的更多資訊,請參考developer.apple.com/apple-pay/