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发送到开发者自己公司的服务器。

服务器上的操作,取决于你们公司是自己处理订单还是用其他支付平台。不管是哪种情况,你们的服务器都要在处理之后向手机返回状态,具体操作见下节Apple Pay编程指南(5) - 处理付款结果

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

示例:LGApplePayDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值