【问题标题】:I am trying to create a base class for Apple Pay payment processing我正在尝试为 Apple Pay 支付处理创建一个基类
【发布时间】:2020-11-10 14:21:35
【问题描述】:

我为 Apple Pay 功能创建了一个基类。但是该基类由 NSObject 继承。我只在这个类中创建了支付授权视图控制器,并将它的委托分配给自己。现在它没有调用 pkpaymentauthorizationviewcontrollerdelegate 的委托方法。如何解决这种情况并在基类中只实现一次委托方法并在应用程序的其他地方重用它。请帮忙。

class ApplePay: NSObject { 
 
var applePayItem: PKPaymentSummaryItem?
var baseVC: UIViewController?
let payNetworks = [PKPaymentNetwork.masterCard, .visa, .amex, .discover]


init(forItem: Product) {
    applePayItem = PKPaymentSummaryItem.init(label: forItem.name ?? "",
                                             amount: NSDecimalNumber(value: forItem.price ?? 0))
}

func initiatePayment(complete: @escaping (Bool) -> Void) {
    if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: payNetworks) {
        let request = PKPaymentRequest()
            request.currencyCode = "USD"
            request.countryCode = "US"
            request.merchantIdentifier = <*identifier from my development account*>
            request.merchantCapabilities = PKMerchantCapability.capability3DS
            request.supportedNetworks = payNetworks
            request.paymentSummaryItems = [applePayItem!]
        guard let paymentVC = PKPaymentAuthorizationViewController(paymentRequest: request) else {
            return
        }
        baseVC = UIApplication.shared.keyWindow?.rootViewController?.children.last
        baseVC?.present(paymentVC, animated: true, completion: nil)
        paymentVC.delegate = self
        complete(true)
    } else {
        complete(false)
        CaAssembly.resolve(CaAlertProtocol.self)!.showAlert(CaConstant.alertTitles.addCardApplePay, dismiss: {})
    }
}

func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
    controller.dismiss {
        
}
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
    controller.dismiss(animated: true, completion: nil)
}



 }

 extension ApplePay: PKPaymentAuthorizationViewControllerDelegate, 
PKPaymentAuthorizationControllerDelegate {
 @available(iOS 11.0, *)
 func paymentAuthorizationViewController(_ controller: 
   PKPaymentAuthorizationViewController, 
   didAuthorizePayment payment: PKPayment, 
   handler completion: @escaping 
  (PKPaymentAuthorizationResult) -> Void) {
    print(“PKPaymentAuthorizationViewController didAuthorizePayment” )
   }
}

【问题讨论】:

  • 您能分享一下您尝试过的方法以及您预计会导致意外功能的原因吗?
  • 暂时我正在考虑让 ApplePay 类回到继承 UIViewController 并使其背景透明,然后调用在 viewdidappear 上呈现 Apple Pay 授权 VC .... 如果可行,那么它将是对我来说很好。
  • 只是为了更新......我能够通过 UIViewController 继承的基类来实现它......使用库 [github.com/IcaliaLabs/Presentr] 使用它我将基类呈现为具有维度的模态(w:0, h:0) 并在其 viewdidappear 上启动 Apple Pay

标签: ios swift iphone applepay


【解决方案1】:

只是为了更新......我能够通过 UIViewController 继承的基类来实现它......使用库 [github.com/IcaliaLabs/Presentr] 使用它我将基类呈现为具有维度的模态(w:0, h:0) 并在其 viewdidappear 上启动 Apple Pay:

import UIKit
import PassKit
import Alamofire
import Presentr

struct Product {
   var name: String
   var price: Double
}

class ApplePay: UIViewController , PKPaymentAuthorizationControllerDelegate, 
PKPaymentAuthorizationViewControllerDelegate{ //
 
var applePayItem: PKPaymentSummaryItem?
let output = ""
var baseVC: UIViewController?
let payNetworks = [PKPaymentNetwork.masterCard, .visa, .amex, .discover]
var presenter: Presentr = {
    let customPresenter = Presentr(
        presentationType: .custom(
            width: ModalSize.custom(size: 0),
            height: ModalSize.custom(size: 0),
            center: ModalCenterPosition.bottomCenter
        )
    )
    customPresenter.keyboardTranslationType = .compress
    return customPresenter
}()
var forItem: Product?

override func viewDidLoad() {
    applePayItem = PKPaymentSummaryItem.init(label: forItem?.name ?? "",
                                             amount: NSDecimalNumber(value: forItem?.price ?? 0))
}
override func viewDidAppear(_ animated: Bool) {
    initiatePayment()
}
func initiatePayment() {
    if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: payNetworks) {
        let request = PKPaymentRequest()
            request.currencyCode = "USD"
            request.countryCode = "US"
            request.merchantIdentifier = <merchant id created on developer account>
            request.merchantCapabilities = PKMerchantCapability.capability3DS
            request.supportedNetworks = payNetworks
            request.paymentSummaryItems = [applePayItem!]
        guard let paymentVC = PKPaymentAuthorizationViewController(paymentRequest: request) else {
            return
        }
        self.present(paymentVC, animated: true, completion: nil)
        paymentVC.delegate = self
    } 
}

func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
    controller.dismiss {
        
    }
}
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
    controller.dismiss(animated: true, completion: nil)
}

@available(iOS 11.0, *)
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, handler completion: @escaping (PKPaymentAuthorizationResult) -> Void) {
    
}

}

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多