Flutter插件enzona的介绍与使用

Flutter插件enzona的介绍与使用

描述

该库是一个SDK(仍在开发中),旨在简化对ENZONA API的使用。通过使用此SDK,开发者可以专注于其项目的核心业务逻辑。

可用API

以下是当前可用的API列表:

API名称 状态
PaymentAPI
QRAPI
ClaimAPI
XMET_AccountAPI
XMET_AccountingOperationAPI

入门指南

在开始使用此SDK之前,建议先查看ENZONA官方文档,了解测试环境(如bulevar/api sandbox)并熟悉API的工作流和功能。

推荐资源:

  1. 简单的教程
  2. 官方文档和示例

如何添加此SDK到项目中

首先,在项目中添加enzona作为依赖项,具体步骤如下:

对于纯Dart项目:

dart pub add enzona

对于Flutter项目:

flutter pub add enzona

最后执行以下命令以下载依赖项到您的pub-cache

dart pub get 或 flutter pub get

如何使用此SDK

使用SDK非常简单,只需创建一个实例并初始化即可。

创建SDK实例:

final enzona = Enzona(  
  apiUrl: apiUrl, // ENZONA API的基本URL (https://api.enzona.net 或 https://apisandbox.enzona.net)
  accessTokenUrl: accessTokenUrl, // 可选,OAuth2认证端点URL (https://api.enzona.net/token 或 https://apisandbox.enzona.net/token),若未指定,默认为 `$apiUrl/token`
  consumerKey: consumerKey, // 商户的Consumer Key
  consumerSecret: consumerSecret, // 商户的Consumer Secret
  scopes: scopes, // 认证Token的范围
  timeout: Duration(seconds: 30), // 可选,设置请求超时时间
  httpClient: HttpClient(), // 可选,用于自定义HTTP客户端配置
);

初始化SDK:

await enzona.init();

此时,您已成功获取访问ENZONA API的权限!


身份验证机制

ENZONA的API使用OAuth2变体进行身份验证(无Token自动刷新)。此SDK实现了OAuth2,并且会自动处理Token的刷新,无需手动干预。

手动刷新Token:

if(enzona.credentials.isExpired) {  
  final credentials = await enzona.refreshCredentials();  
  print(credentials.accessToken);
}

注意事项

为避免属性名、过滤器和值错误,请注意以下类的使用:

  • Params:定义所有属性名和过滤器。
  • StatusCode:定义交易状态码。
  • Order:定义排序类型。

示例代码:

final filters = <String, dynamic> {  
  Params.pageIndex: 0,  
  Params.pageSize: 5,  
  Params.order: Order.desc,  
};  

final response = await enzona.paymentAPI.getPayments(filters: filters);  

if(response.isSuccessful && (response.body?.isNotEmpty ?? false)) {  
  final payment = response.body![0];  
  if(payment.statusCode == StatusCode.confirmada) {  
    print(payment.amount?.total);  
  }  
}

使用PaymentAPI

通过SDK实例,您可以访问各种API,包括支付API。请注意,认证的scope决定了可访问的API范围。

PaymentAPI支持的功能:

功能 支持情况
列表/筛选支付记录
获取单个支付详情
创建支付
完成支付
取消支付
列表/筛选退款
获取单个退款详情
完全退款
部分退款

示例:列出/筛选支付记录

final response = await enzona.paymentAPI.getPayments(
  pageIndex: 0,
  pageSize: 5,
  merchantUUID: 'test',
  merchantOp: 'test',
  enzonaOp: 'test',
  status: StatusCode.confirmada,
  startDate: DateTime.now().subtract(Duration(days: 7)),
  endDate: DateTime.now(),
  order: Order.desc,
);  

if(response.isSuccessful && (response.body?.isNotEmpty ?? false)) {  
  print('totalCount: ${response.headers[Pagination.totalCountHeader]}');  
  for(var payment in response.body!) {  
    print('id: ${payment.transactionUUID}, statusCode: ${payment.statusCode}');  
  }  
}

示例:获取单个支付详情

final response = await enzona.paymentAPI.getPayment(transactionUUID: '支付ID');  
if(response.isSuccessful) {  
  final payment = response.body;  
  print('id: ${payment?.transactionUUID}, statusCode: ${payment?.statusCode}');  
}  

示例:创建支付

final payment = PaymentRequest(  
  returnUrl: "http://url.to.return.after.payment.confirmation",  
  cancelUrl: "http://url.to.return.after.payment.cancellation",  
  merchantOpId: PaymentRequest.generateRandomMerchantOpId(),  
  currency: "CUP",  
  amount: PaymentAmount(  
    total: 33,  
    details: PaymentAmountDetails(  
      shipping: 1,  
      tax: 0,  
      discount: 2,  
      tip: 4,  
    ),  
  ),  
  items: [  
    PaymentItem(  
      name: "Payment Item 1",  
      description: "Some item description",  
      quantity: 2,  
      price: 15,  
      tax: 0,  
    )  
  ],  
  description: "This is an example payment description",  
);

