> LOADING LARAVEL-EUPAGO v3.0...

Laravel EuPago

Integracao completa com o gateway de pagamentos EuPago para Laravel. Multibanco, MB Way, cartoes de credito, wallets digitais e payouts.

Overview

O Laravel EuPago e um pacote completo para integrar a sua aplicacao Laravel com o gateway de pagamentos EuPago, um dos principais processadores de pagamentos em Portugal. O pacote oferece classes dedicadas para cada metodo de pagamento, traits Eloquent para associar referencias a models, e um sistema de eventos robusto para acompanhar todo o ciclo de vida das transacoes.

PHP 8.4+ Laravel 11-13 MIT License Pest 80%+ Coverage Larastan Level 5

Compatibilidade de versoes

Release PHP Laravel
3.0.0 >= 8.4 11, 12, 13
2.3.0 8.3, 8.4 11, 12
2.2.0 >= 8.3 11
2.1.0 >= 8.1 10

Metodos de pagamento suportados

  • Multibanco -- referencias com callback automatico e verificacao de expiracao
  • MB Way -- pagamento movel instantaneo por telefone
  • Cartoes de Credito -- pagamentos unicos e subscricoes recorrentes
  • Google Pay -- wallet digital com dados do cliente
  • Apple Pay -- wallet digital Apple
  • Payouts -- listagem de pagamentos e transacoes

Instalacao

Instale o pacote via Composer e publique as migrations necessarias.

Instalacao
bash
composer require digitaldev-lx/laravel-eupago
Publicar migrations e migrar
bash
php artisan vendor:publish --provider=DigitaldevLx\\LaravelEupago\\Providers\\EuPagoServiceProvider --tag=migrations
php artisan migrate

Opcionalmente, publique o ficheiro de configuracao e as traducoes:

Opcional
bash
php artisan vendor:publish --provider=DigitaldevLx\\LaravelEupago\\Providers\\EuPagoServiceProvider --tag=config
php artisan vendor:publish --provider=DigitaldevLx\\LaravelEupago\\Providers\\EuPagoServiceProvider --tag=translations

Configuracao

Adicione as seguintes variaveis ao ficheiro .env:

.env
bash
EUPAGO_ENV=test
EUPAGO_API_KEY=your_api_key
EUPAGO_CHANNEL=your_channel

Variaveis de ambiente

Variavel Descricao Valores
EUPAGO_ENV Ambiente da API test / prod
EUPAGO_API_KEY Chave de autenticacao da API EuPago --
EUPAGO_CHANNEL Identificador do canal de pagamento --

Multibanco

Gere referencias Multibanco com callback automatico quando o pagamento e efetuado. Os callbacks sao recebidos automaticamente em GET /eupago/callback.

Criar referencia Multibanco
php
use DigitaldevLx\LaravelEupago\MB\MB;

$order = Order::find(1);

$mb = new MB(
    $order->value,              // float: valor do pagamento
    $order->id,                 // string: identificador externo
    $order->date,               // string: data inicio (Y-m-d)
    $order->payment_limit_date, // string: data limite (Y-m-d)
    $order->value,              // float: valor minimo
    $order->value,              // float: valor maximo
    0                           // bool: permitir pagamentos duplicados
);

try {
    $mbReferenceData = $mb->create();

    if ($mb->hasErrors()) {
        // tratar erros
    }

    $order->mbReferences()->create($mbReferenceData);
} catch (\Exception $e) {
    // tratar excepcao
}

Trait Mbable

Adicione a trait ao model para associar referencias Multibanco:

Trait Mbable
php
use DigitaldevLx\LaravelEupago\Traits\Mbable;

class Order extends Model
{
    use Mbable;
}

$order = Order::find(1);
$mbReferences = $order->mbReferences;

MB Way

Pagamento movel instantaneo. O utilizador recebe uma notificacao na app MB Way e confirma com PIN. O callback e recebido com o codigo MW:PT.

