Flutter支付插件flutter_payu_unofficial的使用
Flutter支付插件flutter_payu_unofficial的使用
flutter_payu_unofficial
插件支持Android和iOS平台。它使用了由PayU Money开发团队提供的移动SDK。
![截图1]()
![截图3]()
![截图4]()。
开始使用
在pubspec.yaml
文件中添加依赖:
dependencies:
flutter_payu_unofficial: 1.0.3
特性
特性 | 描述 |
---|---|
插件即用 | 安装简单,开箱即用的UI |
自动读取OTP | 在支持的平台上自动读取OTP |
PayU Money移动SDK | 基于PayU Money的iOS和Android SDK |
空安全 | ✅ |
Android安装
编辑AndroidManifest.xml
在<manifest>
标签中添加以下行:
xmlns:tools="http://schemas.android.com/tools"
在<application>
标签中添加以下行:
tools:replace="android:label"
iOS安装
对于iOS,无需进行任何配置。
使用示例
准备支付参数
// 准备支付参数。
PaymentParams _paymentParam = PaymentParams(
merchantID: "商户ID",
merchantKey: "商户密钥",
salt: "盐值",
amount: "100",
transactionID: "TXNID1234567890",
firstName: "FirstName",
email: "Test@test.com",
productName: "测试产品",
phone: "9876543210",
fURL: "https://www.payumoney.com/mobileapp/payumoney/failure.php",
sURL: "https://www.payumoney.com/mobileapp/payumoney/success.php",
udf1: "udf1",
udf2: "udf2",
udf3: "udf3",
udf4: "udf4",
udf5: "udf5",
udf6: "",
udf7: "",
udf8: "",
udf9: "",
udf10: "",
hash: "",
isDebug: true, // 测试模式为true,生产模式为false
);
发起支付
// 返回PayuPaymentResult对象
PayuPaymentResult _paymentResult = await FlutterPayuUnofficial.initiatePayment(
paymentParams: _paymentParam,
showCompletionScreen: false, // false将不显示内置的成功/失败屏幕,默认为true
);
比较结果
// PayuPaymentResult.status是字符串,PayuPaymentStatus类有一些通用的状态来干净地比较。
// 实际响应在PayuPaymentResult.response中。
// 响应是Map<dynamic,dynamic>,直接来自SDK没有任何更改。
if (_paymentResult.status == PayuPaymentStatus.success) {
print("Success: ${_paymentResult.response}");
} else if (_paymentResult.status == PayuPaymentStatus.failed) {
print("Failed: ${_paymentResult.response}");
} else if (_paymentResult.status == PayuPaymentStatus.cancelled) {
print("Cancelled by User: ${_paymentResult.response}");
} else {
print("Response: ${_paymentResult.response}");
print("Status: ${_paymentResult.status}");
}
完整示例代码
import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'package:flutter/material.dart';
import 'package:flutter_payu_unofficial/flutter_payu_unofficial.dart';
import 'package:flutter_payu_unofficial/models/payment_params_model.dart';
import 'package:flutter_payu_unofficial/models/payment_result.dart';
import 'package:flutter_payu_unofficial/models/payment_status.dart';
import 'package:flutter_payu_unofficial_example/credentials.dart';
import 'package:flutter_payu_unofficial_example/widgets/common_text_field.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
TextEditingController _merchantIDTextFieldController = TextEditingController(text: merchantID);
TextEditingController _merchantKeyTextFieldController = TextEditingController(text: merchantKey);
TextEditingController _saltTextFieldController = TextEditingController(text: salt);
TextEditingController _amountTextFieldController = TextEditingController(text: "100");
TextEditingController _transactionIDTextFieldController = TextEditingController(text: DateTime.now().millisecondsSinceEpoch.toString());
TextEditingController _nameTextFieldController = TextEditingController(text: "Test Name");
TextEditingController _productInfoTextFieldController = TextEditingController(text: "Test Product");
TextEditingController _emailTextFieldController = TextEditingController(text: "Test@test.com");
Future<void> pay() async {
PaymentParams _paymentParam = PaymentParams(
merchantID: _merchantIDTextFieldController.text,
merchantKey: _merchantKeyTextFieldController.text,
salt: _saltTextFieldController.text,
amount: _amountTextFieldController.text,
transactionID: _transactionIDTextFieldController.text,
firstName: _nameTextFieldController.text,
email: _emailTextFieldController.text,
productName: _productInfoTextFieldController.text,
phone: "9876543210",
fURL: "https://www.payumoney.com/mobileapp/payumoney/failure.php",
sURL: "https://www.payumoney.com/mobileapp/payumoney/success.php",
udf1: "udf1",
udf2: "udf2",
udf3: "udf3",
udf4: "udf4",
udf5: "udf5",
udf6: "",
udf7: "",
udf8: "",
udf9: "",
udf10: "",
hash: "", // Hash是必需的,现在初始化为空字符串以稍后设置实际的哈希值
isDebug: true, // 测试模式为true,生产模式为false
);
// 生成本地哈希
var bytes = utf8.encode(
"${_paymentParam.merchantKey}|${_paymentParam.transactionID}|${_paymentParam.amount}|${_paymentParam.productName}|${_paymentParam.firstName}|${_paymentParam.email}|udf1|udf2|udf3|udf4|udf5||||||${_paymentParam.salt}");
String localHash = sha512.convert(bytes).toString();
_paymentParam.hash = localHash;
try {
PayuPaymentResult _paymentResult = await FlutterPayuUnofficial.initiatePayment(
paymentParams: _paymentParam,
showCompletionScreen: true,
);
// 检查成功并打印结果
if (_paymentResult != null) {
if (_paymentResult.status == PayuPaymentStatus.success) {
print("Success: ${_paymentResult.response}");
} else if (_paymentResult.status == PayuPaymentStatus.failed) {
print("Failed: ${_paymentResult.response}");
} else if (_paymentResult.status == PayuPaymentStatus.cancelled) {
print("Cancelled by User: ${_paymentResult.response}");
} else {
print("Response: ${_paymentResult.response}");
print("Status: ${_paymentResult.status}");
}
} else {
print("Something's rotten here");
}
} catch (e) {
print(e);
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('PayU Money Example'),
),
body: SingleChildScrollView(
child: Column(
children: [
CommonTextField(
hint: "Merchant ID",
controller: _merchantIDTextFieldController,
),
CommonTextField(
hint: "Merchant Key",
controller: _merchantKeyTextFieldController,
),
CommonTextField(
hint: "Salt",
controller: _saltTextFieldController,
),
CommonTextField(
hint: "Amount",
controller: _amountTextFieldController,
),
CommonTextField(
hint: "Transaction ID",
controller: _transactionIDTextFieldController,
),
CommonTextField(
hint: "Name",
controller: _nameTextFieldController,
),
CommonTextField(
hint: "Product Info",
controller: _productInfoTextFieldController,
),
CommonTextField(
hint: "Email",
controller: _emailTextFieldController,
),
Padding(
padding: const EdgeInsets.all(8.0),
child: RaisedButton(
onPressed: pay,
child: Text("Pay"),
),
)
],
),
),
),
);
}
}
更多关于Flutter支付插件flutter_payu_unofficial的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter支付插件flutter_payu_unofficial的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用flutter_payu_unofficial
插件进行支付的代码示例。这个插件允许你集成PayU支付网关到你的Flutter应用中。请注意,这只是一个基本的示例,实际使用时你可能需要根据具体需求进行调整。
首先,确保你已经在pubspec.yaml
文件中添加了flutter_payu_unofficial
依赖:
dependencies:
flutter:
sdk: flutter
flutter_payu_unofficial: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来获取依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤配置和使用flutter_payu_unofficial
插件:
- 初始化插件并配置支付参数
在你的Dart文件中(例如payment_screen.dart
),首先导入插件:
import 'package:flutter/material.dart';
import 'package:flutter_payu_unofficial/flutter_payu_unofficial.dart';
然后,定义一个函数来初始化支付插件并启动支付流程:
void _startPayment() async {
// 配置PayU支付参数
final Map<String, dynamic> payUConfig = {
'key': '你的PayU密钥', // 替换为你的PayU密钥
'salt': '你的PayU盐值', // 替换为你的PayU盐值
'merchantId': '你的商户ID', // 替换为你的PayU商户ID
'baseUrl': 'https://test.payu.in/_payment', // 测试环境URL,生产环境需替换
'hash': '生成的哈希值', // 根据你的参数生成的哈希值,用于验证请求
'txnid': '唯一的交易ID', // 替换为实际的交易ID
'amount': '支付金额', // 替换为实际的支付金额
'productinfo': '产品信息', // 替换为实际的产品信息
'firstname': '用户姓名', // 替换为实际的用户姓名
'email': '用户邮箱', // 替换为实际的用户邮箱
'phone': '用户电话', // 替换为实际的用户电话
'udf1': '', // 用户自定义数据1
'udf2': '', // 用户自定义数据2
'udf3': '', // 用户自定义数据3
'udf4': '', // 用户自定义数据4
'udf5': '', // 用户自定义数据5
'surl': '支付成功后的回调URL', // 支付成功后的回调URL
'furl': '支付失败后的回调URL', // 支付失败后的回调URL
};
// 启动支付流程
try {
final result = await FlutterPayuUnofficial.startPayment(payUConfig);
print('支付结果: $result');
// 根据支付结果进行相应的处理
} catch (e) {
print('支付失败: $e');
}
}
注意:hash
字段通常需要根据key
、salt
、txnid
、amount
等参数通过特定的算法生成。你需要查阅PayU的文档来了解如何生成这个哈希值。
- 在UI中触发支付
现在,你可以在你的UI中添加一个按钮来触发支付流程:
class PaymentScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('支付页面'),
),
body: Center(
child: ElevatedButton(
onPressed: _startPayment,
child: Text('开始支付'),
),
),
);
}
}
- 运行应用
确保你的设备或模拟器已经连接,然后运行你的Flutter应用:
flutter run
现在,当你点击“开始支付”按钮时,应该会启动PayU的支付流程。
请记住,这只是一个基本的示例。在实际应用中,你可能需要处理更多的边缘情况和错误处理,同时确保你的支付参数正确无误,并符合PayU的安全要求。