Paystack Flutter 插件

一个强大的 Flutter 插件,用于通过 Paystack 支付网关进行支付。完全支持 Android 和 iOS

:rocket: 安装

要使用此插件,请将 flutter_paystack 添加到您的 pubspec.yaml 文件中的 依赖项

然后,最好在您的 widget 的 initState 中初始化该插件。

import 'package:flutter_paystack/flutter_paystack.dart';

class _PaymentPageState extends State<PaymentPage> {
  var publicKey = '[YOUR_PAYSTACK_PUBLIC_KEY]';

  @override
  void initState() {
    PaystackPlugin.initialize(
            publicKey: publicKey);
  }
}

无需其他配置——该插件开箱即用。

:heavy_dollar_sign: 进行支付

有两种方式可以使用此插件进行支付。

  1. Checkout (结账):这是简单的方式;插件处理所有支付流程(除了需要从您的后端进行的交易初始化和验证)。
    流程
    初始化和验证,这应该从您的
    后端进行。
  2. Charge Card (扣款):这是一个更长的方法;您需要处理所有回调和 UI 状态。
    和 UI 状态。

1. :star2: Checkout (推荐)

您可以使用金额、电子邮件和 accessCode 或 reference 初始化一个 charge 对象。仅当您已从后端初始化交易时,才传递 accessCode
reference。
当您
从后端初始化交易时,仅传递 reference

Charge charge = Charge()
      ..amount = 10000
      ..reference = _getReference()
       // or ..accessCode = _getAccessCodeFrmInitialization()
      ..email = '[email protected]';
    CheckoutResponse response = await PaystackPlugin.checkout(
      context context,
      method: CheckoutMethod.card, // Defaults to CheckoutMethod.selectable
      charge: charge,
    );

请注意,如果方法是 CheckoutMethod.bankCheckoutMethod.selectable,则需要 accessCode
CheckoutMethod.selectable

PaystackPlugin.checkout() 返回 CheckoutResponse 实例中的支付状态和详细信息。
CheckoutResponse

建议当 PaystackPlugin.checkout() 返回时,支付应该在您的后端进行验证。
支付应该
验证
在您的后端。

2. :star: Charge Card

您可以选择在本地或通过您的后端初始化付款。

A. 通过您的后端初始化 (推荐)

1.a. 这首先需要向 paystack 发送一个 HTTP POST 请求。
paystack
在您的后端。

1.b 如果一切顺利,初始化请求将返回一个带有 access_code 的响应。
然后,您可以使用 access code 和卡详细信息创建一个 Charge 对象。然后将 charge 传递给 PaystackPlugin.chargeCard() 函数进行支付。

  PaymentCard _getCardFromUI() {
    // Using just the must-required parameters.
    return PaymentCard(
      number: cardNumber,
      cvc: cvv,
      expiryMonth: expiryMonth,
      expiryYear: expiryYear,
    );

    // Using Cascade notation (similar to Java's builder pattern)
//    return PaymentCard(
//        number: cardNumber,
//        cvc: cvv,
//        expiryMonth: expiryMonth,
//        expiryYear: expiryYear)
//      ..name = 'Segun Chukwuma Adamu'
//      ..country = 'Nigeria'
//      ..addressLine1 = 'Ikeja, Lagos'
//      ..addressPostalCode = '100001';

    // Using optional parameters
//    return PaymentCard(
//        number: cardNumber,
//        cvc: cvv,
//        expiryMonth: expiryMonth,
//        expiryYear: expiryYear,
//        name: 'Ismail Adebola Emeka',
//        addressCountry: 'Nigeria',
//        addressLine1: '90, Nnebisi Road, Asaba, Deleta State');
  }

  _chargeCard(String accessCode) {
    var charge = Charge()
      ..accessCode = accessCode
      ..card = _getCardFromUI();

    PaystackPlugin.chargeCard(context,
        charge: charge,
        beforeValidate: (transaction) => handleBeforeValidate(transaction),
        onSuccess: (transaction) => handleOnSuccess(transaction),
        onError: (error, transaction) => handleOnError(error, transaction));
  }

  handleBeforeValidate(Transaction transaction) {
    // This is called only before requesting OTP
    // Save reference so you may send to server if error occurs with OTP
  }

  handleOnError(Object e, Transaction transaction) {
    // If an access code has expired, simply ask your server for a new one
    // and restart the charge instead of displaying error
  }


  handleOnSuccess(Transaction transaction) {
    // This is called only after transaction is successful
  }

2. 本地初始化

只需将付款详细信息发送到 PaystackPlugin.chargeCard

      // Set transaction params directly in app (note that these params
      // are only used if an access_code is not set. In debug mode,
      // setting them after setting an access code would throw an error
      Charge charge = Charge();
      charge.card = _getCardFromUI();
      charge
        ..amount = 2000
        ..email = '[email protected]'
        ..reference = _getReference()
        ..putCustomField('Charged From', 'Flutter PLUGIN');
      _chargeCard();

:wrench: :nut_and_bolt: 验证卡详细信息

您需要(但非必需)为用户构建输入其付款详细信息的 UI。
为了更方便地进行验证,请将 TextFormFields 包装在 Form widget 中。如果您对此不熟悉,请参阅这篇关于在 Flutter 中验证表单的文章。
验证表单
如果您对此不熟悉。

注意: 您不必将 card 对象传递给 Charge。插件将调用 UI,供用户输入其卡信息。

您可以使用以下方法验证字段

card.validNumber

此方法有助于检查卡号是否有效。

card.validCVC

检查卡安全码是否有效的方法。

card.validExpiryDate

方法检查有效期(年份和月份的组合)是否有效。

card.isValid

检查卡是否有效的方法。在扣款之前,请务必执行此检查。

card.getType

此方法返回卡类型(发行方)的字符串表示形式的估计值。

GitHub

https://github.com/wilburt/flutter_paystack