Criar referencia MB Way
php
use DigitaldevLx\LaravelEupago\MBWay\MBWay;

$order = Order::find(1);

$mbway = new MBWay(
    $order->value,      // float: valor do pagamento
    $order->id,         // int: identificador externo
    $customer->phone,   // string: numero de telefone
    'Pagamento da encomenda' // string|null: descricao opcional
);

try {
    $mbwayReferenceData = $mbway->create();

    if ($mbway->hasErrors()) {
        // tratar erros
    }

    $order->mbwayReferences()->create($mbwayReferenceData);
} catch (\Exception $e) {
    // tratar excepcao
}
Trait Mbwayable
php
use DigitaldevLx\LaravelEupago\Traits\Mbwayable;

class Order extends Model
{
    use Mbwayable;
}

$order->mbwayReferences;

Cartoes de Credito

Pagamentos unicos com cartao de credito (maximo de 3.999 EUR por transacao) e subscricoes recorrentes com autorizacao previa. Callback com codigo CC:PT.

Pagamento unico

Cartao de Credito - Pagamento unico
php
use DigitaldevLx\LaravelEupago\CreditCard\CreditCard;

$creditCard = new CreditCard(
    150.00,                            // float: valor
    'ORDER-456',                       // string: identificador
    'https://example.com/success',     // string: URL sucesso
    'https://example.com/fail',        // string: URL falha
    'https://example.com/back',        // string: URL voltar
    'PT',                              // string: idioma (PT, EN, FR, ES)
    'EUR',                             // string: moeda
    'cliente@example.com',             // string|null: email cliente
    60                                 // int|null: minutos para expirar
);

try {
    $result = $creditCard->create();

    if ($result['success']) {
        // Redirecionar para $result['redirect_url']
        // Guardar $result['reference'] e $result['transaction_id']
    }
} catch (\Exception $e) {
    // tratar excepcao
}

Subscricao recorrente

As subscricoes requerem dois passos: criar a autorizacao e depois executar pagamentos recorrentes.

Passo 1 - Criar autorizacao
php
use DigitaldevLx\LaravelEupago\CreditCard\CreditCardRecurrence;

$recurrence = new CreditCardRecurrence(
    'SUBSCRIPTION-123',                // string: identificador
    'https://example.com/success',     // string: URL sucesso
    'https://example.com/fail',        // string: URL falha
    'https://example.com/back',        // string: URL voltar
    'PT'                               // string: idioma
);

$result = $recurrence->create();

if ($result['success']) {
    // Redirecionar para autorizar a subscricao
    // Guardar $result['subscription_id']
}
Passo 2 - Executar pagamento recorrente
php
use DigitaldevLx\LaravelEupago\CreditCard\CreditCardRecurringPayment;

$payment = new CreditCardRecurringPayment(
    'subscription-id-da-autorizacao',  // string: subscription ID
    50.00,                             // float: valor
    'cliente@example.com',             // string|null: email
    true                               // bool: notificar cliente
);

$result = $payment->create();

if ($result['success']) {
    // Pagamento processado
}
Traits para Eloquent
php
use DigitaldevLx\LaravelEupago\Traits\Creditcardable;
use DigitaldevLx\LaravelEupago\Traits\Creditcardrecurrable;

class Order extends Model
{
    use Creditcardable;
}

class Subscription extends Model
{
    use Creditcardrecurrable;
}

Google Pay e Apple Pay

Aceite pagamentos via wallets digitais. Google Pay suporta transacoes ate 99.999 EUR. Ambos recebem callbacks com codigos GP:PT e AP:PT.

Google Pay
php
use DigitaldevLx\LaravelEupago\GooglePay\GooglePay;

