iOS-APP集成Apple Pay指南

版權聲明:本文為作者原創文章, 如果有相同的或者相似的,那將是我的榮幸。

Apple Pay是什么?

Apple Pay目前在國內上線已有一段時間,這意味著消費者可通過 蘋果手機、蘋果手表等智能設備來進行支付,它的功能類似一個“卡包”,講實體銀行卡虛擬到手機里,用戶可以綁定儲蓄卡或信用卡實現刷卡支付。


為什么使用Apple Pay

從理論上看:微信支付也好、支付寶也好,均屬于“結算平臺”,他們會透過銀聯,從你的銀行里提出現金代為托管;直至你把金錢放回銀行之前,都只能在微信/支付寶上使用。但 Apple Pay 只是一張電子信用卡,你的錢仍然在銀行里,付款時直接從銀聯向銀行提取。而從技上術上,微信支付也好、支付寶也好,在付款時都要透過相機或條碼機,讀取一次性的二維碼;而 Apple Pay 則透過近場通信 (NFC) 的方式,讀取 iPhone 上的 Token 令牌。

從實際上看:目前微信支付及支付寶的優勢在于低入場門檻:商店只要有臺智能手機,就毋須為移動支付購入/租用新設備,而消費者也不需要很高端的旗艦級設備。而 Apple Pay 優勢是良好的用戶體驗,使用 Apple Pay 付費,既安全、又快捷、隱私度也比較高。


設備支持有哪些要求?

Apple Pay需要支持NFC功能,目前只限于iPhone 6s、iPhone 6s Plus、iPhone 6、iPhone 6 Plus和Apple Watch這幾款設備使用。同時,用戶需講手機操作系統版本升級到iOS 9.2以上,Apple Watch則需要Watch OS 2.1版本以上。


Apple Pay如何使用?

iPhone上,先打開系統自帶的Wallet應用,后點右上角的?符號,這時你有兩個選擇,可以用攝像頭拍卡就能識別,也可以手動輸入,或者通過iTunes綁定,至于Apple Watch怎么使用,應該操作差不多,具體情況本人未去實踐,還望諒解。


Apple Pay環境配置

  • 配置Bundle ID


    14671699608022.jpg
  • 添加商戶的ID


    14671702234549.jpg
  • 把工程中對應的Bundle ID添加進去


    14671703281837.jpg
  • 點擊創建好的商戶ID


    14671705166905.jpg
  • 編輯商戶ID


    14671711439975.jpg
  • 添加CSR文件


    14671714784874.jpg
  • 下載配置好的商戶ID


    14671715087391.jpg

    14671715713657.jpg
  • 創建對應的App IDs


    14671716587260.jpg
  • 勾選Apple Pay


    14671717034194.jpg
  • 配置支付環境


    14671720852032.jpg
  • Clean一下工程,如果工程自動添加此文件則以上步驟正確


    14671720005926.jpg

App項目內部集成方式

Apple Pay使用了PassKit框架,所以需要導入相應頭文件

#import <PassKit/PassKit.h>

接收Apple Pay處理信息的回調,需要遵守協議,實現相應的代理方法

@interface ViewController ()<PKPaymentAuthorizationViewControllerDelegate>
@end

為了方便測試,觸發支付操作時間寫在touchBegan:方法中

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // code...
}

具體代碼實現如下:

  • 判斷設備是否支持Apple Pay快捷支付功能
