Flutter支付插件paynow的使用
Flutter支付插件paynow的使用
简介
paynow
是一个用于在 Flutter 应用中集成 Paynow 支付系统的插件。本文将详细介绍如何安装、配置和使用 paynow
插件来实现支付功能。
注册并获取集成详情
在开始使用 Paynow 的 API 之前,你需要从 Paynow 获取集成 ID 和集成密钥。关于如何获取这些信息的详细说明可以在 此页面 找到。
前提条件
为了使项目正常工作,需要满足以下前提条件:
- 最新的 Flutter SDK 版本
安装
要使用 Flutter Paynow SDK,你需要在项目的 pubspec.yaml
文件中添加最新版本的依赖。
pubspec.yaml
dependencies:
paynow: ^latest_version
你可以通过访问 pub.dev 来获取最新版本号。
入门
导入 paynow
包
在你的 Dart 文件中导入 paynow
包:
import 'package:paynow/paynow.dart';
初始化 Paynow
创建一个 Paynow
实例,并关联你在 Paynow 获取的集成 ID 和集成密钥。同时,设置返回 URL 和结果 URL。
Paynow paynow = Paynow(
integrationKey: "INTEGRATION_KEY",
integrationId: "INTEGRATION_ID",
returnUrl: "http://yourReturnUrl.com",
resultUrl: "http://yourResultUrl.com"
);
创建支付实例
使用 createPayment
方法创建一个新的支付实例,确保传递一个唯一的支付引用(例如发票 ID)。如果还传递了电子邮件地址,Paynow 将尝试使用该电子邮件地址自动登录客户。
Payment payment = paynow.createPayment("Invoice 32", "client@email.com");
添加商品到购物车
创建一个商品并将其添加到购物车中。你可以指定商品的数量。
final cartItem = PaynowCartItem(title: 'Banana', amount: 20.0);
// 添加到购物车
payment.addToCart(cartItem);
// 添加特定数量的商品
payment.addToCart(cartItem, quantity: 5);
从购物车中移除商品
你可以从购物车中移除商品或特定数量的商品。
// 移除 1 单位的商品
payment.removeFromCart(cartItem);
// 移除特定数量的商品
payment.removeFromCart(cartItem, quantity: 5);
// 完全移除商品
payment.deleteCartItem(cartItem);
发起基于 Web 的交易
基于 Web 的交易通过 Paynow 网站进行。你可以设置结果 URL 和返回 URL。
paynow.setResultUrl("http://example.com/gateways/paynow/update");
paynow.setReturnUrl("http://example.com/return?gateway=paynow&merchantReference=1234");
InitResponse response = await paynow.send(payment);
InitResponse
响应将包含各种信息,包括:
- 重定向客户完成支付的 URL
- 检查交易是否已支付的轮询 URL
发起基于移动的交易
基于移动的交易使用移动支付方式(如 Ecocash)进行。目前仅支持 Ecocash 和 Econet 号码以及 OneMoney 和 Netone 号码。
InitResponse response = await paynow.sendMobile(payment, "0784442662", MobilePaymentMethod.ecocash);
检查响应结果
InitResponse
响应将包含各种信息,包括:
- 重定向客户完成支付的 URL
- 检查交易是否已支付的轮询 URL
// 显示结果
print(response());
// 打印指令
print(response.instructions);
// 对于 Web Checkout,你将获得重定向 URL 以重定向客户
String redirectUrl = response.redirectUrl;
轮询交易以检查支付状态
你可以检查交易的状态,即支付是否已成功。为此,需要在发起交易后记录轮询 URL,并使用 pollTransaction
方法检查状态。
InitResponse response = await paynow.send(payment);
StatusResponse statusResponse = await paynow.checkTransactionStatus(response.pollUrl);
if (statusResponse.status == "Paid") {
print("Client Paid");
} else {
print("Transaction was unsuccessful");
}
无服务器快速结账(流式交易状态)
你可以使用 streamTransactionStatus
方法流式轮询交易状态,这对于没有服务器来检查 Paynow 结果 URL 和返回 URL 的情况非常有用。
// 从 `StatusResponse` 对象或数据库中获取轮询 URL
var pollUrl = statusResponse.pollUrl;
// 在 Widget build 方法中
// 你可以这样做
StreamBuilder(
stream: paynow.streamTransactionStatus(pollUrl),
builder: (context, AsyncSnapshot<StatusResponse> snapshot) {
if (snapshot.hasData) {
var response = snapshot.data;
// 检查状态或布尔标志
return _trxnStatus(response.status);
} else {
return CircularProgressIndicator();
}
}
);
// 根据流中的状态返回一个 Widget
Widget _trxnStatus(String status) {
switch (status) {
case 'Paid':
return Text('Transaction Successfully Paid');
case 'Sent':
return Container(
height: 130,
child: Column(
children: [
Text('Payment request sent'),
SizedBox(height: 20),
CircularProgressIndicator(),
Text('waiting for response...'),
],
),
);
case 'Cancelled':
return Text('You have cancelled payment request');
default:
return SizedBox.shrink();
}
}
完整使用示例
以下是一个基于移动交易的完整使用示例。更多示例请参阅 example
文件夹。
import 'package:paynow/paynow.dart';
main() async {
Paynow paynow = Paynow(
integrationId: '',
integrationKey: '',
resultUrl: '',
returnUrl: ''
);
Payment payment = paynow.createPayment('Invoice 32', 'user@email.com');
// 添加商品到购物车
payment.add('Banana', 10.0);
// 开始移动支付
InitResponse response = await paynow.sendMobile(payment, '0784442662', MobilePaymentMethod.ecocash);
// 延迟
await Future.delayed(Duration(seconds: 3));
// 检查交易状态
StatusResponse status = await paynow.checkTransactionStatus(response.pollUrl);
if (status.status == "Paid") {
print('Yes!!!!!');
} else {
print('You didn\'t pay');
}
}
注意事项
下一个版本的 paynow
包将启用空安全,这将是一个破坏性更改,版本 2.x.x 将很快发布。
快乐编码 :)
希望本文对你有所帮助,祝你开发愉快!
更多关于Flutter支付插件paynow的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter支付插件paynow的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中集成和使用Paynow支付插件的示例代码。需要注意的是,实际使用时需要根据Paynow的官方文档进行调整,并确保你拥有Paynow的API密钥和其他必要的配置信息。
首先,你需要在pubspec.yaml
文件中添加Paynow的Flutter插件依赖。假设Paynow有一个官方的Flutter插件(注意:这里是一个假设的插件名,你需要根据实际的插件名进行替换):
dependencies:
flutter:
sdk: flutter
paynow_flutter: ^x.y.z # 替换为实际的版本号
然后运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中配置Paynow插件。通常,这包括初始化插件和设置必要的API密钥。以下是一个基本的示例代码:
import 'package:flutter/material.dart';
import 'package:paynow_flutter/paynow_flutter.dart'; // 假设的插件导入路径
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Paynow Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final PaynowFlutter _paynow = PaynowFlutter();
@override
void initState() {
super.initState();
// 初始化Paynow插件,设置API密钥等(这里是一个假设的方法)
_paynow.initialize(
apiKey: 'your_paynow_api_key', // 替换为你的Paynow API密钥
environment: 'sandbox', // 通常会有沙盒环境和生产环境的选择
);
}
void _initiatePayment() async {
try {
// 假设的支付参数,具体参数需要根据Paynow文档进行调整
final Map<String, dynamic> paymentDetails = {
'amount': 100.0, // 支付金额
'currency': 'USD', // 货币类型
'description': 'Test Payment', // 支付描述
// 其他必要的支付参数...
};
// 发起支付请求
final PaynowResponse response = await _paynow.makePayment(paymentDetails);
if (response.status == 'success') {
// 支付成功处理
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Payment Successful'),
content: Text('Payment ID: ${response.paymentId}'),
actions: <Widget>[
FlatButton(
child: Text('OK'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
),
);
} else {
// 支付失败处理
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Payment Failed'),
content: Text('Error: ${response.errorMessage}'),
actions: <Widget>[
FlatButton(
child: Text('OK'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
),
);
}
} catch (e) {
// 处理异常
print('Error initiating payment: $e');
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Error'),
content: Text('An error occurred while initiating payment.'),
actions: <Widget>[
FlatButton(
child: Text('OK'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Paynow Payment Demo'),
),
body: Center(
child: ElevatedButton(
onPressed: _initiatePayment,
child: Text('Initiate Payment'),
),
),
);
}
}
// 假设的Paynow响应类(你需要根据实际的响应结构进行调整)
class PaynowResponse {
String status;
String paymentId;
String errorMessage;
PaynowResponse({required this.status, this.paymentId, this.errorMessage});
factory PaynowResponse.fromJson(Map<String, dynamic> json) {
return PaynowResponse(
status: json['status'] ?? '',
paymentId: json['paymentId'] ?? '',
errorMessage: json['errorMessage'] ?? '',
);
}
}
请注意,上面的代码是基于假设的Paynow Flutter插件和API结构编写的。在实际使用中,你需要参考Paynow的官方文档来调整代码,包括插件的初始化、支付参数的设置、以及响应的处理。
另外,由于支付涉及到敏感信息和安全性,务必确保你的API密钥和其他敏感信息不会泄露给未经授权的用户。在生产环境中,建议使用安全的存储和传输方式来保护这些信息。