Flutter支付功能插件payu_payment的使用
Flutter支付功能插件payu_payment的使用
简单集成PayU支付到Flutter应用。
使用方法
目前,你可以使用PayUWebView
小部件来构建你的PayU WebView。首先你需要:
- 创建并配置
PayUFlutter
对象。 - 使用
prepareOrder
方法创建并放置PayUOrder
。 - 将从
prepareOrder
获取的响应传递给PayUWebView
小部件。
示例
创建并配置PayUFlutter
对象
PayUFlutter payuFlutter = PayUFlutter(
clientId: 1,
clientSecret: 'SUPER_SECRET',
isProduction: false,
);
创建并放置PayUOrder
使用prepareOrder
方法
PayUOrder order = PayUOrder(
posId: 398870,
description: 'ZAKUPY',
currencyCode: 'PLN',
buyer: PayUBuyer(
email: 'thatlukeurban@gmail.com',
firstName: 'null',
language: 'pl',
lastName: 'null',
phone: '555555555',
),
products: [
PayUProduct(
name: 'Air',
unitPrice: 100,
quantity: 10,
)
]
);
PayUOrderResponse payUOrderResponse = await payuFlutter.prepareOrder(order);
将响应传递给PayUWebView
小部件
PayUWebView(
builder: (WebViewController controller, Widget child) {
return child;
},
orderResponse: payUOrderResponse,
redirectUrl: redirectUrl,
onPaymentEnd: (bool paymentSuccessful) {
// 如果不覆盖`onPaymentEnd`方法,则默认会执行`Navigator.pop(context);`
Navigator.of(context).pop(paymentSuccessful);
}
)
builder
- 必需 - 构建器公开以便访问WebViewController
。这允许开发者包装child
以提供一些功能,如重新加载、刷新、后退等。参见WebViewController文档。orderResponse
- 必需 -<strong>PayUOrderResponse</strong>
- 来自payuFlutter.prepareOrder(order);
的响应对象。onPaymentEnd
- 可选 -<strong>Function(bool)</strong>
- 默认情况下它会执行Navigator.of(context).pop();
,但你可以覆盖此行为。customLoadingWidget
- 可选 -<strong>Widget</strong>
- 当webView正在加载时显示。默认为CircularProgressIndicator
。redirectUrl
- 必需 -<strong>String</strong>
- 重定向URL是payu_payment
设置的重要部分。它需要与PayU商店中的“网站地址”相同(如下图所示)。该URL是WebView中的PayU流程结束的地方。插件使用该URL来检测用户是否成功付款。
记住在代码中放置有效的PayU账户设置。
完整示例
import 'package:flutter/material.dart';
import 'package:payu_payment/payu_payment.dart';
void main() {
runApp(MaterialApp(home: MyApp()));
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
// 确保这是PayU设置的商店“网站地址”
String redirectUrl = 'https://lukeurban.tech';
PayUOrder order = PayUOrder(
posId: 398870,
description: 'ZAKUPY',
currencyCode: 'PLN',
buyer: PayUBuyer(
email: 'thatlukeurban@gmail.com',
firstName: 'null',
language: 'pl',
lastName: 'null',
phone: '555555555',
),
products: [
PayUProduct(
name: 'Air',
unitPrice: 100,
quantity: 10,
)
]
);
PayUFlutter payuFlutter = PayUFlutter(
clientId: 1,
clientSecret: 'SUPER_SECRET',
isProduction: false,
);
[@override](/user/override)
void initState() {
super.initState();
}
openAsBottomModal(PayUOrderResponse payUOrderResponse) {
return showModalBottomSheet(
useRootNavigator: true,
elevation: 20,
enableDrag: false,
isDismissible: false,
isScrollControlled: true,
context: context,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(25.0),
topRight: Radius.circular(25.0),
),
),
backgroundColor: Colors.white,
builder: (BuildContext context) {
return Center(
child: Container(
child: PayUWebView(
builder: (WebViewController controller, Widget child) {
return child;
},
orderResponse: payUOrderResponse,
redirectUrl: redirectUrl,
),
),
);
},
);
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('插件示例应用'),
),
body: Builder(
builder: (BuildContext context) {
return Column(
children: [
TextButton(
onPressed: () async {
PayUOrderResponse payUOrderResponse = await payuFlutter.prepareOrder(order);
openAsBottomModal(payUOrderResponse).then((value) {
String result = value == true ? '成功' : '失败';
print('支付结果: $result');
});
},
child: Text("授权在底部模态框"),
),
TextButton(
onPressed: () async {
PayUOrderResponse payUOrderResponse = await payuFlutter.prepareOrder(order);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Scaffold(
appBar: AppBar(),
body: PayUWebView(
builder: (WebViewController controller, Widget child) {
return child;
},
orderResponse: payUOrderResponse,
redirectUrl: redirectUrl,
onPaymentEnd: (bool paymentSuccessful) {
print('我的自定义支付回调');
Navigator.of(context).pop(paymentSuccessful);
},
),
)),
).then((value) {
String result = value == true ? '成功' : '失败';
print('支付结果: $result');
});
},
child: Text("授权其他视图"),
),
],
);
},
),
);
}
}
更多关于Flutter支付功能插件payu_payment的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter支付功能插件payu_payment的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中集成和使用payu_payment
插件进行支付功能的示例代码。payu_payment
插件通常用于集成PayU支付网关。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加payu_payment
依赖:
dependencies:
flutter:
sdk: flutter
payu_payment: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置Android和iOS
Android
在你的android/app/src/main/AndroidManifest.xml
文件中,确保你有互联网权限:
<uses-permission android:name="android.permission.INTERNET"/>
iOS
对于iOS,你可能需要在Info.plist
中添加一些权限配置,具体取决于PayU SDK的要求。不过通常payu_payment
插件已经处理好了大部分配置。
3. 使用payu_payment
插件
在你的Flutter代码中,你可以按照以下步骤使用payu_payment
插件:
import 'package:flutter/material.dart';
import 'package:payu_payment/payu_payment.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('PayU Payment Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () async {
// 配置支付参数
Map<String, dynamic> paymentParams = {
'key': '你的PayU商户密钥',
'salt': '你的PayU盐值',
'txnid': '唯一交易ID',
'amount': '支付金额',
'productinfo': '商品信息',
'firstname': '用户名字',
'email': '用户邮箱',
'phone': '用户手机号',
'udf1': '', // 用户自定义参数1
'udf2': '', // 用户自定义参数2
'udf3': '', // 用户自定义参数3
'udf4': '', // 用户自定义参数4
'udf5': '', // 用户自定义参数5
'surl': '支付成功回调URL',
'furl': '支付失败回调URL',
'hash': '通过PayU SDK生成的hash值', // 注意:这个hash值需要通过PayU提供的算法生成
'var1': '', // 可选参数
'var2': '', // 可选参数
'var3': '', // 可选参数
'var4': '', // 可选参数
'var5': '', // 可选参数
'pg': '支付网关(如PAYU_PAISAPAY, CCAVENUE, etc.)',
};
// 初始化PayU支付
PayUPayment payUPayment = PayUPayment();
// 发起支付请求
try {
bool result = await payUPayment.startPayment(paymentParams);
if (result) {
// 支付成功处理逻辑
print('支付成功');
} else {
// 支付失败处理逻辑
print('支付失败');
}
} catch (e) {
// 错误处理
print('支付发生错误: $e');
}
},
child: Text('发起支付'),
),
),
),
);
}
}
4. 生成hash值
注意在上面的代码中,hash
参数是通过PayU提供的算法生成的。你需要根据PayU的文档来实现这个hash值的生成。通常,你需要使用商户密钥、盐值和其他支付参数来生成这个hash值。
以下是一个简化的hash生成示例(注意:这只是一个示例,实际的hash生成算法需要参考PayU的官方文档):
String generateHash(String key, String salt, Map<String, String> params) {
// 将参数按键名排序并拼接成字符串
List<String> keys = params.keys.toList()..sort();
StringBuffer stringBuffer = StringBuffer();
for (String key in keys) {
stringBuffer.write(key);
stringBuffer.write(params[key] ?? '');
}
// 添加key和salt
stringBuffer.write(key);
stringBuffer.write(salt);
// 使用SHA-256或指定的算法生成hash值
List<int> bytes = utf8.encode(stringBuffer.toString());
Digest digest = sha256.convert(bytes);
return digest.toString();
}
注意:上面的generateHash
函数只是一个示例,实际的hash生成逻辑需要按照PayU的文档来实现,可能涉及到不同的算法和参数处理。
希望这个示例代码能帮助你在Flutter项目中集成和使用payu_payment
插件。如果有任何进一步的问题,请查阅PayU的官方文档或联系他们的技术支持。