Overview
The Telr Mobile Payment SDK for iOS is a comprehensive payment solution that enables merchants to accept payments seamlessly within their iOS applications. Built with SwiftUI and following modern iOS development patterns, it provides a clean, secure, and customizable payment experience.
Key Features
- Multiple Payment Methods: Credit/Debit Cards, Apple Pay
- 3D Secure Support: Built-in 3DS authentication flow
- Saved Cards: Tokenization and card management
- Modern UI: SwiftUI-based interface with iOS design guidelines
- Internationalization: Multi-language support (English, Arabic)
- Security: PCI DSS compliant with tokenization
- Accessibility: Full accessibility support for inclusive design
Requirements
- iOS 15.1+
- Swift 6.0+
- Xcode 15.0+
- CocoaPods 1.11+ (if using CocoaPods)
- Your backend must return two URLs taken directly from the createOrder API response:
- tokenUrl — value of _links.auth.href
- orderUrl — value of _links.self.href
Installation
CocoaPods (Recommended)
-
Install CocoaPods (if not already installed):
sudo gem install cocoapods -
Create or update your Podfile:
platform :ios, '15.1' use_frameworks! inhibit_all_warnings! target 'YourAppTarget' do pod 'TelrSDK', '~> 4.4.1' end -
Install the SDK:
pod install -
Open the workspace:
open YourApp.xcworkspace -
Import the SDK in your Swift files:
import MobilePaymentSDK
CocoaPods Troubleshooting
The TelrSDK pod is published from github.com/Telr-PG/telr-sdk-ios and resolves via the standard CocoaPods CDN — no extra source configuration is required. If pod install cannot find it, run pod repo update and try again.
If you encounter build issues with newer Xcode versions, add this to your Podfile:
post_install do |installer|
installer.pods_project.targets.each do |t|
t.build_configurations.each do |config|
config.build_settings['ENABLE_USER_SCRIPT_SANDBOXING'] = 'NO'
end
end
installer.aggregate_targets.each do |t|
t.user_project.native_targets.each do |nt|
nt.build_configurations.each do |config|
config.build_settings['ENABLE_USER_SCRIPT_SANDBOXING'] = 'NO'
end
end
end
endSwift Package Manager
Via Xcode (Recommended)
- In Xcode, go to File > Add Package Dependencies
- Enter the repository URL:
https://github.com/Telr-PG/telr-sdk-ios - Select version rule (e.g., "Up to Next Major") and pick release (e.g., 4.4.1)
- Add the product
MobilePaymentSDKto your target
Via Package.swift
// swift-tools-version: 6.0
import PackageDescription
let package = Package(
name: "YourApp",
platforms: [
.iOS(.v15)
],
dependencies: [
.package(url: "https://github.com/Telr-PG/telr-sdk-ios.git", .upToNextMajor(from: "4.4.1"))
],
targets: [
.target(
name: "YourApp",
dependencies: [
.product(name: "MobilePaymentSDK", package: "telr-sdk-ios")
]
)
]
)Carthage
-
Add to Cartfile:
binary "https://raw.githubusercontent.com/Telr-PG/telr-sdk-ios/main/MobilePaymentSDK.json" ~> 4.4.1 -
Update dependencies:
carthage update --use-xcframeworks --platform iOS -
Add to Xcode:
- Drag
Carthage/Build/MobilePaymentSDK.xcframeworkinto your project - Set to "Embed & Sign" in Frameworks, Libraries, and Embedded Content
- Drag
Manual Installation
-
Download the framework:
- Download
MobilePaymentSDK.xcframework.zipfrom Releases - Unzip to get
MobilePaymentSDK.xcframework
- Download
-
Add to Xcode:
- Drag the framework into your project navigator
- Check "Copy items if needed" and select your target
- Set to "Embed & Sign" in project settings
Quick Start
Basic Implementation
import SwiftUI
import MobilePaymentSDK
struct PaymentView: View {
@State private var showPayment = false
private let paymentSDK = PaymentSDK()
var body: some View {
VStack {
Button("Pay Now") {
showPayment = true
}
}
.fullScreenCover(isPresented: $showPayment) {
paymentSDK.paymentView(
tokenURL: "https://api.telr.com/token",
orderURL: "https://api.telr.com/order/123",
onFinish: { response in
if response.success {
print("Payment successful: \(response.message)")
} else {
print("Payment failed: \(response.message)")
}
showPayment = false
}
)
}
}
}UIKit Integration
import UIKit
import MobilePaymentSDK
class PaymentViewController: UIViewController {
private let paymentSDK = PaymentSDK()
func showPayment() {
let paymentView = paymentSDK.paymentView(
tokenURL: "https://api.telr.com/token",
orderURL: "https://api.telr.com/order/123",
onFinish: { response in
DispatchQueue.main.async {
if response.success {
self.showAlert(title: "Success", message: response.message)
} else {
self.showAlert(title: "Error", message: response.message)
}
}
}
)
let hostingController = UIHostingController(rootView: paymentView)
present(hostingController, animated: true)
}
private func showAlert(title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
}
}Configuration
Basic Configuration
let configuration = PaymentSDKConfiguration(
debugLoggingEnabled: false,
preferredLanguageCode: "en"
)
let paymentSDK = PaymentSDK(configuration: configuration)Builder Pattern Configuration
let configuration = PaymentSDKConfiguration.builder()
.withDebugLoggingEnabled(true) // Enable for development
.withPreferredLanguageCode("ar") // Arabic support
.build()
let paymentSDK = PaymentSDK(configuration: configuration)Configuration Options
| Parameter | Type | Default | Description |
|---|---|---|---|
debugLoggingEnabled | Bool | false | Enable debug logging (development only) |
preferredLanguageCode | String? | nil | Override language ("en", "ar") |
applePayMerchantIdentifier | String? | nil | Apple Pay merchant ID (e.g. merchant.com.yourcompany.yourapp). Required for Apple Pay to appear. |
applePayButtonType | PKPaymentButtonType | .plain | Apple Pay button label (.buy, .checkout, .book, .donate, etc.) |
applePayButtonStyle | PKPaymentButtonStyle | .automatic | Apple Pay button style (.black, .white, .whiteOutline, .automatic) |
colors | SDKColorConfig? | nil | Merchant color overrides applied at init. See Custom Colors (Theming). |
Runtime Configuration Updates
// Update configuration at runtime
let newConfig = PaymentSDKConfiguration.builder()
.withPreferredLanguageCode("ar")
.build()
paymentSDK.updateConfiguration(newConfig)Note: Views already created with paymentView will not automatically pick up configuration changes. Create a new view after updating configuration if you need the new config applied.
Custom Colors (Theming)
You can theme the SDK's payment UI to match your brand by passing SDKColorConfig at init via .withColors(...). Provide light and/or dark variants; each color is an optional hex string ("#RRGGBB" or "#AARRGGBB").
let config = PaymentSDKConfiguration.builder()
.withColors(SDKColorConfig(
light: SDKColors(
primary: "#0057FF", // Pay button, selected tick, checkbox, links, back chevron
background: "#FFFFFF", // payment sheet / surface background
textLabel: "#101828", // primary text (merchant name, amount, method names, card details)
border: "#E4E7EC", // field/card outlines, dividers
buttonText: "#FFFFFF", // text drawn on the Pay button
textFieldText: "#101828", // text the user types into inputs
textFieldBackground: "#F2F4F7" // input field fill
),
dark: SDKColors(
primary: "#4C8DFF",
background: "#101828",
textLabel: "#F2F4F7",
border: "#344054",
buttonText: "#FFFFFF",
textFieldText: "#F2F4F7",
textFieldBackground: "#1D2939"
)
))
.build()
let paymentSDK = PaymentSDK(configuration: config)Color tokens
| Token | Applies to |
|---|---|
primary | Pay button fill, selected radio tick, save-card checkbox, links, back chevron |
background | Payment sheet / surface background |
textLabel | Primary text: merchant name, amount, method names, masked card details |
border | Input-field & card-row outlines, dividers |
buttonText | Text drawn on the Pay button |
textFieldText | Text the user types into input fields (also derives placeholder & field icons at reduced opacity) |
textFieldBackground | Input-field fill |
Two secondary tones are derived automatically (no separate keys): muted text (expiry on card rows, section labels, card/delete icons) is textLabel at reduced opacity, and placeholder/hint text is textFieldText at reduced opacity — so they always belong to your palette.
Precedence
Colors resolve per token as: init colors (withColors) → store colors from the Telr backend → SDK default. Any token you leave nil falls through to the next source. If you don't call .withColors(...) at all, the SDK uses your store-configured colors, then its built-in defaults.
Provide bothlight anddarkif you want full control in both system themes — store colors are applied per-mode and do not cross-fill between modes.
Payment Methods
Supported Payment Methods
The SDK supports the following payment methods:
-
Credit/Debit Cards
- Visa, Mastercard, American Express
- 3D Secure authentication
- Card tokenization for future payments
-
Apple Pay
- Native Apple Pay integration
- Touch ID/Face ID authentication
- Secure element processing
-
Tamara (Buy Now Pay Later)
- Displayed when enabled in the order (
allowedPaymentMethods/ relevant order links) - SDK-managed redirect/return flow
- Displayed when enabled in the order (
-
STC Bank
- Displayed when enabled in the order (
allowedPaymentMethods/ relevant order links) - SDK-managed data capture and submission flow
- Displayed when enabled in the order (
-
Click to Pay
- Displayed when your order enables
allowedPaymentMethods.type = CLICK_TO_PAY(ororder._links.clicktopay.hrefis present). - No SDK configuration or merchant registration required.
dpaId, acquirer config, and locale come from the order response — Telr's backend owns the network registration. - The SDK handles consumer recognition, email entry, OTP authentication, saved-card listing, manual card entry, the network DCF challenge UI, and 3DS internally.
- Recognition tokens are persisted on-device per
dpaIdso returning users skip the email/OTP step on the next session.
- Displayed when your order enables
Card Payment Features
New Card Payment
- Real-time card validation
- BIN lookup for card scheme detection
- CVV and expiry validation
- Cardholder name validation
Saved Cards
- Tokenized card storage
- Quick payment with saved cards
- Card management (view/delete)
3D Secure Authentication
- Automatic 3DS challenge handling
- WebView-based authentication flow
- Seamless user experience
Apple Pay Integration
Apple Pay is automatically available when:
- Device supports Apple Pay
- User has cards in Wallet
- Merchant has Apple Pay enabled
Apple Pay Setup
- Apple Developer Portal: Enable Apple Pay for your App ID and create a Merchant Identity Certificate under Certificates, Identifiers & Profiles > Identifiers > Merchant IDs.
- Xcode: Add the Apple Pay capability to your target under Signing & Capabilities and select your Merchant ID.
- SDK Configuration: Pass your Merchant Identifier when initializing the SDK:
let configuration = PaymentSDKConfiguration.builder()
.withApplePayMerchantIdentifier("merchant.com.yourcompany.yourapp")
.build()
let paymentSDK = PaymentSDK(configuration: configuration)You can also customize the Apple Pay button:
let configuration = PaymentSDKConfiguration.builder()
.withApplePayMerchantIdentifier("merchant.com.yourcompany.yourapp")
.withApplePayButtonType(.buy)
.withApplePayButtonStyle(.black)
.build()The SDK handles Apple Pay availability detection and presents the option when appropriate.
Dedicated Apple Pay method (your own button)
If you want to show your own Apple Pay button (outside the SDK's payment-options screen), call payWithApplePay. The SDK owns the full PassKit session — payment sheet, cryptogram post, and Apple Pay 3DS — and returns only the final result. No SDK UI is presented.
// Called from your own Apple Pay button's action:
paymentSDK.payWithApplePay(
tokenURL: checkoutTokenURL,
orderURL: checkoutOrderURL
) { response in
if response.success {
// response.orderRef — Telr order id (for server-side verification)
// response.transactionRef — transaction reference
} else if response.errorCode == "cancelled" {
// user cancelled the Apple Pay sheet
} else {
// show response.message
}
}Requirements: applePayMerchantIdentifier set in the configuration, and an order whose allowedPaymentMethods includes Apple Pay with a valid Apple Pay link. Availability (canMakePayments, merchant id, order support) is validated internally and surfaced as a failure SDKPaymentResponse if unmet — gate your button's visibility on your own canMakePayments() check as usual.
Common reasons Apple Pay does not appear
applePayMerchantIdentifiernot passed toPaymentSDKConfiguration(or empty).- Device cannot make Apple Pay payments (
PKPaymentAuthorizationViewController.canMakePayments()returnsfalse) — typically because the device is unsupported or has no cards in Wallet. - The order's
allowedPaymentMethodsdoes not includeAPPLE_PAY— confirm Apple Pay is enabled on the Telr merchant account. - The order's
_links.applePay.hrefis missing.
Add Card Flow
Use addCardView when you want to verify and save a new card (without immediate checkout capture).
Merchant-side flow
- Merchant backend creates a VERIFY order.
- Merchant backend returns
tokenUrl+orderUrlto the app. - App opens SDK add-card sheet with those URLs.
- SDK handles card entry, 3DS, and completion callback.
- On success callback, app calls merchant backend completion endpoint to sync saved cards (for example, /
add-card/complete).
SwiftUI Example
paymentSDK.addCardView(
tokenURL: addCardTokenURL,
orderURL: addCardOrderURL
) { response in
if response.success {
// response.ref — payment reference from the VERIFY transaction (store for saved-card payments)
// response.maskedName — masked cardholder name (store for SDKSavedCardInput)
// response.savedCards — refreshed saved cards list
} else {
// show response.message
}
}Pay with Saved Card Flow
Use payWithSavedCardView when a customer selects a saved card and CVV re-entry and/or 3DS is required (typically for higher-value transactions per your risk policy).
For low-value transactions your backend can process the saved card silently usingclass: CONTwithout opening the SDK — no CVV or user interaction needed. UsepayWithSavedCardView(ECOM) when your risk policy requires CVV re-entry or 3DS authentication.
Merchant-side flow
- Merchant backend creates a SALE order.
- Merchant backend returns
tokenUrl+orderUrlto the app. - App opens the SDK saved-card sheet with those URLs and the saved card details.
- SDK displays the masked card (read-only) and prompts for CVV only.
- SDK handles payment, 3DS, and calls the completion callback.
SwiftUI Example
let savedCard = SDKSavedCardInput(
token: "card_token_here",
maskedCard: "**** 1111", // masked card from add-card flow (e.g. SavedCard.maskedCard)
expiry: "12/30",
scheme: "VISA",
maskedName: "J*** D**" // optional, shown on the sheet
)
paymentSDK.payWithSavedCardView(
tokenURL: checkoutTokenURL,
orderURL: checkoutOrderURL,
savedCard: savedCard
) { response in
if response.success {
// payment complete
} else {
// show response.message
}
}Pay with Card Flow
Use payWithCardView when you want to collect card details and process an immediate payment (e.g., gift card purchases). If the order supports saving cards, the sheet shows an optional "Save my card details" checkbox; when the user opts in, the card is saved and the result returns a savedCard reference you can reuse later via payWithSavedCardView.
Merchant-side flow
- Merchant backend creates a SALE order.
- Merchant backend returns
tokenUrl+orderUrlto the app. - App opens SDK pay-with-card sheet with those URLs.
- SDK handles card entry, BIN lookup (including international card blocking), 3DS, and completion callback.
- On success callback, the payment is complete. If the user opted to save the card,
response.savedCardcontains the saved-card reference; persist it (in your DB) to reuse viapayWithSavedCardView.
SwiftUI Example
paymentSDK.payWithCardView(
tokenURL: checkoutTokenURL,
orderURL: checkoutOrderURL
) { response in
if response.success {
// payment complete
// response.orderRef / response.transactionRef — references for reconciliation
// response.savedCard — non-nil if the user ticked "Save my card details";
// store it to reuse the card via payWithSavedCardView
} else {
// show response.message
}
}Error Handling
SDK Response Format
All payment operations return a standardized response:
public struct SDKPaymentResponse {
public let success: Bool
public let message: String
public let errorCode: String?
public let orderRef: String? // Telr order reference (on success)
public let transactionRef: String? // transaction/payment reference (on success)
public let savedCard: SDKSavedCardInput? // set when the user opts to save the card during pay-with-card
}Add-card operations return:
public struct SDKAddCardResponse {
public let success: Bool
public let message: String
public let errorCode: String?
public let ref: String? // payment reference from the VERIFY transaction
public let savedCards: [SavedCard]?
public let maskedName: String? // e.g. "J*** D**"
}Common Error Scenarios
Network Errors
.onFinish { response in
if !response.success {
switch response.errorCode {
case "timeout":
// Handle session timeout
break
case let code?:
// Handle gateway/backend specific codes
print("Payment failed with code: \(code)")
break
default:
// Network/server failures may be provided as message text
print("Payment failed: \(response.message)")
print("Error code: \(response.errorCode ?? "Unknown")")
break
}
}
}Payment Failures
.onFinish { response in
if !response.success {
// Payment failed
print("Payment failed: \(response.message)")
print("Error code: \(response.errorCode ?? "Unknown")")
// Show user-friendly error message
showErrorAlert(message: response.message)
} else {
// Payment successful
print("Payment successful: \(response.message)")
showSuccessAlert(message: response.message)
}
}Error Codes Reference
| Error Code | Description | Action Required |
|---|---|---|
NETWORK_ERROR | Network connectivity issue | Check internet connection |
TIMEOUT | SDK session timed out | Retry checkout |
SERVER_ERROR | Server-side error | Contact support |
<gateway_code> | Code returned by payment backend/order response | Log and map to merchant-friendly message |
INVALID_TOKEN | Authentication failed | Refresh token |
PAYMENT_DECLINED | Card declined | Try different payment method |
3DS_FAILED | 3D Secure authentication failed | Retry payment |
USER_CANCELLED | User cancelled payment | No action required |
Internationalization
Supported Languages
- English (Base) - Default
- Arabic (
ar) - RTL support
Language Configuration
Automatic Language Detection
By default, the SDK follows the host app's preferred language:
let paymentSDK = PaymentSDK() // Uses system languageManual Language Override
let configuration = PaymentSDKConfiguration.builder()
.withPreferredLanguageCode("ar") // Force Arabic
.build()
let paymentSDK = PaymentSDK(configuration: configuration)RTL Support
The SDK fully supports right-to-left (RTL) languages:
- Automatic layout direction detection
- Proper text alignment
- Icon and image mirroring
- Form field positioning
Troubleshooting
Common Issues
1. "No such module 'MobilePaymentSDK'"
Causes:
- Framework not properly linked
- Wrong import statement
- Build configuration issue
Solutions:
- Ensure framework is added to "Frameworks, Libraries, and Embedded Content"
- Check that you're importing
MobilePaymentSDK(notTelrSDK) - Clean build folder and rebuild
2. "Image not found" at Runtime
Causes:
- Framework not embedded
- Architecture mismatch
Solutions:
- Set framework to "Embed & Sign" in project settings
- Ensure you're using the correct XCFramework for your target architecture
3. CocoaPods Build Errors
Causes:
- Script sandboxing enabled
- Derived data corruption
- Pod cache issues
Solutions:
# Clean derived data
rm -rf ~/Library/Developer/Xcode/DerivedData/*
# Clean pod cache
pod cache clean --all
# Reinstall pods
pod deintegrate
pod install4. Carthage Framework Issues
Causes:
- Not using XCFrameworks
- Framework not properly embedded
Solutions:
# Ensure XCFrameworks are used
carthage update --use-xcframeworks --platform iOS
# Verify framework is embedded
# Check project settings > Frameworks, Libraries, and Embedded Content5. Payment Not Processing
Causes:
- Invalid URLs
- Network connectivity
- Server configuration
Solutions:
- Verify token and order URLs are correct
- Check network connectivity
- Enable debug logging to see detailed error messages
- Verify server endpoints are accessible
Debug Logging
Enable debug logging for development:
let configuration = PaymentSDKConfiguration.builder()
.withDebugLoggingEnabled(true)
.build()
let paymentSDK = PaymentSDK(configuration: configuration)Debug logs will show:
- Network requests and responses
- Error details
- SDK internal state
- Validation results
Performance Optimization
Memory Management
- The SDK automatically manages memory for payment views
- Views are released when payment completes or is cancelled
- No manual cleanup required
Network Optimization
- Requests are automatically retried on failure
- Timeout intervals are configurable
API Reference
PaymentSDK
Main SDK class for payment processing.
public class PaymentSDK {
public init(configuration: PaymentSDKConfiguration = PaymentSDKConfiguration())
public func updateConfiguration(_ configuration: PaymentSDKConfiguration)
@MainActor
public func paymentView(
tokenURL: String,
orderURL: String,
onFinish: @escaping (SDKPaymentResponse) -> Void
) -> some View
@MainActor
public func addCardView(
tokenURL: String,
orderURL: String,
onFinish: @escaping (SDKAddCardResponse) -> Void
) -> some View
@MainActor
public func payWithCardView(
tokenURL: String,
orderURL: String,
onFinish: @escaping (SDKPaymentResponse) -> Void
) -> some View
@MainActor
public func payWithSavedCardView(
tokenURL: String,
orderURL: String,
savedCard: SDKSavedCardInput,
onFinish: @escaping (SDKPaymentResponse) -> Void
) -> some View
// Runs Apple Pay with no SDK UI (for merchant-owned Apple Pay buttons).
// Reports the final result only; orderRef/transactionRef populated on success.
@MainActor
public func payWithApplePay(
tokenURL: String,
orderURL: String,
onFinish: @escaping (SDKPaymentResponse) -> Void
)
}PaymentSDKConfiguration
Configuration class for SDK customization.
public struct PaymentSDKConfiguration {
public let debugLoggingEnabled: Bool
public let preferredLanguageCode: String?
public static func builder() -> Builder
public init(builder configure: (inout Builder) -> Void)
}SDKPaymentResponse
Response object for payment operations.
public struct SDKPaymentResponse {
public let success: Bool
public let message: String
public let errorCode: String?
public let orderRef: String? // Telr order reference (on success)
public let transactionRef: String? // transaction/payment reference (on success)
public let savedCard: SDKSavedCardInput? // set when the user opts to save the card during pay-with-card
public static func success(message: String) -> SDKPaymentResponse
public static func failure(message: String, errorCode: String?) -> SDKPaymentResponse
}SDKColorConfig / SDKColors
Merchant color overrides passed at init via PaymentSDKConfiguration.builder().withColors(...). See Custom Colors (Theming).
public struct SDKColorConfig {
public let light: SDKColors?
public let dark: SDKColors?
public init(light: SDKColors? = nil, dark: SDKColors? = nil)
}
public struct SDKColors {
public let primary: String? // Pay button, selected tick, checkbox, links, back chevron
public let background: String? // payment sheet background
public let textLabel: String? // primary text
public let border: String? // field/card outlines, dividers
public let buttonText: String? // text on the Pay button
public let textFieldText: String? // text typed into inputs (also derives placeholder/hint)
public let textFieldBackground: String? // input field fill
}SDKSavedCardInput
Input struct passed to payWithSavedCardView. Contains the saved card details to display on the payment sheet.
public struct SDKSavedCardInput {
public let token: String // card token from add-card flow
public let maskedCard: String // e.g. "**** 1111"
public let expiry: String // e.g. "12/30"
public let scheme: String // e.g. "VISA"
public let maskedName: String? // optional, e.g. "J*** D**"
}SDKAddCardResponse
Response object for add-card operations.
public struct SDKAddCardResponse {
public let success: Bool
public let message: String
public let errorCode: String?
public let ref: String? // payment reference from the VERIFY transaction
public let savedCards: [SavedCard]?
public let maskedName: String? // e.g. "J*** D**", use for SDKSavedCardInput
}Order Model
Order information structLinks to operations/endpoints associated with the order (card, Apple Pay, 3DS, etc.). These are used internally by the SDK.ure.
public struct Order {
public let ref: String
public let amount: Amount
public let status: OrderStatus
public let allowedPaymentMethods: [PaymentMethod]?
public let _links: OrderLinks?
public let payments: [PaymentResponse]?
}Amount Model
Payment amount structure.
public struct Amount {
public let value: String
public let currency: String?
}PaymentMethod
Supported payment method entry returned with an order.
public struct PaymentMethod {
public let schemes: [String] // e.g. ["VISA", "MASTERCARD"]
public let type: PaymentMethodType // .card, .applePay, .tabby, .stcBank
}PaymentMethodType
Type of payment method available for the order.
public enum PaymentMethodType: String {
case card = "CARD"
case applePay = "APPLE_PAY"
case tabby = "TABBY"
case tamara = "TAMARA"
case stcBank = "STC_BANK"
case clickToPay = "CLICK_TO_PAY"
}OrderStatus
High-level status of the order.
public enum OrderStatus: String {
case pending = "PENDING"
case authorised = "AUTHORISED"
case paid = "PAID"
case cancelled = "CANCELLED"
case declined = "DECLINED"
}OrderLinks (SDK-internal)
Links to operations/endpoints associated with the order (card, Apple Pay, 3DS, etc.). These are used internally by the SDK.
