FonePay Flutter 在Twitter上分享 在Facebook上分享

Pub Version License: MIT

FonePay支付网关的非官方Flutter插件。使用此插件,您可以轻松地将FonePay支付网关集成到您的Flutter应用程序中,并开始接受客户的付款。无论您是在构建电子商务应用程序还是需要支付的任何其他类型的应用程序,此插件都能使集成过程简单明了。

Cover Image

笔记

此包在初始化付款时既不使用任何插件也不使用原生API。相反,它基于Flutter InAppWebView包。特别感谢InAppWebView包的开发者提供了如此有用的包。

功能

  • 易于集成
  • 无需复杂设置
  • 纯Dart代码
  • 易于使用

要求

  • Android: minSdkVersion 17并添加对androidx的支持(请参阅AndroidX迁移
  • iOS: --ios-language swift,Xcode版本>= 11

设置

iOS

平台 配置
iOS 无需配置。更多信息,请参见此处
Android android/app/build.gradle文件中的minSdkVersion设置为至少17。更多信息,请参见此处

用法

  1. fonepay_flutter作为依赖项添加到您的pubspec.yaml文件中

dependencies:
  fonepay_flutter: ^1.0.0
  1. 在您的Dart代码中导入该包

import 'package:fonepay_flutter/fonepay_flutter.dart';

  1. 使用您的付款信息创建FonePayConfig实例

FonePayConfig类保存支付网关的配置详细信息。将FonePayConfig的实例传递给FonePay类的init()方法以启动支付过程。

final config = FonePayConfig.live(
  pid: 'liveMerchantCode',
  ru: 'https://example.com/fonepay/return',
  prn: '123456',
  amt: 100.0,
  sk: 'mySecretKey',
  r1: 'Payment for order #123',
  r2: 'Additional info',
);
  1. 通过调用FonePay.init()方法来初始化支付

final result = await FonePay.i.init(
  context: context,
  fonePayConfig: config,
);
  1. 检查支付结果

付款完成或被用户取消后,该插件将返回一个FonePayPaymentResult实例。如果付款成功,hasData将为true,您可以通过data访问FonePayResponse对象。如果付款不成功,hasError将为true,您可以通过error访问错误消息。

if (result.hasData) {
  // Payment successful
  final response = result.data!;
  print('Payment successful. Ref ID: ${response.uid}');
} else {
  // Payment failed or cancelled
  final error = result.error!;
  print('Payment failed or cancelled. Error: $error');
}

开发/生产模式

FonePayConfig同时支持开发和生产模式。对于生产模式,使用FonePayConfig.live()构造函数;对于开发模式,使用FonePayConfig.dev()构造函数。以下是使用开发模式的示例

final config = FonePayConfig.dev(
  ru: 'https://example.com/fonepay/return',
  prn: '123456',
  amt: 100.0,
  r1: 'Payment for order #123',
  r2: 'Additional info',
);

API

类:FonePay

FonePay提供了一种使用自定义按钮或自定义UI来初始化FonePay支付的方式。以下是示例

方法

init({required BuildContext context,required FonePayConfig fonePayConfig,FonePayPageContent? pageContent})

初始化支付方法

final result = await
FonePay.i.init(context: context,fonePayConfig: config,pageContent: FonePayPageContent
(
appBar: AppBar
(
title: Text
('FonePay Payment
'
)
,
)
,
progressLoader: CircularProgressIndicator
(
),)
,
);

类:FonePayPageContent

FonePayPageContent类提供了自定义FonePay支付屏幕的选项。您可以在支付屏幕中添加应用栏和自定义加载器。以下是示例

FonePayPageContent(
  appBar: AppBar(
    title: Text('FonePay Payment'),
  ),
  progressLoader: CircularProgressIndicator(),
);

类:FonePayConfig

FonePayConfig类提供了FonePay支付的配置选项。

属性

  • ru(必需):实时退货URL,FonePay系统通过此URL通知商家网站付款信息。
  • serverUrl:FonePay生产服务器URL。默认为“https://clientapi.fonepay.com/api/merchantRequest?”。
  • sk(必需):FonePay账户的密钥。
  • pid:FonePay系统定义的实时商家代码。默认为“fonepay123”。
  • prn(必需):需要由商家发送的产品参考号。必须介于3到25个字符之间。
  • amt(必需):应付金额,指定为最多18位数的双精度数。
  • crn:货币代码。默认为“NPR”。
  • dt:付款日期,格式为MM/dd/yyyy。默认为当前日期。
  • r1(必需):付款详情,用于标识付款的目的(例如,收据ID或付款说明)。
  • r2:附加信息,默认为“N/A”。
  • md:支付模式,默认为“P”。
  • dv:SHA512哈希值,使用下面描述的安全哈希计算方法生成。

方法

FonePayConfig.live

初始化FonePay实时支付的配置。

参数

  • pid(必需):FonePay系统定义的实时商家代码。
  • ru(必需):实时退货URL,FonePay系统通过此URL通知商家网站付款信息。
  • prn(必需):需要由商家发送的产品参考号。
  • amt(必需):应付金额。
  • crn:货币代码。默认为“NPR”。
  • dt:付款日期,格式为MM/dd/yyyy。默认为当前日期。
  • sk(必需):FonePay账户的密钥。
  • r1(必需):付款详情,用于标识付款的目的。
  • r2:附加信息。默认为“N/A”。
  • md:支付模式。默认为“P”。

示例

final config = FonePayConfig.live(
  pid: 'liveMerchantCode',
  ru: 'https://example.com/fonepay/return',
  prn: '123456',
  amt: 100.0,
  sk: 'mySecretKey',
  r1: 'Payment for order #123',
  r2: 'Additional info',
);

FonePayConfig.dev

初始化FonePay开发阶段的配置。

参数

  • ru(必需):实时退货URL,FonePay系统通过此URL通知商家网站付款信息。
  • prn(必需):需要由商家发送的产品参考号。
  • amt(必需):应付金额。
  • crn:货币代码。默认为“NPR”。
  • dt:付款日期,格式为MM/dd/yyyy。默认为当前日期。
  • r1(必需):付款详情,用于标识付款的目的。
  • r2:附加信息。默认为“N/A”。
  • md:支付模式。默认为“P”。

示例

final config = FonePayConfig.dev(
  ru: 'https://example.com/fonepay/return',
  prn: '123456',
  amt: 100.0,
  r1: 'Payment for order #123',
  r2: 'Additional info',
);

类:FonePayResponse

代表FonePay API的响应。

属性

名称 类型 描述
prn 字符串 付款参考号。
pid 字符串 商家的支付标识。
ps 字符串 支付状态。
rc 字符串 响应代码。
uid 字符串 唯一交易标识。
bc 字符串 银行代码。
ini 字符串 交易初始化日期和时间。
pAmt 字符串 已付金额。
rAmt 字符串 退款金额。
dv 字符串 设备类型。

方法

toJson()

FonePayResponse实例转换为JSON对象。

返回

表示FonePayResponse实例的Map对象。

类:FonePayPaymentResult

表示付款交易结果的类。

属性

  • data:付款响应数据(如果付款成功)。否则为null。
  • error:错误消息(如果付款失败或被取消)。否则为null。
  • hasData:一个布尔值,指示付款是否成功且包含非null的data属性。
  • hasError:一个布尔值,指示付款是否失败或被取消且包含非null的error属性。

类:FonePayButton

FonePayButton类是一个StatelessWidget,代表一个触发FonePay支付的按钮。它接受多个参数来配置按钮并初始化支付。

参数

  • width(可选):按钮的宽度。
  • height(可选):按钮的高度。
  • onSuccess(必需):付款成功时将调用的回调函数。它将FonePayResponse对象作为参数。
  • onFailure(必需):付款失败时将调用的回调函数。它将失败消息作为参数。
  • paymentConfig(必需):一个FonePayConfig对象,包含FonePay支付的配置。
  • radius(可选):按钮的边框半径。
  • widget(可选):将显示在按钮标题而不是按钮标题中的小部件。这可用于显示图标或自定义小部件。
  • title(可选):按钮的标题。默认为“Pay with FonePay”。
  • textStyle(可选):按钮标题的文本样式。
  • style(可选):按钮的ButtonStyle

用法示例

FonePayButton(
    paymentConfig: FonePayConfig(),
    onSuccess: (response) {
        // Handle successful payment
        print('Payment successful! Response: ${response.toJson()}');
    },
    onFailure: (message) {
        // Handle failed payment
        print('Payment failed. Message: $message');
    },
)

类:FonePayUtils

FonePayUtils类提供了FonePay集成的实用函数。

静态方法:formatDate

static String formatDate
(

DateTime date
)

以MM/dd/yyyy格式返回格式化的日期字符串。

date(必需):要格式化的DateTime对象。

方法:generateRandomString

String generateRandomString
(
{
int
?
len
}
)
  • 生成指定长度的随机字符串,如果未指定则默认为6。

len(可选):要生成的随机字符串的长度。如果未指定,将使用默认长度6。注意:为防止因FonePayConfig中的PRN号重复而导致付款请求失败,建议使用此方法生成唯一的PRN号。

开发测试信息

要访问开发环境,请使用以下凭据

  • 银行:开发模式下的任何可用银行[目前是Global IME Bank]
  • 用户名:[任何以98开头的10位随机尼泊尔号码]
  • 密码:[任何随机的,如1212122]
  • OTP:[任何随机的,如1212122]

请注意,这些凭据仅用于测试目的,不应用于生产环境。

屏幕截图

以下是FonePay支付网关集成到电子商务Flutter应用程序中的一些屏幕截图

Example Order Screen Payment Screen

运行示例应用程序

  • 导航到example文件夹
  • cd example
  • 安装依赖项
    • flutter pub get
  • 设置配置FonePayConfig.live()或直接在开发模式下使用FonePayConfig.dev()运行
  • 启动示例
    • 终端:flutter run

许可证

此插件已根据MIT许可证发布。详情请参阅LICENSE。

贡献

欢迎贡献!为了使该项目变得更好,请随时在Github上打开问题或提交拉取请求。

联系方式

如果您有任何疑问或建议,请随时通过LinkedIn联系我

GitHub

查看 Github