final response = await enzona.paymentAPI.createPayment(data: payment);  
if(response.isSuccessful) {  
  final createdPayment = response.body;  
  print('id: ${createdPayment?.transactionUUID}, statusCode: ${createdPayment?.statusCode}');  
}  

示例:完成支付

final response = await enzona.paymentAPI.completePayment(transactionUUID: '支付ID');  

if(response.isSuccessful) {  
  final completedPayment = response.body;  
  print('id: ${completedPayment?.transactionUUID}, statusCode: ${completedPayment?.statusCode}');  
} else if(response.error is ErrorResponse &&  
    (response.error as ErrorResponse).code == StatusCode.transaccionNoConfirmada) {  
  final errorResponse = response.error as ErrorResponse;  
  print('错误信息: ${errorResponse.message}. 支付必须先确认才能完成');  
}  

示例:取消支付

final response = await enzona.paymentAPI.cancelPayment(transactionUUID: '支付ID');  

if(response.isSuccessful) {  
  final cancelledPayment = response.body;  
  print('id: ${cancelledPayment?.transactionUUID}, statusCode: ${cancelledPayment?.statusCode}');  
} else {  
  print('发生错误,无法取消支付');  
}  

示例:获取退款列表

final response = await enzona.paymentAPI.getRefunds(
  pageIndex: 0,
  pageSize: 5,
  merchantUUID: 'test',
  transactionUUID: '支付ID',
  status: StatusCode.aceptada,
  startDate: DateTime.now().subtract(Duration(days: 7)),
  endDate: DateTime.now(),
  order: Order.desc,
);  

if(response.isSuccessful && (response.body?.isNotEmpty ?? false)) {  
  print('totalCount: ${response.headers[Pagination.totalCountHeader]}');  
  for(var refund in response.body!) {  
    print('id: ${refund.transactionUUID}, statusCode: ${refund.statusCode}');  
  }  
}

示例:完全退款

final response = await enzona.paymentAPI.refundPayment(transactionUUID: '支付ID');  
if(response.isSuccessful) {  
  final refund = response.body;  
  print('id: ${refund?.transactionUUID}, statusCode: ${refund?.statusCode}');  
}  

示例:部分退款

final refund = Refund(  
  amount: PaymentAmount(  
    total: 5,  
  ),  
  description: 'This is a partial refund'  
);  

final response = await enzona.paymentAPI.refundPayment(transactionUUID: '支付ID', data: refund);

if(response.isSuccessful) {  
  final refund = response.body;  
  print('id: ${refund?.transactionUUID}, statusCode: ${refund?.statusCode}');  
}

更多关于Flutter插件enzona的介绍与使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


Enzona 是一个用于在 Flutter 应用中集成支付功能的插件。它允许开发者通过 Enzona 的支付网关来处理支付交易。这个插件可能并不是 Flutter 官方插件库中的一部分,因此在使用之前,你可能需要确保它的可靠性和兼容性。

1. 安装 Enzona 插件

首先,你需要在 pubspec.yaml 文件中添加 enzona 插件的依赖项。假设你已经知道插件的名称和版本号,你可以这样添加:

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

然后运行 flutter pub get 来安装依赖。

2. 初始化 Enzona 插件

在使用 Enzona 插件之前,你通常需要对其进行初始化。这通常涉及到设置 API 密钥、环境(沙盒或生产)等。

import 'package:enzona/enzona.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await Enzona.initialize(
    apiKey: 'your_api_key',
    environment: EnzonaEnvironment.sandbox, // 或 EnzonaEnvironment.production
  );
  
  runApp(MyApp());
}

3. 创建支付订单

你可以使用 Enzona 插件来创建一个支付订单。通常,你需要提供订单的详细信息,如金额、描述等。

void createPaymentOrder() async {
  try {
    final response = await Enzona.createPaymentOrder(
      amount: 100.0, // 金额
      description: 'Test payment', // 描述
    );
    
    if (response.success) {
      print('Payment order created: ${response.data}');
    } else {
      print('Failed to create payment order: ${response.error}');
    }
  } catch (e) {
    print('Error creating payment order: $e');
  }
}

4. 处理支付回调

在用户完成支付后,Enzona 会通过回调通知你支付结果。你需要在应用中处理这些回调。

void handlePaymentCallback(PaymentCallback callback) {
  if (callback.status == PaymentStatus.success) {
    print('Payment successful: ${callback.data}');
  } else {
    print('Payment failed: ${callback.error}');
  }
}

5. 集成到用户界面

你可以将支付功能集成到你的应用界面中,例如在一个按钮的点击事件中触发支付流程。

class PaymentScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Payment'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: createPaymentOrder,
          child: Text('Pay Now'),
        ),
      ),
    );
  }
}

6. 处理错误和异常

在使用 Enzona 插件时,务必处理好各种可能的错误和异常,以确保应用的稳定性和用户体验。

void createPaymentOrder() async {
  try {
    final response = await Enzona.createPaymentOrder(
      amount: 100.0,
      description: 'Test payment',
    );
    
    if (response.success) {
      print('Payment order created: ${response.data}');
    } else {
      print('Failed to create payment order: ${response.error}');
    }
  } catch (e) {
    print('Error creating payment order: $e');
  }
}
回到顶部