# Apple Pay Permite a los clientes hacer pagos en forma segura con Apple Pay en su iPhone, iPad o Apple Watch. Consulta la [documentación sobre compatibilidad](https://support.apple.com/en-us/HT208531) de Apple para saber cuáles con los dispositivos compatibles con Apple Pay. Apple Pay es compatible con la mayoría de los productos y funciones de Stripe. Los usuarios de Stripe pueden aceptar [Apple Pay](https://stripe.com/apple-pay) en aplicaciones iOS en iOS 9 y versiones posteriores, y en la web en Safari a partir de iOS 10 o macOS Sierra. No hay comisiones adicionales por procesar pagos con Apple Pay, y las [tarifas](https://stripe.com/pricing/local-payment-methods#apple-pay) son las mismas que para otras transacciones con tarjeta. Apple Pay está a disposición de los titulares de tarjeta de bancos que lo aceptan en países admitidos. Para obtener más información, consulta la documentación de Apple sobre los [bancos participantes](https://support.apple.com/en-us/ht204916). #### Propiedades del método de pago - **Ubicaciones de los clientes** En todo el mundo, excepto India - **Moneda de pago** Ver [monedas de pago aceptadas](https://docs.stripe.com/currencies.md#presentment-currencies) - **Confirmación del pago** Iniciada por el cliente - **Familia de métodos de pago** Cartera - **Pagos recurrentes** [Sí](https://docs.stripe.com/apple-pay.md#recurring-payments) - **Plazo de transferencia** Se aplica el plazo de transferencia estándar - **Soporte de Connect** Si - **Soporte para disputas** [Sí](https://docs.stripe.com/apple-pay/disputes-refunds.md#disputed-payments) - **Compatibilidad de la captura manual** Si - **Reembolsos/reembolsos parciales** [Sí/Sí](https://docs.stripe.com/apple-pay/disputes-refunds.md#refunds) #### Ubicaciones de la empresa Las cuentas de Stripe de todo el mundo, excepto de la India, pueden aceptar pagos de Apple Pay en moneda local. #### Soporte de productos - Connect - Checkout1 - Payment Links - Elements - Subscriptions - Invoicing 1When Checkout’s [ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) is `embedded_page`, it only supports version 17 or later of Safari and iOS. ## Flujo de pago A continuación, se presenta una demostración del flujo de pago de Apple Pay desde la página del proceso de compra: ![Animación de flujo de pagos de Apple Pay que muestra la página de confirmación de compra de Stripe, el botón de Apple Pay y el cuadro de diálogo de confirmación en modo de prueba.](https://b.stripecdn.com/docs-statics-srv/assets/apple-pay.3447ce2deeaab40d6d231eed4dc34644.gif) ## Elegibilidad para compras dentro de la aplicación con Apple Pay En esta guía, se explica cómo configurar tu aplicación a fin de aceptar Apple Pay directamente para bienes físicos, servicios y otros artículos elegibles. Stripe procesa estos pagos y tú solo pagas las [comisiones de procesamiento](https://stripe.com/pricing) de Stripe. Para productos, contenido y suscripciones digitales vendidos en Estados Unidos o en el Espacio Económico Europeo (EEE), tu aplicación puede aceptar Apple Pay mediante una página de pagos externa. Puedes usar las siguientes interfaces de pago: - [Stripe Checkout](https://docs.stripe.com/mobile/digital-goods/checkout.md) - [Elements para la Web](https://docs.stripe.com/mobile/digital-goods/custom-checkout.md) - [Payment Links](https://docs.stripe.com/mobile/digital-goods/payment-links.md) (ideal para cantidades limitadas de productos y precios) En otras regiones, tu aplicación no puede aceptar Apple Pay para productos digitales, contenido o suscripciones. ## Aceptar Apple Pay Stripe ofrece diversos métodos para agregar Apple Pay como método de pago. Para obtener detalles de la integración, selecciona el método que prefieras: # iOS nativo > This is a iOS nativo for when platform is ios. View the full page at https://docs.stripe.com/apple-pay?platform=ios. > Si utilizas la [interfaz de usuario (IU) prediseñada](https://docs.stripe.com/payments/mobile.md) de Stripe, sigue los pasos que se indican en [esta guía](https://docs.stripe.com/payments/mobile/accept-payment.md?platform=ios&type=payment#apple-pay). Con el [SDK para iOS de Stripe](https://github.com/stripe/stripe-ios), puedes aceptar pagos con Apple Pay y pagos tradicionales con tarjeta de crédito. Antes de comenzar, tienes que estar inscrito en el [Programa de Desarrolladores de Apple](https://developer.apple.com/programs/). A continuación, sigue estos pasos: 1. [Configurar Stripe](https://docs.stripe.com/apple-pay.md#setup) 1. [Inscribirse para obtener un ID de comerciante Apple](https://docs.stripe.com/apple-pay.md#merchantid) 1. [Crear un nuevo certificado de Apple Pay](https://docs.stripe.com/apple-pay.md#csr) 1. [Integrarse con Xcode](https://docs.stripe.com/apple-pay.md#xcode-pay) 1. [Verificar si se acepta Apple Pay](https://docs.stripe.com/apple-pay.md#check-if-apple-pay-supported) 1. [Crear la solicitud de pago](https://docs.stripe.com/apple-pay.md#create-payment-request) 1. [Presentar la hoja de pago](https://docs.stripe.com/apple-pay.md#present-payment-sheet) 1. [Enviar el pago a Stripe](https://docs.stripe.com/apple-pay.md#handle-payment) ## Configurar Stripe [Lado del servidor] [Lado del cliente] Primero, necesitas una cuenta de Stripe. [Inscríbete ahora](https://dashboard.stripe.com/register). ### Lado del servidor Esta integración necesita puntos de conexión en tu servidor que se comuniquen con la API de Stripe. Usa las bibliotecas oficiales para acceder a la API de Stripe desde tu servidor: #### Ruby ```bash # Available as a gem sudo gem install stripe ``` ```ruby # If you use bundler, you can add this line to your Gemfile gem 'stripe' ``` ### Lado del cliente El [SDK para iOS de Stripe](https://github.com/stripe/stripe-ios) es de código abierto, está [plenamente documentado](https://stripe.dev/stripe-ios/index.html) y es compatible con aplicaciones que admiten iOS 13 o posterior. #### Swift Package Manager Para instalar el SDK, sigue estos pasos: 1. En Xcode, selecciona **Archivo** > **Agregar dependencias de paquetes…** e introduce `https://github.com/stripe/stripe-ios-spm` como URL del repositorio. 1. Selecciona el número de versión más reciente en nuestra [página de versiones](https://github.com/stripe/stripe-ios/releases). 1. Agrega el producto **StripeApplePay** al [objetivo de tu aplicación](https://developer.apple.com/documentation/swift_packages/adding_package_dependencies_to_your_app). #### CocoaPods 1. Si aún no lo has hecho, instala la última versión de [CocoaPods](https://guides.cocoapods.org/using/getting-started.html). 1. Si no tienes un [Podfile](https://guides.cocoapods.org/syntax/podfile.html), crea uno al ejecutar el siguiente comando: ```bash pod init ``` 1. Agrega esta línea a tu `Podfile`: ```podfile pod 'StripeApplePay' ``` 1. Ejecuta el siguiente comando: ```bash pod install ``` 1. De ahora en adelante, no olvides usar el archivo `.xcworkspace` en lugar del archivo `.xcodeproj` para abrir tu proyecto en Xcode. 1. En el futuro, para actualizar a la última versión del SDK, ejecuta lo siguiente: ```bash pod update StripeApplePay ``` #### Carthage 1. Si aún no lo has hecho, instala la última versión de [Carthage](https://github.com/Carthage/Carthage#installing-carthage). 1. Agrega esta línea a tu `Cartfile`: ```cartfile github "stripe/stripe-ios" ``` 1. Sigue las [instrucciones de instalación de Carthage](https://github.com/Carthage/Carthage#if-youre-building-for-ios-tvos-or-watchos). Asegúrate de incrustar todos los frameworks obligatorios enumerados [aquí](https://github.com/stripe/stripe-ios/tree/master/StripeApplePay/README.md#manual-linking). 1. En el futuro, para actualizar a la última versión del SDK, ejecuta el siguiente comando: ```bash carthage update stripe-ios --platform ios ``` #### Framework manual 1. Ve a nuestra [página de versiones de GitHub](https://github.com/stripe/stripe-ios/releases/latest) y descarga y descomprime **Stripe.xcframework.zip**. 1. Arrastra **StripeApplePay.xcframework** a la sección **Binarios incrustados** de la configuración **General** de tu proyecto en Xcode. Asegúrate de seleccionar **Copiar elementos si es necesario**. 1. Repite el paso 2 para todos los frameworks obligatorios enumerados [aquí](https://github.com/stripe/stripe-ios/tree/master/StripeApplePay/README.md#manual-linking). 1. En el futuro, para actualizar a la última versión de nuestro SDK, repite los pasos 1 a 3. > Para obtener más detalles sobre la última versión del SDK y las versiones anteriores, consulta la página [Versiones](https://github.com/stripe/stripe-ios/releases) en GitHub. Para recibir notificaciones cuando se publique una nueva versión, [mira las versiones](https://help.github.com/en/articles/watching-and-unwatching-releases-for-a-repository#watching-releases-for-a-repository) del repositorio. Configura el SDK con tu [clave publicable](https://dashboard.stripe.com/test/apikeys) de Stripe al iniciar la aplicación. Esto permite que tu aplicación haga solicitudes a la API de Stripe. #### Swift ```swift import UIKitimportStripeApplePay @main class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {StripeAPI.defaultPublishableKey = "<>" // do any other necessary launch configuration return true } } ``` > Usa las [claves de prueba](https://docs.stripe.com/keys.md#obtain-api-keys) durante las pruebas y el desarrollo, y tus claves para [modo activo](https://docs.stripe.com/keys.md#test-live-modes) cuando publiques tu aplicación. ## Inscribirse para obtener un ID de comerciante Apple Obtén un ID de comerciante Apple [solicitando un nuevo identificador](https://developer.apple.com/account/resources/identifiers/add/merchant) en el sitio web de desarrolladores de Apple. Completa el formulario con una descripción y el identificador. La descripción es para tus registros y se puede modificar en el futuro. Stripe recomienda usar el nombre de tu aplicación como identificador (por ejemplo, `merchant.com.{{YOUR_APP_NAME}}`). ## Crear un nuevo certificado de Apple Pay Crea un certificado para que tu aplicación cifre los datos de pago. Ve a [Configuración de certificados de iOS](https://dashboard.stripe.com/settings/ios_certificates) en el Dashboard, haz clic en **Agregar nueva aplicación** y sigue la guía. Descarga un archivo de solicitud de firma de certificado (CSR) para obtener un certificado seguro de Apple que te permita utilizar Apple Pay. Se debe usar un archivo CSR para emitir exactamente un certificado. Si cambias tu ID de comerciante de Apple, debes ir a la [Configuración de certificados de iOS](https://dashboard.stripe.com/settings/ios_certificates) en el Dashboard para obtener una nueva CSR y un nuevo certificado. ## Integrarse con Xcode Agrega la funcionalidad Apple Pay a tu aplicación. En Xcode, abre la configuración del proyecto, selecciona la pestaña **Firma y funcionalidades** y agrega la funcionalidad **Apple Pay**. En este paso, quizá se te solicite iniciar sesión en tu cuenta de desarrollador. Selecciona el ID de comerciante que creaste antes, y tu aplicación estará lista para aceptar Apple Pay. ![](https://b.stripecdn.com/docs-statics-srv/assets/xcode.a701d4c1922d19985e9c614a6f105bf1.png) Habilitar la funcionalidad Apple Pay en Xcode ## Verificar si se acepta Apple Pay Antes de mostrar Apple Pay como opción de pago en tu aplicación, determina si el dispositivo del usuario acepta Apple Pay y si tiene una tarjeta añadida en su billetera: #### Swift ```swift import StripeApplePay import PassKit class CheckoutViewController: UIViewController, ApplePayContextDelegate { let applePayButton: PKPaymentButton = PKPaymentButton(paymentButtonType: .plain, paymentButtonStyle: .black) override func viewDidLoad() { super.viewDidLoad() // Only offer Apple Pay if the customer can pay with it applePayButton.isHidden = !StripeAPI.deviceSupportsApplePay() applePayButton.addTarget(self, action: #selector(handleApplePayButtonTapped), for: .touchUpInside) } // ...continued in next step } ``` ## Crear la solicitud de pago Cuando el usuario toque el botón **Apple Pay**, llama a [StripeAPI paymentRequestWithMerchantIdentifier:country:currency:](https://stripe.dev/stripe-ios/stripe-payments/Classes/StripeAPI.html#/c:@M@StripeCore@objc\(cs\)StripeAPI\(cm\)paymentRequestWithMerchantIdentifier:country:currency:) para crear una [PKPaymentRequest](https://developer.apple.com/documentation/passkit/pkpaymentrequest). Luego, configura la `PKPaymentRequest` para que se vean el nombre de tu empresa y el total. También puedes recopilar información como los datos de facturación o de envío. Consulta la [documentación de Apple](https://developer.apple.com/design/human-interface-guidelines/apple-pay/overview/checkout-and-payment/#customize-the-payment-sheet) a fin de recibir toda la guía necesaria para personalizar la solicitud de pago. #### Swift ```swift func handleApplePayButtonTapped() { let merchantIdentifier = "merchant.com.your_app_name" let paymentRequest = StripeAPI.paymentRequest(withMerchantIdentifier: merchantIdentifier, country: "US", currency: "USD") // Configure the line items on the payment request paymentRequest.paymentSummaryItems = [ // The final line should represent your company; // it'll be prepended with the word "Pay" (that is, "Pay iHats, Inc $50") PKPaymentSummaryItem(label: "iHats, Inc", amount: 50.00), ] // ...continued in next step } ``` ## Presentar la hoja de pago Crea una instancia [STPApplePayContext](https://stripe.dev/stripe-ios/stripe-applepay/Classes/STPApplePayContext.html) con la `PKPaymentRequest` y úsala para presentar la hoja de Apple Pay: #### Swift ```swift func handleApplePayButtonTapped() { // ...continued from previous step // Initialize an STPApplePayContext instance if let applePayContext = STPApplePayContext(paymentRequest: paymentRequest, delegate: self) { // Present Apple Pay payment sheet applePayContext.presentApplePay(on: self) } else { // There is a problem with your Apple Pay configuration } } ``` Apple requiere que los gestos del usuario activen el cuadro de diálogo de Apple Pay (por ejemplo, hacer clic en un botón o interactuar con el formulario). Asegúrate de que la programación cumpla con los siguientes aspectos: - Invoca la hoja de pago directamente con un evento de activación de usuario. - Agrega la programación para la hoja de pago en la parte superior del controlador de eventos de gestos del usuario o cerca de él, antes de cualquier programación asincrónica o de ejecución prolongada. - Establece un límite de tiempo razonable para llamar a `confirmPayment` después de que el usuario haga el gesto. ## Enviar el pago a Stripe ### Lado del servidor Crea un punto de conexión que genere un PaymentIntent con un atributo [iamount](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount) y [currency](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-currency). Decide cuánto cobrar siempre del lado del servidor, un entorno de confianza, no del lado del cliente. Esto impide que clientes malintencionados puedan elegir sus propios precios. #### curl ```bash curl https://api.stripe.com/v1/payment_intents \ -u <>: \ -d "amount"=1099 \ -d "currency"="usd" ``` ### Lado del cliente #### API Payment Intents Implementa `applePayContext(_:didCreatePaymentMethod:paymentInformation:)` para devolver el secreto de cliente PaymentIntent recuperado del punto de conexión anterior, o arroja un error si la solicitud falla. Después de llamar al secreto de cliente, `STPApplePayContext` completa el pago, descarta la hoja de Apple Pay y llama a `applePayContext(_:didCompleteWithStatus:error:)` con el estado del pago. Aplica este método para mostrarle un recibo a tu cliente. #### Swift ```swift extension CheckoutViewController { func applePayContext(_ context: STPApplePayContext, didCreatePaymentMethod paymentMethod: StripeAPI.PaymentMethod, paymentInformation: PKPayment) async throws -> String { let clientSecret = try await ... // Retrieve the PaymentIntent client secret from your backend (see Server-side step above) // Return the client secret or throw an error return clientSecret } func applePayContext(_ context: STPApplePayContext, didCompleteWith status: STPApplePayContext.PaymentStatus, error: Error?) { switch status { case .success: // Payment succeeded, show a receipt view break case .error: // Payment failed, show the error break case .userCancellation: // User canceled the payment break @unknown default: fatalError() } } } ``` Por último, [gestiona los eventos posteriores al pago](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=ios#ios-post-payment) para ejecutar acciones como enviar un correo electrónico de confirmación del pedido a tu cliente, registrar la venta en una base de datos o iniciar un flujo de trabajo de envío. #### API Payment Intents (confirmación del lado del servidor) Implementa `applePayContext(_:didCreatePaymentMethod:paymentInformation:)` para enviar `paymentMethod.id` a tu servidor y crear y confirmar el PaymentIntent. Devuelve el secreto de cliente PaymentIntent devuelto desde tu servidor o genera un error si falla la solicitud. Después de llamar al secreto de cliente, `STPApplePayContext` completa el pago, descarta la hoja de Apple Pay y llama a `applePayContext(_:didCompleteWithStatus:error:)` con el estado del pago. Aplica este método para mostrarle un recibo a tu cliente. #### Swift ```swift extension CheckoutViewController { func applePayContext(_ context: STPApplePayContext, didCreatePaymentMethod paymentMethod: StripeAPI.PaymentMethod, paymentInformation: PKPayment) async throws -> String { let clientSecret = try await ... // Call your backend to create and confirm a PaymentIntent and get its client secret // Return the client secret or throw an error return clientSecret } func applePayContext(_ context: STPApplePayContext, didCompleteWith status: STPApplePayContext.PaymentStatus, error: Error?) { switch status { case .success: // Payment succeeded, show a receipt view break case .error: // Payment failed, show the error break case .userCancellation: // User canceled the payment break @unknown default: fatalError() } } } ``` ### Resolución de problemas Si estás viendo errores de la API de Stripe al intentar crear tokens, lo más probable es que tengas un problema con tu certificado de Apple Pay. Deberás generar un nuevo certificado y subirlo a Stripe, como se describe en esta página. Asegúrate de usar una solicitud de firma de certificado (CSR) obtenida de tu Dashboard y no una que hayas generado tú. Xcode a menudo almacena en caché incorrectamente los certificados antiguos, por lo que además de generar un nuevo certificado, Stripe también recomienda crear un nuevo ID de comerciante de Apple. Si recibes el error: > No has agregado tu cuenta de comerciante de Apple a Stripe es probable que tu aplicación esté enviando datos encriptados con un CSR/Certificado anterior (que no sea de Stripe). Asegúrate de que todos los certificados generados por CSR que no sean de Stripe se revoquen en tu ID de comerciante de Apple. Si esto no resuelve el problema, elimina el ID del comerciante en tu cuenta de Apple y vuelve a crearlo. Luego, crea un nuevo certificado basado en la misma CSR (proporcionada por Stripe) que se utilizó anteriormente. No es necesario que cargues este nuevo certificado en Stripe. Cuando termines, activa y desactiva las Credenciales de Apple Pay en tu aplicación para asegurarte de que se actualicen correctamente. ## App Clips El módulo `StripeApplePay` es un SDK simplificado de Stripe que está optimizado para usarlo en un [App Clip](https://developer.apple.com/app-clips/). Sigue [los pasos descritos más arriba](https://docs.stripe.com/apple-pay.md?platform=ios#accept) para agregar el módulo `StripeApplePay` al destino del App Clip. > El módulo `StripeApplePay` solo se admite en Swift. Los usuarios de Objective-C deben importar `STPApplePayContext` desde el módulo `Stripe`. ### Migración desde STPApplePayContext Si ya eres usuario de `STPApplePayContext` y quieres cambiar al SDK simplificado de Apple Pay, sigue estos pasos: 1. En las dependencias del destino del App Clip, reemplaza el módulo `Stripe` por el `StripeApplePay`. 1. En el código, reemplaza `import Stripe` por `import StripeApplePay`. 1. Reemplaza el uso de `STPApplePayContextDelegate` con el nuevo protocolo `ApplePayContextDelegate`. 1. Modifica tu implementación de `applePayContext(_:didCreatePaymentMethod:)` para aceptar un `StripeAPI.PaymentMethod`. 1. Cambia tu implementación de `applePayContext(_:didCompleteWith:error:)` para aceptar un `STPApplePayContext.PaymentStatus`. ### Before ```swift func applePayContext(_ context: STPApplePayContext, paymentInformation: PKPayment, // ... } func applePayContext(_ context: STPApplePayContext, error: Error?) { // ... } } ``` ### After ```swift import StripeApplePay class CheckoutViewController: UIViewController, ApplePayContextDelegate { func applePayContext(_ context: STPApplePayContext,didCreatePaymentMethod paymentMethod: StripeAPI.PaymentMethod, paymentInformation: PKPayment // ...} async throws -> String { func applePayContext(_ context: STPApplePayContext,didCompleteWith status: STPApplePayContext.PaymentStatus, error: Error?) { // ... } } ``` ## Pagos recurrentes En iOS 16 o una versión posterior, puedes adoptar [tokens de comercio](https://developer.apple.com/apple-pay/merchant-tokens/) si estableces las propiedades `recurringPaymentRequest` o `automaticReloadPaymentRequest` en `PKPaymentRequest`. Los pagos recurrentes pueden usar métodos de pago guardados solo para [transacciones fuera de](https://docs.stripe.com/apple-pay/apple-pay-recurring.md#set-up-off-session-payments) la sesión. #### Swift ```swift extension CheckoutViewController { func handleApplePayButtonTapped() { let request = StripeAPI.paymentRequest(withMerchantIdentifier: merchantIdentifier, country: "US", currency: "USD") let billing = PKRecurringPaymentSummaryItem(label: "My Subscription", amount: NSDecimalNumber(string: "59.99")) billing.startDate = Date() billing.endDate = Date().addingTimeInterval(60 * 60 * 24 * 365) billing.intervalUnit = .month request.recurringPaymentRequest = PKRecurringPaymentRequest(paymentDescription: "Recurring", regularBilling: billing, managementURL: URL(string: "https://my-backend.example.com/customer-portal")!) request.recurringPaymentRequest?.billingAgreement = "You'll be billed $59.99 every month for the next 12 months. To cancel at any time, go to Account and click 'Cancel Membership.'" request.paymentSummaryItems = [billing] } } ``` Para obtener más información sobre cómo usar los pagos recurrentes con Apple Pay, consulta [Documentación de PassKit de Apple](https://developer.apple.com/documentation/passkit/pkpaymentrequest). ## Seguimiento de pedidos Para adoptar el [seguimiento de pedidos](https://developer.apple.com/design/human-interface-guidelines/technologies/wallet/designing-order-tracking) en iOS 16 o posterior, implementa la función [applePayContext(context:willCompleteWithResult:handler:)](https://github.com/stripe/stripe-ios/blob/22.8.0/StripeApplePay/StripeApplePay/Source/ApplePayContext/STPApplePayContext.swift#L38) en tu `ApplePayContextDelegate`. Stripe llama a tu implementación después de que se complete el pago, pero antes de que iOS descarte la hoja de Apple Pay. En tu implementación: 1. Obtén los detalles del pedido de su servidor para el pedido finalizado. 1. Agrega estos datos al [PKPaymentAuthorizationResult](https://developer.apple.com/documentation/passkit/pkpaymentauthorizationresult) proporcionado. 1. Llama al controlador de finalización proporcionado en la cola principal. Para obtener más información sobre el seguimiento de pedidos, consulta la [Documentación sobre pedidos de billetera de Apple](https://developer.apple.com/documentation/walletorders). #### Swift ```swift extension CheckoutViewController { func applePayContext(_ context: STPApplePayContext, willCompleteWithResult authorizationResult: PKPaymentAuthorizationResult) async -> PKPaymentAuthorizationResult { // Fetch the order details from your service do { let myOrderDetails = try await MyAPIClient.shared.fetchOrderDetails(orderID: myOrderID) authorizationResult.orderDetails = PKPaymentOrderDetails( orderTypeIdentifier: myOrderDetails.orderTypeIdentifier, // "com.myapp.order" orderIdentifier: myOrderDetails.orderIdentifier, // "ABC123-AAAA-1111" webServiceURL: myOrderDetails.webServiceURL, // "https://my-backend.example.com/apple-order-tracking-backend" authenticationToken: myOrderDetails.authenticationToken // "abc123" ) // Return your modified PKPaymentAuthorizationResult return authorizationResult } catch { return PKPaymentAuthorizationResult(status: .failure, errors: [error]) } } } ``` # iOS con React Native > This is a iOS con React Native for when platform is react-native. View the full page at https://docs.stripe.com/apple-pay?platform=react-native. Puedes usar el Stripe [React Native SDK](https://github.com/stripe/stripe-react-native), para aceptar Apple Pay y pagos tradicionales con tarjeta de crédito. Antes de empezar, debes inscribirte en el [Apple Developer Program](https://developer.apple.com/programs/) y [configurar Stripe en tu servidor y en tu aplicación](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=react-native#react-native-setup). Luego, sigue estos pasos: 1. [Inscribirse para obtener un ID de comerciante Apple](https://docs.stripe.com/apple-pay.md#merchantid) 1. [Crear un nuevo certificado de Apple Pay](https://docs.stripe.com/apple-pay.md#csr) 1. [Integrarse con Xcode](https://docs.stripe.com/apple-pay.md#xcode-pay) 1. [Definir tu ID de comerciante Apple en StripeProvider](https://docs.stripe.com/apple-pay.md#set-merchantid) 1. [Verificar si se acepta Apple Pay](https://docs.stripe.com/apple-pay.md#check-if-apple-pay-supported) 1. [Presentar la hoja de pago](https://docs.stripe.com/apple-pay.md#present-payment-sheet) 1. [Enviar el pago a Stripe](https://docs.stripe.com/apple-pay.md#handle-payment) > Si usas React Native y Expo, Expo Go no admite Apple Pay. Para usar Apple Pay con Expo, debes crear una [versión de desarrollo](https://docs.expo.dev/get-started/set-up-your-environment/?mode=development-build&platform=ios). Si ya tienes un proyecto de Expo Go, puedes [migrarlo a una versión de desarrollo](https://docs.expo.dev/develop/development-builds/expo-go-to-dev-build/). ## Inscribirse para obtener un ID de comerciante Apple Obtén un ID de comerciante Apple [solicitando un nuevo identificador](https://developer.apple.com/account/resources/identifiers/add/merchant) en el sitio web de desarrolladores de Apple. Completa el formulario con una descripción y el identificador. La descripción es para tus registros y se puede modificar en el futuro. Stripe recomienda usar el nombre de tu aplicación como identificador (por ejemplo, `merchant.com.{{YOUR_APP_NAME}}`). ## Crear un nuevo certificado de Apple Pay Crea un certificado para que tu aplicación cifre los datos de pago. Ve a [Configuración de certificados de iOS](https://dashboard.stripe.com/settings/ios_certificates) en el Dashboard, haz clic en **Agregar nueva aplicación** y sigue la guía. Descarga un archivo de solicitud de firma de certificado (CSR) para obtener un certificado seguro de Apple que te permita utilizar Apple Pay. Se debe usar un archivo CSR para emitir exactamente un certificado. Si cambias tu ID de comerciante de Apple, debes ir a la [Configuración de certificados de iOS](https://dashboard.stripe.com/settings/ios_certificates) en el Dashboard para obtener una nueva CSR y un nuevo certificado. ## Integrarse con Xcode Agrega la funcionalidad Apple Pay a tu aplicación. En Xcode, abre la configuración del proyecto, selecciona la pestaña **Firma y funcionalidades** y agrega la funcionalidad **Apple Pay**. En este paso, quizá se te solicite iniciar sesión en tu cuenta de desarrollador. Selecciona el ID de comerciante que creaste antes, y tu aplicación estará lista para aceptar Apple Pay. ![](https://b.stripecdn.com/docs-statics-srv/assets/xcode.a701d4c1922d19985e9c614a6f105bf1.png) Habilitar la funcionalidad Apple Pay en Xcode ## Definir tu ID de comerciante Apple en StripeProvider En el componente `StripeProvider`, especifica el ID de comerciante Apple que solicitaste con éxito: ```jsx import { StripeProvider } from '@stripe/stripe-react-native'; function App() { return ( {/* Your app code here */} ); } ``` ## Verificar si se acepta Apple Pay Antes de mostrar Apple Pay como opción de pago en tu aplicación, determina si el dispositivo del usuario acepta Apple Pay y si tiene una tarjeta añadida en su billetera: ```jsx import { PlatformPayButton, isPlatformPaySupported } from '@stripe/stripe-react-native'; function PaymentScreen() { const [isApplePaySupported, setIsApplePaySupported] = useState(false); useEffect(() => { (async function () { setIsApplePaySupported(await isPlatformPaySupported()); })(); }, [isPlatformPaySupported]); // ... const pay = async () => { // ... }; // ... return ( {isApplePaySupported && ( )} ); } ``` ## Crear el Payment Intent ### Lado del servidor Crea un punto de conexión que genere un PaymentIntent con un atributo [iamount](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount) y [currency](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-currency). Decide cuánto cobrar siempre del lado del servidor, un entorno de confianza, no del lado del cliente. Esto impide que clientes malintencionados puedan elegir sus propios precios. #### curl ```bash curl https://api.stripe.com/v1/payment_intents \ -u <>: \ -d "amount"=1099 \ -d "currency"="usd" ``` ### Lado del cliente Crea un método que solicite un PaymentIntent desde tu servidor: ```jsx function PaymentScreen() { // ... const fetchPaymentIntentClientSecret = async () => { const response = await fetch(`${API_URL}/create-payment-intent`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ some: 'value', }), }); const { clientSecret } = await response.json(); return clientSecret; }; // ... } ``` ### Resolución de problemas Si estás viendo errores de la API de Stripe al intentar crear tokens, lo más probable es que tengas un problema con tu certificado de Apple Pay. Deberás generar un nuevo certificado y subirlo a Stripe, como se describe en esta página. Asegúrate de usar una solicitud de firma de certificado (CSR) obtenida de tu Dashboard y no una que hayas generado tú. Xcode a menudo almacena en caché incorrectamente los certificados antiguos, por lo que además de generar un nuevo certificado, Stripe también recomienda crear un nuevo ID de comerciante de Apple. Si recibes el error: > No has agregado tu cuenta de comerciante de Apple a Stripe es probable que tu aplicación esté enviando datos encriptados con un CSR/Certificado anterior (que no sea de Stripe). Asegúrate de que todos los certificados generados por CSR que no sean de Stripe se revoquen en tu ID de comerciante de Apple. Si esto no resuelve el problema, elimina el ID del comerciante en tu cuenta de Apple y vuelve a crearlo. Luego, crea un nuevo certificado basado en la misma CSR (proporcionada por Stripe) que se utilizó anteriormente. No es necesario que cargues este nuevo certificado en Stripe. Cuando termines, activa y desactiva las Credenciales de Apple Pay en tu aplicación para asegurarte de que se actualicen correctamente. ## Presentar la hoja de pago En tu [`PlatformPayButton`](https://stripe.dev/stripe-react-native/api-reference/index.html#PlatformPayButton) `onPress` prop, llama a `confirmPlatformPayPayment` para abrir una hoja de Apple Pay. Para mostrar las partidas del carrito del cliente en la hoja de pago, pasa las partidas como argumento. La partida final debe representar a tu empresa y al total. Aparece en la hoja con la palabra «Paga a» antepuesta (por ejemplo, «Paga a iHats, Inc. USD 50»). > No incluyas ninguna acción compleja o asíncrona en el código que maneja la acción del cliente antes de mostrar la hoja de pago. Si la acción del usuario no invoca directamente la hoja de pago, Apple Pay arroja un error. ```jsx import { confirmPlatformPayPayment } from '@stripe/stripe-react-native'; function PaymentScreen() { // ... see above const pay = async () => { const clientSecret = await fetchPaymentIntentClientSecret() const { error, paymentIntent } = await confirmPlatformPayPayment( clientSecret, { applePay: { cartItems: [ { label: 'Example item name', amount: '14.00', paymentType: PlatformPay.PaymentType.Immediate, }, { label: 'Tax', amount: '1.60', paymentType: PlatformPay.PaymentType.Immediate, }, { label: 'iHats, Inc.', amount: '15.60', paymentType: PlatformPay.PaymentType.Immediate, }, ], merchantCountryCode: 'US', currencyCode: 'USD', requiredShippingAddressFields: [ PlatformPay.ContactField.PostalAddress, ], requiredBillingContactFields: [PlatformPay.ContactField.PhoneNumber], }, } ); if (error) { // handle error } else { Alert.alert('Success', 'Check the logs for payment intent details.'); console.log(JSON.stringify(paymentIntent, null, 2)); } }; // ... see above } ``` ## Optional: Crear un método de pago [Lado del cliente] Si confirmas el pago en tu servidor, puedes usar Apple Pay solo para recopilar un `PaymentMethod` , en lugar de para confirmar el pago. Para hacerlo, llama al método `createPlatformPayPaymentMethod`: ```javascript import {PlatformPayButton, isPlatformPaySupported, createPlatformPayPaymentMethod} from '@stripe/stripe-react-native'; function PaymentScreen() { const [isApplePaySupported, setIsApplePaySupported] = useState(false); useEffect(() => { (async function () { setIsApplePaySupported(await isPlatformPaySupported()); })(); }, [isPlatformPaySupported]); const createPaymentMethod = async () => { const { error, paymentMethod } = await createPlatformPayPaymentMethod({ applePay: { cartItems: [ { label: 'Example item name', amount: '14.00', paymentType: PlatformPay.PaymentType.Immediate, }, { label: 'Total', amount: '12.75', paymentType: PlatformPay.PaymentType.Immediate, }, ], merchantCountryCode: 'US', currencyCode: 'USD', }, }); if (error) { Alert.alert(error.code, error.message); return; } else if (paymentMethod) { Alert.alert( 'Success', `The payment method was created successfully. paymentMethodId: ${paymentMethod.id}` ); } }; return ( {isApplePaySupported && ( )} ); } ``` ## Optional: Pagos recurrentes [Lado del cliente] En iOS 16 o versiones posteriores, puedes adoptar [tokens de comerciante](https://developer.apple.com/apple-pay/merchant-tokens/) estableciendo el campo `request` en el objeto de parámetros `applePay` de `confirmPlatformPayPayment()` y `confirmPlatformPaySetupIntent`. ```js await confirmPlatformPayPayment( clientSecret, { applePay: { // Make sure to include the rest of the necessary fields request: { type: PlatformPay.PaymentRequestType.Recurring, description: 'String describing my payment', managementUrl: 'www..com', billing: { paymentType: PlatformPay.PaymentType.Recurring, intervalUnit: PlatformPay.IntervalUnit.Month, intervalCount: 3, label: 'My label', amount: '39.00', }, }, }, } ); ``` Para obtener más información sobre cómo usar los pagos recurrentes con Apple Pay, consulta [Documentación de PassKit de Apple](https://developer.apple.com/documentation/passkit/pkpaymentrequest). ## Optional: Seguimiento de pedidos [Lado del cliente] Para adoptar [seguimiento de pedidos](https://developer.apple.com/design/human-interface-guidelines/technologies/wallet/designing-order-tracking) en iOS 16 o versiones posteriores, usa la devolución de llamada `setOrderTracking` para el componente `PlatformPayButton`. En tu implementación: 1. Obtén los detalles del pedido de su servidor para el pedido finalizado. 1. Llama al controlador de finalización proporcionado en `setOrderTracking` con los resultados de tu servidor. ```jsx { const { orderIdentifier, orderType, authToken, webServiceUrl } = fetchOrderDetailsFromMyBackend(); completion(orderIdentifier, orderType, authToken, webServiceUrl); }} /> ``` Para obtener más información sobre el seguimiento de pedidos, consulta la [Documentación sobre pedidos de billetera de Apple](https://developer.apple.com/documentation/walletorders). # Web > This is a Web for when platform is web. View the full page at https://docs.stripe.com/apple-pay?platform=web. Puedes aceptar pagos con Apple Pay en la Web mediante [Checkout](https://docs.stripe.com/payments/checkout.md) o [Elements](https://docs.stripe.com/payments/elements.md). No se requiere ninguna configuración adicional para usar Apple Pay en Checkout. En el caso de Elements, consulta las guías [Express Checkout Element](https://docs.stripe.com/elements/express-checkout-element.md) o [Aceptar un pago](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=elements&api-integration=checkout) para saber cómo agregar Apple Pay a tu sitio. ### Consideraciones de integración web - **Cómo usar un iframe con [Elements](https://docs.stripe.com/payments/elements.md)**: cuando uses un iframe, su origen debe coincidir con el origen de nivel superior (excepto para Safari 17 y versiones posteriores al especificar el atributo `allow="payment"`). Dos páginas tienen el mismo origen si el protocolo, el host (nombre completo del dominio) y el puerto (si se especifica) son los mismos para ambas páginas. - **Dominio de nivel superior y dominio de iframe**: si el dominio de nivel superior difiere del dominio de iframe, el dominio de nivel superior y el dominio de origen del iframe deben ser [dominios de métodos de pago registrados](https://docs.stripe.com/payments/payment-methods/pmd-registration.md) en la cuenta asociada. - **Integraciones existentes de Stripe.js v2**: actualiza a Checkout o Elements lo antes posible. - **Using [Checkout](https://docs.stripe.com/payments/checkout.md) with [ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) set to `embedded_page`**: Supports only Safari version 17 or later and iOS version 17 or later. El uso de Apple Pay en la web está sujeto a las [condiciones de servicio de Apple Pay en la web](https://stripe.com/apple-pay/legal). ### Registra tu dominio con Apple Pay Para usar Apple Pay, debes registrar todos tus dominios web que muestren un botón de Apple Pay con Apple. Eso incluye dominios de nivel superior (por ejemplo, **stripe.com**) y subdominios (por ejemplo, **shop.stripe.com**), en producción y pruebas. > #### Subdominios > > `www` es un subdominio (por ejemplo, **www.stripe.com**) que también debes registrar. Stripe se encarga de la validación del comerciante de Apple por ti, incluida la creación de un ID de comerciante de Apple y la solicitud de firma de certificado. No sigas el proceso de validación del comerciante que se indica en la documentación de Apple Pay. En su lugar, sigue este paso: 1. Dile a Stripe que registre tu dominio en Apple. Puedes hacerlo en la [Página de dominios de métodos de pago](https://dashboard.stripe.com/settings/payment_method_domains) en el Dashboard, *o* usando la API con tu clave secreta activa como se muestra abajo. No registres tu dominio más de una vez por cuenta. ```curl curl https://api.stripe.com/v1/payment_method_domains \ -u "<>:" \ -d "domain_name=example.com" ``` Cuando uses [cargos Direct](https://docs.stripe.com/connect/direct-charges.md) con *Connect* (Connect is Stripe's solution for multi-party businesses, such as marketplace or software platforms, to route payments between sellers, customers, and other recipients), tendrás que configurar el dominio para cada cuenta conectada mediante la API. Esto no es un requisito para las cuentas conectadas que usan otros tipos de cargos. Después de registrar tus dominios, puedes efectuar pagos en tu sitio con tus claves de API activas. ## Pagos recurrentes We recommend implementing Apple Pay merchant tokens to enable merchant-initiated transactions (MIT) such as recurring and deferred payments and automatic reloads. Merchant tokens (MPANs) connect your business with your customer’s Apple Wallet payment method, so they work across multiple devices and keep payment information active in a new device even when its removed from a lost or stolen device. See [ApplePay merchant tokens](https://docs.stripe.com/apple-pay/merchant-tokens.md?pay-element=ece) for integration details. ## Prueba Apple Pay Para probar Apple Pay, debes usar un número de tarjeta de crédito real y tus [claves de API](https://docs.stripe.com/keys.md) de prueba. Stripe reconoce que estás en modo de prueba y te devuelve un token de tarjeta de prueba correcto para que puedas realizar pagos de prueba con una tarjeta activa sin realizarle cargos. No puedes guardar [tarjetas de prueba de Stripe](https://docs.stripe.com/testing.md#use-test-cards) ni [tarjetas de prueba de Apple Pay](https://developer.apple.com/apple-pay/sandbox-testing/) en carteras de Apple Pay para probar esta aplicación. # Web > This is a Web for when platform is web. View the full page at https://docs.stripe.com/apple-pay?platform=web. Si no cumples con los requisitos del dispositivo ni de la integración, Stripe no mostrará Apple Pay como opción de pago. Usa nuestra [página de prueba](https://docs.stripe.com/testing/wallets.md) para ayudarte a resolver el problema. ## See also - [Integración iOS](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=ios) - [Apple Pay en la web](https://docs.stripe.com/elements/express-checkout-element.md) - [Prácticas recomendadas de Apple Pay](https://docs.stripe.com/apple-pay/best-practices.md)