Flutter文本传输处理插件surfboard_ttp的使用
Flutter文本传输处理插件surfboard_ttp的使用
Flutter文本传输处理插件surfboard_ttp 概述
Surfboard TTP 插件使您的 Flutter 应用能够通过 Tap To Phone (TTP) 技术接受卡支付。此插件目前仅适用于 Android。
在开始使用 Surfboard TTP 插件之前,我们建议您拥有一个 Surfboard Payments 账户以获取 API 凭证。我们还建议您阅读我们的指南和 SDK 文档。
Surfboard TTP 插件与 Surfboard Payments API 配合工作。此 SDK 允许执行以下操作:
- 终端注册
- 订单创建、更新和取消
- 支付初始化、状态检查和取消
要执行管理操作,需要与 Surfboard Payments API 进行集成。SDK 还需要每个商户的 auth token。更多详细信息可以在开发者文档中找到。
Flutter文本传输处理插件surfboard_ttp开始使用
添加依赖
首先,在项目中添加 surfboard_ttp
作为依赖项。请注意,此包依赖于其他常用的包,如 android_id
, android_intent_plus
, device_apps
, device_info_plus
, http
和 package_info_plus
。
flutter pub add surfboard_ttp
权限
在 AndroidManifest.xml 中添加所需的权限:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<uses-permission android:name="android.permission.INTERNET"/>
初始化插件
导入插件并在应用中初始化它。请注意,如果终端已经注册,则需要传递 terminalId
以避免重新注册过程。还需要商户 ID 和商店 ID。
import 'package:surfboard_ttp/surfboard_ttp.dart';
SurfboardTTP surfboardTTP = SurfboardTTP(
apiUrl: 'your_api_url',
terminalId: 'your_terminal_id',
ttpBundleId: "your_bundle_id",
partnerId: "your_partner_id",
merchantId: "your_merchant_id",
storeId: "your_store_id",
appId: "your_app_id",
);
设置认证令牌
设置由 Auth Token API 生成的 auth token。此方法可以调用来设置新的令牌。SDK 将使用此令牌进行所有后续 API 调用。
surfboardTTP.setAuthToken(authToken: 'your_auth_token');
终端注册
这是在每个新 Android 设备上执行的一次性过程。我们建议您将终端注册作为商户入职流程的一部分。
final Terminal terminal = Terminal();
bool isPinInstalled = await terminal.isPinAppInstalled();
String terminalId = await terminal.registerTerminal(appLifecycleStream.stream);
创建订单并发起支付
一旦通过 API 创建了订单,您可以使用 SDK 发起卡支付。
Order order = Order(orderType: OrderType.purchase, orderId: 'your_order_id');
Payment payment = await order.initiatePayment();
获取支付状态
要检查当前支付实例的支付状态。返回 PaymentStatus
。
PaymentStatus paymentStatus = await payment.getPaymentStatus();
获取交易详情
一旦支付状态为 completed
,可以通过调用此方法获取交易详情。
TransactionDetails transactionDetails = await payment.getTransactionDetails();
其他方法
如果您希望在客户端创建订单,我们还提供了用于订单创建的实用方法。您可以使用 SDK 创建订单并对其执行操作。订单对象通过传递 OrderType
构造函数来创建。
Order order = Order(orderType: OrderType.purchase);
LineItem lineItem = LineItem(
id: '1234',
quantity: 1,
name: 'item1',
itemAmount: ItemAmount(
regular: 1000,
total: 1000,
currency: Currency.sek,
tax: [
Tax(
amount: 100,
percentage: 10,
type: TaxType.vat,
),
],
),
);
order.addLineItem(lineItem).createOrder();
完整示例
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:surfboard_ttp/surfboard_ttp.dart';
import 'package:surfboard_ttp/models/order_model/order_models.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
initializeSDK();
runApp(const MyApp());
}
initializeSDK() {
SurfboardTTP stoked = SurfboardTTP(
apiUrl: 'your_api_url',
ttpBundleId: 'your_bundle_id',
terminalId: '',
partnerId: 'your_partner_id',
merchantId: 'your_merchant_id',
storeId: 'your_store_id',
appId: 'your_app_id');
stoked.setAuthToken(authToken: 'your_auth_token');
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'SDK DEMO',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const Testing());
}
}
class Testing extends StatefulWidget {
const Testing({super.key});
[@override](/user/override)
State<Testing> createState() => _TestingState();
}
class _TestingState extends State<Testing> with WidgetsBindingObserver {
final Terminal terminal = Terminal();
String transactionId = '';
StreamController<AppLifecycleState> appLifecycleStream = StreamController<AppLifecycleState>();
[@override](/user/override)
void initState() {
super.initState();
registerTerminal();
WidgetsBinding.instance.addObserver(this);
}
registerTerminal() {
try {
terminal.registerTerminal(appLifecycleStream.stream).then((value) {
if (value.isNotEmpty) {
// Save terminalId to local storage or any persistent storage
}
});
} catch (e) {
debugPrint('registration failed $e');
}
}
handleResume() {
try {
if (_orderId != 'No order found' && _orderId != 'completed') {
payment.getTransactionDetails().then((value) {
setState(() {
transactionId = value.transactionId;
if (transactionId.isNotEmpty) {
_orderId = 'completed';
}
});
});
}
} catch (e) {
debugPrint(e.toString());
}
}
Payment payment = Payment();
[@override](/user/override)
void didChangeAppLifecycleState(AppLifecycleState appState) {
switch (appState) {
case AppLifecycleState.resumed:
appLifecycleStream.add(AppLifecycleState.resumed);
handleResume();
break;
case AppLifecycleState.inactive:
appLifecycleStream.add(AppLifecycleState.inactive);
break;
case AppLifecycleState.paused:
appLifecycleStream.add(AppLifecycleState.paused);
break;
case AppLifecycleState.detached:
appLifecycleStream.add(AppLifecycleState.detached);
break;
}
}
[@override](/user/override)
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
LineItem orderLines = LineItem(
id: '1234',
quantity: 1,
name: 'item1',
itemAmount: ItemAmount(
regular: 1000,
total: 1000,
currency: Currency.sek,
tax: [
Tax(
amount: 100,
percentage: 10,
type: TaxType.vat,
),
],
),
);
String _orderId = 'No order found';
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text(
'PaymentSDK',
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
),
body: Center(
child: ListView(
children: <Widget>[
Text('current order: $_orderId'),
if (transactionId.isNotEmpty) Text('transactionId: $transactionId'),
ElevatedButton(
onPressed: () {
Order order = Order(orderType: OrderType.purchase);
order.addLineItem(orderLines).createOrder().then((value) {
setState(() {
_orderId = value.orderId;
});
});
},
child: const Text('Create Order')),
ElevatedButton(
onPressed: () {
payment.initiatePayment(
_orderId,
);
},
child: const Text('Initiate Payment'))
],
),
),
);
}
}
更多关于Flutter文本传输处理插件surfboard_ttp的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter文本传输处理插件surfboard_ttp的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
由于surfboard_ttp
插件的具体功能和文档未定义,我们基于其名称进行推测,假设surfboard_ttp
是一个用于文本传输或处理的Flutter插件。以下是一个示例代码案例,展示如何在Flutter应用中使用一个假设的文本传输或处理插件。
假设surfboard_ttp插件的功能
- 文本传输:能够发送和接收文本数据。
- 文本处理:能够对文本数据进行某些处理,如加密、解密、格式化等。
Flutter项目结构
假设我们的Flutter项目结构如下:
my_flutter_app/
├── lib/
│ ├── main.dart
│ └── services/
│ └── text_transfer_processor.dart
├── pubspec.yaml
└── ...
pubspec.yaml
首先,在pubspec.yaml
文件中添加对surfboard_ttp
插件的依赖(注意:这只是一个假设的依赖,实际使用时需要替换为真实插件的依赖):
dependencies:
flutter:
sdk: flutter
surfboard_ttp: ^0.0.1 # 假设的版本号
然后运行flutter pub get
来获取依赖。
text_transfer_processor.dart
在lib/services/text_transfer_processor.dart
文件中创建一个服务类来处理文本传输和处理:
import 'package:flutter/material.dart';
import 'package:surfboard_ttp/surfboard_ttp.dart'; // 假设的导入路径
class TextTransferProcessor {
// 假设的文本传输方法
Future<String> sendText(String text) async {
try {
// 调用插件的发送文本方法(假设存在)
var result = await SurfboardTtp.sendText(text);
return result;
} catch (e) {
print('Error sending text: $e');
return null;
}
}
// 假设的文本处理方法
String processText(String text) {
// 调用插件的文本处理方法(假设存在加密功能)
return SurfboardTtp.encryptText(text);
}
}
main.dart
在lib/main.dart
文件中使用TextTransferProcessor
服务:
import 'package:flutter/material.dart';
import 'package:my_flutter_app/services/text_transfer_processor.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Text Transfer and Processing Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final TextTransferProcessor _textTransferProcessor = TextTransferProcessor();
String _sentText = '';
String _processedText = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Text Transfer and Processing Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextField(
decoration: InputDecoration(labelText: 'Text to Send'),
onChanged: (text) {
// 当文本改变时,可以立即处理文本(例如加密)
setState(() {
_processedText = _textTransferProcessor.processText(text);
});
},
),
SizedBox(height: 16),
ElevatedButton(
onPressed: () async {
// 发送文本并更新UI
String result = await _textTransferProcessor.sendText(_processedText);
setState(() {
_sentText = result ?? 'Failed to send text';
});
},
child: Text('Send Text'),
),
SizedBox(height: 16),
Text('Sent Text: $_sentText'),
SizedBox(height: 16),
Text('Processed Text: $_processedText'),
],
),
),
);
}
}
注意
- 上述代码是一个假设的示例,实际使用时需要根据
surfboard_ttp
插件的真实API进行调整。 - 如果
surfboard_ttp
插件不存在或API不同,请参考插件的官方文档或源代码进行调整。 - 确保在使用插件之前已经正确安装并配置了插件依赖。