pluspay_a2a 0.7.0
pluspay_a2a: ^0.7.0 copied to clipboard
PlusPay A2A (app-to-app) payment plugin for Android POS devices — start payments, EOD, refunds and transaction queries.
import 'package:flutter/material.dart';
import 'package:pluspay_a2a/pluspay_a2a.dart';
import 'package:pluspay_a2a_example/components/components.dart';
import 'package:uuid/uuid.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Pluspay A2A Example',
debugShowCheckedModeBanner: false,
home: const HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final PPA2AClient _pluspay = PPA2AClient();
bool _loading = false;
@override
void initState() {
super.initState();
_pluspay.initialize();
}
@override
void dispose() {
_pluspay.dispose();
super.dispose();
}
String get generateOrderCode => DateTime.now().toIso8601String();
Future<void> _execute(Future<dynamic> Function() fn) async {
setState(() {
_loading = true;
});
try {
await fn();
setState(() {
_loading = false;
});
if (!mounted) return;
_showResultDialog(success: true, message: 'Islem basariyla tamamlandi.');
} catch (e) {
setState(() {
_loading = false;
});
if (!mounted) return;
_showResultDialog(success: false, message: e.toString());
}
}
Future<void> startPayment() async {
await _execute(
() => _pluspay.startPayment(
PPStartPaymentRequestModel.toRequest(
orderCode: '86206823',
totalAmount: 11.9,
paymentType: PPPaymentType.MULTINET,
paymentMethod: PPPaymentMethod.NFC,
),
),
);
}
Future<void> cancelPayment() async {
await _execute(
() => _pluspay.cancelPayment(
PPCancelPaymentRequestModel.toRequest(
orderCode: 'ORD001',
transactionId: 'TX001',
note: 'Test iptali',
),
),
);
}
Future<void> startEftPayment() async {
await _execute(
() => _pluspay.startEftPayment(
PPEftPaymentRequestModel.toRequest(
totalAmount: 3.0,
paymentType: PPPaymentType.POS,
paymentMethod: PPPaymentMethod.CC,
transactionId: Uuid().v4(),
taxRate: 0,
),
),
);
}
Future<void> cancelEftPayment() async {
await _execute(
() => _pluspay.cancelEftPayment(
PPEftCancelRequestModel.toRequest(
transactionId: Uuid().v4(),
totalAmount: 3.0,
),
),
);
}
Future<void> startOrderPayment() async {
await _execute(
() => _pluspay.startOrderPayment(
PPOrderPaymentRequestModel.toRequest(
orderCode: 'ORD001',
),
),
);
}
void _showResultDialog({required bool success, required String message}) {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
icon: Icon(
success ? Icons.check_circle : Icons.error,
color: success ? Colors.green : Colors.red,
size: 48,
),
title: Text(success ? 'Basarili' : 'Hata'),
content: Text(message),
actions: [
TextButton(
onPressed: () => Navigator.pop(ctx),
child: const Text('Tamam'),
),
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Pluspay A2A Example')),
body: _loading
? const Center(child: CircularProgressIndicator())
: ListView(
padding: const EdgeInsets.all(16),
children: [
SectionHeader(title: 'Odeme'),
ActionButton(
icon: Icons.payment,
label: 'Odeme Baslat',
onTap: startPayment,
),
ActionButton(
icon: Icons.cancel,
label: 'Odeme Iptal',
color: Colors.red,
onTap: cancelPayment,
),
const SizedBox(height: 24),
SectionHeader(title: 'EFT POS'),
ActionButton(
icon: Icons.credit_card,
label: 'EFT Odeme',
onTap: startEftPayment,
),
ActionButton(
icon: Icons.cancel,
label: 'EFT Iptal',
color: Colors.red,
onTap: cancelEftPayment,
),
const SizedBox(height: 24),
SectionHeader(title: 'Siparis'),
ActionButton(
icon: Icons.receipt_long,
label: 'Siparis Odeme',
onTap: () => _execute(
() => _pluspay.startOrderPayment(
PPOrderPaymentRequestModel.toRequest(
orderCode: 'ORD001',
),
),
),
),
const SizedBox(height: 24),
SectionHeader(title: 'Siparis Olustur'),
ActionButton(
icon: Icons.add_shopping_cart,
label: 'Siparis Olustur',
onTap: () => _execute(
() => _pluspay.createOrder(
PPOrderCreateRequest.toRequest(
orderCode: generateOrderCode,
orderDate: DateTime.now(),
products: [
ProductModel(
id: 1,
sku: 'SKU001',
unit: PPQtyEnums.ADET,
price: 100.0,
title: 'Test Urun 1',
quantity: 1,
taxRate: 20,
vatInclude: true,
productType: PPProductTypeEnum.PHYSICALLY,
discountValue: 0,
),
],
),
),
),
),
const SizedBox(height: 24),
SectionHeader(title: 'Coklu Odeme'),
ActionButton(
icon: Icons.payments,
label: 'Coklu Odeme',
onTap: () => _execute(
() => _pluspay.startMultiPayment(
PPMultiPaymentRequest.toRequest(
changePaymentStatus: true,
orderCode: generateOrderCode,
orderDate: DateTime.now(),
products: [
ProductModel(
id: 1,
sku: 'SKU001',
unit: PPQtyEnums.ADET,
price: 100.0,
title: 'Test Urun 1',
quantity: 1,
taxRate: 20,
vatInclude: true,
productType: PPProductTypeEnum.PHYSICALLY,
discountValue: 0,
),
],
transactions: [
TransactionModel(
paymentType: PPPaymentType.BANK_TRANSFER,
totalAmount: 50.0,
paymentMethod: PPPaymentMethod.NONE,
),
TransactionModel(
paymentType: PPPaymentType.BANK_TRANSFER,
totalAmount: 50.0,
paymentMethod: PPPaymentMethod.NONE,
),
],
),
),
),
),
const SizedBox(height: 24),
SectionHeader(title: 'Diger'),
ActionButton(
icon: Icons.summarize,
label: 'Gun Sonu',
onTap: () => _execute(
() => _pluspay.triggerEod(
PPEodRequestModel.toRequest(
isAll: false,
types: [PPEodType.POS, PPEodType.MULTINET],
),
),
),
),
ActionButton(
icon: Icons.settings,
label: 'Parametre Yükle',
onTap: () => _execute(
() => _pluspay.triggerParameters(
PPParameterRequestModel.toRequest(
isAll: true,
types: [
PPParameterTypes.bank,
PPParameterTypes.multinet,
],
),
),
),
),
],
),
);
}
}