// // PaymentHandler.swift // PSCB-OOS-iOS // // Created by Antonov Ilia on 16.10.2020. // import Foundation import PassKit public typealias PaymentCompletionHandler = (Bool) -> Void public class ApplePayHandler: NSObject { static let supportedNetworks: [PKPaymentNetwork] = [.visa, .masterCard] // MARK: - Fields public let merchantId: String public let merchantKey: String public let summaryItems: [PKPaymentSummaryItem] // MARK: - Properties var paymentController: PKPaymentAuthorizationController? var paymentStatus: PKPaymentAuthorizationStatus = .failure var completionHandler: PaymentCompletionHandler? var payment: Payment? public init?(merchantId: String, merchantKey: String, summaryItems: [PKPaymentSummaryItem]) { guard PKPaymentAuthorizationController.canMakePayments(usingNetworks: Self.supportedNetworks) else { print("Could not instantiate ApplePayHandler. Cannot make payments with provided networks") return nil } self.merchantId = merchantId self.merchantKey = merchantKey self.summaryItems = summaryItems } public func handle(payment: Payment, completion: @escaping PaymentCompletionHandler) { self.completionHandler = completion self.payment = payment NSLog("About to handle payment: \(payment)") paymentController = PKPaymentAuthorizationController(paymentRequest: paymentRequest) paymentController?.delegate = self paymentController?.present { (presented) in if !presented { NSLog("Could not present PKPaymentAuthorizationController") self.completionHandler!(false) } else { NSLog("PKPaymentAuthorizationController presented") } } } // MARK: - Private details private var paymentRequest: PKPaymentRequest { let request = PKPaymentRequest() request.countryCode = "RU" request.merchantIdentifier = "merchant.pscb.pay" request.currencyCode = "RUB" request.supportedNetworks = Self.supportedNetworks request.merchantCapabilities = .capability3DS request.paymentSummaryItems = summaryItems return request } } // MARK: - Extension for PKPaymentAuthorizationControllerDelegate extension ApplePayHandler: PKPaymentAuthorizationControllerDelegate { public func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController, didAuthorizePayment payment: PKPayment, completion: @escaping (PKPaymentAuthorizationStatus) -> Void) { // print("Payment string") // let paymentString = try! payment.serializeToString() // print(paymentString) // // // // // self.paymentStatus = .success completion(PKPaymentAuthorizationStatus.success) } @available(iOS 11.0, *) public func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController, didAuthorizePayment payment: PKPayment, handler completion: @escaping (PKPaymentAuthorizationResult) -> Void) { // // NSLog("About to send request to backend") // let paymentString = try! payment.serializeToString() // // NSLog("Payment JSON: \(paymentString)") // let result = PKPaymentAuthorizationResult(status: .success, errors: nil) completion(result) self.completionHandler?(true) } public func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) { controller.dismiss(completion: nil) } }