Flutter支付集成插件cinetpay的使用

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

Flutter支付集成插件CinetPay的使用

🚀 CinetPay支付集成 👋

Pub Version Relative date Pub Score Pub Like Pub Popularity

CinetPay Logo

该包允许您调用 CinetPay支付网关,执行支付并等待支付完成后的状态。

🔗 使用步骤

使用此包非常简单,只需调用它,并提供以下内容:

  • 初始化网关所需的参数
  • 支付相关信息
  • 支付结果回调
  • 错误处理回调

🛠 预备条件

Android

android/app/src/main/AndroidManifest.xml 文件中添加权限:

<application
    ...
    android:usesCleartextTraffic="true">
    ...
</application>
...
<uses-permission android:name="android.permission.INTERNET"/>

修改 minSdkVersioncompileSdk 版本(在 android/app/build.gradle 文件中):

minSdkVersion >= 19
compileSdk >= 34

iOS

ios/Runner/Info.plist 文件中添加权限:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

初始化网关

网关需要接收以下数据才能正常工作:

  • apikey: 商户ID (必填)
  • site_id: 服务ID (必填)
  • notify_url: 有效的支付通知URL (必填)

支付信息

为准备支付网关,需提交以下数据:

  • amount: 支付金额 (>100 XOF) (必填)
  • currency: 支付货币 (XOF, XAF, CDN, GNF, USD) (必填)
  • transaction_id: 唯一交易ID (必填)
  • description: 支付描述 (必填)
  • channels: 支付渠道 (可选,默认为’ALL’)
  • metadata: 元数据 (可选)

支付结果回调

当支付完成后,将返回以下格式的结果:

  • amount: 支付金额
  • currency: 支付货币
  • status: 支付状态 (ACCEPTED 或 REFUSED)
  • payment_method: 支付方式
  • description: 支付描述
  • metadata: 元数据
  • operator_id: 操作员支付ID
  • payment_date: 支付日期

错误处理回调

错误处理将返回以下格式的结果:

  • message: 错误消息
  • description: 错误描述

👩‍💻 包的使用示例

以下是一个完整的Flutter应用程序示例,演示了如何使用CinetPay进行支付:

import 'dart:async';
import 'dart:math';

import 'package:cinetpay/cinetpay.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

