ApplePay 神奇。然而,由于它尚未在所有国家推出,并且在一些最新的 iOS 设备上才推出,我们希望使开发者更容易规划和测试他们的 Apple Pay 集成。
我们为对 ApplePay 感兴趣的企业创建了一个替代组件 PKPaymentAuthorizationViewController
(涉及 ApplePay 交易的主要类)称为 STPTestPaymentAuthorizationViewController
。这些类在视觉上相似,行为几乎相同。主要区别是 STPTestPaymentAuthorizationViewController
返回测试信用卡和地址,而不是访问用户 iPhone 上存储的实际信息。您可以使用它构建和测试围绕 ApplePay 的所有 UI 和应用逻辑,并在您获得适当的测试设备后将其切换为真实内容。
请注意,这仅限 测试和开发目的。
ApplePayStubs 还依赖于 PassKit
框架。
使用 Cocoapods 或手动将文件添加到您的仓库中。
您以使用 PKPaymentAuthorizationViewController
的相同方式创建和使用 STPTestPaymentAuthorizationViewController
的实例。
// ViewController.m
- (void)checkoutButtonTapped {
PKPaymentRequest *request = ...;
UIViewController *controller;
#if DEBUG
controller = [[STPTestPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
controller.delegate = self;
#else
controller = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
controller.delegate = self;
[self presentViewController:controller];
}
STPTestPaymentAuthorizationViewController
将在适当的时间在其代理上触发的相同的 PKPaymentAuthorizationViewControllerDelegate
回调。
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didSelectShippingAddress:(ABRecordRef)address
completion:(void (^)(PKPaymentAuthorizationStatus status, NSArray *shippingMethods, NSArray *summaryItems))completion {
[self fetchShippingCostsForAddress:address completion:^(NSArray *shippingMethods, NSError *error) {
if (error) {
completion(PKPaymentAuthorizationStatusFailure, nil, nil);
return;
}
completion(PKPaymentAuthorizationStatusSuccess, shippingMethods, [self summaryItemsForShippingMethod:shippingMethods.firstObject]);
}];
}
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didSelectShippingMethod:(PKShippingMethod *)shippingMethod
completion:(void (^)(PKPaymentAuthorizationStatus, NSArray *summaryItems))completion {
completion(PKPaymentAuthorizationStatusSuccess, [self summaryItemsForShippingMethod:shippingMethod]);
}
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {
[self dismissViewControllerAnimated:YES completion:nil];
}
当用户完成选择卡片时,与往常一样,STPTestPaymentAuthorizationViewController
将在其代理上调用 paymentAuthorizationViewController:didAuthorizePayment:completion
。该代理方法包括一个 PKPayment
对象,该对象本身包含一个实例 PKPaymentToken
,其中包含您将传递给您的支付处理程序(例如 Stripe)的加密信用卡数据。虽然 ApplePayStubs 返回的 PKPayment
和 PKPaymentToken
有模拟(无效)的此数据版本,但 Stripe API 将能够在测试模式下识别它们。因此,您不需要修改现有的 PKPaymentAuthorizationViewControllerDelegate
方法
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus))completion {
[[STPAPIClient sharedClient] createTokenWithPayment:payment
completion:^(STPToken *token, NSError *error) {
[self createBackendChargeWithToken:token
completion:^(STPBackendChargeResult status, NSError *error) {
if (status == STPBackendChargeResultSuccess) {
completion(PKPaymentAuthorizationStatusSuccess);
} else {
completion(PKPaymentAuthorizationStatusFailure);
}
}];
}];
}
(注意:从 Apple Pay 创建的 Stripe 令牌可以与手动收集的信用卡详细信息创建的令牌完全互换)。
如果你没有使用Stripe,你可以在PKPayment
对象的PKPaymentToken
中的transactionIdentifier
字段找到所选卡信息,格式为"ApplePayStubs~{card_number}~{amount_in_cents}~{currency}~{uuid}"
。
如果你想看到更多使用这个的示例,我们已经在我们的示例应用中使用ApplePayStubs,用于我们主要的iOS库。
如果你想了解如何使用Stripe在iOS上一般地接受付款,请阅读我们的iOS教程。