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:
presentApplePay completion fired
didAuthorizePayment fired ← Face ID authorization accepted
_completePayment started
- … 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
- React Native app with New Architecture (Fabric) enabled, Hermes.
@stripe/stripe-react-native 0.74.0 (bundled Stripe iOS SDK 26.6.0).
- On an iOS 26.x device, call
confirmPlatformPayPayment with an
applePay config (see snippet above) for a live PaymentIntent.
- Tap Apple Pay → authorize with Face ID.
- 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
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'sconfirmPlatformPayPayment({ 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 })invokesSTPApplePayContext.React Native implementation (failing path)
The promise returned by
confirmPlatformPayPaymentnever resolves orrejects after authorization. We confirmed this by wrapping the call in a
Promise.racewith a 90 s timeout plus anAppStatewatchdog — thetimeout/rejection fires, but Stripe's completion never does.
Root-cause evidence (instrumentation)
We instrumented
StripeApplePay/StripeApplePay/Source/ApplePayContext/ STPApplePayContext.swiftwithNSLog+NotificationCenterposts andforwarded them into Sentry. Every failing payment shows this exact sequence:
presentApplePay completion fireddidAuthorizePayment fired← Face ID authorization accepted_completePayment startedConfirmed absent in every failing case:
PaymentMethod.create completion fired— never loggedhandleSuccess/handleFailure— never calleddidCreatePaymentMethod/didCompleteWith— never calledConclusion: the flow stalls inside
STPApplePayContextafter_completePaymentbegins — most likely thePaymentMethod.createnetworkcall (or its completion handler) never returns.
To Reproduce
@stripe/stripe-react-native0.74.0 (bundled Stripe iOS SDK 26.6.0).confirmPlatformPayPaymentwith anapplePayconfig (see snippet above) for a live PaymentIntent.Expected behavior
confirmPlatformPayPaymentresolves and the PaymentIntent is confirmed.Actual behavior
The promise never settles; Apple Pay shows "Payment Not Completed".
Environment
@stripe/stripe-react-native: 0.74.0Devices