Flutter安全验证插件pass_mtx的使用
Flutter安全验证插件pass_mtx的使用
平台支持
Android | iOS |
---|---|
✔️ | ✔️ |
安装
在pubspec.yaml
文件中添加以下依赖项:
dependencies:
pass_mtx: ^0.0.31
导入
在Dart文件中导入插件:
import 'package:pass_mtx/pass_mtx.dart';
使用/示例
初始化与检查连接
开发时可以使用init
函数选择PASS
购买或其他方法的环境。开发完成后,将其更改为initProd
。
// 初始化用于测试环境,使用AppID、ClientID、PrivateKey、PublicKey
init(String appId, String clientId, String privatePem, String publicPem);
// 初始化用于生产环境,使用AppID、ClientID、PrivateKey、PublicKey
initProd(String appId, String clientId, String privatePem, String publicPem);
// 获取Pass API状态
getPassPing();
// 获取Pass版本信息
getPassVersion();
// 初始化示例,使用'kReleaseMode'
if (kReleaseMode) {
passInitResult = await _passMtxPlugin.initProd(
appId, clientId, privatePem, publicPem) ??
'Unknown platform version';
} else {
passInitResult = await _passMtxPlugin.init(appId, clientId, privatePem, publicPem) ??
'Unknown platform version';
}
卡片方法
包括卡片注册和获取添加到PASS
钱包中的卡片列表或删除它们的方法。
// 根据UserID获取卡令牌
getCard(String userId);
// 保存用户卡信息
saveCard(String userId, String szPan, String expDate, String cardHolderName);
// 验证卡
verifyCard(String userId, String verificationMethod, String verificationValue)
// 删除用户卡
deleteCard(String userId, String cardRef);
// 设置默认卡
setDefaultCard(String userId, String cardRef);
购买
直接购买
Pass MTX包含微交易方法makePassPurchase
。paymentAmount
字段需要乘以100以获得原始金额。如果用户输入控制器中的值为1000,则将其乘以1000 * 100后通过paymentAmount
字段发送。
// 执行Pass购买
makePassPurchase(
String userId,
String orderId,
String paymentToken,
String expDate,
String paymentAmount,
String dbRefNo,
String description
)
// 购买示例
TextEditingController amountController = TextEditingController(); // 当控制器文本为1000时
String amount = amountController.text;
String realAmount = (int.parse(amount) * 100).toString();
try {
passPurchaseResult = await _passMtxPlugin.makePassPurchase(
"1", // userId
"pass_inapp_txn_1", // orderId
tokenController.text, // paymentToken
"2509", // expDate
realAmount, // paymentAmount
"DTB${DateTime.now().toIso8601String()}", // dbRefNo
"pass txn test", // description
) ??
'Make Purchase Failed';
} on PlatformException {
passPurchaseResult = 'Failed to get platform version.';
}
客户展示模式购买
// 查询由扫描仪扫描的呈现的二维码并获取支付过程
orderEnquery(String userId, String orderId)
// 可选:当金额高于或低于CVM限制时
orderConfirm(
String userId,
String orderId,
String confirmMethod,
String confirmResult,
String payToken,
String expDate)
// 用户取消订单
orderCancel(String userId, String orderId)
完整示例Demo
以下是完整的Flutter应用示例,展示了如何使用pass_mtx
插件进行初始化、卡片操作和购买:
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:pass_mtx/pass_mtx.dart';
import 'package:qr_flutter/qr_flutter.dart';
void main() {
runApp(const MaterialApp(home: MyApp()));
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
static const String RESPONSE_OK = "ok";
static const String RESPONSE_NG = "ng";
String _passInitResult = 'Unknown';
String loggedUserId = "1";
String verificationMethod = "amount";
String verificationValue = "1010";
String? qrData;
String? orderId;
final _passMtxPlugin = PassMtx();
TextEditingController responseController = TextEditingController();
TextEditingController response2Controller = TextEditingController();
TextEditingController amountController = TextEditingController();
TextEditingController tokenController = TextEditingController();
TextEditingController cardNoController = TextEditingController();
TextEditingController cardExpireDateController = TextEditingController();
TextEditingController cardHolderNameController = TextEditingController();
[@override](/user/override)
void initState() {
super.initState();
initPlatformState();
}
Future<void> initPlatformState() async {
String passInitResult;
String appId = "<APP_ID>";
String clientId = "ClientID"; // DATABANK生成的ClientID
String privatePem = "PrivateKey"; // DATABANK生成的PrivateKey
String publicPem = "PublicKey"; // DATABANK生成的PublicKey
try {
if (kReleaseMode) {
passInitResult = await _passMtxPlugin.initProd(appId, clientId, privatePem, publicPem) ?? 'Unknown platform version';
} else {
passInitResult = await _passMtxPlugin.init(appId, clientId, privatePem, publicPem) ?? 'Unknown platform version';
}
} on PlatformException {
passInitResult = 'Failed to get platform version.';
}
if (!mounted) return;
setState(() {
_passInitResult = passInitResult;
response2Controller.text = _passInitResult;
});
}
Future<void> callSaveCard(String szPan, String szExpDate, String szCardHolderName) async {
String saveCardResult;
try {
saveCardResult = await _passMtxPlugin.saveCard(loggedUserId, szPan, szExpDate, szCardHolderName) ?? 'Save Card Failed';
} on PlatformException {
saveCardResult = 'Failed to Save Card.';
}
Map<String, dynamic> jsonBody = json.decode(saveCardResult);
if (jsonBody.containsKey("status_code") && jsonBody["status_code"] == RESPONSE_OK) {
Map<String, dynamic> jsonRet = jsonBody["ret"];
if (jsonRet.containsKey("amount")) {
verificationValue = jsonRet["amount"].substring(jsonRet["amount"].length - 4);
try {
await _passMtxPlugin.verifyCard(loggedUserId, verificationMethod, verificationValue) ?? 'Verify Card Failed';
} on PlatformException {
debugPrint('Failed to Verify Card.');
}
}
}
setState(() {
response2Controller.text = saveCardResult;
});
}
Future<void> makePassPurchase() async {
if (amountController.text.isEmpty) {
return;
}
String amount = amountController.text;
String realAmount = (int.parse(amount) * 100).toString();
DateTime now = DateTime.now();
String formattedDate = DateFormat('yyyyMMddHHmmss').format(now);
try {
String passPurchaseResult = await _passMtxPlugin.makePassPurchase(
"1", // userId
"pass_inapp_txn_1", // orderId
tokenController.text, // paymentToken
"2509", // expDate
realAmount, // paymentAmount
"DTB$formattedDate", // dbRefNo
"pass txn test", // description
) ??
'Make Purchase Failed';
setState(() {
responseController.text = passPurchaseResult;
});
} on PlatformException {
setState(() {
responseController.text = 'Failed to get platform version.';
});
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return DefaultTabController(
initialIndex: 0,
length: 3,
child: Scaffold(
appBar: AppBar(
title: const Text('Pass MTX Example'),
bottom: const TabBar(tabs: [
Tab(icon: Icon(Icons.credit_card_outlined)),
Tab(icon: Icon(Icons.shopping_cart_outlined), text: "Sale /direct/"),
Tab(icon: Icon(Icons.shopping_cart_outlined), text: "Sale /cpm/"),
]),
),
body: TabBarView(children: [
SingleChildScrollView(
child: Wrap(
spacing: 20,
runSpacing: 20,
children: [
TextField(controller: cardNoController, decoration: const InputDecoration(labelText: 'Card Number')),
TextField(controller: cardHolderNameController, decoration: const InputDecoration(labelText: 'Card Holder Name')),
TextField(controller: cardExpireDateController, decoration: const InputDecoration(labelText: 'Expire Date')),
Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
TextButton(child: const Text("Save"), onPressed: () => callSaveCard(cardNoController.text, cardExpireDateController.text, cardHolderNameController.text)),
TextButton(child: const Text("Load"), onPressed: () {}),
TextButton(child: const Text("Set Default"), onPressed: () {}),
TextButton(child: const Text("Delete"), onPressed: () {}),
]),
TextField(controller: response2Controller, readOnly: true, maxLines: 10, decoration: const InputDecoration(border: OutlineInputBorder())),
],
),
),
Column(crossAxisAlignment: CrossAxisAlignment.center, children: [
TextField(controller: tokenController, decoration: const InputDecoration(labelText: 'Payment Token')),
TextField(controller: amountController, decoration: const InputDecoration(labelText: 'Amount')),
TextButton(child: const Text("Pay"), onPressed: makePassPurchase),
TextField(controller: responseController, readOnly: true, maxLines: 10, decoration: const InputDecoration(border: OutlineInputBorder())),
]),
SingleChildScrollView(
child: Column(children: [
TextField(controller: tokenController, decoration: const InputDecoration(labelText: 'Payment Token')),
TextField(controller: cardExpireDateController, decoration: const InputDecoration(labelText: 'Expire Date')),
TextButton(child: const Text("GET QR"), onPressed: () {}),
qrData != null ? QrImageView(data: qrData ?? "", size: 200.0) : Container(),
TextButton(child: const Text("CANCEL"), onPressed: () {}),
]),
),
]),
),
);
}
}
更多关于Flutter安全验证插件pass_mtx的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter安全验证插件pass_mtx的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中集成和使用pass_mtx
插件进行安全验证的示例代码。pass_mtx
插件(假设它是一个提供安全验证功能的插件)通常用于处理密码、指纹、面部识别等身份验证方式。不过,请注意,pass_mtx
并非一个真实存在的官方插件,这里的示例代码是基于假设其功能的一个通用实现。
首先,你需要在pubspec.yaml
文件中添加pass_mtx
插件(假设它已存在于pub.dev上):
dependencies:
flutter:
sdk: flutter
pass_mtx: ^x.y.z # 替换为实际版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以按照以下方式使用pass_mtx
插件进行安全验证:
import 'package:flutter/material.dart';
import 'package:pass_mtx/pass_mtx.dart'; // 假设这是插件的导入路径
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Security Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: SecurityScreen(),
);
}
}
class SecurityScreen extends StatefulWidget {
@override
_SecurityScreenState createState() => _SecurityScreenState();
}
class _SecurityScreenState extends State<SecurityScreen> {
final PassMtx _passMtx = PassMtx();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Security Verification'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Please verify your identity:',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
try {
bool isVerified = await _verifyIdentity();
if (isVerified) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Verification Successful!')),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Verification Failed!')),
);
}
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error: $e')),
);
}
},
child: Text('Verify'),
),
],
),
),
);
}
Future<bool> _verifyIdentity() async {
// 假设插件提供了一个verify方法,返回一个Future<bool>
// 这里只是一个示例,实际插件的方法可能会有所不同
return _passMtx.verify();
}
}
// 假设PassMtx类是这样的(实际上你应该参考插件的官方文档)
class PassMtx {
// 模拟一个异步验证方法
Future<bool> verify() async {
// 这里可以添加实际的验证逻辑,比如调用系统API进行指纹/面部识别
// 或者验证密码等
// 这里为了演示,我们直接返回一个模拟的结果
await Future.delayed(Duration(seconds: 2)); // 模拟异步操作
return true; // 假设验证成功
}
}
请注意,上述代码中的PassMtx
类及其verify
方法仅用于演示目的。在实际使用中,你应该参考pass_mtx
插件的官方文档来了解其提供的API和具体使用方法。
由于pass_mtx
并非一个真实存在的插件,上述代码中的PassMtx
类及其方法只是模拟了一个可能的实现。在实际项目中,你需要根据插件的实际功能来调用相应的方法。通常,插件的官方文档会提供详细的API说明和示例代码。