I am able to display Apple Pay view controller on simulator but not on device.
Entitlement added and certificate installed.
class ViewController: UIViewController, PKPaymentAuthorizationViewControllerDelegate {
var paymentRequest: PKPaymentRequest!
override func viewDidLoad() {
super.viewDidLoad()
}
func rydes(shipping: Double) -> [PKPaymentSummaryItem] {
let ryde = PKPaymentSummaryItem(label: "Your Fare", amount: 1.00)
let discount = PKPaymentSummaryItem(label: "Discount", amount: -0.00)
let shipping = PKPaymentSummaryItem(label: "Shipping", amount: NSDecimalNumber(string: "\(shipping)"))
let subTotal = ryde.amount.adding(discount.amount)
let total = PKPaymentSummaryItem(label: "rydes", amount: subTotal)
return [ryde, discount, shipping, total]
} // rydes() func
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didSelect shippingMethod: PKShippingMethod, completion: @escaping (PKPaymentAuthorizationStatus, [PKPaymentSummaryItem]) -> Void) {
completion(PKPaymentAuthorizationStatus.success, rydes(shipping: Double(shippingMethod.amount)))
} // paymentAuthorizationViewController( didSelectShippingMethod )
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, completion: @escaping (PKPaymentAuthorizationStatus) -> Void) {
completion(PKPaymentAuthorizationStatus.success)
} // paymentAuthorizationViewController( didAuthorizePayment )
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
controller.dismiss(animated: true, completion: nil)
} // paymentAuthorizationViewControllerDidFinish()
@IBAction func applePayPressed(_ sender: Any) {
print("enable apple pay")
// send user to Apple Pay to make payment
let paymentNetworks = [PKPaymentNetwork.visa, .masterCard, .interac, .discover, .amex]
let merchantId = "merchant.com.xxx"
if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: paymentNetworks) {
paymentRequest = PKPaymentRequest()
paymentRequest.currencyCode = "CAD"
paymentRequest.countryCode = "CA"
paymentRequest.merchantIdentifier = merchantId
paymentRequest.supportedNetworks = paymentNetworks
paymentRequest.merchantCapabilities = .capability3DS
paymentRequest.requiredShippingAddressFields = [.all]
paymentRequest.paymentSummaryItems = self.rydes(shipping: 0.00)
// . . . shipping - not really needed
let samedayShipping = PKShippingMethod(label: "Same Day", amount: 12.99)
samedayShipping.detail = "Guaranteed same day delivery."
samedayShipping.identifier = "sameday"
let twodayShipping = PKShippingMethod(label: "Two Day", amount: 4.99)
twodayShipping.detail = "Guaranteed within two days."
twodayShipping.identifier = "twoday"
let freeShipping = PKShippingMethod(label: "Same Day", amount: 0.00)
freeShipping.detail = "Guaranteed same day."
freeShipping.identifier = "freeShipping"
paymentRequest.shippingMethods = [samedayShipping, twodayShipping, freeShipping]
// . . . shipping - not really needed
let applePayVC = PKPaymentAuthorizationViewController(paymentRequest: paymentRequest)
applePayVC.delegate = self
self.present(applePayVC, animated: true, completion: nil)
} else {
print("Tell the user they need to set up Apple Pay!")
}
} // applePayPressed func ACTION
}
The above code just returns this line - Tell the user they need to set up Apple Pay!
I am using a iPhone 6s as the device and Apple Pay and Wallet are enabled with a valid debit card and credit card. I am from Canada, so I am in a valid region.
Edited Code
class ViewController: UIViewController, PKPaymentAuthorizationViewControllerDelegate {
var paymentRequest: PKPaymentRequest! // apple pay
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
func rydes() -> [PKPaymentSummaryItem] {
let ryde = PKPaymentSummaryItem(label: "Your Fare", amount: 1.00)
let subTotal = ryde.amount
let total = PKPaymentSummaryItem(label: "rydes", amount: subTotal)
return [ryde, total]
} // rydes() func
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, completion: @escaping (PKPaymentAuthorizationStatus) -> Void) {
completion(PKPaymentAuthorizationStatus.success)
} // paymentAuthorizationViewController( didAuthorizePayment )
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
controller.dismiss(animated: true, completion: nil)
} // paymentAuthorizationViewControllerDidFinish()
@IBAction func applePayPressed(_ sender: Any) {
print("enable apple pay")
// send user to Apple Pay to make payment
let paymentNetworks = [PKPaymentNetwork.visa, .masterCard, .interac, .discover, .amex]
let merchantID = "merchant.com.xxx"
if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: paymentNetworks) {
paymentRequest = PKPaymentRequest()
paymentRequest.currencyCode = "CAD"
paymentRequest.countryCode = "CA"
paymentRequest.merchantIdentifier = merchantID
paymentRequest.supportedNetworks = paymentNetworks
paymentRequest.merchantCapabilities = .capability3DS
paymentRequest.requiredShippingAddressFields = [.all]
paymentRequest.paymentSummaryItems = self.rydes()
let applePayVC = PKPaymentAuthorizationViewController(paymentRequest: paymentRequest)
applePayVC.delegate = self
self.present(applePayVC, animated: true, completion: nil)
} else {
print("Tell the user they need to set up Apple Pay!")
}
} // applePayPressed func ACTION
}