pagseguro_smart
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
- Instalação
- Configuração Android
- Como Utilizar
- Identificações PagSeguro
- Models
- Notas Importantes
- Desenvolvedor
- Licença
- Contribuições
🎯 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.tCreditPagSeguroEnum.tDebitPagSeguroEnum.tVoucherPagSeguroEnum.tPix
Parcelamento
PagSeguroEnum.iSinglePayPagSeguroEnum.iForMerchantPagSeguroEnum.iForCustomer
Estorno
PagSeguroEnum.vCommonPagSeguroEnum.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:
UserDataModelTransactionModel
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
⚖️ 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.