{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["sub-heading","br","details","admonition"]},"type":"markdown"},"seo":{"title":"Aeropay","description":"Transform your commerce with PXP's unified platform—seamless payments, real-time insights, and global growth in one powerful integration.","lang":"en-UK","siteUrl":"https://developer.pxp.io","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"aeropay","__idx":0},"children":["Aeropay"]},{"$$mdtype":"Tag","name":"SubHeading","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Accept Aeropay pay-by-bank payments with automatic consumer verification, bank linking via Aerosync, and the same Drop-in callbacks as other payment methods."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"overview","__idx":1},"children":["Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Aeropay is included in Checkout Drop-in when it's enabled in your session and the transaction meets Aeropay eligibility rules. When the shopper selects ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Pay by bank via Aeropay"]}," and taps the pay button, the SDK mounts an internal Aeropay button component and drives consumer data collection (when required), OTP verification, bank selection or linking, and Unity transaction authorisation."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["There's no separate Aeropay factory call in Drop-in. Configure Aeropay through ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckoutDropInConfig"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DropInMethodConfig.aeropay"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"key-benefits","__idx":2},"children":["Key benefits"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Aeropay in Drop-in gives you these benefits:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Aeropay appears automatically in the payment method list when the session includes Aeropay funding, the currency is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["USD"]},", and the entry type is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".ecom"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Drop-in handles consumer verification, Aerosync bank linking, and payment authorisation. You don't need Aeropay-specific UI code."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Aeropay uses the same ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSuccess"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," callbacks as other payment methods for a unified integration."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Site branding from the Unity Portal is applied automatically to the Aeropay launcher button, popup, and form fields."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Currency and entry-type gating is enforced automatically."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-it-works","__idx":3},"children":["How it works"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When a shopper selects Aeropay in Checkout Drop-in and taps the pay button:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The shopper selects the Aeropay panel. The SDK shows the Aeropay launcher in the panel."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The shopper taps ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Pay by bank"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onBeforeSubmit"]}," callback runs (if configured). Return ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]}," to stop the flow before the popup opens."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Consumer data collection runs when required (skipped for a non-empty ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["userId"]},", or when ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["skipConsumerDataCollection"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]}," with all four valid ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]}," fields and empty/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nil"]}," editable fields)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["OTP verification runs when required (skipped when ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["userId"]}," is set)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Aerosync bank selection or bank linking runs."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSubmit"]}," callback fires, then the SDK submits the Unity transaction. Drop-in always proceeds after ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSubmit"]}," (there's no merchant ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPreAuthorisation"]}," gate)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSuccess"]}," callback fires with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["paymentMethod == .aeropay"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the shopper closes the Aeropay popup without completing, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.global.onCancel"]}," fires with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".aeropay"]}," and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nil"]}," payload. Errors during setup or the flow are delivered to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"consumer-data-decision-tree","__idx":4},"children":["Consumer data decision tree"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["How the SDK decides whether to collect consumer data:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["userId provided:"]}," When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.aeropay.userId"]}," is set to a non-empty value, skip consumer data collection and OTP. Open Aerosync (bank selection) directly after validating that the user is active."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Skip data collection:"]}," When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["skipConsumerDataCollection"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]}," returns all four fields (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["firstName"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["lastName"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["phoneNumber"]},"), and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["editableConsumerDataFields"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nil"]}," or empty, auto-create the Aeropay user, skip the data screen, and go to OTP."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Otherwise:"]}," Show the consumer data collection screen (prefilled from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]},"). Prefill fields with values are read-only unless listed in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["editableConsumerDataFields"]},". Missing fields stay available for the shopper to complete."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"configuration","__idx":5},"children":["Configuration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Configure Aeropay-specific behaviour at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.aeropay"]},". All properties are optional."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"configuration-properties","__idx":6},"children":["Configuration properties"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following properties are available for Aeropay configuration:"]},{"$$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":{"width":"40%","data-label":"Property"},"children":["Property "]},{"$$mdtype":"Tag","name":"th","attributes":{"width":"60%","data-label":"Description"},"children":["Description "]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["userId"]},{"$$mdtype":"Tag","name":"Break","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Details","attributes":{},"children":["String?"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Pre-configured Aeropay user ID. When provided, consumer data collection and OTP are skipped and the flow opens directly at bank selection (Aerosync). The SDK validates that the user is active before opening the popup. When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["userId"]}," is set, Drop-in also skips shopper-data validation at load."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["editableConsumerDataFields"]},{"$$mdtype":"Tag","name":"Break","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Details","attributes":{},"children":["[ConsumerDataField]?"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Fields returned from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]}," that remain editable on the consumer data collection screen. Possible values: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".firstName"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".lastName"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".email"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".phoneNumber"]},". When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nil"]}," or empty, prefilled fields are read-only. Must be empty or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nil"]}," when using ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["skipConsumerDataCollection"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["excludedBankAccountIds"]},{"$$mdtype":"Tag","name":"Break","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Details","attributes":{},"children":["[AeropayBankAccountId]?"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Bank account IDs to hide from the bank selection screen. Use string or integer literals (e.g., ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[\"12345\"]"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[12345]"]},")."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["skipConsumerDataCollection"]},{"$$mdtype":"Tag","name":"Break","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Details","attributes":{},"children":["Bool"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]}," provides all four consumer fields, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["editableConsumerDataFields"]}," is empty or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nil"]},", the consumer data screen is skipped and the flow goes directly to OTP verification (the user is created automatically). Defaults to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]},"."]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Don't set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["skipConsumerDataCollection"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]}," together with a non-empty ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["editableConsumerDataFields"]}," list. The skip path requires editable fields to be ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nil"]}," or empty."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"settings-used-from-global-configuration","__idx":7},"children":["Settings used from global configuration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Aeropay inherits the following setting from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.global"]},":"]},{"$$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":{"width":"40%","data-label":"Property"},"children":["Property "]},{"$$mdtype":"Tag","name":"th","attributes":{"width":"60%","data-label":"Description"},"children":["Description "]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onCancel"]},{"$$mdtype":"Tag","name":"Break","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Details","attributes":{},"children":["(DropInPaymentMethod, Any?) -> Void"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Called when the shopper closes the Aeropay popup. For Aeropay, the payload is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nil"]},". Cancellation doesn't call ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},"."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetConsent"]}," doesn't apply to Aeropay in Drop-in (Card, PayPal, and Apple Pay only)."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"what-drop-in-doesnt-expose-via-methodconfigaeropay","__idx":8},"children":["What Drop-in doesn't expose via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.aeropay"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following are handled internally from your Unity site branding and Drop-in wiring:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Popup, OTP, bank selection, and launcher button styling."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Component-level callbacks such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onClick"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserVerificationSuccess"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Merchant-controlled ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPreAuthorisation"]}," (Drop-in always proceeds after ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSubmit"]},")."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Payout intent and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["allowLinkBankOnPayout"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you need merchant-controlled pre-authorisation gating, payout intent, or styling and callbacks beyond Drop-in's unified surface, those capabilities aren't part of the Drop-in Aeropay integration. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#what-drop-in-exposes-vs-what-it-manages"},"children":["What Drop-in exposes vs what it manages"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"complete-example","__idx":9},"children":["Complete example"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This example shows Aeropay intent, shopper identity, cancellation handling, and optional ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.aeropay"]}," settings. The skip path below is consistent: all four consumer fields are provided and editable fields are omitted."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"import PXPCheckoutSDK\n\nlet dropInConfig = CheckoutDropInConfig(\n    environment: .test,\n    session: sessionData,\n    transactionData: DropInTransactionData(\n        amount: Decimal(string: \"25.00\") ?? 0,\n        currency: \"USD\",\n        entryType: .ecom,\n        intent: DropInTransactionIntentData(\n            aeropay: .authorisation\n        ),\n        merchantTransactionId: UUID().uuidString,\n        merchantTransactionDate: { Date() }\n    ),\n    merchantShopperId: \"shopper-001\",\n    ownerId: \"MERCHANT_GROUP_1\", // Merchant group ID (ownerType is always \"MerchantGroup\")\n    methodConfig: DropInMethodConfig(\n        global: DropInGlobalConfig(\n            onCancel: { paymentMethod, _ in\n                guard paymentMethod == .aeropay else { return }\n                // Shopper closed Pay by Bank — not an error\n            }\n        ),\n        aeropay: DropInAeropayConfig(\n            // userId: \"existing-aeropay-user-id\",\n            skipConsumerDataCollection: true\n            // editableConsumerDataFields must stay nil or empty when skip is true\n        )\n    ),\n    onGetShopper: {\n        TransactionShopper(\n            id: \"shopper-001\",\n            firstName: \"John\",\n            lastName: \"Doe\",\n            email: \"shopper@example.com\",\n            // When non-empty: +1 followed by 10 digits (e.g. +16465180948). Omit or leave empty to collect in the popup.\n            phoneNumber: \"+16465180948\"\n        )\n    },\n    onBeforeSubmit: { paymentMethod async in\n        guard paymentMethod == .aeropay else { return true }\n        return await validateCheckoutForm()\n    },\n    onSubmit: { paymentMethod in\n        // Unity transaction is about to submit for Aeropay\n        print(\"Submit: \\(paymentMethod.rawValue)\")\n    },\n    onSuccess: { result in\n        guard result.paymentMethod == .aeropay else { return }\n        verifyPaymentOnBackend(result)\n    },\n    onError: { paymentMethod, error in\n        guard paymentMethod == .aeropay else { return }\n        showError(error.errorCode, error.errorMessage)\n    }\n)\n\nlet checkoutDropIn = try CheckoutDropIn(config: dropInConfig)\n// create() does not throw for Aeropay eligibility or render failures — those arrive on onError after create completes.\nawait checkoutDropIn.create()\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"aeropay-requirements","__idx":10},"children":["Aeropay requirements"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Aeropay requires the following to function correctly:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Currency:"]}," Transaction currency must be ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["USD"]},". If another currency is set, the Aeropay panel isn't shown and Drop-in fires ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0116"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Entry type:"]}," Must be ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".ecom"]},". If it isn't, the Aeropay panel isn't shown and Drop-in fires ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0114"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Unity Portal:"]}," Aeropay must be enabled for your merchant site. The session response must contain ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["allowedFundingTypes.payByBanks.aeropay"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["externalMerchantId"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["configurationId"]},". If Aeropay funding is absent, the panel isn't shown and no ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," fires."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Intent:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionData.intent.aeropay"]}," must be set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".authorisation"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".purchase"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".estimatedAuthorisation"]},". If it's missing, Drop-in calls ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0115"]}," and the Aeropay panel doesn't load."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Shopper identity:"]}," Implement ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]}," with valid consumer data when values are provided, or set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.aeropay.userId"]},". Non-empty invalid shopper fields at Drop-in load fire ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1300"]}," and hide the Aeropay panel. Nil shopper, empty fields, and empty phone are allowed at load and collected in the popup when needed. When you supply ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["phoneNumber"]}," in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]},", use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["+1"]}," followed by 10 digits (for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["+16465180948"]},"). Omit or leave empty to collect in the popup."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Site branding:"]}," Checkout Drop-in site configuration must be available from Unity for branding and styling."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Placement:"]}," Aeropay appears in the Drop-in payment method list with the label ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Pay by bank via Aeropay"]}," (localisable). Panel order follows site ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["paymentMethodOrdering"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," before ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["create()"]},":"]}," Aeropay eligibility and render failures during ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["await create()"]}," surface on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},", not as thrown errors from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["create()"]},". Keep ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," implemented before calling ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["create()"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"implementation","__idx":11},"children":["Implementation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Aeropay works through the standard Drop-in implementation. Set the Aeropay intent, provide shopper data or a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["userId"]},", and use the shared success and error callbacks."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"session-configuration-backend","__idx":12},"children":["Session configuration (backend)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Enable Aeropay in the Unity Portal for your merchant and site. Create a session with the standard Sessions API and include the Aeropay intent."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"merchant\": \"MERCHANT-1\",\n  \"site\": \"SITE-1\",\n  \"sessionTimeout\": 120,\n  \"merchantTransactionId\": \"0ce72cfd-014d-4256-a006-a56601b2ffc4\",\n  \"transactionMethod\": {\n    \"intent\": {\n      \"card\": \"Authorisation\",\n      \"paypal\": \"Purchase\",\n      \"aeropay\": \"Authorisation\"\n    }\n  },\n  \"amounts\": {\n    \"currencyCode\": \"USD\",\n    \"transactionValue\": 25.00\n  },\n  \"allowTransaction\": true,\n  \"serviceType\": \"CheckoutDropIn\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When Aeropay is enabled, the session response includes:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"sessionId\": \"...\",\n  \"hmacKey\": \"...\",\n  \"encryptionKey\": \"...\",\n  \"allowedFundingTypes\": {\n    \"payByBanks\": {\n      \"aeropay\": {\n        \"externalMerchantId\": \"...\",\n        \"configurationId\": \"...\"\n      }\n    }\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Pass the session credentials and funding types into ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SessionData"]}," when you initialise Drop-in. If ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["allowedFundingTypes.payByBanks.aeropay"]}," is absent, the Aeropay panel isn't shown. If ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["externalMerchantId"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["configurationId"]}," is blank, the panel doesn't load and Drop-in calls ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0113"]},"."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Aeropay credentials (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["externalMerchantId"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["configurationId"]},") come from the Unity Portal on the session response. Don't hardcode production values in the app."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"intent-requirements","__idx":13},"children":["Intent requirements"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Set the Aeropay intent in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionData.intent.aeropay"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"intent: DropInTransactionIntentData(\n    aeropay: .authorisation\n    // or .purchase\n    // or .estimatedAuthorisation\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Supported Aeropay intents in Drop-in:"]},{"$$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":"Intent value (Sessions API)"},"children":["Intent value (Sessions API)"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"SDK value"},"children":["SDK value"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Supported"},"children":["Supported"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Notes"},"children":["Notes"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Authorisation"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".authorisation"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Recommended for checkout. There is no SDK default; you must set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["intent.aeropay"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Purchase"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".purchase"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["None"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["EstimatedAuthorisation"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".estimatedAuthorisation"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["None"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Payout"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Not available"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Not available on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DropInAeropayIntentType"]},"."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"consumer-data-validation-rules","__idx":14},"children":["Consumer data validation rules"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["userId"]}," isn't provided, Drop-in validates non-empty ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]}," fields before showing the Aeropay panel. Invalid formats raise ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1300"]}," through ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," and hide Aeropay. Nil shopper, empty or omitted fields, and empty phone don't fail this load check."]},{"$$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":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Rules"},"children":["Rules"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["firstName"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["If provided and non-empty: letters and spaces only (Unicode), max 100 characters"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["lastName"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["If provided and non-empty: letters and spaces only (Unicode), max 100 characters"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["If provided and non-empty: valid email format, max 128 characters"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["phoneNumber"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["If provided and non-empty: US format ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["+1"]}," + 10 digits matching ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["^\\+1\\d{10}$"]}," (for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["+16465180948"]},"). Values without the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["+1"]}," prefix (for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["6465180948"]},") fail load validation with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1300"]},". Empty or nil is OK at load; omit or leave empty to collect in the popup."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["skipConsumerDataCollection"]}," additionally requires all four values to be non-empty."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"updating-the-amount-at-runtime","__idx":15},"children":["Updating the amount at runtime"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["updateAmount(amount:)"]}," when the order total changes. This updates all enabled payment methods, including Aeropay."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"await checkoutDropIn.create()\ncheckoutDropIn.updateAmount(amount: Decimal(150))\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"handling-responses","__idx":16},"children":["Handling responses"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"aeropay-callback-data","__idx":17},"children":["Aeropay callback data"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When an Aeropay payment succeeds, your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSuccess"]}," callback receives a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DropInSubmitResult"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"onSuccess: { result in\n    guard result.paymentMethod == .aeropay else { return }\n    // result.systemTransactionId\n    // result.merchantTransactionId\n    // result.paymentData is nil for Aeropay\n    verifyPaymentOnBackend(result)\n}\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"cancellation","__idx":18},"children":["Cancellation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Handle shopper cancellation with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.global.onCancel"]},". Don't treat this as an error."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"methodConfig: DropInMethodConfig(\n    global: DropInGlobalConfig(\n        onCancel: { paymentMethod, _ in\n            guard paymentMethod == .aeropay else { return }\n            // Shopper closed the Aeropay popup\n        }\n    )\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"error-handling","__idx":19},"children":["Error handling"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Handle Aeropay-specific Drop-in errors by branching on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["error.errorCode"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"onError: { paymentMethod, error in\n    guard paymentMethod == .aeropay else { return }\n    switch error.errorCode {\n    case \"SDK0114\":\n        showError(\"Pay by Bank is only available for e-commerce checkout.\")\n    case \"SDK0116\":\n        showError(\"Pay by Bank only supports USD.\")\n    case \"SDK0113\":\n        showError(\"Aeropay isn't configured for this session. Choose another payment method.\")\n    case \"SDK0115\":\n        showError(\"Aeropay intent is missing. Choose another payment method.\")\n    case \"SDK1300\":\n        showError(\n            \"Please check your name, email, and US phone number (+1 followed by 10 digits).\"\n        )\n    case \"SDK1125\":\n        // Fallback when Aeropay fails to render for unexpected reasons.\n        // Credential and intent setup failures usually keep SDK0113 or SDK0115.\n        showError(\n            \"Aeropay is temporarily unavailable. Please try another payment method.\"\n        )\n    case \"SDK1126\":\n        // Fallback when Drop-in can't map a richer failed-submit result.\n        // Mapped Unity failures often deliver the API errorCode from FailedSubmitResult instead.\n        showError(\n            \"Aeropay payment failed. Please try again or use a different payment method.\"\n        )\n    default:\n        // Mapped submit failures may use the API errorCode from FailedSubmitResult.\n        showError(error.errorMessage)\n    }\n}\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"common-error-scenarios","__idx":20},"children":["Common error scenarios"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following table describes common Aeropay error scenarios:"]},{"$$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":"Scenario"},"children":["Scenario"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"How to detect"},"children":["How to detect"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Recommended action"},"children":["Recommended action"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Shopper cancelled"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.global.onCancel"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".aeropay"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No alert needed. The shopper action was intentional."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Currency not USD"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Aeropay panel not shown, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0116"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["currency = \"USD\""]}," when Aeropay is in the session."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Entry type not ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".ecom"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Aeropay panel not shown, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0114"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["entryType: .ecom"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Aeropay not in session"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Panel not shown (no ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},")"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Enable Aeropay in the Unity Portal. Ensure the session includes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payByBanks.aeropay"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Blank credentials or missing intent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Expect ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0113"]}," (blank credentials) or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0115"]}," (missing intent) via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1125"]}," is only the fallback when Aeropay fails to render for other unexpected reasons (not the usual code for credential or intent setup)."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Check ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["externalMerchantId"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["configurationId"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["intent.aeropay"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Invalid shopper data at load"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1300"]}," via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},"; Aeropay panel not shown"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Check ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]}," field formats (especially phone ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["+1XXXXXXXXXX"]},"), or provide ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["userId"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["User not active"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1307"]}," via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The user must complete Aeropay verification before paying."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Transaction declined"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["API ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["errorCode"]}," from the failed submit result on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," when present; otherwise ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1126"]},". Don't expect ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1326"]}," as the Drop-in merchant ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," code for mapped submit failures (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1326"]}," is a component-level analytics code)."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Suggest another payment method."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"backend-verification","__idx":21},"children":["Backend verification"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Always verify Aeropay payments on your backend before fulfilling orders:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"onSuccess: { result in\n    guard result.paymentMethod == .aeropay else { return }\n    Task {\n        let verified = await verifyPaymentOnBackend(\n            systemTransactionId: result.systemTransactionId,\n            merchantTransactionId: result.merchantTransactionId\n        )\n        if verified {\n            navigateToConfirmation(result.systemTransactionId)\n        } else {\n            showError(\"Payment verification failed\")\n        }\n    }\n}\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Confirm the transaction state, merchant transaction ID, amount, and funding type (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayByBank"]},") against your order records using the Transactions API."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"error-codes","__idx":22},"children":["Error codes"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"drop-inspecific-errors","__idx":23},"children":["Drop-in–specific errors"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create and payment failures surface through ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},". Branch on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["error.errorCode"]},"."]},{"$$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":"Error code"},"children":["Error code"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"When it occurs"},"children":["When it occurs"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1125"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Fallback when Aeropay fails to load in Drop-in for unexpected reasons. Expect ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0113"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0115"]}," for credential or intent setup failures; those codes are preserved on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," when the underlying create error is a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BaseSdkException"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1126"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Fallback when a Unity Aeropay submit fails and there is no API ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["errorCode"]}," on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FailedSubmitResult"]},". When the failed result includes an API ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["errorCode"]},", Drop-in delivers that code on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," instead."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"sdk-configuration-errors","__idx":24},"children":["SDK configuration errors"]},{"$$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":"Error code"},"children":["Error code"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Message"},"children":["Message"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"When it occurs in Drop-in"},"children":["When it occurs in Drop-in"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0114"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Aeropay only supports Ecom entry type"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["entryType"]}," isn't ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".ecom"]}," (panel hidden). Fired directly via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0116"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Aeropay only supports USD currency"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["currency"]}," isn't ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["USD"]}," (panel hidden). Fired directly via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0113"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Aeropay is missing in allow funding types"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Session Aeropay credentials are blank. The panel doesn't load and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0113"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0115"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Intent type for Aeropay is required but not provided"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["intent.aeropay"]}," is missing. The panel doesn't load and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0115"]},"."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"aeropay-flow-errors","__idx":25},"children":["Aeropay flow errors"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["During the popup flow, Aeropay component errors may also surface through ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},". Representative codes:"]},{"$$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":"Error code"},"children":["Error code"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Scenario"},"children":["Scenario"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1300"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Invalid ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]}," data (at Drop-in load when malformed and non-empty, or during the popup flow)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1301"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["User creation API failure"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1302"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["OTP verification failure (including provider code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AP112"]},")"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1303"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Missing or invalid Aerosync payload (including bank-list load when no verified user ID is available yet). Prefer this over ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1311"]}," for that diagnosis."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1304"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Aerosync widget error"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1305"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Bank account linking failure"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1306"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Bank account list retrieval failure"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1307"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Pre-configured ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["userId"]}," isn't active"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1308"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Get user API failure (including when retrieving a returning ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["userId"]}," fails)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1319"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Aeropay aggregator credentials lookup failure"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["API ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["errorCode"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1126"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Unity transaction failure. Drop-in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," receives the API ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["errorCode"]}," from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FailedSubmitResult"]}," when present; otherwise ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1126"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1326"]}," is an internal component analytics code for mapped failed submits, not the primary Drop-in merchant ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," code. There is no separate merchant ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSubmitError"]}," callback in Drop-in."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-drop-in-exposes-vs-what-it-manages","__idx":26},"children":["What Drop-in exposes vs what it manages"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Aeropay in Drop-in uses a fixed merchant surface. Use this table as the Drop-in contract:"]},{"$$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":"Concern"},"children":["Concern"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Drop-in behaviour"},"children":["Drop-in behaviour"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["UI placement"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Panel inside ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckoutDropIn.buildContent()"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Branding"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Unity Portal Drop-in site configuration (launcher, popup, fields)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Merchant callbacks"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Unified Drop-in sequence: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onBeforeSubmit"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSubmit"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSuccess"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.global.onCancel"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Pre-authorisation gate"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Always proceeds after ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSubmit"]}," (no merchant veto after bank confirmation)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Payout intent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Not available (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DropInAeropayIntentType"]}," has no payout case)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Eligibility failures"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Panel hidden; some failures also call ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#error-codes"},"children":["Error codes"]},")"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["How Drop-in's unified callbacks relate to the Aeropay flow:"]},{"$$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":"Drop-in callback"},"children":["Drop-in callback"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"When it fires for Aeropay"},"children":["When it fires for Aeropay"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onBeforeSubmit"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Shopper taps ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Pay by bank"]},", before the popup opens. Return ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]}," to stop."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSubmit"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Bank selected and Unity transaction is about to submit. Drop-in always continues afterward."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSuccess"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Unity authorises the transaction."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.global.onCancel"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Shopper closes the popup. Payload is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nil"]},". Doesn't call ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Setup, flow, or transaction error. For Unity transaction failure: API ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["errorCode"]}," from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FailedSubmitResult"]}," when present; otherwise ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1126"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1326"]}," is internal component analytics, not the primary Drop-in merchant callback code."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Drop-in doesn't expose merchant callbacks for button click, user-verification success, or a separate submit-error channel. Handle those concerns through the unified callbacks and analytics events above."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"troubleshooting","__idx":27},"children":["Troubleshooting"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use these checks when Aeropay doesn't appear or the pay-by-bank flow fails."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"aeropay-panel-not-shown","__idx":28},"children":["Aeropay panel not shown"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Verify these conditions:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["allowedFundingTypes.payByBanks.aeropay"]}," is present in the session response with non-blank ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["externalMerchantId"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["configurationId"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionData.currency"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"USD\""]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionData.entryType"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".ecom"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionData.intent.aeropay"]}," is set to a supported intent."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," may fire with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0116"]}," (currency), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0114"]}," (entry type), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1300"]}," (invalid shopper data at load), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0113"]}," (credentials), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0115"]}," (missing intent), or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1125"]}," (Aeropay failed to load)."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"invalid-shopper-data--sdk1300-","__idx":29},"children":["Invalid shopper data (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1300"]},")"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Look for these symptoms:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Non-empty invalid ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]}," fields at Drop-in load hide the Aeropay panel and call ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Name, email, or US phone format (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["+1"]}," + 10 digits) is wrong, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.aeropay.userId"]}," isn't set."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"onerror-with-create-or-render-failure","__idx":30},"children":["onError with create or render failure"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Aeropay eligibility and render failures during ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["await create()"]}," surface on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},", not as thrown errors from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["create()"]},". Keep ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," implemented before calling ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["create()"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Check the following:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The session is missing Aeropay credentials, or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["intent.aeropay"]}," isn't set."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Branch on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["error.errorCode"]},". Expect ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0113"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0115"]}," for credential or intent setup failures. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1125"]}," indicates Aeropay failed to render for other unexpected reasons (not the usual code for those setup failures)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Log ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["error.errorMessage"]}," for extra detail."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"consumer-data-screen-shown-when-userid-is-provided","__idx":31},"children":["Consumer data screen shown when ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["userId"]}," is provided"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Check the following:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.aeropay.userId"]}," is empty or missing after trim."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["If the user isn't active, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," receives ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1307"]},". If retrieving the user fails, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," receives ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK1308"]},". Clear or replace the stored ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["userId"]}," and restart the new-shopper flow."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"onbeforesubmit-not-preventing-the-popup","__idx":32},"children":["onBeforeSubmit not preventing the popup"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Check the following:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Confirm ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onBeforeSubmit"]}," is implemented on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckoutDropInConfig"]},". If it's omitted, Drop-in doesn't register the Aeropay pre-popup validation hook and the flow always opens after the button tap."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onBeforeSubmit"]}," returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]}," for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".aeropay"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The callback is set on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckoutDropInConfig"]},", not only inside ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"otp-screen-not-skipped-with-skipconsumerdatacollection","__idx":33},"children":["OTP screen not skipped with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["skipConsumerDataCollection"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Check the following:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["One or more of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["firstName"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["lastName"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["phoneNumber"]}," is missing from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["editableConsumerDataFields"]}," is set to a non-empty list."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"quick-integration-checklist","__idx":34},"children":["Quick integration checklist"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before you go live with Aeropay, confirm the following:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enable Aeropay in the Unity Portal for your merchant site."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Confirm the session includes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["allowedFundingTypes.payByBanks.aeropay"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["externalMerchantId"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["configurationId"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"aeropay\": \"Authorisation\""]}," (or another supported intent) in the session intent."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionData.currency"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"USD\""]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["entryType"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".ecom"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transactionData.intent.aeropay"]}," to a supported Drop-in intent."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Implement ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onGetShopper"]}," with valid formats when you supply values, or provide ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.aeropay.userId"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Implement ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSuccess"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Optionally configure ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.aeropay"]}," for user ID, skip data collection, editable fields, or excluded bank accounts."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Optionally handle cancellation via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["methodConfig.global.onCancel"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verify payments on your backend before fulfilling orders."]}]}]},"headings":[{"value":"Aeropay","id":"aeropay","depth":1},{"value":"Overview","id":"overview","depth":2},{"value":"Key benefits","id":"key-benefits","depth":3},{"value":"How it works","id":"how-it-works","depth":2},{"value":"Consumer data decision tree","id":"consumer-data-decision-tree","depth":3},{"value":"Configuration","id":"configuration","depth":2},{"value":"Configuration properties","id":"configuration-properties","depth":3},{"value":"Settings used from global configuration","id":"settings-used-from-global-configuration","depth":3},{"value":"What Drop-in doesn't expose via methodConfig.aeropay","id":"what-drop-in-doesnt-expose-via-methodconfigaeropay","depth":3},{"value":"Complete example","id":"complete-example","depth":3},{"value":"Aeropay requirements","id":"aeropay-requirements","depth":3},{"value":"Implementation","id":"implementation","depth":2},{"value":"Session configuration (backend)","id":"session-configuration-backend","depth":3},{"value":"Intent requirements","id":"intent-requirements","depth":3},{"value":"Consumer data validation rules","id":"consumer-data-validation-rules","depth":3},{"value":"Updating the amount at runtime","id":"updating-the-amount-at-runtime","depth":3},{"value":"Handling responses","id":"handling-responses","depth":2},{"value":"Aeropay callback data","id":"aeropay-callback-data","depth":3},{"value":"Cancellation","id":"cancellation","depth":3},{"value":"Error handling","id":"error-handling","depth":3},{"value":"Common error scenarios","id":"common-error-scenarios","depth":4},{"value":"Backend verification","id":"backend-verification","depth":2},{"value":"Error codes","id":"error-codes","depth":2},{"value":"Drop-in–specific errors","id":"drop-inspecific-errors","depth":3},{"value":"SDK configuration errors","id":"sdk-configuration-errors","depth":3},{"value":"Aeropay flow errors","id":"aeropay-flow-errors","depth":3},{"value":"What Drop-in exposes vs what it manages","id":"what-drop-in-exposes-vs-what-it-manages","depth":2},{"value":"Troubleshooting","id":"troubleshooting","depth":2},{"value":"Aeropay panel not shown","id":"aeropay-panel-not-shown","depth":3},{"value":"Invalid shopper data ( SDK1300 )","id":"invalid-shopper-data--sdk1300-","depth":3},{"value":"onError with create or render failure","id":"onerror-with-create-or-render-failure","depth":3},{"value":"Consumer data screen shown when userId is provided","id":"consumer-data-screen-shown-when-userid-is-provided","depth":3},{"value":"onBeforeSubmit not preventing the popup","id":"onbeforesubmit-not-preventing-the-popup","depth":3},{"value":"OTP screen not skipped with skipConsumerDataCollection","id":"otp-screen-not-skipped-with-skipconsumerdatacollection","depth":3},{"value":"Quick integration checklist","id":"quick-integration-checklist","depth":2}],"frontmatter":{"seo":{"title":"Aeropay"}},"lastModified":"2026-08-11T10:18:08.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/checkout/drop-in/ios/aeropay","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}