MENU
Sistema di pagamento in Laravel con Paypal e Stripe: las guida completa

Implementare un sistema di pagamento in Laravel che sia scalabile, sicuro e facilmente estensibile è una delle sfide più comuni nello sviluppo di applicazioni e-commerce moderne. In questa guida completa, esploreremo come creare un’architettura robusta che supporti multipli gateway di pagamento come bonifico bancario, PayPal e Stripe, utilizzando i migliori design pattern e le best practice di Laravel.

Che tu stia sviluppando un piccolo e-commerce o una piattaforma enterprise, questa guida ti fornirà tutti gli strumenti necessari per implementare un sistema di pagamento professionale che rispetti gli standard di sicurezza PCI compliance e sia facilmente manutenibile nel tempo.

Perché un Sistema di Pagamento Scalabile è Fondamentale

Nel panorama digitale odierno, i metodi di pagamento digitali rappresentano già circa il 27% delle transazioni totali in Italia, un dato che conferma la crescente importanza di offrire soluzioni di pagamento flessibili e sicure. Un’architettura ben progettata permette di:

  • Aggiungere nuovi gateway senza modificare il codice esistente
  • Gestire diversi metodi di pagamento in modo uniforme
  • Mantenere la sicurezza centralizzando la logica di elaborazione
  • Facilitare il testing attraverso un’interfaccia comune
  • Rispettare i principi SOLID per un codice pulito e manutenibile

Step 1: Architettura di Base con Service Provider e Interface

Il Pattern Architetturale

La chiave per un sistema di pagamento scalabile in Laravel è l’utilizzo del Strategy Pattern combinato con il Service Provider Pattern. Questo approccio ci permette di definire una famiglia di algoritmi (i vari gateway di pagamento), incapsularli e renderli intercambiabili.

Creazione dell’Interface

Iniziamo definendo un contratto che tutti i nostri gateway dovranno implementare:

<?php

namespace App\Contracts;

interface PaymentGatewayInterface
{
    public function processPayment(array $data): array;
}

Questa interfaccia semplice ma potente definisce il metodo fondamentale che ogni gateway dovrà implementare. Il metodo processPayment accetta un array di dati e restituisce un array con il risultato dell’operazione.

Configurazione del Service Provider

Il cuore del nostro sistema è il PaymentServiceProvider, che utilizza il Laravel Service Container per risolvere dinamicamente il gateway corretto:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Contracts\PaymentGatewayInterface;

class PaymentServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(PaymentGatewayInterface::class, function ($app, $parameters) {
            $method = $parameters['payment_method'] ?? config('payment_methods.default');
            $service = config("payment_methods.methods.{$method}.service");

            return $app->make($service);
        });
    }
}

Questo approccio utilizza la dependency injection di Laravel per istanziare dinamicamente il gateway appropriato basandosi sul metodo di pagamento selezionato.

Il Controller Unificato

Il nostro PaymentController gestisce tutte le richieste di pagamento in modo uniforme:

<?php

namespace App\Http\Controllers;

use App\Models\Order;
use App\Contracts\PaymentGatewayInterface;
use App\Enums\StatusEnum;
use Illuminate\Http\Request;

class PaymentController extends Controller
{
    public function pay(Request $request)
    {
        // Determina se è un callback o una richiesta iniziale
        $isCallback = $request->has('token') || $request->has('session_id') || $request->has('gateway');

        if ($isCallback) {
            return $this->handleCallback($request);
        }

        return $this->initiatePayment($request);
    }

    private function initiatePayment(Request $request)
    {
       //Inizia e prepara pagamento
    }

    private function handleCallback(Request $request)
    {
       //Gestiamo la callback
    }

    private function redirectToSuccess(array $result)
    {
        //Ritorniamo sempre un array
        return redirect()->route('complete')->with([
            'success' => $result['message'] ?? 'Pagamento elaborato con successo',
            'order' => $result['order'],
            'completed' => $result['completed'] ?? false
        ]);
    }

    public function success()
    {
        $order = session('order');
        $message = session('success');
        $completed = session('completed', false);

        if (!$order) {
            return redirect()->route('home')->with('error', 'Nessun ordine trovato');
        }

        return view('success', [
            'order' => $order,
            'message' => $message,
            'completed' => $completed
        ]);
    }
}

