Apple Pay接入詳細教程

來源:互聯網
上載者:User

標籤:

                         Apple Pay接入詳細教程 

來源:Yasin的簡書 

連結:http://www.jianshu.com/p/738aee78ba52#

 

Apple Pay運行環境:iPhone6以上裝置,作業系統最低iOS9.0以上,部分資訊設定需要iOS9.2以上。目前還不支援企業認證添加。

環境搭建好後可以在模擬器上面運行,xcode7.2.1+iPhone6SP9.2系統下,系統會綁定幾種虛擬銀行卡,和幾個連絡人,方便調試,支付也不會發生真實的付款,真的很方便。

[TCO]

 

準備工作

在接入Apple Pay之前,首先要申請MerchantID及對應認證。

請移步我寫的申請MerchantID及對應認證詳細圖文教程

 

工程設定

bundleID設定

 

 

Capability中啟用Apple Pay許可權,並選擇merchantID。

 


之後項目會多一個Applepay的設定檔ApplePayYasin.entitlements

 


需要引用的庫


Xcode7.0以上不需要再手動添加需要引用的庫了,只需要匯入標頭檔就可以了


#import <PassKit/PassKit.h>                                 //使用者綁定的銀行卡資訊

#import <PassKit/PKPaymentAuthorizationViewController.h>    //Apple pay的展示控制項

#import <AddressBook/AddressBook.h>                         //使用者聯絡資訊相關


裝置Applepay許可權檢測

    if (![PKPaymentAuthorizationViewController class]) {

        //PKPaymentAuthorizationViewController需iOS8.0以上支援

        NSLog(@"作業系統不支援ApplePay,請升級至9.0以上版本,且iPhone6以上裝置才支援");

        return;

    }

    //檢查當前裝置是否可以支付

    if (![PKPaymentAuthorizationViewController canMakePayments]) {

        //支付需iOS9.0以上支援

        NSLog(@"裝置不支援ApplePay,請升級至9.0以上版本,且iPhone6以上裝置才支援");

        return;

    }

    //檢查使用者是否可進行某種卡的支付,是否支援Amex、MasterCard、Visa與銀聯四種卡,根據自己項目的需要進行檢測

    NSArray *supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard,PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay];

    if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetworks]) {

        NSLog(@"沒有綁定支付卡");

        return;

    }


建立支付請求PKPaymentRequest


  • 初始化PKPaymentRequest


這裡需要注意RMB的幣種代碼是CNY

//設定幣種、國家碼及merchant標識符等基本資料

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

  payRequest.countryCode = @"CN";     //國家代碼

  payRequest.currencyCode = @"CNY";       //RMB的幣種代碼

  payRequest.merchantIdentifier = @"merchant.ApplePayDemoYasin";  //申請的merchantID

  payRequest.supportedNetworks = supportedNetworks;   //使用者可進行支付的銀行卡

  payRequest.merchantCapabilities = PKMerchantCapability3DS|PKMerchantCapabilityEMV;      //設定支援的交易處理協議,3DS必須支援,EMV為可選,目前國內的話還是使用兩者吧

  • 設定發票配送資訊和貨物配送地址資訊,使用者佈建後可以通過代理回調代理擷取資訊的更新

//    payRequest.requiredBillingAddressFields = PKAddressFieldEmail;   

//如果需要郵寄賬單可以選擇進行設定,預設PKAddressFieldNone(不郵寄賬單)

//樓主感覺賬單郵寄地址可以事先讓使用者選擇是否需要,否則會增加客戶的輸入麻煩度,體驗不好,

  payRequest.requiredShippingAddressFields = PKAddressFieldPostalAddress|PKAddressFieldPhone|PKAddressFieldName;

  //寄送地址資訊,這裡設定需要地址和連絡方式和姓名,如果需要進行設定,預設PKAddressFieldNone(沒有寄送地址)

 

送貨資訊頁面展示

 

  • 設定貨物的配送方式,不需要不配置

 

