Flutter支付集成插件atompaynetznonaes的使用

Flutter支付集成插件atompaynetznonaes的使用

Atom Paynetz Flutter

Atom Paynetz dart包用于Flutter集成。


开始使用

这是一个帮助类,用于生成非AES请求的Atom Paynetz支付URL。


安装

该插件可在Pub上找到:
https://pub.dev/packages/atompaynetznonaes

在项目的pubspec.yaml文件中添加以下依赖项:

dependencies:
  atompaynetznonaes: ^1.0.3
  webview_flutter: ^3.0.4

注意(Android): 确保应用的最低API级别为19或更高。


使用方法

以下是创建支付演示的步骤:

第一步:在main.dart文件中添加以下代码

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Web Views',
      theme: ThemeData(
          primarySwatch: Colors.blue,
          fontFamily: "Arial",
          textTheme: const TextTheme(
              button: TextStyle(color: Colors.white, fontSize: 18.0),
              subtitle1: TextStyle(color: Colors.red))),
      home: const Home(),
    );
  }
}

第二步:创建home.dart文件并添加以下代码

// ignore: import_of_legacy_library_into_null_safe
import 'package:atompaynetznonaes/atompaynetznonaes.dart';
import 'package:flutter/material.dart';
import 'web_view_container.dart';

class Home extends StatelessWidget {
  // 测试UAT时可尝试以下内容
  final login = "197"; // 必填
  final pass = 'Test@123'; // 必填
  final prodid = 'NSE'; // 必填
  final requesthashKey = 'KEY123657234'; // 必填
  final responsehashKey = 'KEYRESP123657234'; // 必填

  final amt = '10.00'; // 必填
  final username = 'test user'; // 可选
  final mobile = '8888888888'; // 可选
  final email = 'test@gmail.com'; // 可选
  final address = 'mumbai'; // 可选
  final date = '12/06/2022 16:50:00'; // 必填,当前交易日期应与此格式匹配
  final txnid = '123456'; // 必填,每次应唯一
  final custacc = '0'; // 必填
  final clientcode = "NAVIN"; // 必填
  final udf9 = "testdata1,testdata2,testdata3"; // 可选,可以发送逗号分隔的数据
  final mode = 'uat'; // 必填,生产环境切换为live

  const Home({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Atom Paynetz Sample App'),
      ),
      body: Center(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () => _handleURLButtonPress(context, responsehashKey),
              child: const Text('Open'),
            ),
          ],
        ),
      ),
    );
  }

  void _handleURLButtonPress(BuildContext context, String responsehashKey) {
    Navigator.push(
        context,
        MaterialPageRoute(
            builder: (context) => WebViewContainer(getUrl(), responsehashKey)));
  }

  getUrl() {
    var atompaynetznonaes = AtomPaynetzNonAes(
        login: login,
        pass: pass,
        prodid: prodid,
        amt: amt,
        username: username,
        mobile: mobile,
        email: email,
        address: address,
        date: date,
        clientcode: clientcode,
        txnid: txnid,
        custacc: custacc,
        udf9: udf9,
        requesthashKey: requesthashKey,
        responsehashKey: responsehashKey,
        mode: mode);
    var urlToSend = atompaynetznonaes.getUrl();
    return urlToSend;
  }
}

第三步:创建web_view_container.dart文件并添加以下代码

// ignore: import_of_legacy_library_into_null_safe
import 'package:atompaynetznonaes/atompaynetznonaes.dart';
import 'package:flutter/material.dart';
// ignore: import_of_legacy_library_into_null_safe
import 'package:webview_flutter/webview_flutter.dart';

class WebViewContainer extends StatefulWidget {
  final url;
  final resHashKey;
  WebViewContainer(this.url, this.resHashKey);
  [@override](/user/override)
  createState() => _WebViewContainerState(this.url, this.resHashKey);
}

class _WebViewContainerState extends State<WebViewContainer> {
  final _url;
  final _resHashKey;
  final _key = UniqueKey();
  late WebViewController _controller;

