Skip to main content

Payment Widget

The PaymentWidget component from OrchestratorX renders an embedded, inline payment form directly inside your screen, instead of opening a modal payment sheet. This approach is useful for custom checkout pages where you want full control over layout and UI.

Find the Demo App​

Find the demo app here

1. Basic Usage​

1.1 Install the react native sdk​

npm install @juspay-tech/react-native-hyperswitch
# or
yarn add @juspay-tech/react-native-hyperswitch

1.1.1 Install Peer Dependencies​

The SDK requires the following peer dependencies to be installed in your project:

yarn add react-native-inappbrowser-reborn
yarn add react-native-svg
yarn add @sentry/react-native
# or
npm install react-native-inappbrowser-reborn
npm install react-native-svg
npm install @sentry/react-native

1.2 Wrap your app with HyperProvider​

To initialize OrchestratorX in a React Native application, wrap your payment screen with the HyperProvider component. The publishable key is required and must be provided to the HyperProvider during initialization.

import { HyperProvider } from "@juspay-tech/react-native-hyperswitch";

function App() {
return (
<HyperProvider publishableKey="YOUR_PUBLISHABLE_KEY" profileId="YOUR_PROFILE_ID">
// Your app code here
</HyperProvider>
);
}

1.3 Fetch the PaymentIntent client Secret​

Send a network request to the backend endpoint created in the previous step to retrieve the clientSecret. This clientSecret returned from the endpoint is required to complete the payment.

useEffect(() => {
fetch('https://your-server.com/create-payment-intent', { method: 'POST' })
.then((res) => res.json())
.then(({ clientSecret, sdkAuthorization, }) => {
setClientSecret(clientSecret);
setAuthorization(sdkAuthorization);
}
}, []);

1.4 Render your Payment widget​

Use the OrchestratorX PaymentWidget component to render an embedded payment form

import { PaymentWidget } from '@juspay-tech/react-native-hyperswitch';

export default function PaymentUI() {
// rest of your logic
return (
<PaymentWidget
widgetId="checkout-widget"
options={{
clientSecret,
sdkAuthorization,
appearance: { theme: 'light' },
}}
onPaymentResult={(result) => {
if (result.errorMessage) {
// Payment failed
console.error('Payment failed:', result.errorMessage);
} else if (result.status === 'succeeded') {
// Payment succeeded
console.log('Payment succeeded!');
} else if (result.status === 'cancelled') {
// User cancelled the payment
}
}}
style={{ width: '100%', height: 600 }}
/>
);
}

Avoid placing the PaymentWidget inside a ScrollView. If necessary, ensure that the parent scroll is disabled while the user interacts with the widget to prevent scrolling conflicts.

1.5 onPaymentResult Callback​

The onPaymentResult callback is triggered when the payment flow finishes. It provides a result object containing the payment outcome.

onPaymentResult={(result) => {
console.log(result);
}}
// type PaymentWidgetResult: {
status?: string; // "succeeded", "cancelled", or "Failed"
errorMessage?: string; // Present if an error occurred
}

Congratulations! You have successfully integrated the Payment Widget into your application.​

Props​

widgetId string · Required

A unique identifier for the widget instance.


options PresentPaymentSheetParams · Required

Configuration and appearance options.

When using PaymentWidget, pass the clientSecret & sdkAuthorization here.

For more customizations follow this


onPaymentResult (result: PaymentWidgetResult) => void · Optional

Callback triggered when the payment completes, fails, or is cancelled.


style StyleProp<ViewStyle> · width & height required

Defines the size and layout of the widget container.