Apple Pay編程指南(4) - 支付授權

Apple Pay 系列文章是蘋果官方文檔的中文翻譯,這將是最詳盡最規範的說明。
原文鏈接:
蘋果開發文檔

Apple Pay編程指南(1) - 簡介
Apple Pay編程指南(2) - 環境配置
Apple Pay編程指南(3) - 創建支付請求
Apple Pay編程指南(4) - 支付授權
Apple Pay編程指南(5) - 處理付款結果
Apple Pay編程指南(6) -沙盒測試

支付授權過程是支付授權視圖控制器及其代理之間的合作工作。支付授權視圖控制器做兩件事:1. 讓用戶選擇支付請求所需的賬單和發貨信息,2. 讓用戶授權支付。當用戶與視圖控制器交互時,將調用代理方法,以便您的應用程序可以更新顯示的信息——例如,在選擇送貨地址時更新送貨價格。在用戶授權支付請求之後,還會調用代理。

注意:在實現委託方法時,請記住可以多次調用它們,並且調用它們的順序取決於用戶操作的順序。

在授權過程中調用的所有代理方法都會傳遞一個completion block。付款授權視圖控制器在調用任何其他委託方法之前,等待其委託完成對一個方法的響應(通過調用completion block)。paymentAuthorizationViewControllerDidFinish:方法是個例外:它不回傳completion block,並且可以在任何時候調用它。

completion block接受一個參數,該參數允許您根據可用的信息指定事務的當前狀態。如果交易沒有問題,您將傳遞PKPaymentAuthorizationStatusSuccess值;否則,傳遞一個標識問題的值。

要創建PKPaymentAuthorizationViewController類的實例,請將付款請求傳遞給視圖控制器的初始化器。爲視圖控制器設置代理,然後present它。

注意:
PKPaymentAuthorizationController類執行與PKPaymentAuthorizationViewController類相同的角色,但它不依賴於UIKit框架。這意味着授權控制器可以用於視圖控制器不能使用的地方(例如,在watchOS應用程序或intent擴展中)。
要使用PKPaymentAuthorizationController類,請設置一個遵循PKPaymentAuthorizationControllerDelegate協議的代理。調用presentWithCompletion:方法來顯示付款表。當您完成時,調用withcompletion:方法來取消付款表。api是相同的。

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

通過代理方法更新你的地址和金額

當用戶提供了地址信息時,授權控制器會調用兩個代理方法:

paymentAuthorizationViewController:didSelectShippingContact:completion:
paymentAuthorizationViewController:didSelectShippingMethod:completion:

在代理方法中更新支付請求的信息。

- (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:中提供的發貨信息是匿名的。返回的聯繫人包含足夠的信息來計算運費,而不顯示用戶的敏感信息。直到用戶批准付款後,纔會獲得用戶的完整發貨信息。此外,聯繫人中可用的數據因國家而異,並且可以隨發佈版本而異。確保適當地測試您的應用程序。

支付授權後會生成一個token

當用戶授權一個支付請求時,framework通過與蘋果的服務器和Secure Element調創建一個支付令牌。您可以在paymentAuthorizationViewController:didAuthorizePayment:completion: delegate方法中向開發者自己公司的服務器發送這個支付令牌,以及處理購買所需的任何其他信息—例如,送貨地址和購物車標識符。過程如下:

  1. framework將付款請求發送到Secure Element。只有Secure Element才能訪問經過標記的特定於設備的付款卡號。
  2. Secure Element將指定的卡和商戶的支付數據放在一起,對其進行加密,以便只有蘋果才能讀取數據,並將其發送到framework。然後,framework將支付數據發送到蘋果的服務器。
  3. 蘋果的服務器使用您的支付處理證書(Payment Processing certificate)重新加密支付數據。token只能由您和與您共享支付處理證書的人讀取。然後服務器簽署支付token,並將其返回給設備。
  4. framework通過調用其paymentAuthorizationViewController:didAuthorizePayment:completion:方法將令牌傳遞給代理。代理將token發送到開發者自己公司的服務器。

服務器上的操作,取決於你們公司是自己處理訂單還是用其他支付平臺。不管是哪種情況,你們的服務器都要在處理之後向手機返回狀態,具體操作見下節TODO。

- (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);
}

處理完成之後再代理方法中dismiss控制器

framework顯示交易狀態後,授權視圖控制器調用代理的paymentAuthorizationViewControllerDidFinish:方法。在您的實現中,dismiss授權視圖控制器,然後顯示您自己的特定於應用程序的訂單確認頁面。

- (void) paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
    [controller dismissViewControllerAnimated:YES completion:nil];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章