//設定兩種配送方式

  PKShippingMethod *freeShipping = [PKShippingMethod summaryItemWithLabel:@"包郵" amount:[NSDecimalNumber zero]];

  freeShipping.identifier = @"freeshipping";

  freeShipping.detail = @"6-8 天 送達";

 

  PKShippingMethod *expressShipping = [PKShippingMethod summaryItemWithLabel:@"極速送達" amount:[NSDecimalNumber decimalNumberWithString:@"10.00"]];

  expressShipping.identifier = @"expressshipping";

  expressShipping.detail = @"2-3 小時 送達";

 

  payRequest.shippingMethods = @[freeShipping, expressShipping];

 

 

 

 

  • 賬單資訊的設定

 

  • 每條賬單的設定

賬單列表使用PKPaymentSummaryItem添加描述和價格,價格使用NSDecimalNumber。

PKPaymentSummaryItem初始化:

label為商品名字或者是描述,amount為商品價格,折扣為負數,type為該條賬單為最終價格還是估算價格(比如出租車價格預估)


+ (instancetype)summaryItemWithLabel:(NSString *)label amount:(NSDecimalNumber *)amount;

+ (instancetype)summaryItemWithLabel:(NSString *)label amount:(NSDecimalNumber *)amount type:(PKPaymentSummaryItemType)type NS_AVAILABLE(NA, 9_0);

  • NSDecimalNumber初始化:

NSDecimalNumber可以使用數字初始化,也可以使用字串。

使用方法請移步我寫的NSDecimalNumber--十進位數

  • 添加賬單列表:

 

NSDecimalNumber *subtotalAmount = [NSDecimalNumber decimalNumberWithMantissa:1275 exponent:-2 isNegative:NO];   //12.75

PKPaymentSummaryItem *subtotal = [PKPaymentSummaryItem summaryItemWithLabel:@"商品價格" amount:subtotalAmount];

 

NSDecimalNumber *discountAmount = [NSDecimalNumber decimalNumberWithString:@"-12.74"];      //-12.74

PKPaymentSummaryItem *discount = [PKPaymentSummaryItem summaryItemWithLabel:@"優惠折扣" amount:discountAmount];

 

NSDecimalNumber *methodsAmount = [NSDecimalNumber zero];

PKPaymentSummaryItem *methods = [PKPaymentSummaryItem summaryItemWithLabel:@"包郵" amount:methodsAmount];

 

NSDecimalNumber *totalAmount = [NSDecimalNumber zero];

totalAmount = [totalAmount decimalNumberByAdding:subtotalAmount];

totalAmount = [totalAmount decimalNumberByAdding:discountAmount];

totalAmount = [totalAmount decimalNumberByAdding:methodsAmount];

PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"Yasin" amount:totalAmount];  //最後這個是支付給誰。哈哈,快支付給我

 

summaryItems = [NSMutableArray arrayWithArray:@[subtotal, discount, methods, total]];

//summaryItems為賬單列表,類型是 NSMutableArray,這裡設定成成員變數,在後續的代理回調中可以進行支付金額的調整。

payRequest.paymentSummaryItems = summaryItems;


顯示購物資訊並進行支付

//ApplePay控制項

    PKPaymentAuthorizationViewController *view = [[PKPaymentAuthorizationViewController alloc]initWithPaymentRequest:payRequest];

    view.delegate = self;

    [self presentViewController:view animated:YES completion:nil];


PKPaymentAuthorizationViewControllerDelegate代理


  • 這裡還有兩個類要介紹

  • PKPayment 支付成功資訊

     

 

PKPaymentToken *payToken = payment.token;

//支付憑據,發給服務端進行驗證支付是否真實有效

PKContact *billingContact = payment.billingContact;     //賬單資訊

PKContact *shippingContact = payment.shippingContact;   //送貨資訊

PKContact *shippingMethod = payment.shippingMethod;     //發貨方式

 

  • PKContact 連絡人資訊


NSPersonNameComponents *name = contact.name;                //連絡人姓名

CNPostalAddress *postalAddress = contact.postalAddress;     //連絡人地址

NSString *emailAddress = contact.emailAddress;              //連絡人郵箱

