The simplest way to integrate UPI payments in your React Native Android app β Launch UPI apps (PhonePe, Google Pay, Paytm, BHIM) directly or via chooser, and fetch installed UPI apps on user's device.
- π― Direct UPI App Launch β Open specific payment apps (PhonePe, GPay, Paytm) directly
- π Smart Fallback β Automatically shows chooser if preferred app isn't available
- π± Detect Installed Apps β Get list of all UPI-enabled apps on device
- β‘ Lightweight β Zero dependencies, minimal footprint
- π‘οΈ Type-Safe β Full TypeScript support
- π Easy Integration β Works with React Native 0.60+ with auto-linking
![]() |
![]() |
![]() |
- E-commerce apps β Accept UPI payments seamlessly
- Bill payment apps β Quick utility bill settlements
- Peer-to-peer payment apps β Send money to friends
- Subscription services β Recurring UPI payments
- Donation platforms β Accept contributions via UPI
npm install react-native-upi-launcheryarn add react-native-upi-launcherreact-native link react-native-upi-launcherimport { fetchUpiApps } from "react-native-upi-launcher";
const getAvailableUpiApps = async () => {
try {
const apps = await fetchUpiApps();
console.log("Available UPI apps:", apps);
/*
Output example:
[
{ packageName: "com.phonepe.app", appName: "PhonePe" },
{ packageName: "com.google.android.apps.nbu.paisa.user", appName: "Google Pay" },
{ packageName: "net.one97.paytm", appName: "Paytm" }
]
*/
} catch (error) {
console.error("Error fetching UPI apps:", error);
}
};import { openUpiIntent } from "react-native-upi-launcher";
const makePayment = async () => {
const upiUrl =
"upi://pay?pa=merchant@upi&pn=Merchant%20Name&am=100&cu=INR&tn=Order%20Payment";
const preferredApp = "com.phonepe.app"; // Optional: specific UPI app package
try {
const result = await openUpiIntent(upiUrl, preferredApp);
console.log("Payment initiated:", result);
} catch (error) {
console.error("Payment failed:", error);
}
};import React, { useState, useEffect } from "react";
import { View, Button, FlatList, Text, Alert } from "react-native";
import { fetchUpiApps, openUpiIntent } from "react-native-upi-launcher";
const PaymentScreen = () => {
const [upiApps, setUpiApps] = useState([]);
useEffect(() => {
loadUpiApps();
}, []);
const loadUpiApps = async () => {
try {
const apps = await fetchUpiApps();
setUpiApps(apps);
} catch (error) {
Alert.alert("Error", "Failed to load UPI apps");
}
};
const initiatePayment = async (packageName) => {
const upiUrl =
"upi://pay?pa=test@upi&pn=Test%20User&am=1&cu=INR&tn=Test%20Payment";
try {
await openUpiIntent(upiUrl, packageName);
Alert.alert("Success", "Payment initiated successfully");
} catch (error) {
Alert.alert("Error", "Payment failed: " + error.message);
}
};
return (
<View>
<FlatList
data={upiApps}
keyExtractor={(item) => item.packageName}
renderItem={({ item }) => (
<Button
title={`Pay with ${item.appName}`}
onPress={() => initiatePayment(item.packageName)}
/>
)}
/>
</View>
);
};
export default PaymentScreen;Fetches all installed UPI applications on the device.
Returns: Array of UPI app objects
interface UpiApp {
packageName: string; // e.g., "com.phonepe.app"
appName: string; // e.g., "PhonePe"
}Launches UPI payment intent.
Parameters:
upiUrl(required): UPI payment URL stringpackageName(optional): Specific UPI app package name. If omitted or app not found, shows chooser.
UPI URL Format:
upi://pay?pa=<UPI_ID>&pn=<NAME>&am=<AMOUNT>&cu=<CURRENCY>&tn=<NOTE>
Parameters:
paβ Payee UPI address (required)pnβ Payee name (required)amβ Amount (optional)cuβ Currency (default: INR)tnβ Transaction note (optional)
| App | Package Name |
|---|---|
| PhonePe | com.phonepe.app |
| Google Pay | com.google.android.apps.nbu.paisa.user |
| Paytm | net.one97.paytm |
| BHIM | in.org.npci.upiapp |
| Amazon Pay | in.amazon.mShop.android.shopping |
com.whatsapp |
|
| Mobikwik | com.mobikwik_new |
| Freecharge | com.freecharge.android |
If you need to support UPI apps beyond the default list, add their package names to your AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yourapp">
<queries>
<!-- Default UPI apps (already included in library) -->
<package android:name="com.phonepe.app" />
<package android:name="com.google.android.apps.nbu.paisa.user" />
<package android:name="net.one97.paytm" />
<package android:name="in.org.npci.upiapp" />
<!-- Add your custom UPI apps here -->
<package android:name="com.mybank.upi" />
<package android:name="com.customwallet.app" />
</queries>
<application>
<!-- Your app configuration -->
</application>
</manifest>Note: For Android 11+ (API 30+), you must declare package visibility queries in your manifest for apps you want to detect.
1. No UPI apps detected
- Ensure UPI apps are installed on the device
- Check
AndroidManifest.xmlhas proper<queries>declarations - Verify targetSdkVersion is 30 or higher
2. App chooser not showing
- Verify the UPI URL format is correct
- Check that at least one UPI app is installed
- Ensure proper permissions in AndroidManifest
3. Payment not initiating
- Validate UPI URL parameters
- Check network connectivity
- Verify UPI app is up to date
On iOS, the library falls back to using React Native's Linking.openURL() to open UPI deep links. However, iOS has limited native UPI support compared to Android.
import { Linking, Platform } from "react-native";
import { openUpiIntent } from "react-native-upi-launcher";
const handlePayment = async (upiUrl) => {
if (Platform.OS === "ios") {
// iOS fallback
await Linking.openURL(upiUrl);
} else {
// Android - full functionality
await openUpiIntent(upiUrl);
}
};- β Always validate UPI URLs on your backend
- β Never hardcode sensitive payment information
- β Implement proper error handling
- β Verify transaction status via server callbacks
- β Use HTTPS for all API communications
- β Sanitize user inputs before creating UPI URLs
Test with these sample UPI URLs:
// Test payment (will fail gracefully)
const testUrl =
"upi://pay?pa=test@paytm&pn=Test%20Merchant&am=1&cu=INR&tn=Test";
// Use your own UPI ID for testing
const realUrl = "upi://pay?pa=yourname@paytm&pn=Your%20Name&am=10&cu=INR";- Bundle size: < 15KB
- No external dependencies
- Native Android implementation for optimal performance
- Async/await support for modern JavaScript
We welcome contributions! Please see our Contributing Guide for details.
- Fork the repository
- Create your feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
See detailed development workflow guide.
Please read our Code of Conduct before contributing.
MIT Β© Vivek Negi
See LICENSE file for details.
- Built with create-react-native-library
- Inspired by the Indian digital payment ecosystem
- NPM Package: npmjs.com/package/react-native-upi-launcher
- GitHub: github.com/vivnegi21/react-native-upi-launcher
- Issues: github.com/vivnegi21/react-native-upi-launcher/issues
- Changelog: CHANGELOG.md
Keywords: react-native, upi, payment, phonepe, gpay, paytm, bhim, android, upi-payment, react-native-payments, indian-payments, upi-integration, mobile-payments, digital-payments, upi-launcher
Made with β€οΈ for the React Native community



