Flutter支付处理插件conekta_flutter的使用

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

Flutter支付处理插件conekta_flutter的使用

简介

conekta_flutter 是一个Flutter插件,允许你创建Conekta卡令牌。通过这个插件,你可以轻松地在Flutter应用中集成支付功能。

安装

1. 添加依赖

在你的 pubspec.yaml 文件中添加 conekta_flutter 作为依赖:

dependencies:
  conekta_flutter: ^1.0.0
2. Android配置

在Android项目中添加互联网权限:

<uses-permission android:name="android.permission.INTERNET"/>
3. iOS配置

如果你使用的是iOS 9或更高版本,需要在 Info.plist 文件中添加以下内容以允许任意负载:

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

使用方法

1. 实例化 ConektaFlutter

首先,你需要实例化 ConektaFlutter 类:

final conektaFlutter = ConektaFlutter();
2. 设置Conekta API Key

设置你的Conekta API Key:

await conektaFlutter.setApiKey("your_api_key_here");
3. 创建卡令牌

当你已经获取了卡信息后,创建一个 ConektaCard 实例并生成卡令牌:

final conektaCard = ConektaCard(
  cardName: 'Alfonso Osorio',
  cardNumber: '4242424242424242',
  cvv: '847',
  expirationMonth: '12',
  expirationYear: '2040',
);

try {
  final String token = await conektaFlutter.createCardToken(conektaCard);
  print('Card Token: $token');
} on PlatformException catch (exception) {
  // 处理异常
  print('Error: ${exception.message}');
}

错误处理

该插件可能会返回以下错误:

  • ApiKeyNotProvided: 表示未设置Conekta API Key。
  • InvalidCardArguments: 表示卡信息中的某些参数为空或无效。

此外,插件还会返回Conekta直接返回的错误信息。例如,卡号或CVV格式不正确等。

注意:该库不会验证或检查 ConektaCard 实例中提供的数据是否正确,例如卡号长度或CVV长度的有效性。

完整示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用 conekta_flutter 插件来创建卡令牌:

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

import 'package:flutter/services.dart';
import 'package:conekta_flutter/conekta_flutter.dart';
import 'package:conekta_flutter/conekta_card.dart';

void main() => runApp(MyApp());

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

class _MyAppState extends State<MyApp> {
  String _token = 'Unknown';

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  Future<void> initPlatformState() async {
    String token = "Unknown";
    try {
      ConektaFlutter conektaFlutter = ConektaFlutter();
      await conektaFlutter.setApiKey('your_api_key_here'); // 替换为你的API Key
      token = await conektaFlutter.createCardToken(ConektaCard(
        cardName: 'Alfonso Osorio',
        cardNumber: '4242424242424242', // 测试卡号
        cvv: '847',
        expirationMonth: '12',
        expirationYear: '2040',
      ));
    } on PlatformException catch (exception) {
      token = exception.message ?? "";
    }

    if (!mounted) return;

    setState(() => _token = token);
  }

  [@override](/user/override)
  Widget build(BuildContext context) => MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Conekta Flutter Plugin Example'),
          ),
          body: Center(
            child: Text('Conekta token: $_token\n'),
          ),
        ),
      );
}

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

1 回复

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


在Flutter应用中集成conekta_flutter插件以处理支付,你需要先确保已经设置好Flutter开发环境,并且在你的项目中添加了这个插件。以下是一个基本的代码示例,展示了如何集成和使用conekta_flutter进行支付处理。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加conekta_flutter依赖:

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

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

2. 配置Android和iOS

确保你在Android和iOS项目中配置了必要的支付权限和设置。这可能包括在AndroidManifest.xml中添加权限,以及在iOS的Info.plist中添加必要的配置。

3. 初始化并使用插件

在你的Flutter项目中,创建一个新的Dart文件(例如payment_service.dart),用于处理支付逻辑。以下是一个基本的示例:

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

class PaymentService {
  // 初始化Conekta
  static Future<void> initializeConekta(String publicKey) async {
    await ConektaFlutter.initialize(publicKey: publicKey);
  }

  // 创建支付Token
  static Future<Map<String, dynamic>> createToken(String cardNumber, String holderName, String expMonth, String expYear, String cvv) async {
    try {
      Map<String, dynamic> result = await ConektaFlutter.createToken(
        cardNumber: cardNumber,
        holderName: holderName,
        expMonth: expMonth,
        expYear: expYear,
        cvv: cvv
      );
      return result;
    } catch (e) {
      print("Error creating token: $e");
      return null;
    }
  }

