Find installed UPI payment apps on your phone and make payments using any one of them.
Package implements UPI Deep Linking And Proximity Integration Specification.
Android | iOS |
---|---|
Add this package to your flutter project's pubspec.yaml
as a dependency as follows:
dependencies:
...
upi_pay: ^1.0.1
Import the package as follows:
import 'package:upi_pay/upi_pay.dart';
In Runner/Info.plist
add or modify the LSApplicationQueriesSchemes
key so it includes custom query schemes shown as follows:
<key>LSApplicationQueriesSchemes</key>
<array>
...
<string>freecharge</string>
<string>gpay</string>
<string>in.fampay.app</string>
<string>lotza</string>
<string>mobikwik</string>
<string>paytm</string>
<string>phonepe</string>
<string>upi</string>
<string>upibillpay</string>
<string>whatsapp</string>
...
</array>
final List<ApplicationMeta> appMetaList = await UpiPay.getInstalledUpiApps();
Widget appWidget(ApplicationMeta appMeta) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
appMeta.iconImage(48), // Logo
Container(
margin: EdgeInsets.only(top: 4),
alignment: Alignment.center,
child: Text(
appMeta.application.getAppName(),
textAlign: TextAlign.center,
),
),
],
);
}
Future doUpiTransation(ApplicationMeta appMeta) {
final UpiTransactionResponse response = await UpiPay.initiateTransaction(
amount: '100.00',
app: appMeta.application,
receiverName: 'John Doe',
receiverUpiAddress: 'john@doe',
transactionRef: 'UPITXREF0001',
transactionNote: 'A UPI Transaction',
);
print(response.status);
}
UpiTransactionResponse
object that is returned to your calling code. This object clearly indicates the status of the UPI payment, i.e. was it successful, failed or being processed.It is advised that you implement a server-side payment verification on top of this status reporting, to avoid being affected by any hacks in the UPI transaction workflow on client's phone.
upi://pay?...
sent by a caller app to iOS.getInstalledUpiApps
?The apps that implement any other unique custom scheme other than upi
are discovered using such custom schemes. In the list of returned apps, both the reliably discovered apps and the supported but undetectable apps are returned.
Your code can distinguish if an app in the list of discovered apps was detected or not by checking as follows:
bool isAppReallyDiscovered(ApplicationMeta applicationMeta) {
return applicationMeta.application.discoveryCustomScheme != null
}
UPI standards and systems are evolving, and accordingly behaviour and functionality of the UPI payment apps are changing. See Apps for details of current functional status of various applications that were verified by us.
The UPI Deep Linking And Proximity Integration Specification is designed for merchant payments. It includes parameters in payment request that can be provided only if the payment was made to a merchant e.g. the merchant code (mc
parameter), and a signature (crypto-hash) of the request created using merchant's private key.
However; various applications have been accepting requests without merchant details and signature and successfully processing payments. Possibly, the dilution could be due to the reason that such a package can only automate filling a payment form, and unless the user verifies the details in the form and enters the UPI pin, no damaging payments can be really made.
Over last few months, few applications have started changing their behaviour around non-merchant payments and one or more of the following are seen in few apps:
This behaviour sometimes is not consistent even for the same app. For example, WhatsApp successfully completes transactions on iOS; but rejects non-merchant transactions on Android.
If you believe that your app's users' money is secure via their UPI pin, and you can let them use apps that successfully complete non-merchant transactions, then go ahead and pick the working apps in Apps and integrate this package.
It's seen that post the Bank mergers of 2020-21 some of the bank apps have stopped working, even though they are still in Play Store and/or App Store.
Several BHIM apps have stopped working on <iOS 13.5. This package's iOS support is verified on iPhone with iOS 14+.
Default behaviour of the getInstalledUpiApps
API is to give you only the completely successfully working UPI apps. You can make the package return other apps by passing relevant values for parameters of this API. Please see API documentation. To support this experimentation, we would add further tweaking to allow you to access UPI apps not seen and supported by this package shortly on Android.
Thanks to these wonderful people (emoji key):
Soumyajit Pathak 💻 🤔 👀 📖 🚧 🔬 |
Reetesh Ranjan 💻 🤔 👀 📖 🚧 🔬 |
Sharad Chand 💻 🤔 🔬 |
Adam Markon 💻 |
This project follows the all-contributors specification. Contributions of any kind welcome and will be recognised!