Flutter支付集成插件bootpay_api的使用
Flutter支付集成插件bootpay_api的使用
卡片快捷支付(生物识别)演示
卡片快捷支付(密码)截图
bootpay_api
bootpay_api
是由Bootpay管理的官方Flutter插件。它基于 bootpay_flutter
模块进行重构。有关Bootpay开发手册,请参阅 此处。
支持的支付网关 (PG)
- INIpay
- NICE Pay
- DANA
- KCP
- EasyPay (KICC)
- TPay (JTNet)
- LG U+
- Paylater
- NAVER PAY
- Kakao PAY
- PAYCO
开始使用
在项目中的 pubspec.yaml
文件中添加依赖项:
dependencies:
...
bootpay_api: last_version
...
然后,在项目目录中运行 flutter packages get
来安装该插件。之后,导入并使用该模块。
设置
Android
无需配置。
iOS
编辑 ios/Runner/Info.plist
文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
...
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>kr.co.bootpaySample</string> <!-- 使用您希望应用的bundle URL名称 -->
<key>CFBundleURLSchemes</key>
<array>
<string>bootpaySample</string> <!-- 使用您希望应用的bundle URL scheme -->
</array>
</dict>
</array>
...
<key>NSFaceIDUsageDescription</key>
<string>生體認證支付進行時需要權限</string>
</dict>
</plist>
完成!
开始使用
以下是完整的示例代码:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:bootpay_api/bootpay_api.dart';
import 'package:bootpay_api/model/payload.dart';
import 'package:bootpay_api/model/bio_payload.dart';
import 'package:bootpay_api/model/bio_price.dart';
import 'package:bootpay_api/model/extra.dart';
import 'package:bootpay_api/model/user.dart';
import 'package:bootpay_api/model/item.dart';
import 'package:http/http.dart' as http;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: "Test",
home: TestPage(),
);
}
}
class TestPage extends StatefulWidget {
[@override](/user/override)
TestPageState createState() => TestPageState();
}
class TestPageState extends State<TestPage> {
var userId = "123421345671223";
[@override](/user/override)
void initState() {
super.initState();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Container(
child: Column(
children: [
SizedBox(
width: double.infinity,
height: 100,
child: RaisedButton(
onPressed: () {
goBootpayRequest(context);
},
child: Text("부트페이 결제요청"),
),
),
SizedBox(height: 10),
SizedBox(
width: double.infinity,
height: 100,
child: RaisedButton(
onPressed: () {
getRestToken(context);
},
child: Text("生物認證請求"),
),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => Navigator.pop(context),
),
);
}
void goBootpayRequest(BuildContext context) async {
Item item1 = Item();
item1.itemName = "米奇老鼠"; // 商品名
item1.qty = 1; // 数量
item1.unique = "ITEM_CODE_MOUSE"; // 唯一标识符
item1.price = 500; // 价格
Item item2 = Item();
item2.itemName = "键盘"; // 商品名
item2.qty = 1; // 数量
item2.unique = "ITEM_CODE_KEYBOARD"; // 唯一标识符
item2.price = 500; // 价格
List<Item> itemList = [item1, item2];
Payload payload = Payload();
payload.applicationId = '5b8f6a4d396fa665fdc2b5e8';
payload.androidApplicationId = '5b8f6a4d396fa665fdc2b5e8';
payload.iosApplicationId = '5b8f6a4d396fa665fdc2b5e9';
payload.pg = 'nicepay';
payload.method = 'npay';
payload.name = '测试商品';
payload.price = 1000.0; // 定期支付时为0或注释
payload.orderId = DateTime.now().millisecondsSinceEpoch.toString();
payload.params = {
"callbackParam1": "value12",
"callbackParam2": "value34",
"callbackParam3": "value56",
"callbackParam4": "value78",
};
User user = User();
user.username = "用户姓名";
user.email = "user1234@gmail.com";
user.area = "首尔";
user.phone = "010-4033-4678";
user.addr = '首尔市道马区尚都路222';
Extra extra = Extra();
extra.appScheme = 'bootpayFlutterSample';
extra.quotas = [0, 2, 3];
extra.popup = 1;
extra.quick_popup = 1;
BootpayApi.request(
context,
payload,
extra: extra,
user: user,
items: itemList,
onDone: (json) {
print('--- onDone: $json');
},
onCancel: (json) {
print('--- onCancel: $json');
},
onError: (json) {
print(' --- onError: $json');
},
);
}
void goBootpayRequestBio(String token) async {
Item item1 = Item();
item1.itemName = "米奇老鼠"; // 商品名
item1.qty = 1; // 数量
item1.unique = "ITEM_CODE_MOUSE"; // 唯一标识符
item1.price = 500; // 价格
Item item2 = Item();
item2.itemName = "键盘"; // 商品名
item2.qty = 1; // 数量
item2.unique = "ITEM_CODE_KEYBOARD"; // 唯一标识符
item2.price = 500; // 价格
List<Item> itemList = [item1, item2];
BioPayload payload = BioPayload();
payload.applicationId = '5b8f6a4d396fa665fdc2b5e8';
payload.androidApplicationId = '5b8f6a4d396fa665fdc2b5e8';
payload.iosApplicationId = '5b8f6a4d396fa665fdc2b5e9';
payload.userToken = token;
payload.pg = 'nicepay';
payload.name = '测试商品';
payload.price = 1000.0; // 定期支付时为0或注释
payload.orderId = DateTime.now().millisecondsSinceEpoch.toString();
payload.params = {
"callbackParam1": "value12",
"callbackParam2": "value34",
"callbackParam3": "value56",
"callbackParam4": "value78",
};
BioPrice price1 = BioPrice();
price1.name = "商品价格";
price1.price = 89000;
BioPrice price2 = BioPrice();
price2.name = "优惠券";
price2.price = -2500;
BioPrice price3 = BioPrice();
price3.name = "运费";
price3.price = 2500;
payload.prices = [price1, price2, price3];
payload.names = ["褶皱层裙摆短裙", "黑色 (颜色)", "55 (尺码)"];
User user = User();
user.id = userId;
user.username = "用户姓名";
user.email = "user1234@gmail.com";
user.area = "首尔";
user.phone = "010-4033-4678";
user.addr = '首尔市道马区尚都路222';
Extra extra = Extra();
extra.appScheme = 'bootpayFlutterSample';
extra.quotas = [0, 2, 3];
extra.iosCloseButton = false;
BootpayApi.requestBio(
context,
payload,
extra: extra,
user: user,
items: itemList,
onDone: (json) {
print('--- onDone: $json');
},
onCancel: (json) {
print('--- onCancel: $json');
},
onError: (json) {
print(' --- onError: $json');
},
);
}
[@deprecated](/user/deprecated)
void getRestToken(BuildContext context) async {
String rest_applicationId = "5b8f6a4d396fa665fdc2b5ea";
String rest_pk = "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=";
Map<String, dynamic> params = {
"application_id": rest_applicationId,
"private_key": rest_pk
};
var url = Uri.parse('https://api.bootpay.co.kr/request/token');
final response = await http.post(url, body: params);
if (response.statusCode == 200) {
var res = json.decode(response.body);
String token = res['data']['token'];
getUserToken(token);
} else {
print(response.body);
}
}
void getUserToken(String restToken) async {
Map<String, dynamic> body = {
"user_id": userId,
"email": "test1234@gmail.com",
"name": "测试用户",
"gender": "0",
"birth": "861014",
"phone": "01012345678"
};
var url = Uri.parse('https://api.bootpay.co.kr/request/user/token');
final response = await http.post(url,
headers: {
"Accept": "application/json",
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": restToken
},
body: body);
if (response.statusCode == 200) {
var res = json.decode(response.body);
String token = res['data']['user_token'];
print(token);
goBootpayRequestBio(token);
} else {
print(response.body);
}
}
}
更多关于Flutter支付集成插件bootpay_api的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter支付集成插件bootpay_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter应用中集成Bootpay支付插件bootpay_api
的示例代码。这段代码将展示如何初始化Bootpay客户端、创建支付请求并处理支付结果。
首先,确保你已经在pubspec.yaml
文件中添加了bootpay_api
依赖:
dependencies:
flutter:
sdk: flutter
bootpay_api: ^最新版本号 # 请替换为实际的最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤集成Bootpay支付:
1. 初始化Bootpay客户端
首先,你需要在你的应用初始化时配置Bootpay客户端。通常,这会在main.dart
文件中进行。
import 'package:flutter/material.dart';
import 'package:bootpay_api/bootpay_api.dart';
void main() {
// 初始化Bootpay客户端
Bootpay.init(
applicationId: '你的Bootpay Application ID',
privateKey: '你的Bootpay Private Key',
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Bootpay支付集成示例'),
),
body: PaymentScreen(),
),
);
}
}
2. 创建支付请求
在你的支付屏幕上,创建一个按钮来触发支付请求,并处理支付结果。
import 'package:flutter/material.dart';
import 'package:bootpay_api/bootpay_api.dart';
class PaymentScreen extends StatefulWidget {
@override
_PaymentScreenState createState() => _PaymentScreenState();
}
class _PaymentScreenState extends State<PaymentScreen> {
void _makePayment() async {
try {
// 创建支付请求
BootpayResponse response = await Bootpay.requestPayment(
name: '商品名称',
amount: 1000, // 金额,单位为韩元(对于其他货币,请参考Bootpay文档)
currency: 'KRW', // 货币代码
memo: '支付备注',
// 可选的支付选项,例如:商品详情、用户信息等
// item_detail, user_data, ...
);
// 处理支付响应
if (response.success) {
// 支付成功处理
print('支付成功: ${response.data}');
} else {
// 支付失败处理
print('支付失败: ${response.message}');
}
} catch (e) {
// 处理异常
print('支付请求异常: $e');
}
}
@override
Widget build(BuildContext context) {
return Center(
child: ElevatedButton(
onPressed: _makePayment,
child: Text('支付'),
),
);
}
}
3. 处理支付回调(可选)
如果你的应用需要处理支付完成后的回调(例如,从Bootpay服务器返回的结果),你可能需要在你的应用中设置一个回调URL,并在该URL对应的路由中处理支付结果。这部分通常涉及到后端服务器的配置和Flutter应用与后端服务器的通信,因此不在此示例中详细展开。
注意事项
- 安全性:请确保你的Bootpay Application ID和PrivateKey安全存储,不要硬编码在客户端代码中。
- 错误处理:在实际应用中,你应该添加更多的错误处理和用户反馈机制。
- UI定制:根据实际需要定制支付界面和流程。
- 测试:在发布前,务必进行充分的测试,包括各种边界条件和异常情况。
通过上述步骤,你应该能够在Flutter应用中成功集成Bootpay支付插件。如果有更多特定需求或遇到问题,请参考Bootpay的官方文档或联系其技术支持。