Error ApplePay iOS: este dispositivo no puede realizar pagos.

Cuando integro ApplePay con mi aplicación de testing, obtengo el error:

Este dispositivo no puede realizar pagos.

He configurado una tarjeta para usarla, y la he probado en una terminal de punto de venta, funciona bien allí.

La línea de código que debería funcionar (pero no funciona) es:

PKPaymentAuthorizationViewController *auth = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:paymentRequest]; 

La documentation de Apple es lamentablemente inadecuada al enumerar detalladamente los pasos de integración.

El documento Apple's Getting Started con Apple Pay menciona estos puntos:

Requisitos previos

Además de implementar Apple Pay con el marco PassKit, debes:

  • Configure una count con un procesador de pago o puerta de enlace, si aún no tiene una
  • Registrar un identificador de comerciante a través de certificates, identificadores y perfiles
  • Envíe una request de firma de certificate para get keys públicas y privadas que se usarán para cifrar y descifrar tokens de pago
  • (paso faltante) Incluir el certificate en su KeyChain
  • Incluya un derecho de Apple Pay en su aplicación.

En mi caso, había olvidado el paso 3. La solución es enviar una nueva CSR con la ID de comerciante creada en el paso 2 e include el certificate resultante en su llavero.

Edit: Pero espera, ¡hay más!

También debe ir a la sección de AppID de su Apple Member Center y editar la ID de la aplicación para que incluya la ID de count de comerciante que acaba de crear. De lo contrario, su aplicación no será aprovisionada para usar la ID de comerciante. Después de eso, vaya a las preferences de Xcode y actualice sus perfiles de aprovisionamiento (o descargue e instálelos manualmente si lo necesita).

Estos pasos deberían llevarte más allá del error "Este dispositivo no puede realizar pagos".

Asegúrese de que la tarjeta de crédito que configuró en la Libreta de ahorros esté verificada … de lo contrario, PKPaymentAuthorizationViewController devolverá cero.

 request.supportedNetworks = [NSArray arrayWithObjects:PKPaymentNetworkAmex,PKPaymentNetworkDiscover,PKPaymentNetworkMasterCard,PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay, nil]; 

seguro tu tarjeta en esos objects!

Es posible que desee verificar si sus tarjetas también son utilizables. Encontré este problema al tener tres tarjetas en mi Wallet. Dos débitos (Interac-Para Canadá) y una Visa. Me había olvidado de que la Visa en la billetera había caducado, y que Interac todavía no es compatible con la aplicación Apple Pay, lo que obligó a Passkit a devolver una Nil PKPaymentAuthorizationControllerInstance. Para resolver esto, ejecuté una comprobación sobre los Tipos de pago admitidos en la aplicación Wallet del iPhone, así:

 func checkApplePayCapabilities() -> Dictionary<String, Any>? { var mar = Array<String>() var methods : Dictionary<String, String> = ["visa":"no","mastercard":"no","amex":"no","interac":"no","debit":"no"] let payload = Dictionary<String, Any>() guard PKPaymentAuthorizationViewController.canMakePayments() else { return nil } guard #available(iOS 10, *) else { return nil } if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [PKPaymentNetwork.amex]) { print("can make amex") methods["amex"] = "yes" mar.insert("visa", at: mar.count) } if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [PKPaymentNetwork.visa]) { print("can make visa") methods["visa"] = "yes" mar.insert("visa", at: mar.count) } if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [PKPaymentNetwork.masterCard]) { print("can make mastercard") methods["mastercard"] = "yes" mar.insert("mastercard", at: mar.count) } if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [PKPaymentNetwork.interac]) { print("can make interac") methods["interac"] = "yes" mar.insert("interac", at: mar.count) } guard mar.isEmpty else { return payload } return nil } 

Solo debe devolver las tarjetas que se pueden usar en la aplicación. Y, por supuesto, puede agregar cualquier otro método de pago, o hacer una matriz de los methods que desee y ejecutar a través de él con un ciclo for también.