在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ iOS/ 授權(quán)支付
創(chuàng)建支付請求
處理支付
配置你的開發(fā)環(huán)境
授權(quán)支付
關(guān)于 Apple Pay

授權(quán)支付

支付授權(quán)過程是由支付授權(quán)視圖控制器與其委托合作完成的。支付授權(quán)視圖控制器做了兩件事:

  1. 讓用戶選擇支付請求所需的賬單信息與配送信息。
  2. 讓用戶授權(quán)支付操作。

用戶與視圖控制器交互時,委托方法會被系統(tǒng)調(diào)用,所以在這些方法中你的應(yīng)用可以更新所要顯示的信息。例如在配送地址修改后更新配送價格。在用戶授權(quán)支付請求后此方法還會被調(diào)用一次。

注意:

在實現(xiàn)這些委托方法時,你應(yīng)該謹記它們會被多次調(diào)用并且這些方法調(diào)用的順序是取決與用戶的操作順序的。

所有的這些委托方法在授權(quán)過程中都會被調(diào)用,傳入該方法的其中一個參數(shù)是一個完成塊 (completion block)。支付授權(quán)視圖控制器等待一個委托完成相應(yīng)的方法后 (通過調(diào)用完成塊) 再依次調(diào)用其它的委托方法。paymentAuthorizationViewControllerDidFinish: 方法是唯一例外:它并不需要一個完成塊作為參數(shù),它可以在任何時候被調(diào)用。

完成塊接受一個輸入?yún)?shù),該參數(shù)為應(yīng)用程序根據(jù)信息判斷得到的支付事務(wù)的當前狀態(tài)。如果支付事務(wù)一切正常,則應(yīng)傳入值 PKPaymentAuthorizationStatusSuccess。否則,可以傳入能識別出錯誤的值。

創(chuàng)建 PKPaymentAuthorizationViewController 類的實例時,你需要將已初始化后的支付請求傳遞給視圖控制器初始化函數(shù)。接著,設(shè)置視圖控制器的委托;然后再顯示它:

PKPaymentAuthorizationViewController *viewController = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
if (!viewController) { /* ... Handle error ... */ }
viewController.delegate = self;
[self presentViewController:viewController animated:YES completion:nil];

當用戶與視圖控制器交互時,視圖控制器就會調(diào)用其委托方法:

注意:

在 Xcode 7.0 及其后的版本中,你可以在模擬器中測試支付授權(quán)視圖控制器。這些版本的模擬器提供了支持所有支付網(wǎng)絡(luò)的虛擬卡,它會以純文本的方式返回虛擬支付數(shù)據(jù)。在設(shè)備上時,這些數(shù)據(jù)會使用商戶 ID 進行加密。

雖然模擬器可以方便快捷地測試支付代碼,但是你仍然需要在物理設(shè)備上測試你的支付功能。

如果你使用的是較早版本的 Xcode,那么你就只能在物理設(shè)備上測試你的支付功能了。

使用委托方法更新配送方式與配送費用

當用戶輸入配送信息時,授權(quán)視圖控制器會調(diào)用委托的 paymentAuthorizationViewController:didSelectShippingContact:completion: 方法和 paymentAuthorizationViewController:didSelectShippingMethod:completion: 方法。你可以實現(xiàn)這兩個方法來更新你的支付請求。

- (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                   didSelectShippingContact:(CNContact *)contact
                                 completion:(void (^)(PKPaymentAuthorizationStatus, NSArray *, NSArray *))completion
{
    self.selectedContact = contact;
    [self updateShippingCost];
    NSArray *shippingMethods = [self shippingMethodsForContact:contact];
    completion(PKPaymentAuthorizationStatusSuccess, shippingMethods, self.summaryItems);
}

- (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                    didSelectShippingMethod:(PKShippingMethod *)shippingMethod
                                 completion:(void (^)(PKPaymentAuthorizationStatus, NSArray *))completion
{
    self.selectedShippingMethod = shippingMethod;
    [self updateShippingCost];
    completion(PKPaymentAuthorizationStatusSuccess, self.summaryItems);
}

注意:

為了保護用戶隱私,提供給方法 paymentAuthorizationViewController:didSelectShippingContact:completion: 的配送信息是經(jīng)過匿名化處理后的數(shù)據(jù)。返回的 contact 包含了計算配送費用的所有信息同時隱藏了用戶的敏感信息。只有在用戶授權(quán)支付后,你才能得到用戶完整的配送信息。此外, contact 中的數(shù)據(jù)會隨著國家的不同而不同,同時還會隨著版本的更新而變化。請仔細測試你的應(yīng)用程序。

支付被授權(quán)時創(chuàng)建了一個支付令牌

當用戶授權(quán)一個支付請求時,支付框架的 Apple 服務(wù)器與安全模塊會協(xié)作創(chuàng)建一個支付令牌。你可以在委托方法 paymentAuthorizationViewController:didAuthorizePayment:completion: 中將支付信息以及其它你需要處理的信息,例如配送地址和購物車標識符,一起發(fā)送至你的服務(wù)器。這個過程如下所示:

  • 支付框架將支付請求發(fā)送至安全模塊。只有安全模塊會訪問令牌化后的設(shè)備相關(guān)的支付卡號。
  • 安全模塊將特定卡的支付數(shù)據(jù)和商家信息一起加密(加密后的數(shù)據(jù)只有 Apple 可以訪問),然后將加密后的數(shù)據(jù)發(fā)送至支付框架。支付框架再將這些數(shù)據(jù)發(fā)送至 Apple 的服務(wù)器。
  • Apple 服務(wù)器使用商家標識證書將這些支付數(shù)據(jù)重新加密。這些令牌只能由你以及那些與你共享商戶標識證書的人讀取。隨后服務(wù)器生成支付令牌再將其發(fā)送至設(shè)備。
  • 支付框架調(diào)用 paymentAuthorizationViewController:didAuthorizePayment:completion: 方法將令牌發(fā)送至你的委托。你在委托方法中再將其發(fā)送至你的服務(wù)器。

在服務(wù)器上的處理操作取決于你是自己處理支付還是使用其它支付平臺。不過,在兩種情況下服務(wù)器都得處理訂單再將處理結(jié)果返回給設(shè)備。在設(shè)備上,委托再將處理結(jié)果傳入完成處理方法中,詳細過程請參閱 處理支付

- (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                        didAuthorizePayment:(PKPayment *)payment
                                 completion:(void (^)(PKPaymentAuthorizationStatus))completion
{
    NSError *error;
    ABMultiValueRef addressMultiValue = ABRecordCopyValue(payment.billingAddress, kABPersonAddressProperty);
    NSDictionary *addressDictionary = (__bridge_transfer NSDictionary *) ABMultiValueCopyValueAtIndex(addressMultiValue, 0);
    NSData *json = [NSJSONSerialization dataWithJSONObject:addressDictionary options:NSJSONWritingPrettyPrinted error: &error];

    // ... Send payment token, shipping and billing address, and order information to your server ...

    PKPaymentAuthorizationStatus status;  // From your server
    completion(status);
}

委托方法中釋放支付授權(quán)視圖控制器

支付框架顯示完支付事務(wù)狀態(tài)后,授權(quán)視圖控制器會調(diào)用委托的 aymentAuthorizationViewControllerDidFinish: 方法。在此方法的實現(xiàn)中,你應(yīng)該釋放授權(quán)視圖控制器然后再顯示與應(yīng)用相關(guān)的支付信息界面。

- (void) paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
    [controller dismissViewControllerAnimated:YES completion:nil];
}