ApplePayStubs 0.2

ApplePayStubs 0.2

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
已发布上次发布2015年5月

Jack Flintermann 维护。



  • 作者
  • Jack Flintermann 和 Stripe

这是什么?

ApplePay 神奇。然而,由于它尚未在所有国家推出,并且在一些最新的 iOS 设备上才推出,我们希望使开发者更容易规划和测试他们的 Apple Pay 集成。

我们为对 ApplePay 感兴趣的企业创建了一个替代组件 PKPaymentAuthorizationViewController(涉及 ApplePay 交易的主要类)称为 STPTestPaymentAuthorizationViewController。这些类在视觉上相似,行为几乎相同。主要区别是 STPTestPaymentAuthorizationViewController 返回测试信用卡和地址,而不是访问用户 iPhone 上存储的实际信息。您可以使用它构建和测试围绕 ApplePay 的所有 UI 和应用逻辑,并在您获得适当的测试设备后将其切换为真实内容。

请注意,这仅限 测试和开发目的

依赖项

  • Xcode 6+
  • iOS 8+

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 返回的 PKPaymentPKPaymentToken 有模拟(无效)的此数据版本,但 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教程