Future main() async {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  TextEditingController amountController = TextEditingController();
  Map<String, dynamic>? response;
  Color? color;
  IconData? icon;
  String? message;
  bool show = false;

  @override
  Widget build(BuildContext context) {
    const String title = 'CinetPay Demo';
    return GetMaterialApp(
      title: title,
      theme: ThemeData(
        primarySwatch: Colors.green,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text(title),
          centerTitle: true,
        ),
        body: SafeArea(
          child: Center(
            child: ListView(
              shrinkWrap: true,
              children: [
                Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    if (show) Icon(icon, color: color, size: 150),
                    if (show) Text(message!),
                    if (show) const SizedBox(height: 50.0),
                    const Text(
                      "Example integration Package for Flutter",
                      style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
                      textAlign: TextAlign.center,
                    ),
                    const SizedBox(height: 50.0),
                    const Text(
                      "Cart informations.",
                      style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
                    ),
                    const SizedBox(height: 50.0),
                    Container(
                      padding: const EdgeInsets.symmetric(horizontal: 20.0),
                      margin: const EdgeInsets.symmetric(horizontal: 50.0),
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(12.0),
                        border: Border.all(color: Colors.green),
                      ),
                      child: TextField(
                        controller: amountController,
                        decoration: const InputDecoration(
                          hintText: "Amount",
                          border: InputBorder.none,
                        ),
                        keyboardType: TextInputType.number,
                      ),
                    ),
                    const SizedBox(height: 40.0),
                    ElevatedButton(
                      child: const Text("Pay with CinetPay"),
                      onPressed: () async {
                        final String amount = amountController.text.trim();
                        if (amount.isEmpty) {
                          // 显示警告
                          return;
                        }

                        try {
                          double _amount = double.parse(amount);

                          if (_amount < 100 || _amount > 1500000) {
                            // 显示警告
                            return;
                          }
                        } catch (_) {
                          return;
                        }

                        amountController.clear();

                        final String transactionId = Random().nextInt(100000000).toString();

                        await Get.to(CinetPayCheckout(
                          title: 'Payment Checkout',
                          titleStyle: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
                          titleBackgroundColor: Colors.green,
                          configData: {
                            'apikey': 'YOUR_API_KEY',
                            'site_id': int.parse("YOUR_SITE_ID"),
                            'notify_url': 'YOUR_NOTIFY_URL'
                          },
                          paymentData: {
                            'transaction_id': transactionId,
                            'amount': double.parse(amount),
                            'currency': 'XOF',
                            'channels': 'ALL',
                            'description': 'Payment test',
                          },
                          waitResponse: (data) {
                            if (mounted) {
                              setState(() {
                                response = data;
                                print(response);
                                icon = data['status'] == 'ACCEPTED'
                                    ? Icons.check_circle
                                    : Icons.mood_bad_rounded;
                                color = data['status'] == 'ACCEPTED'
                                    ? Colors.green
                                    : Colors.redAccent;
                                show = true;
                                Get.back();
                              });
                            }
                          },
                          onError: (data) {
                            if (mounted) {
                              setState(() {
                                response = data;
                                message = response!['description'];
                                print(response);
                                icon = Icons.warning_rounded;
                                color = Colors.yellowAccent;
                                show = true;
                                Get.back();
                              });
                            }
                          },
                        ));
                      },
                    )
                  ],
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

😄 作者

AGBETOGOR Germain (Germinator)

如需更多信息,请联系支持团队。


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

1 回复

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


在Flutter中集成CinetPay支付插件通常涉及几个步骤,包括添加依赖、配置参数、处理支付回调等。以下是一个简化的示例代码,展示了如何在Flutter应用中集成CinetPay支付插件。请注意,具体实现可能会根据CinetPay的SDK版本和Flutter版本有所不同。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加CinetPay的Flutter插件依赖(假设存在一个名为cinetpay_flutter的插件,实际使用时请替换为真实存在的插件名称或URL)。

dependencies:
  flutter:
    sdk: flutter
  cinetpay_flutter: ^x.y.z  # 替换为实际版本号

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

2. 导入插件并配置参数

在你的Flutter项目的Dart文件中(例如main.dart),导入CinetPay插件并配置必要的支付参数。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter CinetPay Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter CinetPay Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 配置CinetPay支付参数
              Map<String, dynamic> paymentParams = {
                'amount': '100.00',  // 支付金额
                'currency': 'USD',   // 货币类型
                'description': 'Product Purchase',  // 支付描述
                'orderId': '123456789',  // 订单ID
                'merchantId': 'your_merchant_id',  // 商户ID
                'secretKey': 'your_secret_key',    // 密钥
                // 其他必要的参数...
              };

              try {
                // 发起支付请求
                bool result = await CinetPayFlutter.startPayment(paymentParams);
                if (result) {
                  // 支付成功处理
                  print('Payment successful');
                } else {
                  // 支付失败处理
                  print('Payment failed');
                }
              } catch (e) {
                // 异常处理
                print('Error during payment: $e');
              }
            },
            child: Text('Pay Now'),
          ),
        ),
      ),
    );
  }
}

3. 处理支付回调

CinetPay支付完成后,通常会有支付结果的回调。在Flutter中,这通常是通过插件提供的回调机制来实现的。具体实现取决于插件的API设计,但以下是一个假设性的示例,展示了如何处理支付回调。

// 假设CinetPayFlutter插件提供了一个监听支付结果的API
CinetPayFlutter.onPaymentResult((result) {
  if (result['status'] == 'success') {
    // 支付成功,处理支付结果
    print('Payment successful with transaction ID: ${result['transactionId']}');
  } else {
    // 支付失败或取消,处理错误情况
    print('Payment failed or cancelled: ${result['errorMessage'] ?? 'Unknown error'}');
  }
});

注意:上述代码中的CinetPayFlutter.onPaymentResult是一个假设性的API,实际使用时请参考CinetPay Flutter插件的官方文档来获取正确的回调处理方式。

4. 注意事项

  • 安全性:确保你的商户ID和密钥不会硬编码在客户端代码中,最好是通过服务器安全地传递给客户端。
  • 错误处理:在实际应用中,添加更详细的错误处理和用户反馈。
  • 沙箱环境:在开发过程中,使用CinetPay提供的沙箱环境进行测试,以避免产生真实的支付交易。

总结

以上是一个简化的Flutter集成CinetPay支付插件的示例代码。实际使用时,请根据CinetPay Flutter插件的官方文档进行详细的配置和测试。

回到顶部