Configurazione dei Metodi di Pagamento

Creiamo un file di configurazione config/payment_methods.php:

<?php

return [

    'default' => env('DEFAULT_PAYMENT_METHOD','bank_transfer'),

    'methods' => [
        'bank_transfer' => [
            'enabled' => true,
            'code' => 'bank_transfer',
            'name' => 'Bonifico Bancario',
            'service' => \App\Services\BankTransferService::class,
        ],
        'paypal' => [
            'enabled' => true,
            'code' => 'paypal',
            'name' => 'PayPal',
            'service' => \App\Services\PayPalService::class,
        ],
        'stripe' => [
            'enabled' => true,
            'code' => 'stripe',
            'name' => 'Carta di Credito (Stripe)',
            'service' => \App\Services\StripeService::class,
        ],
    ],

];

Step 2: Implementazione del Bonifico Bancario

Il bonifico bancario rappresenta uno dei metodi di pagamento più tradizionali ma ancora molto utilizzati in Italia. Il bonifico bancario è uno strumento di pagamento che consiste nel trasferire una somma di denaro da un conto corrente ad un altro, garantendo tracciabilità e sicurezza.

Step 3: Implementazione di PayPal

PayPal rimane uno dei gateway di pagamento più popolari a livello mondiale. Paypal è un metodo di pagamento internazionale che funziona nella maggior parte dei paesi che supportano i trasferimenti di denaro online, offrendo sicurezza e facilità d’uso.

Step 4: Implementazione di Stripe

Stripe è noto per la sua eccellente documentazione e facilità di integrazione. Le API di Stripe forniscono varie opzioni, tra cui quella del pagamento on site tramite carta di credito, rendendolo ideale per un’esperienza di pagamento fluida.

Conclusioni e Punti Chiave

Riassunto dei Vantaggi

Implementare un sistema di pagamento scalabile in Laravel utilizzando il pattern architetturale presentato offre numerosi vantaggi:

Scalabilità: Aggiungere nuovi gateway è questione di creare una nuova classe che implementa l’interfaccia
Manutenibilità: Ogni gateway è isolato nel proprio service, facilitando modifiche e debug
Testabilità: L’uso delle interfacce permette di creare facilmente mock per i test
Sicurezza: Centralizzazione della logica di sicurezza e conformità PCI
Flessibilità: Facile switch tra ambienti di test e produzione

FAQ - Domande Frequenti

Q: Posso utilizzare questa architettura per gateway non menzionati nell’articolo?
A: Assolutamente sì! L’architettura è progettata per essere estensibile. Basta creare un nuovo service che implementi PaymentGatewayInterface.

Q: Come gestisco i pagamenti ricorrenti o abbonamenti?
A: Per gli abbonamenti, considera l’utilizzo di Laravel Cashier che fornisce un’astrazione di alto livello per gestire subscription con Stripe e Paddle.

Q: È necessario utilizzare code per i webhook?
A: È altamente consigliato utilizzare le code per processare i webhook, specialmente in produzione, per evitare timeout e garantire l’affidabilità.

Q: Come posso testare i pagamenti senza spendere soldi reali?
A: Tutti i principali gateway offrono ambienti sandbox con carte di test. Utilizza sempre questi ambienti durante lo sviluppo.

Q: Quali sono i costi tipici per l’implementazione di questi gateway?
A: I costi variano: Stripe e PayPal applicano commissioni intorno al 2.9% + fee fissa per transazione. Il bonifico bancario generalmente non ha commissioni per chi riceve.


Hai trovato utile questa guida? Implementa il sistema di pagamento nel tuo progetto Laravel e condividi la tua esperienza! Se hai domande o suggerimenti per migliorare l’architettura, lascia un commento qui sotto.

Vuoi rimanere aggiornato sulle best practice di Laravel? Iscriviti alla nostra newsletter per ricevere guide esclusive e tips avanzati direttamente nella tua inbox.

Ricorda: la sicurezza dei pagamenti è fondamentale. Non esitare a consultare un esperto di sicurezza prima di andare in produzione con il tuo sistema di pagamento.