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包含微交易方法makePassPurchasepaymentAmount字段需要乘以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

1 回复

更多关于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说明和示例代码。

回到顶部