Paiement en Ligne avec Paddle et Laravel Cashier

March 16, 2025 Tutoriel

Découvrez comment intégrer Paddle Checkout avec Laravel Cashier pour gérer les paiements et abonnements facilement.

Paiement en Ligne avec Paddle et Laravel Cashier

Introduction

Laravel Cashier simplifie la gestion des paiements avec Paddle, notamment pour les transactions uniques et les abonnements. Dans cet article, nous allons voir comment :
✅ Configurer Paddle Checkout dans Laravel
✅ Ajouter une page de paiement Filament
✅ Gérer les webhooks Paddle pour suivre les paiements


Étape 1 : Installer Cashier Paddle

Installe Cashier Paddle via Composer :

composer require laravel/cashier-paddle

Puis publie les migrations et exécute-les :

php artisan vendor:publish --tag="cashier-migrations"
php artisan migrate

Étape 2 : Configurer Paddle en Mode Sandbox

  1. Crée un compte sur Paddle Sandbox.
  2. Récupère tes clés Client-Side Token et API Key.
  3. Ajoute ces valeurs dans .env :
PADDLE_CLIENT_SIDE_TOKEN=test_c4f42c5d6081a68fb9396d0ad5c
PADDLE_API_KEY=efaa8c6e1ebf2ee89a507a910ec2b840b9a58488de99a9de30
PADDLE_SANDBOX=true

Étape 3 : Ajouter un Produit Paddle

Avant de pouvoir utiliser Paddle Checkout, tu dois créer un produit et récupérer son Product ID.

  1. Accède à ton compte Paddle (Sandbox ou Production).
  2. Va dans "Catalog" → "Products".
  3. Clique sur "Create Product" et remplis les informations.
  4. Récupère l'ID du produit (pri_xxxxxxxx).

Cet ID est essentiel pour générer le lien de paiement avec Cashier Paddle.


Étape 4 : Ajouter Cashier à votre Modèle User

Ajoute le trait Billable dans app/Models/User.php :

use Laravel\Paddle\Billable;

class User extends Authenticatable
{
    use Billable;
}

Cela permet à chaque utilisateur d'effectuer des paiements et de suivre ses transactions.


Étape 5 : Créer une Page Checkout dans Filament

1⃣ Création de la Page Checkout

Crée la page Checkout avec la commande suivante :

php artisan make:filament-page Checkout

Puis modifie app/Filament/Pages/Checkout.php :

<?php

namespace App\Filament\Pages;

use Filament\Pages\Page;

class Checkout extends Page
{
    protected static ?string $navigationIcon = 'heroicon-o-credit-card';
    protected static string $view = 'filament.pages.checkout';
    
    protected function getViewData(): array
    {
        $checkout = auth()->user()->checkout('pri_xxxxxxxx');

        return ['checkout' => $checkout];
    }
}

Étape 6 : Créer la Vue Checkout avec Paddle

Dans resources/views/filament/pages/checkout.blade.php, ajoute :

<x-filament::page>
    @paddleJS

    <div class="max-w-lg mx-auto bg-white dark:bg-gray-800 rounded-lg shadow-md p-6 text-center">
        <h2 class="text-xl font-bold text-gray-800 dark:text-gray-200">Paiement</h2>
        <p class="text-gray-600 dark:text-gray-400 mb-4">
            Accédez à toutes les fonctionnalités premium avec notre achat unique.
        </p>
        
        @if(auth()->user()->hasPurchased())
            <p class="text-green-500">✅ Vous avez déjà effectué un achat !</p>
        @else
            <x-paddle-button :checkout="$checkout" class="px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 mt-4">
                Acheter avec Paddle
            </x-paddle-button>
        @endif
    </div>
</x-filament::page>

Étape 7 : Configurer les Webhooks Paddle

1⃣ Ajouter l’URL du Webhook

Dans Paddle Dashboard → Developer Tools → Webhooks, ajoute l’URL :

https://xxxxx.ngrok.io/paddle/webhook

⚠️ Important : Si tu testes en local, expose ton serveur avec Herd :

herd share

2⃣ Ajouter la Clé Secrète des Webhooks

Dans .env :

PADDLE_WEBHOOK_SECRET=your_webhook_secret

3⃣ Exclure les Webhooks du CSRF Token

Modifie bootstrap/app.php pour permettre à Paddle d'envoyer des requêtes :

->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(except: [
        'paddle/*',
    ]);
})

Étape 8 : Gérer les Transactions en Base de Données

Ajoute une méthode hasPurchased() dans User.php pour vérifier les paiements :

use Laravel\Paddle\Transaction;

public function hasPurchased(): bool
{
    return Transaction::where('billable_id', $this->id)
        ->where('status', 'completed')
        ->exists();
}

Conclusion

🎯 Bravo ! Tu as maintenant un système de paiement complet avec Laravel Filament et Paddle.

🚀 Prochaine étape : Passe en mode production en remplaçant PADDLE_SANDBOX=true par false dans .env.

💬 As-tu des questions ? Laisse un commentaire !