Flutter支付集成插件flutterbudpay的使用
Flutter支付集成插件flutterbudpay的使用
Flutter插件用于通过BudPay支付系统进行支付。完全支持所有平台。
特性
当前特性:
- 卡支付
- 银行支付
安装
要使用此插件,在pubspec.yaml
文件中添加flutterbudpay
作为依赖项。
然后在您的widget的initState
方法中初始化插件。
import 'package:flutterbudpay/flutterbudpay.dart';
class _ExamplePayementPageState extends State<ExamplePayementPage> {
var publicKey = 'Add your BudPay Public Key Here';
var secretKey = 'Add your Budpay Secret Key Here';
final plugin = Budpay();
[@override](/user/override)
void initState() {
plugin.initialize(publicKey: publicKey, secretKey: secretKey);
}
}
进行支付
您可以使用两种方式进行支付:
- 结账:这是简单的方式;插件处理了支付过程中涉及的所有过程(除了交易初始化和验证,这些应从您的后端完成)。
- 刷卡:这是更复杂的方式;您需要处理所有回调和UI状态。
1. 结账(推荐)
初始化一个带有金额、邮箱和访问码或引用的收费对象。
Charge charge = Charge()
..amount = 10000
..reference = _getReference()
// 或者 ..accessCode = _getAccessCodeFrmInitialization()
..email = 'customer@email.com';
CheckoutResponse response = await plugin.checkout(
context,
method: CheckoutMethod.card, // 默认为CheckoutMethod.selectable
charge: charge,
);
plugin.checkout()
返回支付的状态和详细信息在一个CheckoutResponse
实例中。
2. 刷卡
您可以选择在本地或通过后端初始化支付。
发送支付详情到plugin.chargeCard
。
Charge charge = Charge();
charge.card = _getCardFromUI();
charge
..amount = 2000
..email = 'user@email.com'
..reference = _getReference()
..putCustomField('Charged From', 'Flutter PLUGIN');
_chargeCard();
验证卡详情
您需要但不是必须构建UI让用户输入他们的支付详情。为了更方便的验证,将TextFormField
包裹在Form
小部件内。如果这对你来说是新的,请查看这篇关于如何在Flutter上验证表单的文章。
注意: 您不必将卡片对象传递给Charge
。插件会调用UI让用户输入他们的卡信息。
您可以使用以下方法来验证字段:
card.validNumber
该方法帮助检查卡号是否有效。
card.validCVC
该方法检查卡安全码是否有效。
card.validExpiryDate
该方法检查过期日期(年月组合)是否有效。
card.isValid
该方法检查卡是否有效。在刷卡前始终执行此检查。
card.getType
该方法返回卡片类型(发行机构)的字符串表示形式。
运行示例项目
对于如何开始使用Flutter,请查看在线文档。
在这个插件中提供了一个示例项目。克隆此仓库并导航到example
文件夹。使用支持的IDE打开它,或者在终端中从该文件夹执行flutter run
。
贡献、问题和错误报告
该项目公开接受贡献。请自由贡献。
遇到问题或想报告错误?请在此处报告。记得尽可能详细描述。
示例代码
// 忽略对文件的库私有类型的公共API
import 'dart:developer';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutterbudpay/flutterbudpay.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'themeclass.dart';
// 定义您的后端URL和Budpay公钥。
String backendUrl = '{YOUR_BACKEND_URL}';
String budpayPublicKey = '{YOUR_budpay_PUBLIC_KEY}';
const String appName = 'Budpay Example';
void main() {
runApp(const MyApp());
}
// MyApp是主要的应用程序小部件。
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
// 从任何上下文中获取MyApp小部件的状态。
static _MyAppState of(BuildContext context) =>
context.findAncestorStateOfType<_MyAppState>()!;
}
class _MyAppState extends State<MyApp> {
// 默认主题模式为系统。
ThemeMode _themeMode = ThemeMode.system;
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: appName,
debugShowCheckedModeBanner: false,
themeMode: _themeMode,
theme: ThemeClass.lightTheme,
darkTheme: ThemeClass.darkTheme,
home: const Newpage(),
);
}
// 更改主题模式的函数。
void changeTheme(ThemeMode themeMode) {
setState(() {
_themeMode = themeMode;
});
}
}
// 检查应用程序是否处于暗模式。
bool get isDarkMode {
var brightness = SchedulerBinding.instance.window.platformBrightness;
return brightness == Brightness.dark;
}
// Newpage是应用程序的主要界面。
class Newpage extends StatefulWidget {
const Newpage({Key? key}) : super(key: key);
[@override](/user/override)
_NewpageState createState() => _NewpageState();
}
class _NewpageState extends State<Newpage> {
var currency = ["USD", "NGN"]; // 支持的货币。
String dropdownvalue = 'NGN'; // 默认货币。
TextEditingController phoneController = TextEditingController(); // 控制器用于金额文本框。
bool isloading = false; // 结账按钮的加载状态。
final plugin = Budpay(); // Budpay插件的实例。
final _formKey = GlobalKey<FormState>(); // 表单键用于验证表单。
bool check = false; // 暗模式复选框的状态。
[@override](/user/override)
void initState() {
check = isDarkMode;
plugin.initialize(
publicKey: 'pk_test_oppvguyfnlna4f1eidl1bqrkxrxfszgdvgwq1q',
secretKey: 'sk_test_genllkfsimb3wrqamv02hcqbr3fuo1alekr7cpy'); // 替换为您自己的密钥
super.initState();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: const Color(0xff6C30F4),
title: const Text("BUDPAY SDK SAMPLE"),
),
body: Center(
child: Form(
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Checkbox(
value: check,
onChanged: (bool? value) {
setState(() {
check = !check;
});
if (!check) {
MyApp.of(context).changeTheme(ThemeMode.light);
} else {
MyApp.of(context).changeTheme(ThemeMode.dark);
}
}),
const SizedBox(
height: 20,
),
DropdownButton(
// 初始值
value: dropdownvalue,
// 下拉箭头图标
icon: const Icon(Icons.keyboard_arrow_down),
// 项目数组
items: currency.map((String items) {
return DropdownMenuItem(
value: items,
child: Text(items),
);
}).toList(),
// 选择所需选项后,将按钮值更改为所选值
onChanged: (String? newValue) {
setState(() {
dropdownvalue = newValue!;
});
},
),
const SizedBox(
height: 30,
),
Container(
decoration: const BoxDecoration(
color: Color(0xffF4F4F6),
borderRadius: BorderRadius.all(Radius.circular(15.0))),
padding: const EdgeInsets.symmetric(horizontal: 15),
child: TextFormField(
decoration: InputDecoration(
fillColor: const Color(0xffF4F4F6),
hintText: "1000",
hintStyle: TextStyle(
fontSize: 16.56,
fontWeight: FontWeight.w500,
color: isDarkMode ? null : Colors.black),
enabledBorder: const OutlineInputBorder(
borderRadius:
BorderRadius.all(Radius.circular(15.0)),
borderSide: BorderSide(color: Color(0xffF4F4F6)),
),
focusedBorder: const OutlineInputBorder(
borderRadius:
BorderRadius.all(Radius.circular(15.0)),
borderSide: BorderSide(color: Color(0xffF4F4F6)),
),
disabledBorder: const OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(15.0)),
borderSide: BorderSide(color: Color(0xffF4F4F6)),
),
),
style: TextStyle(
fontSize: 16.56,
fontWeight: FontWeight.w500,
color: isDarkMode ? null : Colors.black),
controller: phoneController,
keyboardType: TextInputType.phone,
onChanged: (value) {
if (value.isEmpty) {
setState(() {});
}
},
validator: (value) {
if (value!.isEmpty) {
return "This field can't be empty";
}
return null;
},
),
),
const SizedBox(
height: 50,
),
GestureDetector(
child: Container(
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(15)),
color: Color(0xff6C30F4)),
height: 65,
width: MediaQuery.of(context).size.width - 70,
padding: const EdgeInsets.symmetric(vertical: 15),
margin: const EdgeInsets.symmetric(
horizontal: 10, vertical: 10),
alignment: Alignment.center,
child: isloading
? loadingWidget
: const Text(
"Checkout",
style: TextStyle(color: Colors.white, fontSize: 20),
),
),
onTap: () {
if (_formKey.currentState!.validate()) {
_handleCheckout(context);
}
},
)
],
),
),
),
);
}
_handleCheckout(BuildContext context) async {
setState(() => isloading = true);
_formKey.currentState?.save();
Charge charge = Charge()
..amount = int.parse(phoneController.text) // 基本货币单位
..email = 'sdkapp@email.com'
..currency = dropdownvalue;
charge.reference = _getReference();
try {
var response = await plugin.checkout(
context,
charge: charge,
);
log('Response = $response');
setState(() => isloading = false);
_updateStatus(response.reference, '$response');
} catch (e) {
setState(() => isloading = false);
_showMessage("Check console for error");
rethrow;
}
}
String _getReference() {
String platform;
if (!kIsWeb) {
if (Platform.isIOS) {
platform = 'iOS';
} else {
platform = 'Android';
}
} else {
platform = "WEB";
}
return 'ChargedFrom${platform}_${DateTime.now().millisecondsSinceEpoch}';
}
_updateStatus(String? reference, String message) {
_showMessage('Reference: $reference \n Response: $message',
const Duration(seconds: 7));
}
_showMessage(String message,
[Duration duration = const Duration(seconds: 4)]) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(message),
duration: duration,
action: SnackBarAction(
label: 'CLOSE',
onPressed: () =>
ScaffoldMessenger.of(context).removeCurrentSnackBar()),
));
}
}
const loadingWidget = SpinKitThreeBounce(
color: Colors.white,
size: 30.0,
);
更多关于Flutter支付集成插件flutterbudpay的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html