首页 > 解决方案 > PKPaymentAuthorizationController 不调用委托方法并在按下“取消”时冻结

问题描述

在我的 Intents 扩展中,我使用PKPaymentAuthorizationController来允许用户付款。我围绕它创建了一个包装器,如下所示:

class ApplePayModalController: NSObject {

  public typealias AuthorizationHandler = (ApplePayModalController, PKPayment, (PKPaymentAuthorizationResult) -> Void) -> Void

  private var onAuthorize: AuthorizationHandler?

  func present(paymentRequest: PKPaymentRequest, onAuthorize: @escaping AuthorizationHandler) {
    let controller = PKPaymentAuthorizationController(paymentRequest: paymentRequest)
    self.onAuthorize = onAuthorize
    controller.delegate = self
    controller.present()
  }

}

extension ApplePayModalController: PKPaymentAuthorizationControllerDelegate {

  func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
    controller.dismiss()
  }

  func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController, didAuthorizePayment payment: PKPayment, handler completion: @escaping (PKPaymentAuthorizationResult) -> Void) {
    guard let onAuthorize = self.onAuthorize else {
      return completion(.init(status: .failure, errors: nil))
    }

    onAuthorize(self, payment, completion)
  }

}

这就是我得到用来展示它的 PKPaymentRequest 的地方:

  public func createPKRequest(order: Order) -> PKPaymentRequest {
    let paymentRequest = Stripe.paymentRequest(withMerchantIdentifier: PaymentRepository.merchantIdentifier, country: "US", currency: "USD")
    paymentRequest.paymentSummaryItems = [
      PKPaymentSummaryItem(label: "HSCO", amount: 1.00),
      PKPaymentSummaryItem(label: "Phil", amount: NSDecimalNumber(value: Double(order.price) / 100))
    ]
    paymentRequest.shippingType = .storePickup
    paymentRequest.requiredBillingContactFields = [PKContactField.postalAddress]

    return paymentRequest
  }

但是,当我展示控制器时,我遇到了以下问题:

  1. 按下“取消”按钮会导致整个控制器停止工作。我无法更改付款方式,它不会关闭,并且“付款”按钮也停止响应。但是,我仍然可以在控制器外部点击以将其关闭

  2. 委托方法根本没有触发。我尝试添加更多委托方法,但也没有触发;因此,我无法处理付款授权。

  3. 当我尝试用不同的卡支付时控制器的行为并不一致。使用 Apple Amex 测试卡,尝试付款将立即失败;使用 Apple 测试 Visa,它会卡在“处理”状态 15-20 秒,然后显示“Apple Pay 未完成”的警报(与这篇文章相同

这一切都在 iPhone X、iOS 12.1.4 上运行,在沙盒模式下使用 Apple Pay。

标签: iosswiftapplepaysirisirikit

解决方案


确保您的ApplePayModalController实例生命周期长于您的付款流程。尝试使用静态ApplePayModalController单例。


推荐阅读