pagseguro_smart

pub package likes pub points

Desenvolvedor Takeo

pagseguro_smart é um plugin Flutter para integração completa com as maquininhas PagSeguro Smart (P2 A7, P2 A11 e GPOS A11).
Permite pagamentos, estornos, callbacks de transação, reimpressão de recibos e comunicação direta com o PlugPagServiceWrapper no Android.

⚠️ Plugin não oficial — Compatível somente com Android.


📘 Sumário


🎯 Sobre

O objetivo do plugin é oferecer uma interface simples, segura e moderna para comunicação com o SDK PagSeguro PlugPagServiceWrapper diretamente de projetos Flutter.

Compatível apenas com máquinas POS Smart P2 A7, P2 A11 e GPOS A11.


📦 Instalação

No pubspec.yaml:

dependencies:
  pagseguro_smart: ^1.0.5+5

Execute:

flutter pub get

⚙️ Configuração Android

1️⃣ Permissão necessária

Adicione ao AndroidManifest.xml:

<uses-permission android:name="br.com.uol.pagseguro.permission.MANAGE_PAYMENTS"/>

2️⃣ Intent-Filter

Dentro da <activity> principal:

<intent-filter>
    <action android:name="br.com.uol.pagseguro.PAYMENT"/>
    <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

3️⃣ Ajustar minSdk / targetSdk

A PagSeguro exige Assinatura V1 + V2, que requer configurar o projeto para aceitar minSdkVersion 23:


📍 1. Editar android/local.properties

Adicione:

flutter.minSdkVersion=23
flutter.targetSdkVersion=28

Você pode ajustar o targetSdkVersion depois, mas o default usado pelo plugin é 28 para máxima compatibilidade.


📍 2. Editar android/app/build.gradle.kts (Kotlin) ou build.gradle (Groovy)

Para permitir que o app ajuste automaticamente o minSdkVersion e targetSdkVersion usando o arquivo local.properties, siga as instruções conforme o tipo do seu arquivo Gradle.


🟦 Se você usa Kotlin DSL (build.gradle.kts)

Adicione no topo do arquivo:

import java.util.Properties
import java.io.FileInputStream

val localProps = Properties()
val localPropsFile = rootProject.file("local.properties")
if (localPropsFile.exists()) {
    localProps.load(FileInputStream(localPropsFile))
}

val minSdkFromLocal = localProps.getProperty("flutter.minSdkVersion")?.toInt() ?: 23
val targetSdkFromLocal = localProps.getProperty("flutter.targetSdkVersion")?.toInt() ?: 34

Agora substitua (ou ajuste) a seção:

android {
    defaultConfig {
        minSdk = minSdkFromLocal
        targetSdk = targetSdkFromLocal
    }
}

🟧 Se você usa Groovy DSL (build.gradle)

Adicione no topo do arquivo:

import java.util.Properties
import java.io.FileInputStream

def localProps = new Properties()
def localPropsFile = rootProject.file("local.properties")

if (localPropsFile.exists()) {
    localProps.load(new FileInputStream(localPropsFile))
}

def minSdkFromLocal = (localProps.getProperty("flutter.minSdkVersion") ?: "23") as Integer
def targetSdkFromLocal = (localProps.getProperty("flutter.targetSdkVersion") ?: "34") as Integer

Agora substitua (ou ajuste) a seção:

android {
    defaultConfig {
        minSdkVersion minSdkFromLocal
        targetSdkVersion targetSdkFromLocal
    }
}

Isso permite que seu app use automaticamente os valores do local.properties.


🚀 Como Utilizar

Importação

import 'package:pagseguro_smart/pagseguro_smart.dart';

🔌 Inicialização

Verificando se PinPad está Autenticado

final PagSeguroService pagSeguro = PagSeguroService();

Future<void> isAuthenticated() async {
  final result = await pagSeguro.isAuthenticated();

  if (result['success']) {
    print('PinPad Autenticado!');
  } else {
    print('${result['message']}');
  }
}

Ativando o PinPad

Future<void> initPinPad(String codigoAtivacao) async {
  final result = await pagSeguro.initPinPad(codigoAtivacao);

  if (result['success']) {
    print('PinPad Ativado!');
  } else {
    print('${result['message']}');
  }
}

Layout de Janelas PagSeguro

⚠️ Nota sobre cores — O SDK do PagSeguro PlugPag é sensível a cores inválidas. Necessário atenção para evitar crashes como IllegalArgumentException: Unknown color.

final LayoutPreset preset = LayoutPreset.darkBlue;
final style = LayoutPresets.of(layoutPreset);

