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

1 回复

更多关于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');
    }
  }
}
回到顶部