CNPhoneNumber *phoneNumber = contact.phoneNumber;           //連絡人手機

NSString *supplementarySubLocality = contact.supplementarySubLocality;  //補充資訊,地址詳細描述,其他備忘等等,iOS9.2及以上才有

 

  • 代理說明


寄送地址回調

 

-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller

                didSelectShippingContact:(PKContact *)contact

                              completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<PKShippingMethod *> * _Nonnull, NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{

  //contact寄送地址資訊,PKContact類型

  //送貨資訊選擇回調,如果需要根據寄送地址調整發貨方式,比如普通地區包郵+極速配送,偏遠地區只有付費普通配送,進行支付金額重新計算,可以實現該代理,返回給系統:shippingMethods配送方式,summaryItems賬單列表,如果不支援該送貨資訊返回想要的PKPaymentAuthorizationStatus

  completion(PKPaymentAuthorizationStatusSuccess, shippingMethods, summaryItems);

}


發貨方式回調

 

-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller

                 didSelectShippingMethod:(PKShippingMethod *)shippingMethod

                              completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{

  //配送方式回調,如果需要根據不同的發貨方式進行支付金額的調整,比如包郵和付費加速配送,可以實現該代理

  PKShippingMethod *oldShippingMethod = [summaryItems objectAtIndex:2];

  PKPaymentSummaryItem *total = [summaryItems lastObject];

  total.amount = [total.amount decimalNumberBySubtracting:oldShippingMethod.amount];

-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller

                 didSelectShippingMethod:(PKShippingMethod *)shippingMethod

                              completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{

  //配送方式回調,如果需要根據不同的發貨方式進行支付金額的調整,比如包郵和付費加速配送,可以實現該代理

  PKShippingMethod *oldShippingMethod = [summaryItems objectAtIndex:2];

  PKPaymentSummaryItem *total = [summaryItems lastObject];

  total.amount = [total.amount decimalNumberBySubtracting:oldShippingMethod.amount];

  total.amount = [total.amount decimalNumberByAdding:shippingMethod.amount];

 

  [summaryItems replaceObjectAtIndex:2 withObject:shippingMethod];

  [summaryItems replaceObjectAtIndex:3 withObject:total];

 

  completion(PKPaymentAuthorizationStatusSuccess, summaryItems);

}  total.amount = [total.amount decimalNumberByAdding:shippingMethod.amount];

 

  [summaryItems replaceObjectAtIndex:2 withObject:shippingMethod];

  [summaryItems replaceObjectAtIndex:3 withObject:total];

 

  completion(PKPaymentAuthorizationStatusSuccess, summaryItems);

}


支付卡選擇回調

 

-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectPaymentMethod:(PKPaymentMethod *)paymentMethod completion:(void (^)(NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{

  //支付銀行卡回調,如果需要根據不同的銀行調整付費金額,可以實現該代理

  completion(summaryItems);

}


寄送地址回調,已棄用

 

-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectShippingAddress:(ABRecordRef)address completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<PKShippingMethod *> * _Nonnull, NSArray<PKPaymentSummaryItem *> * _Nonnull))completion{

  //寄送地址回調,已棄用

}

 

付款成功蘋果伺服器返回資訊回調,做伺服器驗證

 

-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller

                     didAuthorizePayment:(PKPayment *)payment

                              completion:(void (^)(PKPaymentAuthorizationStatus status))completion {

  PKPaymentToken *payToken = payment.token;

  //支付憑據,發給服務端進行驗證支付是否真實有效

  PKContact *billingContact = payment.billingContact;     //賬單資訊

  PKContact *shippingContact = payment.shippingContact;   //送貨資訊

  PKContact *shippingMethod = payment.shippingMethod;     //發貨方式

  //等待伺服器返回結果後再進行系統block調用

  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

      //類比伺服器通訊

      completion(PKPaymentAuthorizationStatusSuccess);

  });

}

 

支付完成回調

 

-(void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{

  [controller dismissViewControllerAnimated:YES completion:nil];

}

Apple Pay接入詳細教程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.