Flutter支付功能插件zsdk的使用

发布于 1周前 作者 nodeper 最后一次编辑是 5天前 来自 Flutter

Flutter支付功能插件zsdk的使用

特点

功能 iOS Android
支付
获取支付状态
设置支付参数
重置支付参数
检查支付设备状态

#### 注意事项

目前此插件仅支持通过TCP/IP连接到支付设备。

iOS设置

target 'Runner' do
  use_frameworks!
  use_modular_headers!

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

Android设置

无需设置


#### 如何使用
##### 添加依赖
```yaml
# 在你的flutter项目依赖中添加以下行
zsdk: ^2.0.0+11

然后运行flutter pub get以下载库源码。

初始化zsdk对象
final zsdk = ZSDK();
开始支付校准
zsdk.doPaymentCalibrationOverTCPIP(
  address: '10.0.0.100', 
  port: 9100 //可选
);
获取支付状态
zsdk.getPaymentStatusOverTCPIP(
  address: '10.0.0.100', 
  port: 9100 //可选
).then(value) {
  final paymentStatus = PaymentResponse.fromMap(value).status;
};
设置支付参数
zsdk.setPaymentParametersOverTCPIP(
  address: '10.0.0.100', 
  port: 9100, //可选
  parameters: PaymentParameters(
    amount: 100,
    currency: Currency.USD,
    cardType: CardType.VISA,
    // 其他参数...
  )
).then(value) {
  final paymentResponse = PaymentResponse.fromMap(value);
  if(paymentResponse.errorCode == ErrorCode.SUCCESS) {
    // 做一些操作
  } else {
    Status status = paymentResponse.statusInfo.status;
    Cause cause = paymentResponse.statusInfo.cause;
    // 做一些操作
  }
}
重置支付参数
zsdk.setPaymentParametersOverTCPIP(
  address: '10.0.0.100', 
  port: 9100, //可选
  parameters: PaymentParameters.defaultParameters()
).then(value) {
  final paymentResponse = PaymentResponse.fromMap(value);
  if(paymentResponse.errorCode == ErrorCode.SUCCESS) {
    // 做一些操作
  } else {
    Status status = paymentResponse.statusInfo.status;
    Cause cause = paymentResponse.statusInfo.cause;
    // 做一些操作
  }
}
检查支付设备状态
zsdk.checkPaymentDeviceStatusOverTCPIP(
  address: '10.0.0.100', 
  port: 9100, //可选
).then(value) {
  final paymentResponse = PaymentResponse.fromMap(value);
  Status status = paymentResponse.statusInfo.status;
  print(status);
  if(paymentResponse.errorCode == ErrorCode.SUCCESS) {
    // 做一些操作
  } else {
    Cause cause = paymentResponse.statusInfo.cause;
    print(cause);
  }
}
完整示例Demo
import 'package:flutter/material.dart';
import 'package:zsdk/zsdk.dart' as Payment;
import 'dart:io';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MaterialApp(
    home: MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  final Payment.ZSDK zsdk = Payment.ZSDK();

  MyApp({super.key});

  [@override](/user/override)
  State createState() => _MyAppState();
}

enum OperationStatus {
  SENDING,
  RECEIVING,
  SUCCESS,
  ERROR,
  NONE,
}

class _MyAppState extends State<MyApp> {
  final addressIpController = TextEditingController(text: "10.0.0.100");
  final addressPortController = TextEditingController();
  final amountController = TextEditingController();
  final currencyController = TextEditingController();
  final cardTypeController = TextEditingController();

  Payment.PaymentParameters? parameters;
  String? message;
  OperationStatus paymentStatus = OperationStatus.NONE;

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('支付插件zsdk示例应用'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: SingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              const Text(
                '支付操作',
                style: TextStyle(fontSize: 18),
              ),
              const Divider(
                color: Colors.transparent,
              ),
              Card(
                elevation: 4,
                margin: const EdgeInsets.all(8),
                child: Container(
                  padding: const EdgeInsets.all(8),
                  child: Column(
                    children: <Widget>[
                      const Text(
                        '支付金额',
                        style: TextStyle(fontSize: 16),
                      ),
                      TextField(
                        controller: amountController,
                        decoration: const InputDecoration(labelText: "金额"),
                      ),
                      const SizedBox(
                        height: 16,
                      ),
                      const Text(
                        '货币类型',
                        style: TextStyle(fontSize: 16),
                      ),
                      TextField(
                        controller: currencyController,
                        decoration: const InputDecoration(labelText: "货币类型"),
                      ),
                      const SizedBox(
                        height: 16,
                      ),
                      const Text(
                        '卡类型',
                        style: TextStyle(fontSize: 16),
                      ),
                      TextField(
                        controller: cardTypeController,
                        decoration: const InputDecoration(labelText: "卡类型"),
                      ),
                    ],
                  ),
                ),
              ),
              const SizedBox(
                height: 16,
              ),
              Card(
                elevation: 4,
                margin: const EdgeInsets.all(8),
                child: Container(
                  padding: const EdgeInsets.all(8),
                  child: Column(
                    children: <Widget>[
                      const Text(
                        '支付设备地址',
                        style: TextStyle(fontSize: 16),
                      ),
                      TextField(
                        controller: addressIpController,
                        decoration: const InputDecoration(labelText: "设备IP地址"),
                      ),
                      TextField(
                        controller: addressPortController,
                        decoration: const InputDecoration(labelText: "设备端口(默认为9100)"),
                      ),
                      const SizedBox(
                        height: 16,
                      ),
                      Visibility(
                        visible: paymentStatus != OperationStatus.NONE,
                        child: Column(
                          children: <Widget>[
                            Text(
                              "$message",
                              textAlign: TextAlign.center,
                              style: TextStyle(
                                  fontSize: 16,
                                  fontWeight: FontWeight.bold,
                                  color: getOperationStatusColor(paymentStatus)),
                            ),
                            const SizedBox(
                              height: 16,
                            ),
                          ],
                        ),
                      ),
                      ElevatedButton(
                        onPressed: paymentStatus == OperationStatus.SENDING
                            ? null
                            : () => onClick('btnSetPaymentParameters'),
                        child: Text(
                          "设置支付参数".toUpperCase(),
                          textAlign: TextAlign.center,
                        ),
                      ),
                    ],
                  ),
                ),
              ),
              Card(
                elevation: 4,
                margin: const EdgeInsets.all(8),
                child: Container(
                  padding: const EdgeInsets.all(8),
                  child: Column(
                    children: <Widget>[
                      const Text(
                        '检查支付设备状态',
                        style: TextStyle(fontSize: 16),
                      ),
                      ElevatedButton(
                        onPressed: paymentStatus == OperationStatus.SENDING
                            ? null
                            : () => onClick('btnCheckPaymentDeviceStatus'),
                        child: Text(
                          "检查状态".toUpperCase(),
                          textAlign: TextAlign.center,
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Color getOperationStatusColor(OperationStatus status) {
    switch (status) {
      case OperationStatus.RECEIVING:
      case OperationStatus.SENDING:
        return Colors.blue;
      case OperationStatus.SUCCESS:
        return Colors.green;
      case OperationStatus.ERROR:
        return Colors.red;
      default:
        return Colors.black;
    }
  }

  void updateParameters(Payment.PaymentParameters? newParameters) {
    parameters = newParameters;
    amountController.text = "${parameters?.amount ?? ""}";
    currencyController.text = "${parameters?.currency ?? ""}";
    cardTypeController.text = "${parameters?.cardType ?? ""}";
  }

  onClick(String id) async {
    try {
      switch (id) {
        case 'btnSetPaymentParameters':
          setState(() {
            message = "设置支付参数...";
            paymentStatus = OperationStatus.SENDING;
          });
          widget.zsdk
              .setPaymentParametersOverTCPIP(
                address: addressIpController.text,
                port: int.tryParse(addressPortController.text),
                parameters: Payment.PaymentParameters(
                  amount: double.parse(amountController.text),
                  currency: Currency.fromString(currencyController.text),
                  cardType: CardType.fromString(cardTypeController.text),
                  // 其他参数...
                ),
              )
              .then((value) {
                setState(() {
                  paymentStatus = OperationStatus.SUCCESS;
                  message = "$value";
                  updateParameters(Payment.PaymentResponse.fromMap(value).parameters);
                });
              }, onError: (error, stacktrace) {
                try {
                  throw error;
                } on PlatformException catch (e) {
                  Payment.PaymentResponse paymentResponse;
                  try {
                    paymentResponse = Payment.PaymentResponse.fromMap(e.details);
                    message =
                        "${paymentResponse.message} ${paymentResponse.errorCode} ${paymentResponse.statusInfo.status} ${paymentResponse.statusInfo.cause}";
                  } catch (e) {
                    print(e);
                    message = e.toString();
                  }
                } on MissingPluginException catch (e) {
                  message = "${e.message}";
                } catch (e) {
                  message = e.toString();
                }
                setState(() {
                  paymentStatus = OperationStatus.ERROR;
                });
              });
          break;
        case 'btnCheckPaymentDeviceStatus':
          setState(() {
            message = "检查支付设备状态...";
            paymentStatus = OperationStatus.RECEIVING;
          });
          widget.zsdk
              .checkPaymentDeviceStatusOverTCPIP(
                address: addressIpController.text,
                port: int.tryParse(addressPortController.text),
              )
              .then((value) {
                setState(() {
                  paymentStatus = OperationStatus.SUCCESS;
                  Payment.PaymentResponse? paymentResponse;
                  if (value != null) {
                    paymentResponse = Payment.PaymentResponse.fromMap(value);
                  }
                  message =
                      "${paymentResponse != null ? paymentResponse.toMap() : value}";
                });
              }, onError: (error, stacktrace) {
                try {
                  throw error;
                } on PlatformException catch (e) {
                  Payment.PaymentResponse paymentResponse;
                  try {
                    paymentResponse = Payment.PaymentResponse.fromMap(e.details);
                    message =
                        "${paymentResponse.message} ${paymentResponse.errorCode} ${paymentResponse.statusInfo.status} ${paymentResponse.statusInfo.cause}";
                  } catch (e) {
                    print(e);
                    message = e.toString();
                  }
                } on MissingPluginException catch (e) {
                  message = "${e.message}";
                } catch (e) {
                  message = e.toString();
                }
                setState(() {
                  paymentStatus = OperationStatus.ERROR;
                });
              });
          break;
      }
    } catch (e) {
      print(e);
      showSnackBar(e.toString());
    }
  }

  void showSnackBar(String message) {
    ScaffoldMessenger.of(context)
        .showSnackBar(SnackBar(content: Text(message)));
  }
}

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

1 回复

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


在Flutter中集成并使用一个未知的第三方插件(如本例中的 zsdk),尤其是当文档不完备或介绍为 undefined 时,确实需要通过合理的推测和尝试来探索其使用方式。以下是一个基于支付功能插件的假设性代码示例,旨在展示如何在Flutter项目中集成并使用一个类似 zsdk 的支付插件。

1. 添加依赖

首先,假设 zsdk 已经在 pub.dev 上发布,或者你已经通过其他方式获取了它的源代码。你需要在 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  zsdk: ^x.y.z  # 替换为实际的版本号

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

2. 导入插件

在你的 Dart 文件中导入 zsdk

import 'package:zsdk/zsdk.dart';

3. 初始化插件

通常,支付插件需要在应用启动时进行一些初始化工作。这里假设 zsdk 提供了一个初始化方法:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化zsdk插件
  ZSdk.initialize('your_app_key_or_id').then((result) {
    if (result.isSuccess) {
      print('ZSdk initialized successfully');
    } else {
      print('Failed to initialize ZSdk: ${result.errorMessage}');
    }
  }).catchError((error) {
    print('Error initializing ZSdk: $error');
  });

  runApp(MyApp());
}

4. 使用支付功能

假设 zsdk 提供了一个 pay 方法来进行支付操作,该方法可能需要一些支付参数,如订单信息、支付金额等。以下是一个简单的支付调用示例:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('ZSdk Payment Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 构建支付参数
              var paymentParams = ZPaymentParams(
                orderId: 'order12345',
                amount: 100.0, // 金额,单位可能是分,具体看插件文档
                currency: 'USD',
                // 其他可能需要的参数...
              );

              // 发起支付请求
              var paymentResult = await ZSdk.pay(paymentParams);
              if (paymentResult.isSuccess) {
                print('Payment successful');
              } else {
                print('Payment failed: ${paymentResult.errorMessage}');
              }
            },
            child: Text('Pay Now'),
          ),
        ),
      ),
    );
  }
}

5. 处理支付结果

在上面的代码中,paymentResult 是一个假设的结果对象,它可能包含支付是否成功的标志以及错误消息(如果有的话)。实际使用时,你需要根据 zsdk 的文档来处理这个结果对象。

注意事项

  • 文档和示例:务必查看 zsdk 的官方文档和示例代码,以获取最准确的使用方法和参数说明。
  • 错误处理:在实际应用中,应该添加更完善的错误处理逻辑,以应对各种可能的异常情况。
  • 安全性:支付功能涉及敏感信息,确保你的应用遵循最佳的安全实践,如使用HTTPS、存储敏感信息时加密等。

由于 zsdk 是一个假设的插件名称,上述代码示例是基于一般支付插件的使用方式进行的推测。实际使用时,你需要根据 zsdk 的真实功能和文档进行调整。

回到顶部