@adsesugh/monnify-react-native
Version:
A React Native component for integrating Monnify payment gateway using WebView for both React Native CLI and Expo.
220 lines (191 loc) • 7.94 kB
Markdown
`@adsesugh/monnify-react-native` is a React Native package that simplifies the integration of the Monnify payment gateway into React Native applications. This package is compatible with both React Native CLI and Expo projects.
- Easy integration of the Monnify payment gateway.
- Supports payment in Nigerian Naira (NGN).
- Handles payment completion and closure callbacks.
- Compatible with both React Native CLI and Expo.
## Installation
### For React Native CLI:
1. Install the package via npm or yarn:
```bash
npm install @adsesugh/monnify-react-native
# or
yarn add @adsesugh/monnify-react-native
```
2. Install react-native-webview if haven't already:
```bash
npm install react-native-webview
npm install axios
npm install react-native-safe-area-context
# or
yarn add react-native-webview
yarn add axios
yarn add react-native-safe-area-context
```
### For Expo:
1. Install the package via npm or yarn:
```bash
npx expo install @adsesugh/monnify-react-native
```
2. Install react-native-webview using Expo:
```bash
npx expo install react-native-webview
npx expo install react-native-safe-area-context
npm install axios
```
## Basic Example
```typescript
import React, { useState } from 'react';
import { StyleSheet, View, Text, Modal, Pressable } from 'react-native';
import { Monnify, MonnifyModal } from '@adsesugh/monnify-react-native'
// Initialize Monnify
const monnify = new Monnify({
apiKey: "<api-key>",
secretKey: "<secret-key>",
contractCode: "<contract-code>",
isTestMode: true, // Set to false for production
});
export default function App() {
const [checkoutUrl, setCheckoutUrl] = useState("");
const [paymentRef, setPaymentRef] = useState("");
const [visible, setVisible] = useState(false);
const payNow = async () => {
try {
const paymentReference = `ref-${Date.now()}`;
const res = await monnify.initializePayment({
amount: 200,
customerName: "John Doe",
customerEmail: "johndoe@gmail.com",
paymentReference,
paymentDescription: "Test Payment",
redirectUrl: "https://webhook.site/payment-complete",
});
setCheckoutUrl(res.checkoutUrl);
setPaymentRef(paymentReference);
setVisible(true);
} catch (error: any) {
Alert.alert("Payment Error", error.message)
}
};
return (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<<View style={{backgroundColor: 'green', padding: 2}}>
<Button color={'white'} title="Pay with Monnify" onPress={payNow} />
</View>
<MonnifyModal
visible={visible}
checkoutUrl={checkoutUrl}
transactionReference={paymentRef}
monnifyInstance={monnify}
onClose={(response) => {
setVisible(false);
if (response) {
console.log('Payment completed with response:', response);
}
}}
onPaymentComplete={(verifiedResponse) => {
setVisible(false);
if (verifiedResponse.success) {
Alert.alert(
"Payment Successful",
`Amount: ₦${verifiedResponse.amountPaid}\nMethod: ${verifiedResponse.paymentMethod}\nRef: ${verifiedResponse.paymentReference}`
);
} else {
console.log('Payment failed:', verifiedResponse);
Alert.alert("Payment Failed", verifiedResponse.error || "Payment could not be verified");
}
}}
/>
</View>
);
}
```
| Prop | Type | Required | Description |
|----------------------|---------------------------|----------|--------------------------------------------------------------------------------------------------------|
| `visible` | `boolean` | Yes | Controls modal visibility. |
| `checkoutUrl` | `string` | Yes | The Payment checkout URL from initializePayment. |
| `transactionReference` | `string` | Yes | Payment reference for verification. |
`apiKey` | `string` | Yes | The API key provided by Monnify. |
| `contractCode` | `string` | Yes | The contract code provided by Monnify. |
| `secretKey` | `string` | Yes | The secret key provided by Monnify. |
`onPaymentComplete` | `(response: any) => void` | No | Callback function that is invoked when the transaction is completed successfully or error occurence. |
| `onClose` | `() => void` | No | Callback function that is invoked when the payment modal is closed. |
```typescript
import Monnify from '@adsesugh/monnify-react-native';
import React, { useState } from 'react';
import { StyleSheet, View, Text, Modal, Pressable } from 'react-native';
export default function App() {
const [checkoutUrl, setCheckoutUrl] = useState("");
const [paymentRef, setPaymentRef] = useState("");
const [visible, setVisible] = useState(false);
const payNow = async () => {
try {
const paymentReference = `ref-${Date.now()}`;
const res = await monnify.initializePayment({
amount: 200,
customerName: "John Doe",
customerEmail: "johndoe@gmail.com",
paymentReference,
paymentDescription: "Test Payment",
metadata: {name: "Damilare", age: 45},
incomeSplitConfig: [
{
subAccountCode: "MFY_SUB_342113621921",
feePercentage: 50,
splitAmount: 1900,
feeBearer: true,
},
{
subAccountCode: "MFY_SUB_342113621922",
feePercentage: 50,
splitAmount: 2100,
feeBearer: true,
},
],
redirectUrl: "https://webhook.site/payment-complete",
});
setCheckoutUrl(res.checkoutUrl);
setPaymentRef(paymentReference);
setVisible(true);
} catch (error: any) {
Alert.alert("Payment Error", error.message)
}
};
return (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<<View style={{backgroundColor: 'green', padding: 2}}>
<Button color={'white'} title="Pay with Monnify" onPress={payNow} />
</View>
<MonnifyModal
visible={visible}
checkoutUrl={checkoutUrl}
transactionReference={paymentRef}
monnifyInstance={monnify}
onClose={(response) => {
setVisible(false);
if (response) {
console.log('Payment completed with response:', response);
}
}}
onPaymentComplete={(verifiedResponse) => {
setVisible(false);
if (verifiedResponse.success) {
Alert.alert(
"Payment Successful",
`Amount: ₦${verifiedResponse.amountPaid}\nMethod: ${verifiedResponse.paymentMethod}\nRef: ${verifiedResponse.paymentReference}`
);
} else {
console.log('Payment failed:', verifiedResponse);
Alert.alert("Payment Failed", verifiedResponse.error || "Payment could not be verified");
}
}}
/>
</View>
);
}
```
MIT