  // 处理支付(后端处理逻辑,这里假设你已经有了后端API)
  static Future<Map<String, dynamic>> processPayment(String tokenId, double amount, String currency, String description) async {
    // 这里你需要调用你自己的后端API来处理支付
    // 假设后端API的URL是 'https://yourbackend.com/api/pay'
    // 并且接收一个包含tokenId, amount, currency, 和description的JSON body

    // 以下是一个伪代码示例,你需要替换为实际的网络请求代码
    // var response = await http.post(
    //   Uri.parse('https://yourbackend.com/api/pay'),
    //   body: jsonEncode(<String, dynamic>{
    //     'token_id': tokenId,
    //     'amount': amount,
    //     'currency': currency,
    //     'description': description
    //   }),
    //   headers: <String, String>{
    //     'Content-Type': 'application/json',
    //   },
    // );

    // 假设我们直接返回一个模拟的支付结果
    return {
      'success': true,
      'message': 'Payment processed successfully!',
      // 其他可能的返回字段...
    };
  }
}

4. 在UI中调用支付服务

在你的UI文件中(例如main.dart),你可以创建一个表单来收集用户的支付信息,并调用上述服务来处理支付:

import 'package:flutter/material.dart';
import 'package:your_app/payment_service.dart';  // 替换为你的实际路径

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

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

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

class _PaymentScreenState extends State<PaymentScreen> {
  final _formKey = GlobalKey<FormState>();
  String _cardNumber = '';
  String _holderName = '';
  String _expMonth = '';
  String _expYear = '';
  String _cvv = '';

  void _submit() async {
    if (_formKey.currentState!.validate()) {
      _formKey.currentState!.save();

      // 初始化Conekta(在实际应用中,这通常是在应用启动时完成的)
      await PaymentService.initializeConekta('你的Conekta公钥');

      // 创建Token
      Map<String, dynamic> tokenResult = await PaymentService.createToken(
        _cardNumber, _holderName, _expMonth, _expYear, _cvv
      );

      if (tokenResult != null && tokenResult['id'] != null) {
        String tokenId = tokenResult['id'];

        // 处理支付(调用后端API)
        Map<String, dynamic> paymentResult = await PaymentService.processPayment(
          tokenId, 100.0, 'MXN', 'Test Payment'
        );

        // 显示支付结果
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text(paymentResult['message'] ?? 'Payment failed.'),
            duration: Duration(seconds: 3),
          ),
        );
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Payment Screen'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              TextFormField(
                decoration: InputDecoration(labelText: 'Card Number'),
                validator: (value) {
                  if (value == null || value.isEmpty || value.length != 16) {
                    return 'Invalid card number';
                  }
                  return null;
                },
                onSaved: (value) {
                  _cardNumber = value!;
                },
              ),
              TextFormField(
                decoration: InputDecoration(labelText: 'Holder Name'),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return 'Holder name is required';
                  }
                  return null;
                },
                onSaved: (value) {
                  _holderName = value!;
                },
              ),
              Row(
                children: [
                  Expanded(
                    child: TextFormField(
                      decoration: InputDecoration(labelText: 'Exp Month'),
                      keyboardType: TextInputType.number,
                      validator: (value) {
                        if (value == null || value.isEmpty || value.length != 2 || !value.allMatch(RegExp(r'^\d+$'))) {
                          return 'Invalid exp month';
                        }
                        return null;
                      },
                      onSaved: (value) {
                        _expMonth = value!;
                      },
                    ),
                  ),
                  Expanded(
                    child: TextFormField(
                      decoration: InputDecoration(labelText: 'Exp Year'),
                      keyboardType: TextInputType.number,
                      validator: (value) {
                        if (value == null || value.isEmpty || value.length != 4 || !value.allMatch(RegExp(r'^\d+$'))) {
                          return 'Invalid exp year';
                        }
                        return null;
                      },
                      onSaved: (value) {
                        _expYear = value!;
                      },
                    ),
                  ),
                ],
              ),
              TextFormField(
                decoration: InputDecoration(labelText: 'CVV'),
                keyboardType: TextInputType.number,
                validator: (value) {
                  if (value == null || value.isEmpty || value.length != 3 || !value.allMatch(RegExp(r'^\d+$'))) {
                    return 'Invalid CVV';
                  }
                  return null;
                },
                onSaved: (value) {
                  _cvv = value!;
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _submit,
                child: Text('Pay'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 安全性:在实际应用中,不要在客户端代码中硬编码敏感信息(如Conekta公钥
回到顶部