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.
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.
composer require digitaldev-lx/laravel-eupago
php artisan vendor:publish --provider=DigitaldevLx\\LaravelEupago\\Providers\\EuPagoServiceProvider --tag=migrations
php artisan migrate
Opcionalmente, publique o ficheiro de configuracao e as traducoes:
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:
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.
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:
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.
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
}
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
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.
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']
}
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
}
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.
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']);
}
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']);
}
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.
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
}
}
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
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)
);
});
}
// 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.
php artisan eupago:check-expired
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.
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();
# 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.