패키지, 저장소 및 앱 카테고리 검색

flutter_upi_india 표지
패키지 상세v1.0.1

flutter_upi_india

Android 및 iOS에서 UPI 결제 앱을 시작하여 UPI 결제를 수행할 수 있는 플러터 플러그인입니다.

AndroidiOS
30일 다운로드
1.5천
좋아요
13
Pub 점수
140

패키지 설치

flutter pub add flutter_upi_india

패키지 개요

공개 정보를 바탕으로 생성한 선택 가이드입니다.

안드로이드 및 iOS용 모바일 애플리케이션에서 UPI(통합 결제 인터페이스) 결제를 통합할 수 있는 플러터 플러그인입니다. 사용자는 Google Pay나 PhonePe와 같은 기본 UPI 앱을 실행하여 UPI 결제를 시작할 수 있습니다. 이 플러그인은 최소한의 설정으로 UPI 앱으로의 딥링크 처리를 담당하여 결제 처리를 간편하게 만듭니다. 안드로이드와 iOS 양쪽 플랫폼을 지원하므로, 원활한 디지털 거래가 필요한 인도 시장 애플리케이션에 적합합니다.

사용 사례

  • 전자상거래 앱에서 UPI 결제 활성화
  • 현지 서비스 플랫폼에 디지털 결제 통합
  • UPI를 통한 요금 지불 지원
  • 피어 투 피어 송금 지원
  • 모바일 앱에 즉시 결제 옵션 추가하기

주요 기능

  • 기기의 기본 UPI 앱을 실행합니다
  • Android 및 iOS용 크로스 플랫폼 지원
  • UPI 결제 시작을 위한 간단한 API
  • 민감한 결제 데이터를 처리할 필요 없음
  • Google Pay, PhonePe와 같은 모든 주요 UPI 앱과 호환됩니다

적합한 대상

  • 인도 핀테크 스타트업
  • 인도 사용자를 대상으로 하는 모바일 앱
  • 전자상거래 및 유틸리티 앱
  • UPI 통합이 필요한 결제 게이트웨이
  • 저코드 결제 솔루션을 구축하는 개발자

고려 사항

  • 사용자 기기에서 UPI를 지원하는 앱이 설치되어 있어야 합니다
  • 출시 후 결제 흐름에 대한 제어가 제한됨
  • 사용자의 UPI 앱 구성에 따라 다릅니다
  • 서버 측 트랜잭션 처리에 적합하지 않음
  • UPI 앱을 기본으로 설정하지 않은 경우 작동하지 않을 수 있습니다

원본 README

연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.

flutter_upi_india

version

Curruntly Working in android only with some specific banks. Open for Query and Discussion.

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
Android Screen Capture IOS Screen Capture

Getting Started

Add this package to your flutter project's pubspec.yaml as a dependency as follows:

dependencies:
  ...
  flutter_upi_india: ^1.0.1

Import the package as follows:

import 'package:flutter_upi_india/flutter_upi_india.dart';
iOS configuration

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>
Usage
Get list of installed apps
final List<ApplicationMeta> appMetaList = await UpiPay.getInstalledUpiApplications();

Filter for mandate-capable apps:

final List<ApplicationMeta> mandateApps =
    await UpiPay.getInstalledUpiApplications(isForMandateApps: true);
Show an app's details
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,
        ),
      ),
    ],
  );
}
Do a UPI transaction
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',
     // merchantCode: '7372',
  );
  print(response.status);
}

Send a mandate request (uses upi://mandate):

Future doUpiMandate(ApplicationMeta appMeta) {
  return UpiPay.initiateTransaction(
    amount: '100.00',
    app: appMeta.application,
    receiverName: 'John Doe',
    receiverUpiAddress: 'john@doe',
    transactionRef: 'UPIMANDATE0001',
    transactionNote: 'UPI Mandate',
    isForMandate: true,
  );
}
Mandate parameters

Mandate requests can include additional parameters when isForMandate: true. Only non-null values are sent to the UPI app.

Future doUpiMandateWithParams(ApplicationMeta appMeta) {
  return UpiPay.initiateTransaction(
    amount: '250.00',
    app: appMeta.application,
    receiverName: 'Acme Subscriptions',
    receiverUpiAddress: 'acme@upi',
    transactionRef: 'UPIMANDATE0002',
    transactionNote: 'Monthly plan',
    isForMandate: true,
    // Mandate-specific parameters
    amountRule: 'MAX', // amrule
    blockFlag: 'Y', // block
    merchantName: 'ACME', // mn
    mode: 'UPI', // mode
    orgId: 'ACME001', // orgid
    purpose: '00', // purpose
    recurrence: 'MONTHLY', // recur
    recurrenceType: 'BEFORE', // recurtype
    recurrenceValue: '1', // recurvalue
    revocable: 'Y', // rev
    transactionId: 'TID12345', // tid
    txnType: 'CREATE', // txnType
    validityStart: '01012025', // validitystart
    validityEnd: '31122025', // validityend
  );
}

Mandate-capable apps can be filtered via UpiPay.getInstalledUpiApplications(isForMandateApps: true). Availability varies by app and platform, so verify with the target UPI app before production use.

Behaviour, Limitations & Measures

Android
Flow
  • On Android, the UPI Deep Linking And Proximity Integration Specification is implemented using Intents.
  • An Intent call with transaction request parameters includes the specific UPI app to be invoked.
  • Post the UPI transaction being processed by the chosen Android UPI app, it returns a response as per the format defined in the specification to the package's Android plugin layer.
  • The plugin layer parses this response to create a 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.
Measures

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.

iOS
Flow
  • On iOS, the UPI Deep Linking And Proximity Integration Specification is implemented using iOS custom schemes.
  • Each UPI payment app can listen to a payment request of the form upi://pay?... or upi://mandate?... sent by a caller app to iOS.
  • The specification does not let you specify the target app's identifier in this request. On iOS, there is no other disambiguation measure available such as any ordering of the UPI payment apps that can be retrieved using any iOS APIs. Hence, it's impossible to know which UPI payment app will be invoked.
  • One of the applicable apps gets invoked and it processes the payment. The custom schemes mechanism has no way to return a transaction status to your calling code. The calling code can only know if a UPI payment app was launched successfully or not.
How does the package then implement 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
}
Measures
  • You will have to implement a payment verification on top of functionality available through this package.
  • You should distinguish discovered and supported-only apps using the mechanism in the above section. The example app can be used for reference.

UPI Apps' Functional Status Dynamics

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.

Support for merchant and non-merchant payments

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:

  • An implicit "unverified source" warning or a direct warning indicating that merchant data in the request is not correct
  • Z7 error, "Transaction Frequency Limit Exceeded": See UPI Error and Response Codes
  • U16 error, "Risk Threshold Exceeded", see UPI Error and Response Codes
  • An implicit "Security error"

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.

Regressions

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.

iOS minimum versions

Several BHIM apps have stopped working on <iOS 13.5. This package's iOS support is verified on iPhone with iOS 14+.

Love to experiment yourself?

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.

Contributors ✨

This project follows the all-contributors specification. Contributions of any kind welcome and will be recognised!

Other related solutions

  • upi_india (repo) - Another solid flutter package for payment gateway free UPI integration. We often share issues faced / solution approaches and more. Go check them out as well!

카테고리

의존성

의존성 목록 2 개

소스 저장소

이 패키지를 사용하는 프로젝트

아직 데이터가 없습니다.