  _WebViewContainerState(this._url, this._resHashKey);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.transparent,
          automaticallyImplyLeading: false,
          elevation: 0,
          toolbarHeight: 2,
        ),
        body: Column(
          children: [
            Expanded(
                child: WebView(
              key: _key,
              javascriptMode: JavascriptMode.unrestricted,
              onWebViewCreated: (controller) {
                _controller = controller;
              },
              initialUrl: _url,
              onPageFinished: (String url) async {
                if (url.contains('/mobilesdk/param')) {
                  // 获取最终响应
                  final response = await _controller.runJavascriptReturningResult(
                      "(function() { let htmlH5 = document.getElementsByTagName('h5')[0].innerHTML; return htmlH5; })();");

                  List responseArray = [];
                  var responseMap = {};

                  // 解析返回数据
                  var splitRawResponse =
                      response.trim().split('|').map((text) => text).toList();
                  for (var i = 0; i < splitRawResponse.length; i++) {
                    if (splitRawResponse[i].isNotEmpty && splitRawResponse[i].length > 2) {
                      var splitNewResponse = splitRawResponse[i]
                          .trim()
                          .split('=')
                          .map((text) => text)
                          .toList();
                      responseArray.add(splitNewResponse);
                    }
                  }

                  // 构建键值对映射
                  for (var i = 0; i < responseArray.length; i++) {
                    responseMap[responseArray[i][0]] = responseArray[i][1];
                  }

                  // 验证签名
                  var atompaynetznonaes = VerifyTransaction();
                  var checkFinalTransaction = atompaynetznonaes
                      .validateSignature(responseMap, _resHashKey);
                  var transactionResult = "";

                  if (checkFinalTransaction) {
                    if (responseMap['f_code'] == 'success_00' || responseMap['f_code'] == 'Ok') {
                      transactionResult = "success";
                    } else if (responseMap['f_code'] == 'C_06' || responseMap['f_code'] == 'C') {
                      transactionResult = "cancelled";
                    } else {
                      transactionResult = "failed";
                    }
                  } else {
                    // ignore: avoid_print
                    print("签名不匹配");
                    transactionResult = "failed";
                  }

                  // 显示结果
                  Navigator.pop(context); // 关闭当前窗口
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(
                      content: Text("交易状态 = $transactionResult")));
                }
              },
              gestureNavigationEnabled: true,
            ))
          ],
        ));
  }
}
1 回复

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


atompaynetznonaes 是一个用于在 Flutter 应用中集成 Atom Payments 的插件。它允许你轻松地在应用中处理支付事务。以下是如何使用 atompaynetznonaes 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 atompaynetznonaes 插件的依赖。

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

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

2. 导入插件

在你的 Dart 文件中导入 atompaynetznonaes 插件。

import 'package:atompaynetznonaes/atompaynetznonaes.dart';

3. 初始化支付

在使用支付功能之前,你需要初始化支付插件。通常,你需要在应用的启动时进行初始化。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 AtomPay
  await AtomPay.initialize(
    merchantId: 'YOUR_MERCHANT_ID',
    merchantKey: 'YOUR_MERCHANT_KEY',
    environment: AtomPayEnvironment.SANDBOX, // 或者 AtomPayEnvironment.PRODUCTION
  );
  
  runApp(MyApp());
}

4. 发起支付

你可以使用 AtomPay 类来发起支付请求。通常,你需要提供订单号、金额、回调 URL 等信息。

void initiatePayment() async {
  try {
    final response = await AtomPay.initiatePayment(
      orderId: 'ORDER12345',
      amount: '100.00',
      currency: 'INR',
      customerEmail: 'customer@example.com',
      customerPhone: '9876543210',
      returnUrl: 'https://yourwebsite.com/return',
    );
    
    if (response.status == 'SUCCESS') {
      // 支付成功,处理后续逻辑
      print('Payment successful: ${response.transactionId}');
    } else {
      // 支付失败,处理错误
      print('Payment failed: ${response.errorMessage}');
    }
  } catch (e) {
    // 处理异常
    print('Error: $e');
  }
}

5. 处理支付回调

支付完成后,Atom Payments 会重定向到你在 returnUrl 中指定的 URL。你需要在服务器端处理支付结果,并在应用中显示相应的结果。

6. 处理支付结果

你可以在应用的某个页面中处理支付结果,例如在支付成功或失败后显示相应的消息。

class PaymentResultPage extends StatelessWidget {
  final String status;
  final String message;

  PaymentResultPage({required this.status, required this.message});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Payment Result'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Payment Status: $status'),
            Text('Message: $message'),
          ],
        ),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!