Flutter支付结账插件flutter_checkout_payment的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter支付结账插件flutter_checkout_payment的使用

概述

flutter_checkout_payment 是一个用于在线支付的Flutter插件,实现了Checkout.com的原生SDK。以下是该插件的基本用法和示例代码。

安装步骤

pubspec.yaml 文件中添加依赖

dependencies:
  flutter_checkout_payment: ^1.4.0

Android 配置

无需额外配置。

iOS 配置

确保在 Podfile 中设置平台版本为 iOS 10 或更高。

platform :ios, '10.0'

使用方法

导入包

import 'package:flutter_checkout_payment/flutter_checkout_payment.dart';

初始化API

使用你的公共密钥初始化API。密钥可以在Checkout仪表板中找到。

await FlutterCheckoutPayment.init(key: "YOUR_PUBLIC_KEY");

生产环境需要设置环境为Live:

await FlutterCheckoutPayment.init(key: "YOUR_PUBLIC_KEY", environment: Environment.LIVE);

生成Token

生成Token用于支付过程。

CardTokenisationResponse response = await FlutterCheckoutPayment.generateToken(
  number: "4242424242424242",
  name: "name",
  expiryMonth: "05",
  expiryYear: "21",
  cvv: "100"
);
print(response.token);

示例Demo

以下是一个完整的示例应用,展示如何使用 flutter_checkout_payment 插件。

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_checkout_payment/flutter_checkout_payment.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Test",
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  String _isInit = "false";
  String cardNumber = '';
  String expiryDate = '';
  String cardNameHolder = '';
  String cvv = '';

  @override
  void initState() {
    super.initState();
    initPaymentSDK();
  }

  Future<void> initPaymentSDK() async {
    try {
      bool? isSuccess = await FlutterCheckoutPayment.init(key: "YOUR_PUBLIC_KEY");
      if (mounted) setState(() => _isInit = "true");
    } on PlatformException {
      if (mounted) setState(() => _isInit = "error");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Checkout Payment Plugin'),
        ),
        body: SafeArea(
          child: Column(
            children: <Widget>[
              SizedBox(height: 10),
              Text("Checkout Init: $_isInit", style: TextStyle(fontSize: 18)),
              // Add your Credit Card UI here
              Expanded(
                child: SingleChildScrollView(
                  child: Container(
                    padding: EdgeInsets.all(16),
                    child: Column(
                      children: [
                        TextField(
                          decoration: InputDecoration(labelText: 'Card Number'),
                          onChanged: (value) => cardNumber = value,
                        ),
                        TextField(
                          decoration: InputDecoration(labelText: 'Expiry Date'),
                          onChanged: (value) => expiryDate = value,
                        ),
                        TextField(
                          decoration: InputDecoration(labelText: 'Card Holder Name'),
                          onChanged: (value) => cardNameHolder = value,
                        ),
                        TextField(
                          decoration: InputDecoration(labelText: 'CVV'),
                          onChanged: (value) => cvv = value,
                        ),
                      ],
                    ),
                  ),
                ),
              ),
              ElevatedButton(
                onPressed: _generateToken,
                child: Text('Generate Token'),
              ),
            ],
          ),
        ));
  }

  Future<void> _generateToken() async {
    try {
      showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          return WillPopScope(
              onWillPop: () => Future<bool>.value(false),
              child: AlertDialog(
                title: Text("Loading..."),
                content: Column(
                    mainAxisSize: MainAxisSize.min,
                    children: <Widget>[CircularProgressIndicator()]),
              ));
        },
      );

      String number = cardNumber.replaceAll(" ", "");
      String expiryMonth = expiryDate.substring(0, 2);
      String expiryYear = expiryDate.substring(3);

      CardTokenisationResponse? response = await FlutterCheckoutPayment.generateToken(
          number: number,
          name: cardNameHolder,
          expiryMonth: expiryMonth,
          expiryYear: expiryYear,
          cvv: cvv);

      Navigator.pop(context);

      showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text("Token"),
            content: Text("${response?.token ?? 'No token found'}"),
            actions: <Widget>[
              TextButton(
                child: Text("Close"),
                onPressed: () => Navigator.pop(context),
              )
            ],
          );
        },
      );
    } catch (ex) {
      Navigator.pop(context);

      showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text("Error"),
            content: Text("${ex.toString()}"),
            actions: <Widget>[
              TextButton(
                child: Text("Close"),
                onPressed: () => Navigator.pop(context),
              )
            ],
          );
        },
      );
    }
  }
}

