ms_infinitepay

Biblioteca Dart/Flutter para integração com a API de checkout da InfinitePay.

Com essa integração, você pode gerar links de pagamento automaticamente e acompanhar as vendas em tempo real de forma incrivelmente simples!

Features

  • ✅ Criação de links de checkout de forma simples e direta
  • ✅ Verificação de status de pagamentos
  • ✅ Suporte a webhooks para notificações em tempo real
  • ✅ Suporte completo a Pix e Cartão de Crédito
  • ✅ API totalmente documentada em português
  • ✅ Type-safe com modelos de dados bem definidos

Getting started

Instalação

Adicione a dependência no seu pubspec.yaml:

dependencies:
  ms_infinitepay: ^1.0.0

Pré-requisitos

Você precisará de:

  • Uma conta na InfinitePay
  • Sua InfiniteTag (nome de usuário no App InfinitePay, sem o símbolo $)

Usage

import 'package:ms_infinitepay/ms_infinitepay.dart';

final service = CheckoutService();

// Configure o payload com as informações do pedido
final payload = Payload(
  handle: 'seu-handle', // Sua InfiniteTag sem o $
  items: [
    Item(
      description: 'Produto Exemplo',
      quantity: 2,
      price: 5000, // R$ 50,00 em centavos
    ),
    Item(
      description: 'Outro Produto',
      quantity: 1,
      price: 3000, // R$ 30,00 em centavos
    ),
  ],
  orderNSU: 'pedido-123', // Identificador do seu sistema (opcional)
  redirectUrl: 'https://seusite.com/pagamento-concluido',
  webhookUrl: 'https://seusite.com/webhook',
  customer: Customer(
    name: 'João Silva',
    email: 'joao@email.com',
    phoneNumber: '+5511999887766',
  ),
  address: Address(
    cep: '12345678',
    street: 'Rua das Flores',
    neighborhood: 'Centro',
    number: '123',
    complement: 'Apto 45',
  ),
);

try {
  final checkoutUrl = await service.createCheckout(payload);
  print('Link de checkout criado: $checkoutUrl');
  // Redirecione o cliente para checkoutUrl
} catch (e) {
  print('Erro ao criar checkout: $e');
}

2. Verificar status de pagamento

Após o cliente finalizar o pagamento, ele será redirecionado para sua redirectUrl com os seguintes parâmetros:

  • receipt_url: Link do comprovante de pagamento
  • order_nsu: O número do pedido no seu sistema
  • slug: Código da fatura na InfinitePay
  • capture_method: Como foi pago ("credit_card" ou "pix")
  • transaction_nsu: ID único da transação

Use esses parâmetros para verificar o status:

final request = PaymentCheckRequest(
  handle: 'seu-handle',
  orderNSU: 'pedido-123',
  transactionNSU: 'uuid-recebido-na-url',
  slug: 'codigo-fatura',
);

try {
  final response = await service.checkPayment(request);
  
  if (response.paid) {
    print('✅ Pagamento confirmado!');
    print('Valor pago: R\$ ${response.paidAmount / 100}');
    print('Método: ${response.captureMethod}');
    print('Parcelas: ${response.installments}x');
  } else {
    print('❌ Pagamento não confirmado');
  }
} catch (e) {
  print('Erro ao verificar pagamento: $e');
}

3. Receber webhooks (Recomendado)

Para uma integração mais robusta, configure um endpoint para receber webhooks:

import 'package:shelf/shelf.dart';
import 'dart:convert';
import 'package:ms_infinitepay/ms_infinitepay.dart';

Response webhookHandler(Request request) async {
  try {
    final body = await request.readAsString();
    final json = jsonDecode(body);
    final webhookBody = WebhookBody.fromMap(json);
    
    // Valide se o order_nsu corresponde a um pedido real no seu sistema
    if (await isValidOrder(webhookBody.orderNSU)) {
      // Processe o pagamento aprovado
      await processPayment(webhookBody);
      
      print('✅ Pagamento recebido!');
      print('Order NSU: ${webhookBody.orderNSU}');
      print('Valor: R\$ ${webhookBody.paidAmount / 100}');
      print('Comprovante: ${webhookBody.receiptUrl}');
      
      // Responda rapidamente com 200 OK (< 1 segundo)
      return Response.ok('OK');
    } else {
      // Retorne 400 se houver erro (InfinitePay tentará reenviar)
      return Response(400, body: 'Order NSU inválido');
    }
  } catch (e) {
    print('Erro ao processar webhook: $e');
    return Response(400, body: 'Erro ao processar webhook');
  }
}

Conceitos importantes

Valores em centavos

Todos os valores monetários devem ser informados em centavos:

  • R$ 10,00 = 1000 centavos
  • R$ 155,50 = 15550 centavos

Order NSU

É o identificador do pedido no seu sistema. Se não for informado, a InfinitePay gerará um automaticamente. Sempre valide se o order_nsu corresponde a um pedido real.

Webhooks vs Consulta manual

  • Webhook: Mais eficiente, você recebe notificações em tempo real
  • Consulta manual: Útil como fallback ou para verificações pontuais

Segurança

  • Sempre valide os dados recebidos via webhook
  • Guarde o transaction_nsu para futuras consultas
  • Teste bastante no ambiente de desenvolvimento antes de colocar em produção

Endpoints da API

  • Criar checkout: POST https://api.infinitepay.io/invoices/public/checkout/links
  • Verificar pagamento: POST https://api.infinitepay.io/invoices/public/checkout/payment_check

Métodos de pagamento suportados

  • Pix: Pagamento instantâneo
  • Cartão de Crédito: Com opção de parcelamento

Additional information

Contribuindo

Contribuições são bem-vindas! Sinta-se à vontade para abrir issues ou pull requests.

Suporte

Para questões sobre a API da InfinitePay, consulte a documentação oficial ou entre em contato com o suporte da InfinitePay.

Licença

Veja o arquivo LICENSE para mais informações.