{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["cards","card","img","admonition","tabs","tab"]},"type":"markdown"},"seo":{"title":"Native Mobile SDKs | xMoney Documentation","description":"Integrate xMoney Payment Sheet, Payment Element, Apple Pay, and Google Pay in iOS, Android, React Native, and Flutter apps.","llmstxt":{"hide":false,"title":"xMoney Documentation","description":"Guides and API references for integrating xMoney card and crypto payments.","sections":[{"title":"Guides","description":"Integration guides for card payments, crypto, checkout, and dashboard.","includeFiles":["guides/**/*.md"]},{"title":"Card API","description":"REST API reference and concepts for xMoney card payments.","includeFiles":["api/**/*.md","api/**/*.yaml"]},{"title":"Crypto API","description":"REST API reference and concepts for xMoney crypto payments.","includeFiles":["crypto_api/**/*.md","crypto_api/**/*.yaml"]},{"title":"Card Issuing API","description":"Guides and API reference for xMoney whitelabel card issuing partners.","includeFiles":["card_issuing_api/**/*.md","card_issuing_api/**/*.yaml"]}]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"native-mobile-sdks","__idx":0},"children":["Native Mobile SDKs"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["xMoney provides native checkout SDKs for iOS, Android, React Native, and Flutter. All four use the same integration model: your backend creates a signed order, the app presents a payment surface, and the SDK returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentResult"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Current releases:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["iOS:"]}," 1.1.0"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Android:"]}," 1.1.0"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["React Native:"]}," 1.1.0"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Flutter:"]}," 0.0.3, built on the iOS and Android SDKs 1.1.0"]}]},{"$$mdtype":"Tag","name":"Cards","attributes":{"columns":3,"cardMinWidth":240},"children":[{"$$mdtype":"Tag","name":"Card","attributes":{"title":"iOS","imagePosition":"start","iconPosition":"auto","layout":"vertical","align":"start","variant":"filled","to":"/guides/checkout/native-sdks/ios"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Integrate with Swift Package Manager or CocoaPods. Use Payment Sheet, Payment Element, or Apple Pay in UIKit and SwiftUI."]}]},{"$$mdtype":"Tag","name":"Card","attributes":{"title":"Android","imagePosition":"start","iconPosition":"auto","layout":"vertical","align":"start","variant":"filled","to":"/guides/checkout/native-sdks/android"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Install from Maven Central. Use Payment Sheet, Payment Element, or Google Pay with Compose or an Activity."]}]},{"$$mdtype":"Tag","name":"Card","attributes":{"title":"React Native","imagePosition":"start","iconPosition":"auto","layout":"vertical","align":"start","variant":"filled","to":"/guides/checkout/native-sdks/react-native"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Install from npm and use native payment views from React Native New Architecture apps, including Expo development builds."]}]},{"$$mdtype":"Tag","name":"Card","attributes":{"title":"Flutter","imagePosition":"start","iconPosition":"auto","layout":"vertical","align":"start","variant":"filled","to":"/guides/checkout/native-sdks/flutter"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Install from pub.dev and use native payment views as Flutter widgets on iOS and Android."]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"choose-an-integration","__idx":1},"children":["Choose an integration"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Surface"},"children":["Surface"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Use it when"},"children":["Use it when"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Who owns the Pay button?"},"children":["Who owns the Pay button?"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Payment Sheet"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["You want the fastest path to a complete native checkout."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The SDK"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Payment Element"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The payment form should sit inside your own checkout layout."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The SDK, or your app through ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["confirm()"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Apple Pay / Google Pay"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["You want a standalone express-wallet experience."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The native wallet"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Payment Sheet includes the platform wallet. Payment Element does not add the wallet module automatically: link ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["XMoneyApplePay"]}," beside the iOS element or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["com.xmoney:googlepay"]}," beside the Android element when you want a wallet button. The React Native and Flutter packages include both platform wrappers, but each wallet renders only on its supported platform."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"native-sdk-or-webview","__idx":2},"children":["Native SDK or WebView?"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use a native SDK when you want native controls, lifecycle handling, accessibility, and wallet presentation. Use ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/checkout/inline-checkout/mobile-webview"},"children":["Mobile WebView integration"]}," when you already have one web checkout that must be shared by web, iOS, and Android. Use ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/checkout/hosted-checkout"},"children":["Hosted Checkout"]}," when redirecting to an xMoney-hosted payment page is a better fit."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The native SDKs are not WebView wrappers. Card collection uses native SDK views; web content may still appear during an issuer's 3DS challenge."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"shared-checkout-flow","__idx":3},"children":["Shared checkout flow"]},{"$$mdtype":"Tag","name":"Image","attributes":{"srcSet":"/assets/native-sdk-flow.b962cf2a580f4da39f5b8b3a6f4e18bd096fc9f33cbb8a7384255a4d621e474f.3a19c8dd.svg light, /assets/native-sdk-flow-dark.d32b5f164afa2ba6fc70fbf962f21f38f07939818b6d6959c363914803ae00fe.3a19c8dd.svg dark","alt":"Sequence diagram showing the shared xMoney native SDK checkout flow","framed":false,"withLightbox":false,"align":"center"},"children":[]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your backend creates the order and signs it with the private key."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The app receives ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payload"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["checksum"]}," and builds a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentIntent"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The app presents Payment Sheet, mounts Payment Element, or opens a wallet."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The SDK obtains the payment session, collects payment details, and handles 3DS when required."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The SDK returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["complete"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["canceled"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your backend confirms the final transaction status before fulfillment."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Keep secret keys on your server"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The app should contain only a publishable key such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pk_test_..."]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pk_live_..."]},". Never ship a private or secret API key. Create and sign orders on your backend."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For a server-side signing example, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/checkout/inline-checkout/web-integration#3-create-the-order-on-your-backend"},"children":["Create the order on your backend"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"install-a-platform-sdk","__idx":4},"children":["Install a platform SDK"]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"iOS","disable":false},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use Swift Package Manager:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":".package(\n    url: \"https://github.com/xMoney-Payments/xmoney-ios.git\",\n    from: \"1.1.0\"\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Link ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["XMoneyPaymentSheet"]}," for the drop-in flow, or select ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["XMoneyPaymentElement"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["XMoneyApplePay"]}," separately."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["With CocoaPods:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ruby","header":{"controls":{"copy":{}}},"source":"pod 'XMoneyPaymentSheet', '1.1.0'\n","lang":"ruby"},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Android","disable":false},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Install from Maven Central:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"dependencies {\n    implementation(\"com.xmoney:paymentsheet:1.1.0\")\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For separate surfaces, use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["com.xmoney:paymentelement:1.1.0"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["com.xmoney:googlepay:1.1.0"]},". Upgrade all ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["com.xmoney"]}," artifacts together."]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"React Native","disable":false},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Install the npm package:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"npm install @xmoney/react-native@1.1.0\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["React Native 0.76 or later with New Architecture is required. On iOS, run ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pod install"]},", then rebuild the native app."]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Flutter","disable":false},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Add the package to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pubspec.yaml"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"dependencies:\n  xmoney: ^0.0.3\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Flutter 3.44 or later is required. Run ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["flutter pub get"]},", then ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pod install"]}," in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ios/"]},". On Android, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["MainActivity"]}," must extend ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FlutterFragmentActivity"]},". See the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/checkout/native-sdks/flutter#android-configuration"},"children":["Flutter guide"]}," for the Gradle setup."]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"payment-results-and-order-consumption","__idx":5},"children":["Payment results and order consumption"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Every surface reports the same three terminal outcomes:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Complete:"]}," payment completed; the transaction is available on the result."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Failed:"]}," the attempt failed; use the SDK-authored error code and message."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Canceled:"]}," the shopper dismissed or left the flow."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Signed order checksums are one-shot after a payment attempt starts:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Outcome"},"children":["Outcome"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Is the order consumed?"},"children":["Is the order consumed?"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Next action"},"children":["Next action"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Complete or failed"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Request a new signed order and create a new ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentIntent"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Canceled after Pay or 3DS started"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Request a new signed order."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Payment Sheet closed before Pay"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Present the same intent again."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Wallet dismissed before authorization"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Present the same intent again."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For Payment Element and wallet buttons, replace the consumed intent or unmount the surface. Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isOrderConsumed"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isInteractionEnabled"]}," where exposed to control your app UI."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Confirm payment server-side"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentResult"]}," updates the app experience; it is not the sole source of truth for fulfillment. Confirm final status through your backend, using webhooks or a trusted API check."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"loading-order-updates-and-failures","__idx":6},"children":["Loading, order updates, and failures"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["All four SDKs follow the same contract for loading state and order updates."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Ready."]}," Each mounted surface emits ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ready"]}," once, after the form or wallet button has first drawn. Order updates do not emit it again. A first load that fails shows an SDK-authored failure state and delivers a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]}," result instead of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ready"]},". End your own loading indicator on either one."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Keep the surface mounted."]}," Do not replace Payment Element or a wallet button with a loader while it loads or while the order changes. Keep it laid out at its real size, even under your own loading cover, so it can draw."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Update the order in place."]}," When the cart, amount, or currency changes, rebind the mounted surface with a new signed order. Pay stays disabled (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isInteractionEnabled"]}," is false) until the new order is bound. Each SDK also accepts a callback that creates the order. Pay locks as soon as you call it, so a fast tap cannot charge the previous order while your server is creating the next one. The call returns the bound ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentIntent"]},"."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Platform"},"children":["Platform"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Update with a callback that creates the order"},"children":["Update with a callback that creates the order"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["iOS"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["try await embedded.updateOrder { ... }"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Android"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["embedded.updateOrder { ... }"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["React Native"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["await elementRef.current?.updateOrder(async () => ...)"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Flutter"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["await controller.updateOrderWith(() async => ...)"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Apple Pay and Google Pay APIs and wallet buttons offer the same callback form."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Failures during an update:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Your callback fails."]}," The previous order stays bound and payable, and the error is returned to you."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["A newer update replaces an older one."]}," The newest call always wins. The older call ends with a cancellation error: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CancellationError"]}," on iOS, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["UpdateOrderSuperseded"]}," on Android, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SUPERSEDED_UPDATE_ORDER"]}," in React Native and Flutter. Ignore it. Keep order-creation endpoints idempotent."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Binding fails after an order was already bound."]}," The surface emits ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["updateFailed"]}," and does not call the result handler. Pay stays locked on the previous order until a later update succeeds. Tell the shopper and call the update again."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["A charge is in flight."]}," Passing the same order is a no-op. Passing a different order fails with \"payment in progress\": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentError.paymentInProgress"]}," on iOS, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PaymentError.PaymentInProgress"]}," on Android, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAYMENT_IN_PROGRESS"]}," in React Native and Flutter."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"shared-capabilities","__idx":7},"children":["Shared capabilities"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["All four SDKs support:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Card collection and saved cards"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Payment Sheet and embedded Payment Element"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Apple Pay on iOS and Google Pay on Android"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["SDK-owned or merchant-owned Pay buttons for Payment Element"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Order updates without remounting Payment Element"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["3DS challenges, including hand-off to the shopper's bank app"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Light, dark, and custom appearance"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["English, Greek, Romanian, Bulgarian, Hungarian, and Polish"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Optional cardholder name verification when enabled for the site"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For complete API references and runnable samples, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/xMoney-Payments/xmoney-ios"},"children":["iOS SDK"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/xMoney-Payments/xmoney-android"},"children":["Android SDK"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/xMoney-Payments/xmoney-react-native"},"children":["React Native SDK"]},", and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/xMoney-Payments/xmoney-flutter"},"children":["Flutter SDK"]}," repositories."]}]},"headings":[{"value":"Native Mobile SDKs","id":"native-mobile-sdks","depth":1},{"value":"Choose an integration","id":"choose-an-integration","depth":2},{"value":"Native SDK or WebView?","id":"native-sdk-or-webview","depth":2},{"value":"Shared checkout flow","id":"shared-checkout-flow","depth":2},{"value":"Install a platform SDK","id":"install-a-platform-sdk","depth":2},{"value":"Payment results and order consumption","id":"payment-results-and-order-consumption","depth":2},{"value":"Loading, order updates, and failures","id":"loading-order-updates-and-failures","depth":2},{"value":"Shared capabilities","id":"shared-capabilities","depth":2}],"frontmatter":{"seo":{"title":"Native Mobile SDKs | xMoney Documentation","description":"Integrate xMoney Payment Sheet, Payment Element, Apple Pay, and Google Pay in iOS, Android, React Native, and Flutter apps."}},"lastModified":"2026-10-21T21:31:56.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/checkout/native-sdks","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}