close
Skip to content

STPApplePayContext hangs after didAuthorizePayment on iOS 26 + React Native New Architecture — "Payment Not Completed" #2575

Description

@owen-appicidea

STPApplePayContext hangs after didAuthorizePayment on iOS 26 + React Native New Architecture — "Payment Not Completed"

Describe the bug

When a customer pays with Apple Pay via @stripe/stripe-react-native's
confirmPlatformPayPayment({ applePay: ... }), authorization succeeds
(Face ID), the sheet dismisses to a spinner, and the payment never settles —
ending with Apple Pay's "Payment Not Completed". Reproducible on iOS 26.x
devices under the React Native New Architecture (Fabric) + Hermes.

Native instrumentation confirms that on iOS,
confirmPlatformPayPayment({ applePay }) invokes STPApplePayContext.

React Native implementation (failing path)

// @stripe/stripe-react-native 0.74.0 (bundled Stripe iOS SDK 26.6.0)
import { confirmPlatformPayPayment, PlatformPay } from '@stripe/stripe-react-native'

const result = await confirmPlatformPayPayment(paymentIntentClientSecret, {
  applePay: {
    merchantCapabilities: [
      PlatformPay.ApplePayMerchantCapability.Supports3DS,
      PlatformPay.ApplePayMerchantCapability.SupportsCredit,
      PlatformPay.ApplePayMerchantCapability.SupportsDebit,
    ],
    merchantCountryCode: 'HK',
    currencyCode: 'HKD',
    cartItems: [
      {
        label: 'Order',
        amount: (amount / 100).toString(),
        paymentType: PlatformPay.PaymentType.Immediate,
      },
    ],
  },
})

The promise returned by confirmPlatformPayPayment never resolves or
rejects after authorization. We confirmed this by wrapping the call in a
Promise.race with a 90 s timeout plus an AppState watchdog — the
timeout/rejection fires, but Stripe's completion never does.

Root-cause evidence (instrumentation)

We instrumented StripeApplePay/StripeApplePay/Source/ApplePayContext/ STPApplePayContext.swift with NSLog + NotificationCenter posts and
forwarded them into Sentry. Every failing payment shows this exact sequence:

  1. presentApplePay completion fired
  2. didAuthorizePayment fired ← Face ID authorization accepted
  3. _completePayment started
  4. … nothing after

Confirmed absent in every failing case:

  • PaymentMethod.create completion fired — never logged
  • handleSuccess / handleFailure — never called
  • didCreatePaymentMethod / didCompleteWith — never called
  • No App Hang / ANR event captured — the main thread is not blocked

Conclusion: the flow stalls inside STPApplePayContext after
_completePayment begins — most likely the PaymentMethod.create network
call (or its completion handler) never returns.

To Reproduce

  1. React Native app with New Architecture (Fabric) enabled, Hermes.
  2. @stripe/stripe-react-native 0.74.0 (bundled Stripe iOS SDK 26.6.0).
  3. On an iOS 26.x device, call confirmPlatformPayPayment with an
    applePay config (see snippet above) for a live PaymentIntent.
  4. Tap Apple Pay → authorize with Face ID.
  5. Observe: spinner → "Payment Not Completed".

Expected behavior

confirmPlatformPayPayment resolves and the PaymentIntent is confirmed.

Actual behavior

The promise never settles; Apple Pay shows "Payment Not Completed".

Environment

  • React Native: 0.83.10 (New Architecture / Fabric enabled)
  • JS engine: Hermes
  • @stripe/stripe-react-native: 0.74.0
  • Stripe iOS SDK (StripeApplePay pod): 26.6.0

Devices

  • iPhone14,2 — iOS 26.6
  • iPhone14,3 — iOS 26.6
  • iPhone15,3 — iOS 26.5.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    triagedIssue has been reviewed by Stripe and is being tracked internally

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions