I have the below piece of code to do the Apple Pay. For some reason the code DidFinish method in the delegate is never called. Any help is appreciated.
import PassKit
typealias ApplePaymentCompletionHandler = (Bool) -> Void
class ApplePayment: NSObject {
var applePaymentController : PKPaymentAuthorizationController?
var summaryItems = [PKPaymentSummaryItem]()
var status = PKPaymentAuthorizationStatus.failure
var paymentCompletionHandler: ApplePaymentCompletionHandler!
static let networks: [PKPaymentNetwork] = [
.visa, .masterCard, .discover, .amex
]
class func applePayStatus() -> (makePayments: Bool, setupCards: Bool) {
return (PKPaymentAuthorizationController.canMakePayments(),
PKPaymentAuthorizationController.canMakePayments(usingNetworks: networks));
}
func startPayment(completion: @escaping ApplePaymentCompletionHandler, payAmount: String) {
paymentCompletionHandler = completion
let amount = PKPaymentSummaryItem(label: "Payment Amount", amount: NSDecimalNumber(string: payAmount), type: .final)
summaryItems = [amount]
let request = PKPaymentRequest()
request.paymentSummaryItems = summaryItems
request.merchantIdentifier = "<MERCHANT_ID>"
request.merchantCapabilities = .capability3DS
request.countryCode = "US"
request.currencyCode = "USD"
request.supportedNetworks = ApplePayment.networks
applePaymentController = PKPaymentAuthorizationController(paymentRequest: request)
applePaymentController!.delegate = self
applePaymentController!.present(completion: { presented in
if presented {
print("Apple Payment Controller is presented.")
}
else {
print("Apple Payment Controller is not presented. There is an Issue.")
self.paymentCompletionHandler(false)
}
})
}
}
extension ApplePayment: PKPaymentAuthorizationControllerDelegate {
func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController, didAuthorizePayment payment: PKPayment, handler completion: @escaping (PKPaymentAuthorizationResult) -> Void) {
self.status = .success
completion(PKPaymentAuthorizationResult(status: .success, errors: [Error]()))
}
func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
debugPrint("Did Finish.")
controller.dismiss {
DispatchQueue.main.async {
if self.status == .success {
self.paymentCompletionHandler(true)
}
else {
self.paymentCompletionHandler(false)
}
}
}
}
}