Flutter在线支付插件zarinpal的使用
Flutter在线支付插件Zarinpal的使用
插件简介
Zarinpal Package 是一个用于Flutter应用的在线支付插件,支持Android和iOS平台。它可以帮助开发者轻松集成Zarinpal支付网关,实现安全、便捷的支付功能。
使用方法
1. 初始化支付请求
首先,我们需要导入zarinpal
包,并创建一个PaymentRequest
对象来设置支付请求的参数。以下是一个简单的示例:
import 'package:zarinpal/zarinpal.dart';
void main() {
// 初始化支付请求
PaymentRequest _paymentRequest = PaymentRequest();
// 设置是否为沙盒环境(开发模式)
_paymentRequest.setIsSandBox(true); // 如果应用处于开发模式,请设置为true,否则设置为false
// 设置商户ID
_paymentRequest.setMerchantID("Zarinpal MerchantID"); // 替换为你的Zarinpal商户ID
// 设置回调URL
_paymentRequest.setCallbackURL("CallBack URL"); // 回调可以是Android Scheme或网站URL,你可以通过回调传递任何数据
// 设置支付金额
_paymentRequest.setAmount(1000); // 支付金额为整数
// 设置支付描述
_paymentRequest.setDescription("Payment Description");
// 保存支付URL
String? _paymentUrl;
// 调用开始支付
ZarinPal().startPayment(_paymentRequest, (int? status, String? paymentGatewayUri, data) {
if (status == 100) {
_paymentUrl = paymentGatewayUri; // 在浏览器中打开支付URL
print("支付网关URL: $_paymentUrl");
} else {
print("启动支付失败,状态码: $status");
}
});
}
2. 验证支付结果
在用户完成支付后,你需要验证支付结果。根据你设置的回调方式(Scheme或网站URL),你可以获取支付的状态和授权码(Authority)。以下是验证支付的代码示例:
// 验证支付
ZarinPal().verificationPayment("Status", "Authority Call back", _paymentRequest, (bool isPaymentSuccess, String refID, PaymentRequest paymentRequest, data) {
if (isPaymentSuccess) {
// 支付成功
print("支付成功,参考号: $refID");
} else {
// 支付失败
print("支付失败,错误信息: $data");
}
});
3. 注意事项
- 沙盒环境:在开发和测试阶段,建议将
setIsSandBox(true)
设置为true
,以避免真实的资金交易。 - 回调URL:如果你使用的是Scheme回调(例如
uni_links
包),你需要在应用中处理Scheme回调,并从中提取Status
和Authority
参数。如果你使用的是网站URL回调,则不需要调用verificationPayment
函数。 - 支付金额:支付金额必须为整数,单位为里亚尔(Rial)。
完整示例Demo
以下是一个完整的Flutter应用示例,展示了如何使用Zarinpal插件进行支付并验证支付结果:
import 'package:flutter/material.dart';
import 'package:zarinpal/zarinpal.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: PaymentPage(),
);
}
}
class PaymentPage extends StatefulWidget {
[@override](/user/override)
_PaymentPageState createState() => _PaymentPageState();
}
class _PaymentPageState extends State<PaymentPage> {
String? _paymentUrl;
bool _isPaymentInProgress = false;
String _paymentResult = "";
void startPayment() async {
setState(() {
_isPaymentInProgress = true;
_paymentResult = "";
});
// 初始化支付请求
PaymentRequest _paymentRequest = PaymentRequest();
// 设置是否为沙盒环境
_paymentRequest.setIsSandBox(true);
// 设置商户ID
_paymentRequest.setMerchantID("Zarinpal MerchantID"); // 替换为你的Zarinpal商户ID
// 设置回调URL
_paymentRequest.setCallbackURL("CallBack URL"); // 替换为你的回调URL
// 设置支付金额
_paymentRequest.setAmount(1000); // 支付金额为1000里亚尔
// 设置支付描述
_paymentRequest.setDescription("Payment Description");
// 调用开始支付
ZarinPal().startPayment(_paymentRequest, (int? status, String? paymentGatewayUri, data) {
if (status == 100) {
setState(() {
_paymentUrl = paymentGatewayUri;
_isPaymentInProgress = false;
});
} else {
setState(() {
_isPaymentInProgress = false;
_paymentResult = "启动支付失败,状态码: $status";
});
}
});
}
void verifyPayment(String status, String authority) {
ZarinPal().verificationPayment(status, authority, _paymentRequest, (bool isPaymentSuccess, String refID, PaymentRequest paymentRequest, data) {
setState(() {
if (isPaymentSuccess) {
_paymentResult = "支付成功,参考号: $refID";
} else {
_paymentResult = "支付失败,错误信息: $data";
}
});
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Zarinpal支付示例"),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: _isPaymentInProgress ? null : startPayment,
child: _isPaymentInProgress
? CircularProgressIndicator()
: Text("开始支付"),
),
SizedBox(height: 20),
if (_paymentUrl != null)
TextButton(
onPressed: () {
// 打开支付URL(可以使用url_launcher包)
// launch(_paymentUrl!);
},
child: Text("点击这里完成支付"),
),
SizedBox(height: 20),
if (_paymentResult.isNotEmpty) Text(_paymentResult),
],
),
),
);
}
}
更多关于Flutter在线支付插件zarinpal的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter在线支付插件zarinpal的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter应用中使用ZarinPal插件进行在线支付的代码示例。ZarinPal是伊朗的一个流行的在线支付网关。首先,你需要确保已经在pubspec.yaml
文件中添加了zarinpal
插件的依赖。
在pubspec.yaml
中添加依赖
dependencies:
flutter:
sdk: flutter
zarinpal: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
Flutter代码示例
以下是一个简单的Flutter应用示例,展示如何使用ZarinPal插件进行支付。
main.dart
import 'package:flutter/material.dart';
import 'package:zarinpal/zarinpal.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter ZarinPal Payment Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: PaymentScreen(),
);
}
}
class PaymentScreen extends StatefulWidget {
@override
_PaymentScreenState createState() => _PaymentScreenState();
}
class _PaymentScreenState extends State<PaymentScreen> {
final ZarinPal _zarinPal = ZarinPal();
String _paymentUrl = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('ZarinPal Payment Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () async {
// 替换为实际的商户ID和金额
String merchantId = 'YOUR_MERCHANT_ID';
double amount = 1000.0;
String description = 'Test Payment';
String callbackUrl = 'https://yourwebsite.com/callback';
try {
String authority = await _zarinPal.requestPayment(
merchantId: merchantId,
amount: amount,
description: description,
callbackUrl: callbackUrl,
);
setState(() {
_paymentUrl = 'https://www.zarinpal.com/pg/StartPay/$authority';
});
// 打开支付页面
if (await canLaunch(_paymentUrl)) {
await launch(_paymentUrl);
} else {
throw 'Could not launch $_paymentUrl';
}
} catch (e) {
print('Error: $e');
}
},
child: Text('Pay Now'),
),
SizedBox(height: 20),
if (_paymentUrl.isNotEmpty)
Text(
'Payment URL: $_paymentUrl',
style: TextStyle(fontSize: 16),
),
],
),
),
);
}
}
注意事项
- 商户ID:你需要在ZarinPal注册并获得一个商户ID (
merchantId
)。 - 回调URL:你需要在ZarinPal后台设置一个回调URL,以便在支付完成后接收通知。
- 权限:确保你的应用有打开网页的权限。在
AndroidManifest.xml
和Info.plist
中可能需要添加相应的权限和配置。 - 安全性:不要在客户端代码中硬编码敏感信息,如商户ID和API密钥。考虑使用环境变量或安全存储。
处理支付回调
在ZarinPal后台设置的回调URL需要你的服务器能够接收和处理POST请求。服务器接收到回调后,通常会验证支付状态并更新订单状态。这部分代码需要在服务器端实现,不在Flutter应用范围内。
以上示例展示了如何在Flutter应用中集成ZarinPal进行在线支付。根据实际需求,你可能需要进一步完善代码,如添加错误处理、用户反馈等。