Flutter插件flutter_eghl的使用方法
Flutter插件flutter_eghl的使用方法
Flutter eGHL SDK
A eGHL packages for Flutter project.
⚠️ 注意事项
eGHL Flutter SDK 目前仅实现了 ECR 功能!
Flutter插件flutter_eghl特性 ✨
- Ecr Sale
- Ecr Void
- Ecr Refund
- Ecr Settlement
- Ecr Last Settlement
Flutter
在您的代码中导入该包:
import 'package:flutter_eghl/flutter_eghl_sdk.dart';
Android
在 Android 中,请在 AndroidManifest.xml
文件中添加以下权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.your.app">
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
iOS
- 平台版本必须至少为 11.0。
- 修改
ios/Podfile
文件并相应更新。
platform :ios, '11.0'
如果行首有 #
号,请移除。
MacOS
- 平台版本必须至少为 10.15。
- 修改
macos/Podfile
文件并相应更新。
platform :osx, '10.15'
如果行首有 #
号,请移除。
-
设置 macOS 的最低部署目标为 10.15。
-
使用 XCode 打开
macos/Runner.xcworkspace
。 -
按照 iOS 指令修改
Info.plist
。 -
在
macos/Runner/DebugProfile.entitlements
和macos/Runner/Release.entitlements
中添加以下内容:
<key>com.apple.security.network.client</key>
<true/>
简单使用
// 您的 eGHL 公钥路径(PEM 格式)
final String _publicKeyPath = "";
// 您的 eGHL 私钥路径(PEM 格式)
final String _privateKeyPath = "";
// 您的 eGHL URL
final String _url = "";
// eGHL 商户ID
final String _merchantID = "";
// eGHL 终端ID
final String _terminalID = "";
void main() {
EghlSdk.init(
publicKeyPath: _publicKeyPath,
privateKeyPath: _privateKeyPath,
url: _url,
merchantID: _merchantID,
terminalID: _terminalID,
);
}
// 获取 eGHL 实例
final sdk = EghlSdk.instance;
// 检查 eGHL 网络是否正常工作
await sdk.networkCheck();
ercSale
通知 eGHL 终端进行销售操作:
// 通知 eGHL 终端销售
sdk.ecrSale(amount: 4.5, operatorID: "LISHII");
ecrSale
字段说明:
名称 | 类型 | 描述 |
---|---|---|
amount | String | 交易金额(必填) |
operatorID | String | 操作员ID(可选) |
customField | String | 自定义字段(可选) |
ercVoid
撤销交易:
// 撤销交易
sdk.ecrVoid(amount: 4.5);
ecrVoid
字段说明:
名称 | 类型 | 描述 |
---|---|---|
amount | String | 交易金额(必填) |
operatorID | String | 操作员ID(可选) |
orgTxnRef | String | 交易引用码(可选) |
txnTraceID | String | 唯一标识每个交易请求的ID(可选) |
customField | String | 自定义字段(可选) |
ercRefund
退款交易:
// 退款交易
sdk.ecrRefund(amount: 4.5, operatorID: "LSHII");
ecrRefund
字段说明:
名称 | 类型 | 描述 |
---|---|---|
amount | String | 交易金额(必填) |
operatorID | String | 操作员ID(可选) |
orgTxnRef | String | 交易引用码(可选) |
txnTraceID | String | 唯一标识每个交易请求的ID(可选) |
productCode | String | 提供商提供的产品代码(可选) |
customField | String | 自定义字段(可选) |
ecrSettlement
通知 eGHL 终端显示结算信息:
// 通知 eGHL 终端显示结算
sdk.ecrSettlement();
ecrLastSettlement
通知 eGHL 终端显示上次结算信息:
// 通知 eGHL 终端显示上次结算
sdk.ecrLastSettlement();
eGHL 响应代码
响应码 | 响应消息 |
---|---|
0 | 成功 |
XT | 超时 |
01-99 | 来自 MAH 主机的错误 |
B0 | 银行端交易超时 |
C0 | 扩展设备端交易超时 |
C1 | 不支持的卡 |
C2 | 金额超过最大限制 |
C3 | 未找到交易(例如:无效发票号) |
C4 | EMV 相关错误(例如:卡片被拒绝) |
C5 | 交易已被撤销 |
C6 | 扩展设备内存满 |
C7 | 交易已取消 |
C8 | 无效的卡输入方式 |
C9 | 必须先执行结算才能继续 |
CA | 通信错误 |
CB | 批次为空 |
CC | 结算失败 |
D1 | CRC 失败(例如:确保设备日期时间正确,输入请求消息正确) |
…(其他响应码省略)
常见问题 ❔
我已经设置了所有正确的设置,但仍然收到超时响应
请确保您的终端已成功连接。
致谢
感谢 Dart-Basic-Utils 提供加密工具。
示例代码
import 'package:flutter/material.dart';
import 'package:flutter_eghl/flutter_eghl_sdk.dart';
import 'package:flutter_eghl_example/app.dart';
const String _publicKeyPath = ""; // 您的 eGHL 公钥路径
const String _privateKeyPath = ""; // 您的 eGHL 私钥路径
const String _url = ""; // 您的 eGHL URL
const String _merchantID = ""; // eGHL 商户ID
const String _terminalID = ""; // eGHL 终端ID
void main() {
EghlSdk.init(
publicKeyPath: _publicKeyPath,
privateKeyPath: _privateKeyPath,
url: _url,
merchantID: _merchantID,
terminalID: _terminalID,
);
runApp(const EghlExampleApp());
}
更多关于Flutter插件flutter_eghl的使用方法的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter插件flutter_eghl的使用方法的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用flutter_eghl
插件的示例代码案例。假设flutter_eghl
是一个用于集成某种特定功能(例如电子网关或支付功能)的Flutter插件。请注意,由于flutter_eghl
可能不是一个实际存在的插件(我未能在Flutter的官方或社区插件库中找到它),以下示例将基于一个假设的支付插件功能进行构建。
首先,确保你已经在pubspec.yaml
文件中添加了flutter_eghl
依赖项(假设它存在):
dependencies:
flutter:
sdk: flutter
flutter_eghl: ^x.y.z # 替换为实际版本号
然后,运行flutter pub get
来安装依赖项。
接下来,在你的Flutter应用中,你可以按照以下方式使用flutter_eghl
插件:
import 'package:flutter/material.dart';
import 'package:flutter_eghl/flutter_eghl.dart'; // 假设的包导入路径
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final FlutterEghl _flutterEghl = FlutterEghl();
Future<void> initiatePayment() async {
try {
// 假设支付配置需要这些参数
Map<String, String> paymentDetails = {
'amount': '100.00',
'currency': 'USD',
'description': 'Test Payment',
// 其他必要的支付参数
};
// 发起支付请求
var result = await _flutterEghl.initiatePayment(paymentDetails);
// 处理支付结果
if (result['status'] == 'success') {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Payment Successful'),
content: Text('Payment has been successfully processed.'),
actions: <Widget>[
FlatButton(
child: Text('OK'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
} else {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Payment Failed'),
content: Text('Payment failed with error: ${result['error']}'),
actions: <Widget>[
FlatButton(
child: Text('OK'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
}
} catch (e) {
// 处理异常
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Error'),
content: Text('An error occurred: $e'),
actions: <Widget>[
FlatButton(
child: Text('OK'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter EGHL Demo'),
),
body: Center(
child: ElevatedButton(
onPressed: initiatePayment,
child: Text('Initiate Payment'),
),
),
);
}
}
在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮用于发起支付请求。当用户点击按钮时,initiatePayment
函数会被调用,该函数使用flutter_eghl
插件的initiatePayment
方法来发送支付请求,并处理支付结果。
请注意,由于flutter_eghl
可能不是一个实际存在的插件,因此上述代码中的方法调用和参数可能需要根据实际插件的API进行调整。如果你正在使用一个特定的插件,请查阅该插件的官方文档以获取正确的使用方法和参数。