Olo Pay React Native SDK
npm install @olo/pay-react-native- About Olo Pay
- About the React Native SDK
- Installation
- Updating From a Previous Version
- Setup
- Getting Started
- Handling Promise Rejections
- Events
- Components
- PaymentCardDetailsView
- PaymentCardDetailsForm
- PaymentCardCvvView
- DigitalWalletButton
- OloPaySDK Module
- Migration Guide
- Known Issues
- Changelog
- License
Olo Pay is an E-commerce payment solution designed to help restaurants grow, protect, and support their digital ordering and delivery business. Olo Pay is specifically designed for digital restaurant ordering to address the challenges and concerns that weʼve heard from thousands of merchants.
The Olo Pay React Native SDK allows partners to easily add PCI-compliant Apple Pay and Google Pay functionality to their checkout flow and seamlessly integrate with the Olo Ordering API. The SDK supports React Native's new architecture (Fabric)
Use of the plugin is subject to the terms of the Olo Pay SDK License.
For more information about integrating Olo Pay into your payment solutions, refer to our Olo Pay Dev Portal Documentation _(Note: requires an Olo Developer account)_.
Run the following command from a terminal in your app's root project directory
``sh`
npm install @olo/pay-react-native
#### Supported Versions
- _Minimum SDK Version:_
- The minimum supported Android SDK is API 24
- The Android project's minSdkVersion must be set to 24 or higher
- Refer to the changelog for other required versions (e.g. compile SDK version, gradle, etc)
#### Supported Versions
- _Minimum iOS Version:_
- The minimum supported version is iOS 14
In your app's Podfile:
- Add the following lines at the top:
`Podspec`
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/ololabs/podspecs.git'
- Ensure that ios.deploymentTarget is set to at least 14.0
Open a terminal, navigate to your app's iOS folder (usually ), and run the following command:
`sh`
pod install
Run the following command from a terminal in your app's root project directory
`sh`
npm install @olo/pay-react-native@latest
Open a terminal, navigate to your app's iOS folder (usually ), and run the following commands:
`sh`
rm -rf Pods
rm Podfile.lock
pod update
> Note: If you run into errors after updating, delete both your Pods folder and Podfile.lock file and then run pod install.
[[Back to Top]](#table-of-contents)
In order to use the PaymentCardDetailsView or PaymentCardDetailsForm components you need to install and configure Material Components theme in your app.
1. In your app/build.gradle add the dependency with a specific version
`groovy`
implementation 'com.google.android.material:material:
2. Set the appropriate style in your styles.xml file. You can use a full Material Components theme or a Bridge theme (which extends AppCompat):
`xml
`
#### Component Registration (Required)
In your app's AppDelegate.mm (or AppDelegate.swift), register the Olo Pay components before the app finishes launching.
Objective-C (AppDelegate.mm):
Add the following import and function call:
`objc
// At the top of AppDelegate.mm
extern "C" void registerOloPayComponents(void);
// In application:didFinishLaunchingWithOptions: before [super application:...]
- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions
{
registerOloPayComponents();
// ... rest of your existing code
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
`
Swift (AppDelegate.swift):
Add a bridging header with the declaration, then call it:
`swift
// In your bridging header (e.g., YourApp-Bridging-Header.h)
void registerOloPayComponents(void);
// In AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
registerOloPayComponents()
// ... rest of your existing code
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
`
[[Back to Top]](#table-of-contents)
A basic high-level overview of the steps needed to integrate the React Native SDK into your hybrid app is as follows:
#### Payment Methods (new cards & digital wallets)
This approach is used for cards that have not previously been saved on file with Olo. This includes new credit cards and digital wallets. With this approach both card input components and digital wallets return a PaymentMethod instance that is then used to submit a basket with Olo's Ordering API. Specific details can be found below.
1. Initialize Olo Pay (see initialize(...)).
2. Create the PaymentMethod.
- Credit Card Components
1. Add a component to the App's UI (See PaymentCardDetailsView and PaymentCardDetailsForm)
2. Use the createPaymentMethod() function on the component to get a PaymentMethod instanceDigitalWalletReadyEvent
- Digital Wallets _(Apple Pay & Google Pay)_
1. Wait for to indicate when digital wallet payments can be processed.createDigitalWalletPaymentMethod(...)
2. Create a payment method (see ).
3. Submit the order to Olo's Ordering API using the PaymentMethod details.
#### CVV Tokens (previously saved cards)
This approach is used for cards that have previously been saved on file with Olo, and you want to reverify the CVV of the saved card prior to submitting a basket and processing a payment. The PaymentCardCvvView component will provide a CvvUpdateToken instance that is then used to submit a basket with Olo's Ordering API. Specific details can be found below.
1. Initialize Olo Pay (see initialize(...)).
1. Create the CvvUpdateToken.
1. Add the PaymentCardCvvView component to the App's UI.
1. Use the createCvvUpdateToken() function on the component to get a CvvUpdateToken instance
1. Submit the order to Olo's Ordering API using the CvvUpdateToken details.
[[Back to Top]](#table-of-contents)
When calling functions on the Olo Pay React Native SDK, there is a chance that the call will fail with the promise being rejected. When this happens
the returned error object will always contain code and message properties indicating why the method call was rejected.
For convenience, the SDK exports a OloErrorCode enum and a OloError type for
handling promise rejection errors.
`typescript`
try {
const paymentMethodData = await createDigitalWalletPaymentMethod({ amount: 2.34 }});
//Handle payment method data
} catch (error) {
let rejection = error as OloError;
if (rejection) {
switch(rejection.code) {
case OloErrorCode.missingParameter: {
// Handle missing parameter scenario
break;
}
case OloErrorCode.sdkUninitialized: {
// Handle sdk not initialized scenario
break;
}
}
} else {
// Some other error not related to a promise rejection
}
}
[[Back to Top]](#table-of-contents)
Events are used to send notifications regarding state changes that can't be completely handled by asynchronous method calls that return a promise. Details about each type of event can be found below.
#### DigitalWalletReadyEvent
You can subscribe to this event to know when digital wallets are ready to process payments. It can be referenced using the exported DigitalWalletReadyEvent constant or as a string with "digitalWalletReadyEvent". The event returns a DigitalWalletStatus object. Attempting to create a PaymentMethod via createDigitalWalletPaymentMethod when digital wallets are not in a ready state will result in errors.
This event is emitted whenever the readiness of digital wallets change. It can change as a result of calling certain methods on the SDK (e.g. initialize or updateDigitalWalletConfig) or due to changes in app state (e.g. app going in the background).
_Important:_ This event can, and likely will, be emitted multiple times. It is recommended to keep this event listener active and update your UI accordingly whenever the app is displaying digital wallet UIs.
Example Code:
`typescript
import { OloPayEvents, DigitalWalletReadyEvent } from '@olo/pay-react-native';
let subscription = OloPayEvents.addListener(
DigitalWalletReadyEvent,
(event: DigitalWalletStatus) => {
// Handle event...
}
);
// Don't forget to unsubscribe when you no longer need to
// know if digital wallets are in a ready state
subscription.remove();
`
[[Back to Top]](#table-of-contents)
Components are used to display credit card input fields in an app. Credit card details are not accessible by the developer, helping reduce the effort needed to maintain PCI compliance. Details about each component can be found below.
---
The PaymentCardDetailsView component displays all credit card input details in a single input field and is the most compressed way to display a credit card input view. It is composed of a root component with two direct children, the credit card input view and a view for displaying error messages. Each piece of the component can be individually styled via componentStyles, cardStyles, and errorStyles _(See PaymentCardDetailsViewProps)_
#### PaymentCardDetailsViewProps
PaymentCardDetailsViewProps provides customization for the card component.
| Property | Description |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| componentStyles | Options for styling the root component |errorStyles
| | Options for styling the error component. _Default style is { minHeight: 20 }_ |cardStyles
| | Options for styling credit card input portion of the component. _(See PaymentCardDetailsViewStyles)_ |viewProps
| | React Native view properties for the root component |customErrorMessages
| | Options for defining custom error messages in place of defaults _(See CustomErrorMessages)_ |postalCodeEnabled
| | Whether or not the postal code should be displayed |disabled
| | Whether or not the component is disabled and cannot receive touch and input events |displayErrorMessages
| | Whether or not the component should display error messages. Set to false if you have a custom mechanism for displaying error messages |placeholders
| | Options for specifying placeholder text. _(See PaymentCardDetailsPlaceholders)_ |onCardChange(card: CardDetails)
| | Callback called when card input changes. _(See CardDetails)_ |onFocus()
| | Callback called when the component receives input focus |onBlur()
| | Callback called when the component loses input focus |onFocusField(field: CardField)
| | Callback called each time focus moves to a new card input field within the component. _(See CardField)_ |onPaymentMethodResult(result: PaymentMethodResult)
| | Callback called when payment method creation completes _(See PaymentMethodResult)_ |
{
componentStyles?: StyleProp\
errorStyles?: StyleProp\
cardStyles?: PaymentCardDetailsViewStyles;
viewProps?: ViewProps;
postalCodeEnabled?: boolean;
disabled?: boolean;
displayErrorMessages?: boolean;
placeholders?: PaymentCardDetailsPlaceholders;
onCardChange?(card: CardDetails): void;
onFocus?(): void;
onBlur?(): void;
onFocusField?(field: CardField): void;
customErrorMessages?: CustomErrorMessages;
onPaymentMethodResult?(result: PaymentMethodResult): void;
}
> _Important_: Card field text and error message text have separate styling mechanisms. If the default error colors are changed, it is important to change both of them. An example is provided below:
>
> `typescript`
>
> errorStyles={{ color: "#00ff00" }}
> />
>
#### PaymentCardDetailsViewMethods
PaymentCardDetailsViewMethods defines the native methods that can be called on the PaymentCardDetailsView component. These methods can be accessed by passing a ref prop of this type into the component, and then calling them on the ref. See the PaymentCardDetailsView example code below for details.
focus()
`typescript`
focus(field?: CardField) => void
Puts focus on the PaymentCardDetailsView component and displays the keyboard. If a CardField is passed in, focus will attempt to be given to that field. If no field is passed in, it defaults to CardField.number.
blur()
`typescript`
blur() => void
Clears focus on the PaymentCardDetailsView component and hides the keyboard.
clear()
`typescript`
clear() => void
Clears all card details entered in the PaymentCardDetailsView component.
createPaymentMethod()
`typescript`
createPaymentMethod() => void
Attempts to create a payment method based on the entered card details. Results are delivered via the onPaymentMethodResult callback:result.paymentMethod
- On success: contains a PaymentMethod instance and result.error is undefinedresult.error
- On failure: contains a OloError and result.paymentMethod is undefined. The error will contain one of the following codes:
- OloErrorCode.viewNotFound
- OloErrorCode.invalidNumber
- OloErrorCode.invalidExpiration
- OloErrorCode.invalidCvv
- OloErrorCode.invalidPostalCode
- OloErrorCode.expiredCard
- OloErrorCode.cardDeclined
- OloErrorCode.unknownCardError
- OloErrorCode.processingError
- OloErrorCode.connectionError
- OloErrorCode.invalidRequest
- OloErrorCode.apiError
- OloErrorCode.cancellationError
- OloErrorCode.authenticationError
- OloErrorCode.generalError
#### PaymentCardDetailsView Example
`typescript
import {
PaymentCardDetailsView,
PaymentCardDetailsViewMethods,
PaymentMethodResult,
} from '@olo/pay-react-native';
import { View, Button } from 'react-native';
import { useRef } from 'react';
export default function MyComponent() {
const cardRef = useRef
const handlePaymentMethodResult = (result: PaymentMethodResult) => {
if (result.error) {
// Handle the error
console.error(result.error.message);
return;
}
// Use the payment method to submit a basket using Olo's ordering API
const paymentMethod = result.paymentMethod!;
// Submit payment with paymentMethod.id
};
const createPaymentMethod = () => {
cardRef.current?.createPaymentMethod();
};
// Styling omitted for sake of example simplicity
return (
ref={cardRef}
onPaymentMethodResult={handlePaymentMethodResult}
/>
);
}
`
The PaymentCardDetailsForm component displays all credit card input details in a multi-line form and is the most visible way to display a credit card input view. It is composed of a root component with a single nested child, the credit card input form. Each piece of the component can be individually styled via componentStyles and cardStyles _(See PaymentCardDetailsFormProps)_
#### PaymentCardDetailsFormProps
PaymentCardDetailsFormProps provides additional properties defined in the following table
| Property | Description |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
| componentStyles | Options for styling the root |cardStyles
| | Options for styling credit card input portion of the component. _(See PaymentCardDetailsFormStyles)_ |disabled
| | Whether or not the component is disabled and cannot receive touch and input events |onFormComplete()
| | Callback called when all card fields have been filled out. _(See CardValidationStatus)_ |viewProps
| | React Native view properties for the root component |placeholders
| | Options for specifying placeholder text. _(See PaymentCardDetailsPlaceholders)_ |onPaymentMethodResult(result: PaymentMethodResult)
| | Callback called when payment method creation completes _(See PaymentMethodResult)_ |
{
cardStyles?: PaymentCardDetailsFormStyles;
componentStyles?: StyleProp\
disabled?: boolean;
onFormComplete?(cardValidationStatus: CardValidationStatus): void;
viewProps?: ViewProps;
placeholders?: PaymentCardDetailsPlaceholders;
onPaymentMethodResult?(result: PaymentMethodResult): void;
}
#### PaymentCardDetailsFormMethods
PaymentCardDetailsFormMethods defines the native methods that can be called on the PaymentCardDetailsForm component. These methods can be accessed by passing a ref prop of this type into the component, and then calling them on the ref. See the PaymentCardDetailsForm example code below for details.
focus()
`typescript`
focus(field?: CardField) => void
Puts focus on the PaymentCardDetailsForm component and displays the keyboard. If a CardField is passed in, focus will attempt to be given to that field. If no field is passed in, it defaults to CardField.number.
blur()
`typescript`
blur() => void
Clears focus on the PaymentCardDetailsForm component and hides the keyboard.
clear() _(Android Only)_
`typescript`
clear() => void
Clears all card details entered in the PaymentCardDetailsForm component.
createPaymentMethod()
`typescript`
createPaymentMethod() => void
Attempts to create a payment method based on the entered card details. Results are delivered via the onPaymentMethodResult callback:result.paymentMethod
- On success: contains a PaymentMethod instance and result.error is undefinedresult.error
- On failure: contains a OloError and result.paymentMethod is undefined. The error will contain one of the following codes:
- OloErrorCode.viewNotFound
- OloErrorCode.isValid
- OloErrorCode.invalidNumber
- OloErrorCode.invalidExpMonth
- OloErrorCode.invalidExpYear
- OloErrorCode.invalidCvv
- OloErrorCode.invalidPostalCode
- OloErrorCode.expiredCard
- OloErrorCode.cardDeclined
- OloErrorCode.unknownCardError
- OloErrorCode.processingError
- OloErrorCode.connectionError
- OloErrorCode.invalidRequestError
- OloErrorCode.apiError
- OloErrorCode.cancellationError
- OloErrorCode.authenticationError
- OloErrorCode.invalidCardDetails
- OloErrorCode.generalError
#### PaymentCardDetailsForm Example
`typescript
import {
PaymentCardDetailsForm,
PaymentCardDetailsFormMethods,
PaymentMethodResult,
} from "@olo/pay-react-native";
import { View, Button } from "react-native";
import { useRef } from "react";
export default function MyComponent() {
const cardRef = useRef
const handlePaymentMethodResult = (result: PaymentMethodResult) => {
if (result.error) {
// Handle the error
console.error(result.error.message);
return;
}
// Use the payment method to submit a basket using Olo's ordering API
const paymentMethod = result.paymentMethod!;
// Submit payment with paymentMethod.id
};
const createPaymentMethod = () => {
cardRef.current?.createPaymentMethod();
};
// Styling omitted for sake of example simplicity
return (
onPaymentMethodResult={handlePaymentMethodResult}
/>
title="Submit Payment"
onPress={createPaymentMethod}
/>
);
};
`
The PaymentCardCvvView component displays a single input for a credit card's Card Verification Value (CVV). This is useful to reverify a credit card that has previously been saved with Olo. It is composed of a root component with two nested children, the CVV code input and a component for displaying error messages. Each piece of the component can be individually styled via componentStyles and cvvStyles _(See PaymentCardCvvViewProps)_
#### PaymentCardCvvViewProps
| Property | Description |
| ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| componentStyles | Options for styling the root component |customErrorMessages
| | Option for defining custom error messages in place of defaults _(See CustomFieldError)_ |cvvStyles
| | Options for styling security code input portion of the component. _(See PaymentCardCvvViewStyles)_ |displayErrorMessages
| | Whether or not the component should display error messages. Set to false if you have a custom mechanism for displaying error messages |errorStyles
| | Options for styling the error component. _Default style is { minHeight: 20 }_ |disabled
| | Whether or not the component is disabled and cannot receive touch and input events |onBlur(cvvDetails: CvvDetails)
| | Callback called when the component loses input focus _(See CvvDetails)_ |onCvvChange(cvvDetails: CvvDetails)
| | Callback called when card input changes. _(See CvvDetails)_ |onFocus(cvvDetails: CvvDetails)
| | Callback called when the component receives input focus _(See CvvDetails)_ |placeholder
| | Placeholder text for the CVV input field |viewProps
| | React Native view properties for the root component |onCvvTokenResult(result: CvvTokenResult)
| | Callback called when CVV update token creation completes _(See CvvTokenResult)_ |
{
componentStyles?: StyleProp\
customErrorMessages?: CustomFieldError;
cvvStyles?: StyleProp\
displayErrorMessages?: boolean;
errorStyles?: StyleProp\
disabled?: boolean:
onBlur(details: CvvDetails)?: void;
onCvvChange(details: CvvDetails)?: void;
onFocus(details: CvvDetails)?: void;
placeholder?: string;
viewProps?: ViewProps;
onCvvTokenResult?(result: CvvTokenResult): void;
}
> _Important_: CVV field text and error message text have separate styling mechanisms. If the default error colors are changed, it is important to change both of them. An example is provided below:
>
> `typescript`
>
> errorStyles={{ color: "#00ff00" }}
> />
>
#### PaymentCardCvvViewMethods
PaymentCardCvvViewMethods defines the native methods that can be called on the PaymentCardCvvView component. These methods can be accessed by adding a ref prop of this typeref
into the component, and then calling them on the . See the PaymentCardCvvView example code below for details.
focus()
`typescript`
focus() => void
Puts focus on the PaymentCardCvvView component and displays the keyboard.
blur()
`typescript`
blur() => void
Clears focus on the PaymentCardCvvView component and hides the keyboard.
clear()
`typescript`
clear() => void
Clears all security code details entered in the PaymentCardCvvView component.
createCvvUpdateToken()
`typescript`
createCvvUpdateToken() => void
Attempts to create a CVV update token based on the entered security code details. Results are delivered via the onCvvTokenResult callback:result.token
- On success: contains a CvvUpdateToken instance and result.error is undefinedresult.error
- On failure: contains a OloError and result.token is undefined. The error will contain one of the following codes:
- OloErrorCode.viewNotFound
- OloErrorCode.invalidCvv
- OloErrorCode.processingError
- OloErrorCode.connectionError
- OloErrorCode.invalidRequest
- OloErrorCode.apiError
- OloErrorCode.cancellationError
- OloErrorCode.authenticationError
- OloErrorCode.generalError
#### PaymentCardCvvView Example
`typescript
import {
PaymentCardCvvView,
PaymentCardCvvViewMethods,
CvvTokenResult,
} from '@olo/pay-react-native';
import { View, Button } from 'react-native';
import { useRef } from 'react';
export default function MyComponent() {
const cvvRef = useRef
const handleCvvTokenResult = (result: CvvTokenResult) => {
if (result.error) {
// Handle the error
console.error(result.error.message);
return;
}
// Use the CVV update token for revalidating a stored credit card
const cvvToken = result.token!;
// Submit with cvvToken.id
};
const createCvvUpdateToken = () => {
cvvRef.current?.createCvvUpdateToken();
};
// Styling omitted for sake of example simplicity
return (
ref={cvvRef}
onCvvTokenResult={handleCvvTokenResult}
/>
);
}
`
A button that renders a native Apple Pay button on iOS and a native Google Pay button on Android.
#### DigitalWalletButtonProps
| Property | Description |
| ----------------- | ------------------------------------------------------------------------------------------------------------------ |
| applePayConfig | Options for customizing the button for Apple Pay on iOS (See ApplePayButtonConfig) |googlePayConfig
| | Options for customizing the button for Google Pay on Android (See GooglePayButtonConfig) |styles
| | Options for styling the button. Default styles provide a minimum height of 40 on Android and 30 on iOS |disabled
| | Whether or not the component is disabled and cannot receive touch events |onPress()
| | Callback called when the button is pressed |
{
applePayConfig?: ApplePayButtonConfig;
googlePayConfig?: GooglePayButtonConfig;
disabled?: boolean;
onPress(): void;
styles?: StyleProp\
}
#### DigitalWalletButton Example
`typescript
import {
ApplePayButtonStyle,
ApplePayButtonType,
DigitalWalletButton,
GooglePayButtonTheme,
GooglePayButtonType,
OloPaySDK
} from '@olo/pay-react-native';
export default function MyComponent() {
const createDigitalWalletPaymentMethod = async () => {
try {
let result = await OloPaySDK.createDigitalWalletPaymentMethod();
// Use result.paymentMethod method to submit a basket using Olo's ordering API
// or result.error to handle additional error scenarios
} catch (error) {
// Handle the promise rejection
}
};
// Styling omitted for sake of example simplicity
return (
googlePayConfig={{
theme: GooglePayButtonTheme.dark,
type: GooglePayButtonType.checkout,
cornerRadius: 8,
}}
applePayConfig={{
style: ApplePayButtonStyle.black,
type: ApplePayButtonType.checkout,
cornerRadius: 8,
}}
/>
);
}
`
[[Back to Top]](#table-of-contents)
Native SDK methods can be called on the imported OloPaySDK object. This module is responsible for initializing the Olo Pay SDK and processing digital wallet payments.
`typescript`
import { OloPaySDK } from '@olo/pay-react-native';
* initialize(...)
* updateDigitalWalletConfig(...)
* createDigitalWalletPaymentMethod(...)
* isInitialized()
* isDigitalWalletInitialized()
* isDigitalWalletReady()
* Type Aliases
* Enums
`typescript`
initialize(productionEnvironment: boolean, digitalWalletConfig?: DigitalWalletConfig | undefined) => Promise
Initialize the Olo Pay SDK and, optionally, configure and initialize digital wallets. The SDK must be initialized prior to calling other methods. Calling this method will ensure that the Olo Pay SDK is initialized.
If a DigitalWalletConfig is provided, when digital wallets become ready, a DigitalWalletReadyEvent will be emitted. If digital wallets are not configured
and initialized here, this can be done later by calling updateDigitalWalletConfig.
Important: The Olo Pay SDK is guaranteed to be initialized even if the promise is rejected. Promise rejections will only occur due to an error while initializing digital wallets, which happens after successful SDK initialization.
If the promise is rejected, the code property of the returned error object will be one of:
- OloErrorCode.missingParameter
- OloErrorCode.invalidParameter
- OloErrorCode.googlePayInvalidSetup _(Android only)_
- OloErrorCode.unexpectedError _(Android only)_
| Param | Type | Description |
| --------------------------- | ------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| productionEnvironment | boolean | true to use the production environment, false for the test environment |digitalWalletConfig
| | DigitalWalletConfig | Initialization options for digital wallets |
--------------------
`typescript`
updateDigitalWalletConfig(digitalWalletConfig: DigitalWalletConfig) => Promise
Update the configuration settings for digital wallets.
This can be used to change configuration parameters for digital wallets. Calling this method will
immediately invalidate digital wallet readiness and will cause a DigitalWalletReadyEvent
to be emitted with a value of false. Once the new configuration is ready to be used,true
the DigitalWalletReadyEvent will be triggered again with a value of .
Note: This method can also be used to initialize digital wallets if they were not initialized as part of SDK initialization (see initialize).
If the promise is rejected, the code property of the returned error object will be one of:
- OloErrorCode.missingParameter
- OloErrorCode.invalidParameter
- OloErrorCode.sdkUninitialized
- OloErrorCode.googlePayInvalidSetup _(Android only)_
- OloErrorCode.unexpectedError _(Android only)_
| Param | Type | Description |
| ------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| digitalWalletConfig | DigitalWalletConfig | The new configuration settings for digital wallets. See DigitalWalletConfig for more details. |
--------------------
`typescript`
createDigitalWalletPaymentMethod(options: DigitalWalletPaymentRequestOptions) => Promise
Launch the digital wallet flow and generate a payment method to be used with Olo's Ordering API.
If the promise is rejected, the code property of the returned error object will be one of:
- OloErrorCode.sdkUninitialized
- OloErrorCode.digitalWalletUninitialized
- OloErrorCode.digitalWalletNotReady
- OloErrorCode.invalidParameter
- OloErrorCode.missingParameter
- OloErrorCode.emptyCompanyLabel
- OloErrorCode.invalidCountyCode
- OloErrorCode.lineItemsTotalMismatch
- OloErrorCode.applePayEmptyMerchantId _(iOS only)_
- OloErrorCode.applePayUnsupported _(iOS only)_
- OloErrorCode.applePayError _(iOS only)_
- OloErrorCode.applePayTimeout _(iOS only)_
- OloErrorCode.googlePayNetworkError _(Android only)_
- OloErrorCode.googlePayDeveloperError _(Android only)_
- OloErrorCode.googlePayInternalError _(Android only)_
- OloErrorCode.unexpectedError _(Android only)_
- OloErrorCode.generalError
`typescript`
try {
const { paymentMethod } = await createDigitalWalletPaymentMethod({ amount: 5.00 });
if (paymentMethod === undefined) {
// User canceled the digital wallet flow
} else {
// Send paymentMethod to Olo's Ordering API
}
} catch (error) {
// Handle error
}
| Param | Type | Description |
| ------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------ |
| options | DigitalWalletPaymentRequestOptions | Options for processing a digital wallet payment. |
Returns: Promise<DigitalWalletPaymentMethodResult>
--------------------
`typescript`
isInitialized() => Promise
Check if the Olo Pay SDK has been initialized
Returns: Promise<InitializationStatus>
--------------------
`typescript`
isDigitalWalletInitialized() => Promise
Check if digital wallets have been initialized. On iOS, digital wallets are initialized when the SDK is initialized, so this method
will behave the same as isInitialized(). On Android, a separate call to initializeGooglePay() is required to initialize digital wallets.
Returns: Promise<InitializationStatus>
--------------------
`typescript`
isDigitalWalletReady() => Promise
Check if digital wallets are ready to be used. Events are emitted whenever the digital wallet status
changes, so listenting to that event can be used instead of calling this method, if desired.
Returns: Promise<DigitalWalletStatus>
--------------------
#### DigitalWalletConfig
Options for intializing digital wallets
| Property | Description | Default |
| -------- | ----------- | ------- |
| countryCode | A two character country code for the vendor that will be processing the payment | 'US' |currencyCode
| | Currency code to be used for transactions | CurrencyCode.usd |companyLabel
| | The company display name | - |emailRequired
| | Whether an email will be collected and returned when processing transactions | false |fullNameRequired
| | Whether a full name will be collected and returned when processing transactions | false |fullBillingAddressRequired
| | Whether a full billing address will be collected and returned when processing transactions | false |phoneNumberRequired
| | Whether a phone number will be collected and returned when processing transactions | false |initializeApplePay
| | Whether Apple Pay should be initialized. | - |initializeGooglePay
| | Whether Google Pay should be initialized. | - |applePayConfig
| | Configuration options for initializing Apple Pay. Required if initializeApplePay is true | - |googlePayConfig
| | Configuration options for initializing Google Pay. Required if initializeGooglePay is true | - |
Note: If Apple Pay or Google Pay were previously initialized and the respective initialize property (initializeApplePay or initializeGooglePay) is set to false, this will not uninitialize digital wallets and will result in a no-op.
{ companyLabel: string; countryCode?: string; currencyCode?: CurrencyCode; emailRequired?: boolean; phoneNumberRequired?: boolean; fullNameRequired?: boolean; fullBillingAddressRequired?: boolean; initializeApplePay: boolean; initializeGooglePay: boolean; applePayConfig?: ApplePayConfig; googlePayConfig?: GooglePayConfig; }
#### CurrencyCode
Type alias representing currency codes supported by Olo Pay.
'USD' | 'CAD'
#### ApplePayConfig
Options for initializing Apple Pay
| Property | Description | Default |
| -------- | ----------- | ------- |
| fullPhoneticNameRequired | Whether a full phonetic name will be collected and returned when processing transactions | false |merchantId
| | The merchant id registered with Apple for Apple Pay | - |
{ fullPhoneticNameRequired?: boolean; merchantId: string; }
#### GooglePayConfig
Options for intializing Google Pay
| Property | Description | Default |
| -------- | ----------- | ------- |
| productionEnvironment | Whether Google Pay will use the production environment | true |existingPaymentMethodRequired
| | Whether an existing saved payment method is required for Google Pay to be considered ready | false |currencyMultiplier
| | Multiplier to convert the amount to the currency's smallest unit (e.g. $2.34 * 100 = 234 cents) | 100 |
{ productionEnvironment?: boolean; existingPaymentMethodRequired?: boolean; currencyMultiplier?: number; }
#### DigitalWalletPaymentMethodResult
Type alias representing a digital wallet payment method result.
| Property | Description |
| -------- | ----------- |
| paymentMethod | The payment method generated by the digital wallet flow, or undefined if the user canceled the flow |
{ paymentMethod?: PaymentMethod; }
#### PaymentMethod
Payment method used for submitting payments to Olo's Ordering API
| Property | Description |
| -------- | ----------- |
| id | The payment method id. This should be set to the token field when submitting a basket |last4
| | The last four digits of the card |cardType
| | The issuer of the card |expMonth
| | Two-digit number representing the card's expiration month |expYear
| | Four-digit number representing the card's expiration year |postalCode
| | Zip or postal code. Will always have the same value as billingAddress.postalCode |countryCode
| | Two character country code. Will always have the same value as billingAddress.countryCode |isDigitalWallet
| | true if this payment method was created by digital wallets (e.g. Apple Pay or Google Pay), false otherwise |productionEnvironment
| | true if this payment method was created in the production environment, false otherwise |email
| | The email address associated with the transaction, or an empty string if unavailable. Only provided for digital wallet payment methods (see isDigitalWallet) |digitalWalletCardDescription
| | The description of the card, as provided by Apple or Google. Only provided for digital wallet payment methods (see isDigitalWallet) |billingAddress
| | The billing address associated with the transaction. The country code and postal code fields will always have a non-empty value. Other fields will only have non-empty values for digital wallet payment methods (see isDigitalWallet) |fullName
| | The full name associated with the transaction. Will only have a non-empty value for digital wallet payment methods (see isDigitalWallet) |fullPhoneticName
| | The full phonetic name associated with the transaction. Will only have a non-empty value for digital wallet payment methods (see isDigitalWallet) _(iOS only)_ |
{ id: string; last4: string; cardType: CardType; expMonth: number; expYear: number; postalCode: string; countryCode: string; isDigitalWallet: boolean; productionEnvironment: boolean; email: string; digitalWalletCardDescription: string; billingAddress: Address; fullName: string; fullPhoneticName: string; phoneNumber: string; }
#### Address
Represents an address. Currently only used for digital wallets, if billing address details are requested to be returned in the
generated digital wallet payment method.
| Property | Description |
| -------- | ----------- |
| address1 | The first line of the address |address2
| | The second line of the address, or an empty string |address3
| | The third line of the address, or an empty string |postalCode
| | The postal or zip code |countryCode
| | The two digit ISO country code |administrativeArea
| | A country subdivision, such as a state or province |
{ address1: string; address2: string; address3: string; locality: string; postalCode: string; countryCode: string; administrativeArea: string; }
#### DigitalWalletPaymentRequestOptions
Type alias representing options for a digital wallet payment method request
GooglePayPaymentRequestOptions | ApplePayPaymentRequestOptions
#### GooglePayPaymentRequestOptions
Options for requesting a payment method via Google Pay
| Property | Description | Default |
| -------- | ----------- | ------- |
| amount | The amount to be charged | - |checkoutStatus
| | The checkout status to be used for the transaction | FinalImmediatePurchase |totalPriceLabel
| | A custom value to override the default total price label in the Google Pay sheet | - |lineItems
| | A list of line items to be displayed in the digital wallet payment sheet | - |validateLineItems
| | Whether or not to validate the line items. If true, createDigitalWalletPaymentMethod will throw an exception if the sum of the line items does not equal the total amount passed in. If no line items are provided, this parameter is ignored. | true |
{ amount: number; checkoutStatus?: GooglePayCheckoutStatus; totalPriceLabel?: string; lineItems?: LineItem[]; validateLineItems?: boolean; }
#### LineItem
Represents a line item in a digital wallet transaction
| Property | Description |
| -------- | ----------- |
| label | The label of the line item |amount
| | The amount of the line item |type
| | Enum representing the type of a line item in a digital wallet transaction |status
| | Enum representing the status of a line item. If not provided, default value is LineItemStatus.final |
{ label: string; amount: number; type: LineItemType; status?: LineItemStatus; }
#### ApplePayPaymentRequestOptions
Options for requesting a payment method via Apple Pay
| Property | Description | Default |
| -------- | ----------- | ------- |
| amount | The amount to be charged | - |lineItems
| | A list of line items to be displayed in the digital wallet payment sheet | - |validateLineItems
| | Whether or not to validate the line items. If true, createDigitalWalletPaymentMethod will throw an exception if the sum of the line items does not equal the total amount passed in. If no line items are provided, this parameter is ignored. | true |
{ amount: number; lineItems?: LineItem[]; validateLineItems?: boolean; }
#### InitializationStatus
Represents the status for SDK initialization
| Property | Description |
| -------- | ----------- |
| isInitialized | true if the SDK is initialized, false otherwise |
{ isInitialized: boolean; }
#### DigitalWalletStatus
Represents the status of digital wallets.
| Property | Description |
| -------- | ----------- |
| isReady | true if digital wallets are ready to be used, false otherwise |
{ isReady: boolean; }
#### CardType
| Members | Value | Description |
| ----------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| visa | 'Visa' | Visa credit card type. Pass the string value of this into the Olo Ordering API when submitting orders |
| amex | 'Amex' | American Express credit card type. Pass the string value of this into the Olo Ordering API when submitting orders |
| mastercard | 'Mastercard' | Mastercard credit card type. Pass the string value of this into the Olo Ordering API when submitting orders |
| discover | 'Discover' | Discover credit card type. Pass the string value of this into the Olo Ordering API when submitting orders |
| unsupported | 'Unsupported' | Unsupported credit card type. Passing this to the Olo Ordering API will result in an error |
| unknown | 'Unknown' | Unknown credit card type. Passing this to the Olo Ordering API will result in an error |
#### GooglePayCheckoutStatus
| Members | Value | Description |
| ---------------------------- | ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| estimatedDefault | 'EstimatedDefault' | Represents an estimated price (meaning it's not final and could change) and the default checkout option. The confirmation button will display "Continue". |
| finalDefault | 'FinalDefault' | Represents the final price of the transaction and the default checkout option. The confirmation button will display "Continue". |
| finalImmediatePurchase | 'FinalImmediatePurchase' | Represents the final price of the transaction and the immediate checkout option. The confirmation button will display "Pay Now". |
#### LineItemType
| Members | Value | Description |
| -------------- | ----------------------------------------------- | --------------------------------------------------------------- |
| subtotal | 'Subtotal' | Represents a subtotal line item in a digital wallet transaction |
| lineItem | 'LineItem' | Represents a line item in a digital wallet transaction |
| tax | 'Tax' | Represents a tax line item in a digital wallet transaction |
#### LineItemStatus
| Members | Value | Description |
| ------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------- |
| final | 'Final' | Indicates that the price is final and has no variance |
| pending | 'Pending' | Indicates that the price is pending and may change. On iOS this will cause the amount to appear as an elipsis ("...") |
#### OloErrorCode
| Members | Value | Description |
|-------------------------------|--------------------------------|-----------------------------------------------------------------------------------------|
| apiError | 'ApiError' | A general-purpose API error occurred |applePayEmptyMerchantId
| | 'ApplePayEmptyMerchantId' | The merchantId was empty when initializing Apple Pay _(iOS Only)_ |applePayError
| | 'ApplePayError' | There was an error with Apple Pay _(iOS Only)_ |applePayTimeout
| | 'ApplePayTimeout' | A timeout occurred while attempting to process an Apple Pay transaction _(iOS Only)_ |applePayUnsupported
| | 'ApplePayUnsupported' | The device doesn't support Apple Pay _(iOS Only)_ |authenticationError
| | 'AuthenticationError' | An authentication issue occurred with the server |cancellationError
| | 'CancellationError' | The operation was cancelled by the server |cardDeclined
| | 'CardDeclined' | The card was declined |connectionError
| | 'ConnectionError' | An issue occurred connecting to the server |digitalWalletNotReady
| | 'DigitalWalletNotReady' | Digital wallets were not ready when attempting an action |digitalWalletUninitialized
| | 'DigitalWalletUninitialized' | Digital wallets were uninitialized when attempting an action |emptyCompanyLabel
| | 'EmptyCompanyLabel' | The value for the company label was empty |expiredCard
| | 'ExpiredCard' | The card is expired |generalError
| | 'GeneralError' | A general-purpose error occurred |googlePayDeveloperError
| | 'GooglePayDeveloperError' | A developer error occurred, usually due to malformed configuration _(Android Only)_ |googlePayInternalError
| | 'GooglePayInternalError' | An internal Google error occurred _(Android Only)_ |googlePayInvalidSetup
| | 'GooglePayInvalidSetup' | Missing com.google.android.gms.wallet.api.enabled in AndroidManifest _(Android Only)_ |googlePayNetworkError
| | 'GooglePayNetworkError' | A network error occurred with Google's servers _(Android Only)_ |invalidCardDetails
| | 'InvalidCardDetails' | The card details are invalid |invalidCountryCode
| | 'InvalidCountryCode' | The country code is not supported by Olo Pay (US or Canada) |invalidCVV
| | 'InvalidCVV' | The card security code is invalid or incomplete |invalidExpiration
| | 'InvalidExpiration' | The card's expiration date is invalid |invalidNumber
| | 'InvalidNumber' | The card's number is invalid |invalidParameter
| | 'InvalidParameter' | Promise rejected due to an invalid parameter |invalidPostalCode
| | 'InvalidPostalCode' | The card's zip code is invalid or incorrect |invalidRequest
| | 'InvalidRequest' | A request to servers has invalid parameters |lineItemsTotalMismatch
| | 'LineItemsTotalMismatch' | The amount total did not match the sum of the line items |missingParameter
| | 'MissingParameter' | A required parameter is missing |processingError
| | 'ProcessingError' | An error occurred while processing the card info |sdkUninitialized
| | 'SdkUninitialized' | The SDK isn't initialized yet |unexpectedError
| | 'UnexpectedError' | An unexpected error occurred |unknownCard
| | 'UnknownCard' | An unknown or unaccounted-for card error occurred |viewNotFound
| | 'ViewNotFound' | The native view associated with the component could not be found |
#### CardField
Represents the different input fields of the PaymentCardDetailsView and PaymentCardDetailsForm components
| Property | Value | Description |
| ------------ | ------------ | ------------------------------- |
| number | 'number' | Credit card number field |expiration
| | 'expiration' | Credit card expiration field |cvv
| | 'cvv' | Credit card security code field |postalCode
| | 'postalCode' | Credit card postal code field |
#### FontWeight
Options for determining the weight of the font.
| Property | Description |
| ------------ | --------------------------------------------------------------------------------------- |
| ultraLight | Ultra light font weight. Corresponds to a value of 100 |thin
| | Thin font weight. Corresponds to a value of 200 |light
| | Light font weight. Corresponds to a value of 300 |regular
| | Regular font weight. This is the default in most cases. Corresponds to a value of 400 |medium
| | Medium font weight. Corresponds to a value of 500 |semiBold
| | Semi Bold font weight. Corresponds to a value of 600 |bold
| | Bold font weight. Corresponds to a value of 700 |extraBold
| | Extra bold font weight. Corresponds to a value of 800 |black
| | Heaviest font weight. Corresponds to a value of 900 |
#### ApplePayButtonStyle
Options representing different visual styles available for Apple Pay when used with a
DigitalWalletButton. Values map directly to Apple's
PKPaymentButtonStyle.
> Some values are only available on specific versions of iOS. If an unsupported value is used, it will
> default to black
| Property | Limitations | Description |
| -------------- | ----------- | --------------------------------------------------------------------- |
| automatic | _iOS 14+_ | A button that automatically switches between light mode and dark mode |black
| | | A black button with white lettering |white
| | | A white button with black lettering |whiteOutline
| | | A white button with black lettering and a black outline |
#### ApplePayButtonType
Options representing different types of Apple Pay buttons that can be displayed with a
DigitalWalletButton. Values map directly to Apple's
PKPaymentButtonType.
> Some values are only available on specific versions of iOS. If an unsupported value is used, it will
> default to checkout
| Property | Limitations | Description |
| ------------ | ----------- | -----------------------------------------------------------------------------------------------------------|
| addMoney | _iOS 14+_ | A button that uses the phrase _"Add Money with"_ in conjunction with the Apple Pay logo |book
| | | A button that uses the phrase _"Book with"_ in conjunction with the Apple Pay logo |buy
| | | A button that uses the phrase _"Buy with"_ in conjunction with the Apple Pay logo |checkout
| | | A button that uses the phrase _"Checkout with"_ in conjunction with the Apple Pay logo |
|