Flutter在线支付插件zarinpal的使用

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

Flutter在线支付插件Zarinpal的使用

插件简介

Zarinpal Package 是一个用于Flutter应用的在线支付插件,支持Android和iOS平台。它可以帮助开发者轻松集成Zarinpal支付网关,实现安全、便捷的支付功能。

使用方法

1. 初始化支付请求

首先,我们需要导入zarinpal包,并创建一个PaymentRequest对象来设置支付请求的参数。以下是一个简单的示例:

import 'package:zarinpal/zarinpal.dart';

void main() {
  // 初始化支付请求
  PaymentRequest _paymentRequest = PaymentRequest();

  // 设置是否为沙盒环境(开发模式)
  _paymentRequest.setIsSandBox(true); // 如果应用处于开发模式,请设置为true,否则设置为false

  // 设置商户ID
  _paymentRequest.setMerchantID("Zarinpal MerchantID"); // 替换为你的Zarinpal商户ID

  // 设置回调URL
  _paymentRequest.setCallbackURL("CallBack URL"); // 回调可以是Android Scheme或网站URL,你可以通过回调传递任何数据

  // 设置支付金额
  _paymentRequest.setAmount(1000); // 支付金额为整数

  // 设置支付描述
  _paymentRequest.setDescription("Payment Description");

  // 保存支付URL
  String? _paymentUrl;

  // 调用开始支付
  ZarinPal().startPayment(_paymentRequest, (int? status, String? paymentGatewayUri, data) {
    if (status == 100) {
      _paymentUrl = paymentGatewayUri; // 在浏览器中打开支付URL
      print("支付网关URL: $_paymentUrl");
    } else {
      print("启动支付失败,状态码: $status");
    }
  });
}
2. 验证支付结果

在用户完成支付后,你需要验证支付结果。根据你设置的回调方式(Scheme或网站URL),你可以获取支付的状态和授权码(Authority)。以下是验证支付的代码示例:

// 验证支付
ZarinPal().verificationPayment("Status", "Authority Call back", _paymentRequest, (bool isPaymentSuccess, String refID, PaymentRequest paymentRequest, data) {
  if (isPaymentSuccess) {
    // 支付成功
    print("支付成功,参考号: $refID");
  } else {
    // 支付失败
    print("支付失败,错误信息: $data");
  }
});
3. 注意事项
  • 沙盒环境:在开发和测试阶段,建议将setIsSandBox(true)设置为true,以避免真实的资金交易。
  • 回调URL:如果你使用的是Scheme回调(例如uni_links包),你需要在应用中处理Scheme回调,并从中提取StatusAuthority参数。如果你使用的是网站URL回调,则不需要调用verificationPayment函数。
  • 支付金额:支付金额必须为整数,单位为里亚尔(Rial)。

完整示例Demo

以下是一个完整的Flutter应用示例,展示了如何使用Zarinpal插件进行支付并验证支付结果:

import 'package:flutter/material.dart';
import 'package:zarinpal/zarinpal.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PaymentPage(),
    );
  }
}

class PaymentPage extends StatefulWidget {
  [@override](/user/override)
  _PaymentPageState createState() => _PaymentPageState();
}

class _PaymentPageState extends State<PaymentPage> {
  String? _paymentUrl;
  bool _isPaymentInProgress = false;
  String _paymentResult = "";

  void startPayment() async {
    setState(() {
      _isPaymentInProgress = true;
      _paymentResult = "";
    });

    // 初始化支付请求
    PaymentRequest _paymentRequest = PaymentRequest();

    // 设置是否为沙盒环境
    _paymentRequest.setIsSandBox(true);

    // 设置商户ID
    _paymentRequest.setMerchantID("Zarinpal MerchantID"); // 替换为你的Zarinpal商户ID

    // 设置回调URL
    _paymentRequest.setCallbackURL("CallBack URL"); // 替换为你的回调URL

    // 设置支付金额
    _paymentRequest.setAmount(1000); // 支付金额为1000里亚尔

    // 设置支付描述
    _paymentRequest.setDescription("Payment Description");

    // 调用开始支付
    ZarinPal().startPayment(_paymentRequest, (int? status, String? paymentGatewayUri, data) {
      if (status == 100) {
        setState(() {
          _paymentUrl = paymentGatewayUri;
          _isPaymentInProgress = false;
        });
      } else {
        setState(() {
          _isPaymentInProgress = false;
          _paymentResult = "启动支付失败,状态码: $status";
        });
      }
    });
  }

