114 lines
3.7 KiB
Swift
114 lines
3.7 KiB
Swift
//
|
|
// 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)
|
|
}
|
|
|
|
}
|