STPApplePayContext hangs after didAuthorizePayment on iOS 26 + React Native New Architecture — "Payment Not Completed"
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 48/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- ios, react-native, swift, typescript
- Domain
- mobile-dev, payments
Research direction
Start in StripeApplePay/StripeApplePay/Source/ApplePayContext/STPApplePayContext.swift around _completePayment and the PaymentMethod.create completion, then reproduce the flow on the listed iOS 26 and React Native New Architecture environment. Trace why the completion does not return; done means confirmPlatformPayPayment settles and the PaymentIntent is confirmed without Apple Pay showing “Payment Not Completed”.
Written by the indexing model from the issue text.
Description
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 fireddidAuthorizePayment fired← Face ID authorization accepted_completePayment started- … nothing after
Confirmed absent in every failing case:
PaymentMethod.create completion fired— never loggedhandleSuccess/handleFailure— never calleddidCreatePaymentMethod/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-native0.74.0 (bundled Stripe iOS SDK 26.6.0).- On an iOS 26.x device, call
confirmPlatformPayPaymentwith an
applePayconfig (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
- Dominant language
- TypeScript
- Stars
- 1.4k
- Forks
- 328
- Avg merge
- 3d 9h
- Merged PRs (30d)
- 23
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from stripe/stripe-react-native
-
[Bug] @stripe/stripe-react-native@0.52.0-crypto-onramp-2-private-beta.4 Swift-generated header bug Open
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
stripe/stripe-react-native#2547 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
stripe/stripe-react-native#2546 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 55/100
stripe/stripe-react-native#2661 · 1 comment ·
-
Difficulty 5/5 Over a week Newbie friendliness 25/100
stripe/stripe-react-native#2660 · 1 comment · 2 reactions ·
-
Difficulty 5/5 Over a week Newbie friendliness 15/100
stripe/stripe-react-native#2637 ·
All issues in stripe/stripe-react-native
Similar issues
-
clawsweeper:fix-shape-clear clawsweeper:queueable-fix clawsweeper:source-repro impact:ux-friction issue-rating: 🦞 diamond lobster no-stale P3
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Difficulty 1/5 Under an hour Newbie friendliness 76/100
-
code-quality refactoring
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
github/gh-aw-firewall#8816 ·
-
integration:quickjs org:external priority:backlog topic:code-interpreter topic:middleware type:feature
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
langchain-ai/deepagents#6450 ·
-
Difficulty 1/5 Under an hour Newbie friendliness 88/100
vercel/react-tweet#225 ·