Разрешение оплаты
Процесс авторизации платежа является совместным усилием между контроллером представления авторизации платежа и его делегатом. Контроллер представления авторизации платежа делает две вещи: Это позволяет пользователю выбрать тарификацию и информацию о поставке, которая необходима платежному требованию, и это позволяет пользователю разрешить оплату, которая будет сделана. Методы делегата вызывают, когда пользователь взаимодействует с контроллером представления так, чтобы Ваше приложение могло обновить показанную информацию — например, для обновления стоимости перевозки, когда выбран адрес поставки. Делегата также вызывают после того, как пользователь авторизовывает платежное требование.
Все методы делегата, вызванные во время процесса авторизации, передаются блок завершения как один из их параметров. Контроллер представления авторизации платежа ожидает своего делегата, чтобы закончить отвечать на один метод (путем вызова блока завершения), прежде чем это вызовет любые другие методы делегата. paymentAuthorizationViewControllerDidFinish:
метод является единственным исключением: Это не берет блок завершения, и это можно вызвать в любое время.
Блоки завершения берут параметр, позволяющий Вам указать текущий статус транзакции на основе информации, это доступно. Если нет никаких проблем с транзакцией, Вы передаете значение PKPaymentAuthorizationStatusSuccess
; иначе, Вы передаете значение, идентифицирующее проблему.
Создать экземпляр PKPaymentAuthorizationViewController
класс, передайте платежное требование инициализатору контроллера представления. Установите делегата к контроллеру представления, и затем представьте его.
PKPaymentAuthorizationViewController *viewController = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
if (!viewController) { /* ... Handle error ... */ }
viewController.delegate = self;
[self presentViewController:viewController animated:YES completion:nil];
Поскольку пользователь взаимодействует с контроллером представления, контроллер представления вызывает свои методы делегата.
Ваш делегат обновляет способы доставки и затраты
Когда пользователь обеспечивает информацию о поставке, контроллер представления авторизации вызывает Вашего делегата paymentAuthorizationViewController:didSelectShippingAddress:completion:
и paymentAuthorizationViewController:didSelectShippingMethod:completion:
методы. Используйте эти методы для обновления платежного требования на основе новой информации.
- (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didSelectShippingAddress:(ABRecordRef)address
completion:(void (^)(PKPaymentAuthorizationStatus, NSArray *, NSArray *))completion
{
self.selectedShippingAddress = address;
[self updateShippingCost];
NSArray *shippingMethods = [self shippingMethodsForAddress:address];
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);
}
Когда оплата разрешена, маркер платежа создается
Когда пользователь авторизовывает платежное требование, платформа создает маркер платежа путем координирования с сервером Apple и Безопасным Элементом, который является специализированной микросхемой на устройстве пользователя. Вы отправляете этот маркер платежа в свой сервер в paymentAuthorizationViewController:didAuthorizePayment:completion:
метод делегата, вместе с любой другой информацией необходимо обработать закупку — например, адрес поставки и идентификатор покупательской корзины. Процесс происходит следующим образом:
Платформа отправляет платежное требование в Безопасный Элемент. Только Безопасный Элемент имеет доступ к маркируемым специфичным для устройства числам платежной карты.
Безопасный Элемент соединяет данные платежа для указанной карты и продавца, шифрует его так, чтобы только Apple мог считать его и отправил его в платформу. Платформа отправляет данные платежа в сервер Apple.
Сервер Apple повторно шифрует данные платежа так, чтобы только продавец мог считать его. Сервер тогда подписывает его, создавая маркер платежа, который это отправляет в устройство.
Платформа вызывает Ваш метод делегата с маркером, и Ваш делегат отправляет маркер в Ваш сервер.
Действия с Вашим сервером варьируются в зависимости от того, обрабатываете ли Вы свои собственные платежи или работаете с платежной платформой. В обоих случаях Ваш сервер обрабатывает порядок и передает состояние обратно устройству, которое Ваш делегат передает его обработчику завершения, как описано в Обработке Платежа.
- (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);
}
Ваш делегат отклоняет контроллер представления авторизации платежа
После того, как платформа выводит на экран состояние транзакции, контроллер представления авторизации вызывает Вашего делегата paymentAuthorizationViewControllerDidFinish:
метод. В Вашей реализации отклоните контроллер представления авторизации и затем выведите на экран свою собственную специфичную для приложения страницу подтверждения заказа.
- (void) paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
[controller dismissViewControllerAnimated:YES completion:nil];
}