Flutter支付集成插件adotech_puntopay的使用

Flutter支付集成插件adotech_puntopay的使用

本指南将帮助你了解如何在Flutter项目中集成和使用adotech_puntopay插件。

安装

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

dependencies:
  adotech_puntopay: ^1.0.0

然后在你的Dart文件中导入该插件:

import 'package:adotech_puntopay/adotech_puntopay.dart';

iOS 配置

在iOS平台上,你需要在ios/Runner/Info.plist文件中添加以下键值对:

<key>NSCameraUsageDescription</key>
<string>用于身份验证</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>应用程序需要访问您的位置来完成支付验证</string>

确保你的目标iOS版本至少为11。在Podfile中更改目标iOS版本,并运行pod installpod update

Android 配置

在Android平台上,确保你的最小SDK版本至少为19。在android/app/build.gradle文件中进行配置:

android {
    defaultConfig {
        minSdkVersion 19
    }
}

示例代码

下面是一个简单的示例,展示了如何在Flutter应用中调用adotech_puntopay插件:

import 'dart:developer';

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

import 'package:flutter/services.dart';
import 'package:adotech_puntopay/adotech_puntopay.dart';

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

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

class _MyAppState extends State<MyApp> {
  bool pressedValidate = false;
  final documentNumberController = TextEditingController();
  final individualFingerCode = TextEditingController();

  String documentType = "1";
  int productId = 1;
  String projectName = "puntoredqa";
  String apiKey = "db92efc69991";
  String urlSdk = "https://adocolombia-qa.ado-tech.com/puntoredqa/api/";
  String documentNumber;
  bool verification = false;
  String userName = "";
  String password = "";

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

  // 平台消息是异步的,因此我们在异步方法中初始化。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用try/catch PlatformException。
    try {
      platformVersion = await AdotechPuntopay.platformVersion;
      log(platformVersion);
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // 如果小部件从树中移除,而异步平台消息仍在飞行,则我们希望丢弃回复而不是调用
    // setState来更新我们的非存在外观。
    if (!mounted) return;
  }

  Future<void> _scanovate(BuildContext context) async {
    String response;
    // 平台消息可能会失败,所以我们使用try/catch PlatformException。
    try {
      documentNumber = documentNumberController.text;

      response = await AdotechPuntopay.callPuntopay(verification, documentType, productId,
          projectName, apiKey, urlSdk, documentNumber, userName, password);
    } on PlatformException {
      response = 'Failed to get platform version.';
    }

    // 如果小部件从树中移除,而异步平台消息仍在飞行,则我们希望丢弃回复而不是调用
    // setState来更新我们的非存在外观。
    if (!mounted) return;

    _showAlert(response);
  }

  final navigatorKey = GlobalKey<NavigatorState>();
  void _showAlert(String message) {
    final context = navigatorKey.currentState.overlay.context;
    showDialog(
        context: context,
        builder: (context) => AlertDialog(
              title: Text("Test"),
              content: Text(message),
            ));
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return new MaterialApp(
        navigatorKey: navigatorKey,
        home: new Scaffold(
          appBar: AppBar(
            // 这里我们从MyHomePage对象获取值,该对象由App.build方法创建,
            // 并将其用于设置我们的appbar标题。
            title: Text('PuntoPay Lancher'),
          ),
          body: Center(
            // Center是一个布局小部件。它接受一个子元素并将其放置在父元素的中间。
            child: Column(
              // Column也是一个布局小部件。它接受一组子元素并垂直排列它们。
              // 默认情况下,它会水平调整大小以适应其子元素,并尝试与其父元素一样高。
              //
              // 调用“调试绘制”(在控制台中按“p”,选择Android Studio中的“切换调试绘制”操作,
              // 或Visual Studio Code中的“切换调试绘制”命令)可以看到每个小部件的线框。
              //
              // Column有各种属性可以控制其自身大小及其子元素的位置。在这里我们使用mainAxisAlignment
              // 来垂直居中子元素;主轴是垂直的,因为Columns是垂直的(横轴将是水平的)。
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                !pressedValidate
                    ? ElevatedButton(
                        onPressed: () {
                          this.setState(() {
                            pressedValidate = true;
                          });
                        },
                        child: const Text('Enroll', style: TextStyle(fontSize: 20)),
                      )
                    : SizedBox(),
                !pressedValidate
                    ? ElevatedButton(
                        onPressed: () {
                          this.setState(() {
                            verification = true;
                            pressedValidate = true;
                          });
                        },
                        child: const Text('Verify', style: TextStyle(fontSize: 20)),
                      )
                    : SizedBox(),
                pressedValidate
                    ? new Container(
                        width: 300,
                        child: TextField(
                            controller: documentNumberController,
                            obscureText: false,
                            keyboardType: TextInputType.number,
                            decoration: InputDecoration(
                              border: OutlineInputBorder(),
                              labelText: 'Document Number',
                            )))
                    : SizedBox(),
                SizedBox(height: 40),
                pressedValidate
                    ? ElevatedButton(
                        onPressed: () {
                          _scanovate(context);
                        },
                        child: const Text('Submit', style: TextStyle(fontSize: 20)),
                      )
                    : SizedBox(),
                pressedValidate
                    ? ElevatedButton(
                        onPressed: () {
                          this.setState(() {
                            pressedValidate = false;
                          });
                        },
                        child: const Text('Back', style: TextStyle(fontSize: 20)),
                      )
                    : SizedBox()
              ],
            ),
          ),
          // 这个尾随逗号使自动格式化更美观。
        ));
  }
}

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

1 回复

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


在 Flutter 应用中集成支付功能时,adotech_puntopay 是一个常用的插件,用于处理支付流程。以下是如何使用 adotech_puntopay 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  adotech_puntopay: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在需要使用支付功能的 Dart 文件中,导入 adotech_puntopay 插件:

import 'package:adotech_puntopay/adotech_puntopay.dart';

3. 初始化支付插件

在使用支付功能之前,通常需要初始化支付插件。你可以通过调用 initialize 方法来设置支付环境或配置参数。

AdotechPuntopay.initialize(
  apiKey: 'your_api_key',
  environment: Environment.sandbox, // 或 Environment.production
);

4. 处理支付

使用 AdotechPuntopay 插件提供的 API 来处理支付。以下是一个简单的支付流程示例:

Future<void> makePayment() async {
  try {
    PaymentResponse response = await AdotechPuntopay.makePayment(
      amount: 100.0, // 支付金额
      currency: 'USD', // 货币类型
      description: 'Test Payment', // 支付描述
    );

    if (response.status == PaymentStatus.success) {
      print('Payment successful: ${response.transactionId}');
    } else {
      print('Payment failed: ${response.errorMessage}');
    }
  } catch (e) {
    print('Error during payment: $e');
  }
}

5. 处理回调

支付完成后,你可能需要处理支付结果回调。可以通过监听 AdotechPuntopay 的回调来处理支付成功或失败的情况。

AdotechPuntopay.setPaymentListener((PaymentResponse response) {
  if (response.status == PaymentStatus.success) {
    print('Payment successful: ${response.transactionId}');
  } else {
    print('Payment failed: ${response.errorMessage}');
  }
});

6. 处理错误

在支付过程中可能会遇到各种错误,建议在代码中捕获并处理这些错误,以便为用户提供更好的体验。

try {
  await makePayment();
} catch (e) {
  print('Payment error: $e');
}
回到顶部