Flutter加密解密插件ndpsflutternonaes的使用

Flutter加密解密插件ndpsflutternonaes的使用

Atom Paynetz Flutter

Atom Paynetz dart package for Flutter Integration.


获取开始

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


安装

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

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

dependencies:
  ndpsflutternonaes: ^1.0.1
  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:ndpsflutternonaes/ndpsflutternonaes.dart';
import 'package:flutter/material.dart';
import 'web_view_container.dart';

class Home extends StatelessWidget {
  // 必填参数
  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 ndpsflutternonaes = NdpsFlutterNonAes(
      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 = ndpsflutternonaes.getUrl();
    return urlToSend;
  }
}

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

// ignore: import_of_legacy_library_into_null_safe
import 'package:ndpsflutternonaes/ndpsflutternonaes.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')) {
                  // 获取网页中的HTML元素内容
                  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);
                    }
                  }

                  // 将解析后的数据存储到Map中
                  for (var i = 0; i < responseArray.length; i++) {
                    responseMap[responseArray[i][0]] = responseArray[i][1];
                  }

                  // 验证签名
                  var ndpsflutternonaes = VerifyTransaction();
                  var checkFinalTransaction =
                      ndpsflutternonaes.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 {
                    print("signature mismatched");
                    transactionResult = "failed";
                  }

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

更多关于Flutter加密解密插件ndpsflutternonaes的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter加密解密插件ndpsflutternonaes的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


ndpsflutternonaes 是一个用于 Flutter 的加密解密插件,支持 AES 加密算法。以下是如何在 Flutter 项目中使用 ndpsflutternonaes 插件进行加密和解密的基本步骤。

1. 添加依赖

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

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

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

2. 导入插件

在需要使用加密解密的 Dart 文件中导入插件:

import 'package:ndpsflutternonaes/ndpsflutternonaes.dart';

3. 初始化插件

在使用插件之前,通常需要初始化它。你可以通过以下方式初始化:

final ndpsAes = Ndpsflutternonaes();

4. 加密数据

使用 encrypt 方法对数据进行加密。你需要提供一个密钥(key)和初始化向量(iv):

String key = 'your-32-byte-key';  // 32字节的密钥
String iv = 'your-16-byte-iv';    // 16字节的初始化向量
String plainText = 'Hello, World!';

String encryptedText = ndpsAes.encrypt(plainText, key, iv);
print('Encrypted: $encryptedText');

5. 解密数据

使用 decrypt 方法对加密后的数据进行解密:

String decryptedText = ndpsAes.decrypt(encryptedText, key, iv);
print('Decrypted: $decryptedText');

6. 完整示例

以下是一个完整的示例,展示了如何使用 ndpsflutternonaes 插件进行加密和解密:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AES Encryption Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () {
                  final ndpsAes = Ndpsflutternonaes();
                  String key = 'your-32-byte-key';  // 32字节的密钥
                  String iv = 'your-16-byte-iv';    // 16字节的初始化向量
                  String plainText = 'Hello, World!';

                  String encryptedText = ndpsAes.encrypt(plainText, key, iv);
                  print('Encrypted: $encryptedText');

                  String decryptedText = ndpsAes.decrypt(encryptedText, key, iv);
                  print('Decrypted: $decryptedText');
                },
                child: Text('Encrypt & Decrypt'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

7. 注意事项

  • 密钥和初始化向量:确保密钥和初始化向量的长度符合 AES 算法的要求(密钥为 32 字节,初始化向量为 16 字节)。
  • 安全性:在实际应用中,密钥和初始化向量应妥善保管,避免硬编码在代码中。

8. 错误处理

在实际使用中,可能会遇到加密或解密失败的情况。建议在使用 encryptdecrypt 方法时添加错误处理逻辑,例如:

try {
  String encryptedText = ndpsAes.encrypt(plainText, key, iv);
  print('Encrypted: $encryptedText');
} catch (e) {
  print('Encryption failed: $e');
}

try {
  String decryptedText = ndpsAes.decrypt(encryptedText, key, iv);
  print('Decrypted: $decryptedText');
} catch (e) {
  print('Decryption failed: $e');
}
回到顶部