$googlePay = new GooglePay(
    150.00,                            // float: valor
    'ORDER-456',                       // string: identificador
    'https://example.com/success',     // string: URL sucesso
    'https://example.com/fail',        // string: URL falha
    'https://example.com/back',        // string: URL voltar
    'PT',                              // string: idioma
    'EUR',                             // string: moeda
    'cliente@example.com',             // string|null: email
    'John',                            // string|null: primeiro nome
    'Doe',                             // string|null: apelido
    'PT',                              // string|null: codigo pais
    true,                              // bool: notificar cliente
    60                                 // int|null: minutos para expirar
);

$result = $googlePay->create();

if ($result['success']) {
    return redirect($result['redirect_url']);
}
Apple Pay
php
use DigitaldevLx\LaravelEupago\ApplePay\ApplePay;

$applePay = new ApplePay(
    150.00,                            // float: valor
    'ORDER-456',                       // string: identificador
    'https://example.com/success',     // string: URL sucesso
    'https://example.com/fail',        // string: URL falha
    'https://example.com/back',        // string: URL voltar
    'PT',                              // string: idioma
    'EUR',                             // string: moeda
    'cliente@example.com',             // string|null: email
    'John',                            // string|null: primeiro nome
    'Doe',                             // string|null: apelido
    'PT',                              // string|null: codigo pais
    true,                              // bool: notificar cliente
    60                                 // int|null: minutos para expirar
);

$result = $applePay->create();

if ($result['success']) {
    return redirect($result['redirect_url']);
}
Traits para Eloquent
php
use DigitaldevLx\LaravelEupago\Traits\Googlepayable;
use DigitaldevLx\LaravelEupago\Traits\Applepayable;

class Order extends Model
{
    use Googlepayable, Applepayable;
}

$order->googlePayReferences;
$order->applePayReferences;

Payouts

Consulte pagamentos e transacoes realizados atraves da API de payouts. Requer autenticacao via OAuth Bearer Token.

Listar payouts
php
use DigitaldevLx\LaravelEupago\Payouts\Payout;

$payout = new Payout(
    '2024-01-01',          // string: data inicio (yyyy-mm-dd)
    '2024-01-31',          // string: data fim (yyyy-mm-dd)
    'your-bearer-token'    // string: OAuth Bearer Token
);

$result = $payout->list();

if ($result['success']) {
    foreach ($result['payouts'] as $payout) {
        // processar dados do payout
    }
}
Listar transacoes
php
use DigitaldevLx\LaravelEupago\Payouts\PayoutTransaction;

$transactions = new PayoutTransaction(
    '2024-01-01',          // string: data inicio
    '2024-01-31',          // string: data fim
    'your-bearer-token'    // string: OAuth Bearer Token
);

$result = $transactions->list();

if ($result['success']) {
    foreach ($result['transactions'] as $transaction) {
        // trid, date, amount, payment_method, status
    }
}

Eventos

O pacote emite eventos ao longo do ciclo de vida de cada pagamento. Registe listeners para reagir a criacoes, pagamentos, expiracoes e callbacks.

Eventos de criacao

Sucesso Falha
MBReferenceCreated MBReferenceCreationFailed
MBWayReferenceCreated MBWayReferenceCreationFailed
CreditCardReferenceCreated CreditCardReferenceCreationFailed
GooglePayReferenceCreated GooglePayReferenceCreationFailed
ApplePayReferenceCreated ApplePayReferenceCreationFailed

Eventos de pagamento e expiracao

Pagamento Expiracao
MBReferencePaid MBReferenceExpired
MBWayReferencePaid MBWayReferenceExpired
CreditCardReferencePaid --
GooglePayReferencePaid --
ApplePayReferencePaid --

Adicionalmente, os eventos CallbackReceived e InvalidCallbackReceived sao emitidos para todos os callbacks.

Registar listeners

AppServiceProvider.php (Laravel 11/12/13)
php
use DigitaldevLx\LaravelEupago\Events\MBReferencePaid;
use Illuminate\Support\Facades\Event;

