getnet_payments 1.1.0 copy "getnet_payments: ^1.1.0" to clipboard
getnet_payments: ^1.1.0 copied to clipboard

PlatformAndroid

getnet_payments é um plugin que fornece integração com as máquinas de pagamento da empresa Getnet.

example/lib/main.dart

import 'dart:convert';
import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:getnet_payments/getnet_payments.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 const MaterialApp(
      home: PaymentApp(),
    );
  }
}

class PaymentApp extends StatefulWidget {
  const PaymentApp({super.key});

  @override
  State<PaymentApp> createState() => _PaymentAppState();
}

class _PaymentAppState extends State<PaymentApp>
    with SingleTickerProviderStateMixin {
  late TabController _tabController;
  TextEditingController valueController = TextEditingController(text: '12.50');
  String? mensagem;
  String? mensagemTransacoes;
  bool allowPrintCurrentTransaction = true;

  final List<Transaction> _successfulTransactions = [];

  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: 2, vsync: this);
  }

  void _addTransaction(Transaction transaction) {
    if (transaction.result != '0' && transaction.result != '5') return;
    setState(() {
      _successfulTransactions.insert(0, transaction);
    });
  }

  double _convertAmount(Transaction transaction) {
    final amount = transaction.amount ?? '0000';
    final amountDouble = double.parse(
        '${amount.substring(0, amount.length - 2)}.${amount.substring(amount.length - 2)}');
    return amountDouble;
  }

  Future<void> _processPrint() async {
    FocusScope.of(context).unfocus();

    final logo = await rootBundle.load('assets/images/logo.jpg');
    String base64 = base64Encode(logo.buffer.asUint8List());

    final items = [
      ItemPrintModel.text(
        content: "TEXTO SMALL CENTRALIZADO",
        align: AlignModeEnum.center,
        fontFormat: FontFormatEnum.small,
      ),
      ItemPrintModel.text(
        content: "TEXTO MEDIUM CENTRALIZADO",
        align: AlignModeEnum.center,
        fontFormat: FontFormatEnum.medium,
      ),
      ItemPrintModel.text(
        content: "TEXTO LARGE CENTRALIZADO",
        align: AlignModeEnum.center,
        fontFormat: FontFormatEnum.large,
      ),
      ItemPrintModel.qrcode(
        content: "https://example.com",
        align: AlignModeEnum.center,
        height: 200,
      ),
      ItemPrintModel.linewrap(lines: 1),
      ItemPrintModel.barcode(
        content: "123456789012",
        align: AlignModeEnum.center,
      ),
      ItemPrintModel.image(
        content: base64,
        align: AlignModeEnum.center,
      ),
      ItemPrintModel.linewrap(lines: 2),
    ];
    GetnetPayments.pos.print(items);
  }

  Future<void> _processPayment(
    PaymentTypeEnum type, {
    int installments = 1,
    String? creditType,
  }) async {
    FocusScope.of(context).unfocus();
    if (valueController.text.isEmpty) return;

    final valor = double.parse(valueController.text);
    try {
      final callerId = const Uuid().v4();
      final transaction = await GetnetPayments.deeplink.payment(
          amount: valor,
          paymentType: type,
          callerId: callerId,
          installments: installments,
          creditType: creditType,
          allowPrintCurrentTransaction: !allowPrintCurrentTransaction);
      if (transaction != null) {
        setState(() {
          mensagem = '${transaction.result} - ${transaction.resultDetails}';
        });
        _addTransaction(
            transaction.copyWith(callerId: transaction.callerId ?? callerId));
      }
    } catch (e) {
      log(e.toString());
      setState(() {
        mensagem = 'Erro ao realizar pagamento';
      });
    }
  }

  Future<void> _processReprintLastTransaction() async {
    FocusScope.of(context).unfocus();

    try {
      final result = await GetnetPayments.deeplink.reprint();
      if (result != null) {
        setState(() {
          mensagem = result;
        });
      }
    } catch (e) {
      log(e.toString());
      setState(() {
        mensagem = 'Erro ao realizar pagamento';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Getnet Payments'),
        bottom: TabBar(
          controller: _tabController,
          tabs: const [
            Tab(text: 'Pagamento'),
            Tab(text: 'Transações'),
          ],
        ),
      ),
      body: TabBarView(
        controller: _tabController,
        children: [
          // Pagamento Tab
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Column(
              children: [
                TextField(
                  controller: valueController,
                  keyboardType: TextInputType.number,
                  inputFormatters: [
                    FilteringTextInputFormatter.allow(RegExp(r'[0-9.]')),
                  ],
                  decoration: const InputDecoration(
                    hintText: 'Valor',
                    contentPadding: EdgeInsets.all(10.0),
                  ),
                ),
                Row(
                  children: [
                    Switch(
                        value: allowPrintCurrentTransaction,
                        onChanged: (value) {
                          setState(() => allowPrintCurrentTransaction = value);
                        }),
                    const Text('Imprimir cupom'),
                  ],
                ),
                const SizedBox(height: 20),
                Wrap(
                  spacing: 8,
                  runSpacing: 8,
                  children: [
                    ElevatedButton(
                      onPressed: () => _processPayment(PaymentTypeEnum.credit),
                      child: const Text('CRÉDITO'),
                    ),
                    ElevatedButton(
                      onPressed: () => _processPayment(
                        PaymentTypeEnum.credit,
                        installments: 12,
                        creditType: 'creditMerchant',
                      ),
                      child: const Text('CRÉDITO 12X'),
                    ),
                    ElevatedButton(
                      onPressed: () => _processPayment(PaymentTypeEnum.debit),
                      child: const Text('DÉBITO'),
                    ),
                    ElevatedButton(
                      onPressed: () => _processPayment(PaymentTypeEnum.voucher),
                      child: const Text('VOUCHER'),
                    ),
                    ElevatedButton(
                      onPressed: () => _processPayment(PaymentTypeEnum.pix),
                      child: const Text('PIX'),
                    ),
                    ElevatedButton(
                      onPressed: () => _processReprintLastTransaction(),
                      child: const Text('REIMPRIMIR ÚLTIMO CUPOM'),
                    ),
                    ElevatedButton(
                      onPressed: () => _processPrint(),
                      child: const Text('TESTAR IMPRESSORA'),
                    ),
                  ],
                ),
                const SizedBox(height: 20),
                if (mensagem != null)
                  Column(
                    children: [
                      const Divider(),
                      const Text('Resultado:'),
                      const Divider(),
                      Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Text(mensagem!),
                      ),
                    ],
                  ),
              ],
            ),
          ),
          // Transações Tab
          SizedBox(
            child: Column(
              children: [
                if (mensagemTransacoes != null)
                  Column(
                    children: [
                      const Text('Resultado Reembolso:'),
                      Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Text(mensagemTransacoes!),
                      ),
                    ],
                  ),
                Expanded(
                  child: ListView.builder(
                    itemCount: _successfulTransactions.length,
                    itemBuilder: (context, index) {
                      final transaction = _successfulTransactions[index];
                      return Card(
                        margin: const EdgeInsets.symmetric(
                            vertical: 8, horizontal: 16),
                        child: ListTile(
                          title: Text(
                              'CV: ${transaction.cvNumber ?? 'Sem informação'}'),
                          subtitle: Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              Text(
                                  'Valor: ${_convertAmount(transaction).toStringAsFixed(2)}'),
                              Row(
                                mainAxisSize: MainAxisSize.max,
                                mainAxisAlignment:
                                    MainAxisAlignment.spaceBetween,
                                children: [
                                  FilledButton(
                                    onPressed: () async {
                                      final refund = await GetnetPayments
                                          .deeplink
                                          .checkStatus(
                                        callerId: transaction.callerId!,
                                      );

                                      if (refund != null) {
                                        setState(() {
                                          mensagemTransacoes =
                                              '${refund.result} - ${refund.resultDetails}';
                                        });
                                      }
                                    },
                                    child: const Text('Status'),
                                  ),
                                  FilledButton(
                                    onPressed: () async {
                                      final refund =
                                          await GetnetPayments.deeplink.refund(
                                        amount: _convertAmount(transaction),
                                        transactionDate: DateTime.now(),
                                        cvNumber: transaction.cvNumber,
                                        allowPrintCurrentTransaction:
                                            !allowPrintCurrentTransaction,
                                      );

                                      if (refund != null) {
                                        setState(() {
                                          mensagemTransacoes =
                                              '${refund.result} - ${refund.resultDetails}';
                                        });

                                        if (refund.result ==
                                            TransactionResultEnum
                                                .success.value) {
                                          _successfulTransactions
                                              .removeAt(index);
                                        }
                                      }
                                    },
                                    child: const Text('Reembolsar'),
                                  ),
                                ],
                              ),
                            ],
                          ),
                        ),
                      );
                    },
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}
6
likes
160
points
98
downloads

Publisher

unverified uploader

Weekly Downloads

getnet_payments é um plugin que fornece integração com as máquinas de pagamento da empresa Getnet.

Repository (GitHub)

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

flutter, intl, plugin_platform_interface

More

Packages that depend on getnet_payments