Skip to content

React Native

Accept payments in your React Native app. The SDK opens the ZevPay checkout page in a WebView modal and returns the result when payment completes.

Installation

bash
npm install @zevpay/react-native react-native-webview

For iOS:

bash
cd ios && pod install

Requires React Native 0.72+ and react-native-webview 13+.

Quick start

tsx
import { useState } from 'react';
import { Button } from 'react-native';
import { ZevPayCheckout } from '@zevpay/react-native';

function CheckoutScreen() {
  const [visible, setVisible] = useState(false);

  return (
    <>
      <Button title="Pay ₦5,000" onPress={() => setVisible(true)} />

      <ZevPayCheckout
        visible={visible}
        publicKey="pk_test_your_public_key"
        email="customer@example.com"
        amount={500000}
        onSuccess={(data) => {
          setVisible(false);
          console.log('Paid! Reference:', data.reference);
          // Verify payment on your server
        }}
        onCancel={() => setVisible(false)}
      />
    </>
  );
}

Component API

<ZevPayCheckout>

A modal component that renders the checkout page in a WebView.

tsx
<ZevPayCheckout
  visible={true}
  publicKey="pk_test_xxx"
  email="customer@example.com"
  amount={500000}
  reference="ORDER-123"
  firstName="John"
  lastName="Doe"
  metadata={{ orderId: '123' }}
  paymentMethods={['bank_transfer', 'payid']}
  onSuccess={(data) => console.log(data.reference)}
  onCancel={() => setVisible(false)}
  onError={(error) => console.error(error)}
/>

Props

PropTypeRequiredDescription
visiblebooleanYesShow/hide the modal
publicKeystringYesYour public key (pk_live_* or pk_test_*)
emailstringYesCustomer email
amountnumberYesAmount in kobo (₦1 = 100 kobo)
currencystringNoCurrency code (default: NGN)
referencestringNoYour unique transaction reference
firstNamestringNoCustomer first name
lastNamestringNoCustomer last name
metadataobjectNoAdditional metadata
paymentMethodsstring[]Nobank_transfer, payid, card
onSuccessfunctionYesCalled with { reference, params }
onCancelfunctionYesCalled when user closes the modal
onErrorfunctionNoCalled on WebView errors

Hook API

useZevPayCheckout()

A Promise-based hook for imperative checkout flow.

tsx
import { ZevPayCheckout, useZevPayCheckout } from '@zevpay/react-native';

function CheckoutScreen() {
  const checkout = useZevPayCheckout();

  const handlePay = async () => {
    const result = await checkout.open({
      publicKey: 'pk_test_your_public_key',
      email: 'customer@example.com',
      amount: 500000,
    });

    if (result.success) {
      console.log('Paid!', result.reference);
      // Verify payment on your server
    } else if (result.cancelled) {
      console.log('User cancelled');
    } else if (result.error) {
      console.error('Error:', result.error);
    }
  };

  return (
    <>
      <Button title="Pay" onPress={handlePay} />

      {checkout.options && (
        <ZevPayCheckout
          visible={checkout.visible}
          onSuccess={checkout.onSuccess}
          onCancel={checkout.onCancel}
          onError={checkout.onError}
          {...checkout.options}
        />
      )}
    </>
  );
}

Return value

PropertyTypeDescription
open(options) => Promise<CheckoutResult>Opens checkout, resolves on completion
close() => voidProgrammatically close the modal
visiblebooleanCurrent modal visibility
optionsCheckoutOptions | nullCurrent checkout options
onSuccessfunctionPass to <ZevPayCheckout>
onCancelfunctionPass to <ZevPayCheckout>
onErrorfunctionPass to <ZevPayCheckout>

CheckoutResult

typescript
interface CheckoutResult {
  success: boolean;     // Payment was successful
  cancelled: boolean;   // User cancelled
  reference?: string;   // Payment reference (when successful)
  error?: Error;        // Error (when failed)
}

Server-side verification

Always verify on your server

The client-side callback only indicates the user completed the flow. Always verify the payment on your server using the reference.

typescript
// Your server (Node.js example)
import ZevPay from '@zevpay/node';

const zevpay = new ZevPay('sk_test_your_secret_key');
const session = await zevpay.checkout.verify(reference);

if (session.status === 'completed') {
  // Payment is confirmed
}

Resources

ZevPay Checkout Developer Documentation