public function boot(): void
{
    Event::listen(function (MBReferencePaid $event) {
        $reference = $event->reference;

        // Atualizar estado da encomenda
        $reference->mbable->update(['status' => 'paid']);

        // Enviar email de confirmacao
        Mail::to($reference->mbable->user)->send(
            new PaymentConfirmed($reference)
        );
    });
}
Listener dedicado
php
// app/Listeners/SendPaymentConfirmationEmail.php
namespace App\Listeners;

use DigitaldevLx\LaravelEupago\Events\MBReferencePaid;

class SendPaymentConfirmationEmail
{
    public function handle(MBReferencePaid $event): void
    {
        // logica de envio de email
    }
}

// Em AppServiceProvider.php:
Event::listen(MBReferencePaid::class, SendPaymentConfirmationEmail::class);

Verificar referencias expiradas

O comando eupago:check-expired identifica referencias Multibanco expiradas e emite o evento MBReferenceExpired para cada uma.

Comando e agendamento
bash
php artisan eupago:check-expired
routes/console.php (Laravel 11/12/13)
php
use Illuminate\Support\Facades\Schedule;

Schedule::command('eupago:check-expired')->daily();

Testes

O pacote fornece factories para todos os modelos de referencia de pagamento, com estados pre-definidos para simular pagamentos e expiracoes.

Factories com estados
php
use DigitaldevLx\LaravelEupago\Models\MbReference;
use DigitaldevLx\LaravelEupago\Models\MbwayReference;
use DigitaldevLx\LaravelEupago\Models\CreditCardReference;
use DigitaldevLx\LaravelEupago\Models\GooglePayReference;
use DigitaldevLx\LaravelEupago\Models\ApplePayReference;

// Referencia por pagar (default)
$reference = MbReference::factory()->create();

// Referencia paga
$paidReference = MbReference::factory()->paid()->create();

// Referencia expirada
$expiredReference = MbReference::factory()->expired()->create();

// Outros metodos de pagamento
$mbwayRef = MbwayReference::factory()->create();
$ccRef = CreditCardReference::factory()->paid()->create();
$gpayRef = GooglePayReference::factory()->create();
$appleRef = ApplePayReference::factory()->paid()->create();
Executar testes e ferramentas de qualidade
bash
# Testes completos
composer test

# Com cobertura (minimo 80%)
composer test:coverage

# Teste especifico
vendor/bin/pest tests/Unit/MB/MBTest.php

# Analise estatica
composer analyse

# Formatacao de codigo
composer lint

Boas Praticas

Usar ambiente test para desenvolvimento

Configure sempre EUPAGO_ENV=test em ambientes de desenvolvimento e staging. Teste todos os fluxos de pagamento antes de mudar para prod.

Usar traits Eloquent

Adicione as traits Mbable, Mbwayable, Creditcardable, etc. aos models para aceder facilmente as referencias de pagamento e manter uma relacao limpa entre encomendas e transacoes.

Tratar todos os eventos

Nao trate apenas o evento de sucesso. Registe listeners para eventos de falha e expiracao para manter o estado das encomendas consistente e notificar os clientes adequadamente.

Agendar verificacao de expiracoes

Execute o comando eupago:check-expired diariamente via scheduler para detetar e tratar automaticamente referencias Multibanco expiradas.

Handlers idempotentes

Os callbacks podem ser recebidos mais de uma vez. Garanta que os seus listeners sao idempotentes -- verificar o estado atual antes de processar evita duplicacoes e inconsistencias.

Validar montantes nos callbacks

Quando receber um callback de pagamento, compare sempre o montante recebido com o montante esperado na sua base de dados. Nunca confie apenas no valor do callback.

$ composer require digitaldev-lx/laravel-eupago

Pronto para integrar pagamentos?

Consulte o repositorio no GitHub para a documentacao completa, issues e contribuicoes.

> COOKIE_CONSENT_REQUIRED

Utilizamos cookies essenciais para o funcionamento do site e cookies analíticos (Google Analytics) para compreender como utiliza o nosso site. Os cookies analíticos só são ativados com o seu consentimento. Política de Privacidade