if (![PKPaymentAuthorizationViewController canMakePayments]) {
        // 提示用戶該設備不支持Apple Pay快捷支付功能
        // code...
        return;
    }
  • 判斷設備是否綁定過可支付的銀行卡
    /**
     *  若沒有可用銀行卡,則跳轉到設置銀行卡界面
     *  PKPaymentNetworkVisa                Visa國際卡
     *  PKPaymentNetworkChinaUnionPay       中國銀聯
     *  PKPaymentNetworkDiscover            Discover(美國流行的信用卡)
     */
    if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay, PKPaymentNetworkDiscover]]) {
        
        // 進入設置銀行卡界面
        [[[PKPassLibrary alloc] init] openPaymentSetup];
        
    }

  • 設置商品參數
    // 創建商品
    NSDecimalNumber *firstAmount = [NSDecimalNumber decimalNumberWithString:@"1.11"];
    NSDecimalNumber *secondAmount = [NSDecimalNumber decimalNumberWithString:@"2.22"];
    NSDecimalNumber *thirdAmount = [NSDecimalNumber decimalNumberWithString:@"3.33"];
    
    NSDecimalNumber *amountSum = [NSDecimalNumber zero];
    amountSum = [amountSum decimalNumberByAdding:firstAmount];
    amountSum = [amountSum decimalNumberByAdding:secondAmount];
    amountSum = [amountSum decimalNumberByAdding:thirdAmount];
    
    /**
     *  @param label        商品名稱(英文名稱默認全部顯示大寫)
     *  @param amount       商品價格 - NSDecimalNumber類型
     */
    PKPaymentSummaryItem *firstItem = [PKPaymentSummaryItem summaryItemWithLabel:@"FirstItem" amount:firstAmount];
    PKPaymentSummaryItem *secondItem = [PKPaymentSummaryItem summaryItemWithLabel:@"SecondItem" amount:secondAmount];
    PKPaymentSummaryItem *thirdItem = [PKPaymentSummaryItem summaryItemWithLabel:@"ThirdtItem" amount:thirdAmount];
    
    PKPaymentSummaryItem *itemsSum = [PKPaymentSummaryItem summaryItemWithLabel:@"PJChao" amount:amountSum];
  • 創建支付請求(基本配置)
    PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
    
    // 設置商戶ID(merchant IDs)
    request.merchantIdentifier = @"merchant.com.zpj.ApplePayTest";
    
    // 設置國家代碼(中國大陸)
    request.countryCode = @"CN";
    
    // 設置支付貨幣(人民幣)
    request.currencyCode = @"CNY";
    
    // 設置商戶的支付標準(3DS支付方式必須支持,其他方式可選)
    request.merchantCapabilities = PKMerchantCapability3DS;
    request.paymentSummaryItems = @[firstItem, secondItem, thirdItem, itemsSum];
    
    /**
     *  以上參數都是必須的
     *  以下參數不是必須的
     */
     
    // 設置收據內容
    request.requiredBillingAddressFields = PKAddressFieldAll;
    
    // 設置送貨內容
    request.requiredShippingAddressFields = PKAddressFieldAll;
    
    // 設置送貨方式
    PKShippingMethod *method = [PKShippingMethod summaryItemWithLabel:@"阿敏" amount:[NSDecimalNumber decimalNumberWithString:@"10.00"]];
    method.identifier = @"阿敏物流";
    method.detail = @"12小時到達";
    
    request.shippingMethods = @[method];
  • 顯示支付界面
    PKPaymentAuthorizationViewController *paymentVC = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
    paymentVC.delegate = self;
    
    if (paymentVC == nil) return;
    
    [self presentViewController:paymentVC animated:YES completion:nil];
  • 代理方法的實現
#pragma mark - <PKPaymentAuthorizationViewControllerDelegate>
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                       didAuthorizePayment:(PKPayment *)payment
                                completion:(void (^)(PKPaymentAuthorizationStatus status))completion
{
    /**
     *  在這里支付信息應發送給服務器/第三方的SDK(銀聯SDK/易寶支付SDK/易智付SDK等)
     *  再根據服務器返回的支付成功與否進行不同處理
     *  這里直接返回支付成功
     */
    completion(PKPaymentAuthorizationStatusSuccess);
}

- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
    // 點擊支付/取消按鈕隱藏界面
    [controller dismissViewControllerAnimated:YES completion:nil];
}

附上測試結果

14671851652964.jpg

test.gif

14671854207186.jpg

終于寫完了,如果有什么問題,還望大神給予指點,Thank you。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容