final result = await pagSeguro.setStyleData(
    headTextColor: style.headTextColor,
    headBackgroundColor: style.headBackgroundColor,
    contentTextColor: style.contentTextColor,
    contentTextValue1Color: style.contentTextValue1Color,
    contentTextValue2Color: style.contentTextValue2Color,
    positiveButtonTextColor: style.positiveButtonTextColor,
    positiveButtonBackground: style.positiveButtonBackground,
    negativeButtonTextColor: style.negativeButtonTextColor,
    negativeButtonBackground: style.negativeButtonBackground,
    genericButtonBackground: style.genericButtonBackground,
    genericButtonTextColor: style.genericButtonTextColor,
    genericSmsEditTextBackground: style.genericSmsEditTextBackground,
    genericSmsEditTextTextColor: style.genericSmsEditTextTextColor,
    lineColor: style.lineColor,
);

💳 Pagamentos

PagSeguroEnum payType = PagSeguroEnum.tCredit;
final result = await pagSeguro.doPayment(
  type: payType,
  value: 50.00,
  userReference: 't${payType.code}p123', // Pode ser qualquer identificador com limite de 10 caracteres, nesse exemplo tem o Tipo (t), Código do Tipo (${payType.code}), Pedido (p), Número do Pedido (123)
  printReceipt: true,
);

if (result['success']) {
  final transaction = TransactionModel.fromJsonToModel(result['data']);
  print('Pagamento aprovado!');
} else {
  print('Falha: ${result['message']}');
}

⛔ Estorno

PagSeguroEnum voidType = PagSeguroEnum.vCommon;
final estorno = await pagSeguro.voidPayment(
  transactionCode: '123456',
  transactionId: '987654',
  voidType: voidType,
  printReceipt: true,
);

🧾 Impressão & Recibos

Definir Ação de Impressão do Recibo do Cliente:

await pagSeguro.setPrintActionListener(
    askCustomerReceipt: true,
    smsReceipt: false,
);

Definir Estilo, Cor e Tempo de Exibição da Janela de Recibo do Cliente:

⚠️ Nota sobre cores — O SDK do PagSeguro PlugPag é sensível a cores inválidas. Necessário atenção para evitar crashes como IllegalArgumentException: Unknown color.

await pagSeguro.setPlugPagCustomPrinterLayout('Comprovante');

Reimprimir via Cliente:

await pagSeguro.reprintCustomerReceipt();

Reimprimir via Loja:

await pagSeguro.reprintEstablishmentReceipt();

Enviar recibo via SMS:

await pagSeguro.sendReceiptSMS(
  transactionCode: '123456',
  phoneNumber: '11999999999',
);

📡 Callbacks

O plugin envia mensagens de progresso durante o pagamento, recomendado colocar no initState:

@override
void initState() {
  super.initState();

  _pagSeguro.onPaymentProgress = (message, canAbort) {
    print('Status: $message');

    if (canAbort) {
      print('Permitido Cancelar Pagamento.');
    }
  };
}

🔧 Identificações PagSeguro

O plugin possui facilitadores com identificações de Tipos de Pagamento, Parcelamento e Estorno da PagSeguro com códigos e descrição em enum:

Tipos de Pagamento

  • PagSeguroEnum.tCredit
  • PagSeguroEnum.tDebit
  • PagSeguroEnum.tVoucher
  • PagSeguroEnum.tPix

Parcelamento

  • PagSeguroEnum.iSinglePay
  • PagSeguroEnum.iForMerchant
  • PagSeguroEnum.iForCustomer

Estorno

  • PagSeguroEnum.vCommon
  • PagSeguroEnum.vQrCode

Como Utilizar o "PagSeguroEnum"

PagSeguroEnum pagSeguroEnum = PagSeguroEnum.tCredit;
print('Código: ${pagSeguroEnum.code}'); // Enviar para a PagSeguro sempre o Código
print('Descrição: ${pagSeguroEnum.description}'); // Utilizar para Tratativas Internas como preferir

📄 Models

Inclui:

  • UserDataModel
  • TransactionModel

Todos com fromJsonToModel() para parse automático.


📝 Notas Importantes

  • O plugin funciona somente em Android.
  • A maquininha deve estar vinculada a um usuário ativo na PagSeguro e com o aplicativo configurado (salvo maquininha debug).
  • Callbacks dependem do texto da maquininha — o comportamento pode variar por modelo.
  • Recomenda-se testar em dispositivo físico real.

👨‍💻 Desenvolvedor


Fernando Takeo Miyaji


⚖️ Licença

MIT © 2025 Fernando Takeo Miyaji


⭐ Contribuições

Pull Requests são sempre Bem Vindos!
Se você gostou desse package, considere dar um Like no pub.dev ou no GitHub.

Libraries

pagseguro_smart