公共静态方法总结

返回值 描述
Future<bool> init(@required String key, Environment environment default Environment.SANDBOX})
Future<CardTokenisationResponse> generateToken({@required String number, @required String name, @required String expiryMonth, @required String expiryYear, @required String cvv, BillingModel billingModel})
Future<bool> isCardValid({@required String number})
Future<String> handle3DS({@required String authUrl, @required String successUrl, @required String failUrl})
Future<CardTokenisationResponse> generateApplePayToken({@required String paymentDataBase64})
Future<CardTokenisationResponse> generateGooglePayToken({@required String tokenJsonPayload})

以上是 flutter_checkout_payment 插件的基本使用方法及示例代码,希望对您有所帮助!


更多关于Flutter支付结账插件flutter_checkout_payment的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter支付结账插件flutter_checkout_payment的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用flutter_checkout_payment插件的一个示例。请注意,由于flutter_checkout_payment插件的具体实现和API可能会随时间变化,以下代码基于假设的插件API结构。如果插件的实际API有所不同,请查阅最新的官方文档。

首先,确保你已经在pubspec.yaml文件中添加了flutter_checkout_payment依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_checkout_payment: ^latest_version  # 替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤使用flutter_checkout_payment插件进行支付结账。

1. 导入插件

在你的Dart文件中导入插件:

import 'package:flutter_checkout_payment/flutter_checkout_payment.dart';

2. 配置支付参数

创建一个函数来配置支付参数,并启动支付流程。这里是一个简单的示例:

Future<void> initiatePayment() async {
  // 配置支付参数
  final paymentConfig = CheckoutPaymentConfig(
    publicKey: 'your_public_key',  // 替换为你的公钥
    amount: 100.0,  // 支付金额
    currency: 'USD',  // 货币类型
    description: 'Product Description',  // 商品描述
    // 其他可选参数,如成功回调URL、失败回调URL等
  );

  try {
    // 启动支付流程
    final result = await FlutterCheckoutPayment.startPayment(config: paymentConfig);

    if (result.status == PaymentStatus.success) {
      // 支付成功处理
      print('Payment successful! Transaction ID: ${result.transactionId}');
    } else if (result.status == PaymentStatus.failed) {
      // 支付失败处理
      print('Payment failed! Error: ${result.errorMessage}');
    } else if (result.status == PaymentStatus.canceled) {
      // 支付取消处理
      print('Payment canceled by user.');
    }
  } catch (e) {
    // 处理异常
    print('An error occurred: $e');
  }
}

3. 在UI中调用支付函数

在你的UI组件中,比如一个按钮的点击事件中调用initiatePayment函数:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Checkout Payment Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: initiatePayment,
            child: Text('Initiate Payment'),
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 公钥和私钥:确保你使用的是从支付服务提供商获取的正确的公钥和私钥。私钥通常用于后端服务器验证支付结果。
  2. 安全性:不要在客户端代码中硬编码敏感信息,如私钥。所有敏感操作应在后端服务器上进行。
  3. 错误处理:在实际应用中,添加更详细的错误处理和用户反馈。
  4. UI/UX:根据应用需求,自定义支付界面的UI/UX。

这个示例提供了一个基本的框架,你可以根据flutter_checkout_payment插件的实际API文档和支付服务提供商的要求进行调整和扩展。

回到顶部