Flutter支付集成插件dart_payway的使用
在Flutter应用中集成支付功能时,dart_payway是一个非常实用的插件。本文将详细介绍如何使用 dart_payway插件来创建和处理支付交易。
引入 PaywayTransactionService
首先,我们需要初始化 PaywayTransactionService
对象,并传递必要的商户信息。
var service = PaywayTransactionService(
merchant: PaywayMerchant(
merchantID: env['ABA_PAYWAY_MERCHANT_ID'] ?? '',
merchantApiName: env['ABA_PAYWAY_MERCHANT_NAME'] ?? '',
merchantApiKey: env['ABA_PAYWAY_API_KEY'] ?? '',
baseApiUrl: env['ABA_PAYWAY_API_URL'] ?? '',
refererDomain: "http://mylekha.app",
),
);
创建交易示例
接下来,我们通过调用 service.createTransaction
方法来创建一个支付交易。
/// 创建交易
final tranID = service.uniqueTranID();
var _transaction = PaywayCreateTransaction(
amount: 6.00, // 交易金额
items: [
PaywayTransactionItem(name: "商品 1", price: 1, quantity: 1), // 商品详情
PaywayTransactionItem(name: "商品 2", price: 2, quantity: 1),
PaywayTransactionItem(name: "商品 3", price: 3, quantity: 1),
],
reqTime: service.uniqueReqTime(), // 请求时间戳
tranId: tranID, // 交易ID
email: 'support@mylekha.app', // 用户邮箱
firstname: 'Miss', // 用户名
lastname: 'My Lekha', // 用户姓氏
phone: '010464144', // 用户电话
option: PaywayPaymentOption.abapay_deeplink, // 支付选项
shipping: 0.0, // 运费
returnUrl: "https://mylekha.app", // 返回URL
);
var createResponse = await service.createTransaction(transaction: _transaction);
print(_transaction.amount); // 打印交易金额
print(createResponse.status); // 打印交易状态
生成后端检查URL
我们还可以生成一个用于后端验证的支付检查URL。
final tranID = service.uniqueTranID();
var _transaction = PaywayCreateTransaction(
amount: 6.00,
items: [
PaywayTransactionItem(name: "商品 1", price: 1, quantity: 1),
PaywayTransactionItem(name: "商品 2", price: 2, quantity: 1),
PaywayTransactionItem(name: "商品 3", price: 3, quantity: 1),
],
reqTime: service.uniqueReqTime(),
tranId: tranID,
email: 'support@mylekha.app',
firstname: 'Miss',
lastname: 'My Lekha',
phone: '010464144',
option: PaywayPaymentOption.abapay_deeplink,
shipping: 0.0,
returnUrl: "https://mylekha.app",
);
var webURI = await service.generateTransactionCheckoutURI(transaction: _transaction);
完整示例代码
以下是一个完整的示例代码,展示了如何在Flutter中使用 dart_payway
插件。
import 'dart:convert';
import 'dart:io';
import 'package:dart_payway/dart_payway.dart' hide debugPrint, kIsWeb;
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
class MyHttpOverrides extends HttpOverrides {
[@override](/user/override)
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
}
void main() async {
HttpOverrides.global = MyHttpOverrides();
await dotenv.load(fileName: ".env");
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late PaywayTransactionService service;
String? tranID = null;
[@override](/user/override)
void initState() {
service = PaywayTransactionService(
merchant: PaywayMerchant(
merchantID: dotenv.env['ABA_PAYWAY_MERCHANT_ID'] ?? '',
merchantApiName: dotenv.env['ABA_PAYWAY_MERCHANT_NAME'] ?? '',
merchantApiKey: dotenv.env['ABA_PAYWAY_API_KEY'] ?? '',
baseApiUrl: dotenv.env['ABA_PAYWAY_API_URL'] ?? '',
refererDomain: "http://localhost",
),
);
super.initState();
kIsWeb;
}
Future<void> createTransaction() async {
setState(() {
tranID = service.uniqueTranID();
});
var transaction = PaywayCreateTransaction(
amount: 10.00,
items: [
PaywayTransactionItem(name: "商品 1", price: 2, quantity: 1),
PaywayTransactionItem(name: "商品 2", price: 3, quantity: 1),
PaywayTransactionItem(name: "商品 3", price: 5, quantity: 1),
],
reqTime: service.uniqueReqTime(),
tranId: tranID!,
email: 'support@mylekha.app',
firstname: 'Miss',
lastname: 'My Lekha',
phone: '010464144',
option: PaywayPaymentOption.abapay_khqr_deeplink,
shipping: 0.0,
returnUrl:
"https://xdgacmihblkqdexzbmkw.supabase.co/functions/v1/payway_checkout_success",
continueSuccessUrl: "https://mylekha.app",
returnParams: EncoderService.base64_encode(
{"booking_id": "0032153b-8df2-40a3-b533-37622e7ecd37"}),
customFields: EncoderService.base64_encode(
{"booking_id": "0032153b-8df2-40a3-b533-37622e7ecd37"}),
);
try {
var createResponse = await service.createTransaction(
transaction: transaction, enabledLogger: true);
debugPrint(createResponse.toString());
} catch (e) {}
}
Future<void> checkTransaction() async {
final transaction = PaywayCheckTransaction(
reqTime: service.uniqueReqTime(),
tranId: tranID!,
);
try {
var createResponse = await service.checkTransaction(
transaction: transaction, enabledLogger: true);
debugPrint(createResponse.toString());
} catch (e) {}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextButton(
onPressed: createTransaction,
child: Text("创建交易"),
),
TextButton(
onPressed: checkTransaction,
child: Text("检查交易"),
),
],
),
),
);
}
}
更多关于Flutter支付集成插件dart_payway的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter支付集成插件dart_payway的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
dart_payway
是一个用于在 Flutter 应用中集成支付功能的插件。它支持多种支付网关,如 Stripe、PayPal、Razorpay 等。以下是如何在 Flutter 项目中使用 dart_payway
插件的基本步骤。
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 dart_payway
依赖:
dependencies:
flutter:
sdk: flutter
dart_payway: ^latest_version
然后运行 flutter pub get
来安装依赖。
2. 配置支付网关
在使用 dart_payway
之前,你需要配置你选择的支付网关。例如,如果你使用 Stripe,你需要在 Stripe 的开发者控制台中获取你的 API 密钥。
3. 初始化支付网关
在你的 Flutter 应用中初始化支付网关。以下是一个使用 Stripe 的示例:
import 'package:dart_payway/dart_payway.dart';
void main() {
Payway.initialize(
stripePublishableKey: 'your_stripe_publishable_key',
// 其他支付网关的配置
);
runApp(MyApp());
}
4. 创建支付请求
接下来,你可以创建一个支付请求。以下是一个使用 Stripe 进行支付的示例:
import 'package:dart_payway/dart_payway.dart';
Future<void> makePayment() async {
try {
final paymentIntent = await Payway.createPaymentIntent(
amount: 1000, // 金额(以最小货币单位表示,例如 1000 表示 10.00 美元)
currency: 'usd', // 货币代码
description: 'Test Payment', // 支付描述
);
final paymentResult = await Payway.confirmPayment(
paymentIntentId: paymentIntent.id,
paymentMethodId: 'your_payment_method_id', // 支付方法 ID
);
if (paymentResult.status == PaymentStatus.succeeded) {
print('Payment succeeded!');
} else {
print('Payment failed: ${paymentResult.errorMessage}');
}
} catch (e) {
print('Error: $e');
}
}
5. 处理支付结果
在支付完成后,你可以根据支付结果进行相应的处理。例如,显示成功或失败的消息。
6. 其他支付网关
dart_payway
还支持其他支付网关,如 PayPal 和 Razorpay。你可以根据文档配置和使用这些支付网关。
7. 处理 Webhook
对于某些支付网关,你可能需要处理 Webhook 来确认支付状态。你可以在服务器端设置 Webhook 端点,并在 Flutter 应用中处理 Webhook 事件。
8. 测试支付
在开发过程中,你可以使用测试模式来测试支付功能。例如,Stripe 提供了测试卡号,你可以使用这些卡号来模拟支付。
9. 发布应用
在发布应用之前,确保你已经配置了生产环境的支付网关密钥,并进行了充分的测试。
10. 参考文档
dart_payway
的详细文档可以在 pub.dev 上找到。你可以参考文档来了解更多高级功能和配置选项。
示例代码
以下是一个完整的示例代码,展示了如何使用 dart_payway
进行支付:
import 'package:flutter/material.dart';
import 'package:dart_payway/dart_payway.dart';
void main() {
Payway.initialize(
stripePublishableKey: 'your_stripe_publishable_key',
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Payment Example'),
),
body: Center(
child: ElevatedButton(
onPressed: makePayment,
child: Text('Make Payment'),
),
),
),
);
}
Future<void> makePayment() async {
try {
final paymentIntent = await Payway.createPaymentIntent(
amount: 1000,
currency: 'usd',
description: 'Test Payment',
);
final paymentResult = await Payway.confirmPayment(
paymentIntentId: paymentIntent.id,
paymentMethodId: 'your_payment_method_id',
);
if (paymentResult.status == PaymentStatus.succeeded) {
print('Payment succeeded!');
} else {
print('Payment failed: ${paymentResult.errorMessage}');
}
} catch (e) {
print('Error: $e');
}
}
}