  void verifyPayment(String status, String authority) {
    ZarinPal().verificationPayment(status, authority, _paymentRequest, (bool isPaymentSuccess, String refID, PaymentRequest paymentRequest, data) {
      setState(() {
        if (isPaymentSuccess) {
          _paymentResult = "支付成功,参考号: $refID";
        } else {
          _paymentResult = "支付失败,错误信息: $data";
        }
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Zarinpal支付示例"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _isPaymentInProgress ? null : startPayment,
              child: _isPaymentInProgress
                  ? CircularProgressIndicator()
                  : Text("开始支付"),
            ),
            SizedBox(height: 20),
            if (_paymentUrl != null)
              TextButton(
                onPressed: () {
                  // 打开支付URL(可以使用url_launcher包)
                  // launch(_paymentUrl!);
                },
                child: Text("点击这里完成支付"),
              ),
            SizedBox(height: 20),
            if (_paymentResult.isNotEmpty) Text(_paymentResult),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用ZarinPal插件进行在线支付的代码示例。ZarinPal是伊朗的一个流行的在线支付网关。首先,你需要确保已经在pubspec.yaml文件中添加了zarinpal插件的依赖。

pubspec.yaml中添加依赖

dependencies:
  flutter:
    sdk: flutter
  zarinpal: ^最新版本号  # 请替换为实际的最新版本号

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

Flutter代码示例

以下是一个简单的Flutter应用示例,展示如何使用ZarinPal插件进行支付。

main.dart

import 'package:flutter/material.dart';
import 'package:zarinpal/zarinpal.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter ZarinPal Payment Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PaymentScreen(),
    );
  }
}

class PaymentScreen extends StatefulWidget {
  @override
  _PaymentScreenState createState() => _PaymentScreenState();
}

class _PaymentScreenState extends State<PaymentScreen> {
  final ZarinPal _zarinPal = ZarinPal();
  String _paymentUrl = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ZarinPal Payment Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                // 替换为实际的商户ID和金额
                String merchantId = 'YOUR_MERCHANT_ID';
                double amount = 1000.0;
                String description = 'Test Payment';
                String callbackUrl = 'https://yourwebsite.com/callback';

                try {
                  String authority = await _zarinPal.requestPayment(
                    merchantId: merchantId,
                    amount: amount,
                    description: description,
                    callbackUrl: callbackUrl,
                  );

                  setState(() {
                    _paymentUrl = 'https://www.zarinpal.com/pg/StartPay/$authority';
                  });

                  // 打开支付页面
                  if (await canLaunch(_paymentUrl)) {
                    await launch(_paymentUrl);
                  } else {
                    throw 'Could not launch $_paymentUrl';
                  }
                } catch (e) {
                  print('Error: $e');
                }
              },
              child: Text('Pay Now'),
            ),
            SizedBox(height: 20),
            if (_paymentUrl.isNotEmpty)
              Text(
                'Payment URL: $_paymentUrl',
                style: TextStyle(fontSize: 16),
              ),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 商户ID:你需要在ZarinPal注册并获得一个商户ID (merchantId)。
  2. 回调URL:你需要在ZarinPal后台设置一个回调URL,以便在支付完成后接收通知。
  3. 权限:确保你的应用有打开网页的权限。在AndroidManifest.xmlInfo.plist中可能需要添加相应的权限和配置。
  4. 安全性:不要在客户端代码中硬编码敏感信息,如商户ID和API密钥。考虑使用环境变量或安全存储。

处理支付回调

在ZarinPal后台设置的回调URL需要你的服务器能够接收和处理POST请求。服务器接收到回调后,通常会验证支付状态并更新订单状态。这部分代码需要在服务器端实现,不在Flutter应用范围内。

以上示例展示了如何在Flutter应用中集成ZarinPal进行在线支付。根据实际需求,你可能需要进一步完善代码,如添加错误处理、用户反馈等。

回到顶部