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
更多关于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. 错误处理
在实际使用中,可能会遇到加密或解密失败的情况。建议在使用 encrypt
和 decrypt
方法时添加错误处理逻辑,例如:
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');
}