Payment Manager plugin screenshot
Dark mode ready
Multilingual support
No v5.x support

Payment Manager by Fady Mondy

Community

Manage your payments inside FilamentPHP app with multi payment gateway integration

Tags: Developer Tool
Supported versions:
3.x
Fady Mondy avatar Author: Fady Mondy

Package health

Automated checks of this plugin's Composer package

75 / 100
Security 61
Maintenance 90
Ecosystem 100
15 checks
  • Failed: GitHub Actions pinned to SHA — View details on Plumb
  • Skipped: GitLab CI includes pinned to SHA
  • Passed: Open security advisories
  • Passed: Dependabot PR responsiveness — No open Dependabot PRs.
  • Skipped: Renovate MR responsiveness
  • Failed: Dependabot or Renovate configured — No dependency updater configuration found. View details on Plumb
  • Skipped: Dependency update cooldown configured
  • Passed: Provides a security policy
  • Passed: Abandoned or archived — No consulted source marks the package abandoned (packagist, github).
  • Passed: Commit and release recency — Active: last commit 0 days ago; last release 25 days ago.
  • Passed: composer.lock not committed by library — composer.lock is absent from the released dist archive.
  • Warning: Dist archive is lean
  • Passed: Current Laravel version supported — Package dependencies resolve together with current Laravel 13.0.
  • Passed: Current PHP version supported — Constraint ^8.2 supports current PHP 8.5.
  • Skipped: Current Symfony version supported
Third-party plugin. This is built by the community, not the Filament team. Filament does not review, endorse, or vet the security of plugins outside the filament/ namespace. Review the source and install at your own risk. Found malware or an unresolved security issue the author won't address? Report it .
Powered by Plumb Last scanned 1 week ago

Documentation

Screenshot

Latest Stable Version License Downloads

Manage your payments inside FilamentPHP app with multi payment gateway integration

#Screenshots

Payments Payments Dark View Payment View Payment Dark Payment Gateways Payment Gateways Dark Edit Gateway Edit Gateway Dark Payment Page Payment Page Dark

#Features

  • Payments List
  • Payment View
  • Payment Filter And Groups by Status
  • Payment Gates
  • Payment Gate Options
  • Payment Action
  • Payment Facade Method
  • Payment Page
  • Payment Drivers
  • StripeV3 Integration
  • Plisio Integration
  • Paypal Integration
  • Paymob Integration
  • Tap Integration
  • Myfatoorah Integration
  • Creptomus Integration
  • Paddle Integration
  • Lemon Squeezy Integration
  • Binance Integration
  • PayTabs Integration
  • Moyaser Integration
  • Payfort Integration
  • Fawery Integration

#Compatibility

Package version Filament Laravel PHP
5.x 5.x 12 / 13 8.2+
1.x (v3 branch) 3.x 10 / 11 8.1+

#Installation

composer require tomatophp/filament-payments

we need the Media Library plugin to be installed and migrated you can use this command to publish the migration

php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="medialibrary-migrations"

after install your package please run this command

php artisan filament-payments:install

finally register the plugin on /app/Providers/Filament/AdminPanelProvider.php

->plugin(\TomatoPHP\FilamentPayments\FilamentPaymentsPlugin::make())

#Using

you can use payment with the very easy way just use Facade FilamentPayments like this

use TomatoPHP\FilamentPayments\Facades\FilamentPayments;
use TomatoPHP\FilamentPayments\Services\Contracts\PaymentBillingInfo;
use TomatoPHP\FilamentPayments\Services\Contracts\PaymentCustomer;
use TomatoPHP\FilamentPayments\Services\Contracts\PaymentRequest;
use TomatoPHP\FilamentPayments\Services\Contracts\PaymentShippingInfo;
use TomatoPHP\FilamentSubscriptions\Facades\FilamentSubscriptions;

return redirect()->to(
        FilamentPayments::pay(
            data: PaymentRequest::make(Plan::class)
                ->model_id($data['new']->id)
                ->currency('USD')
                ->amount($data['new']->price)
                ->details('Subscription Payment')
                ->success_url(url('/success'))
                ->cancel_url(url('/cancel'))
                ->customer(
                    PaymentCustomer::make('John Doe')
                        ->email('[email protected]')
                        ->mobile('+201207860084')
                )
                ->billing_info(
                    PaymentBillingInfo::make('123 Main St')
                        ->area('Downtown')
                        ->city('Cairo')
                        ->state('Cairo')
                        ->postcode('12345')
                        ->country('EG')
                )
                ->shipping_info(
                    PaymentShippingInfo::make('123 Main St')
                        ->area('Downtown')
                        ->city('Cairo')
                        ->state('Cairo')
                        ->postcode('12345')
                        ->country('EG'
                        )
                )),
    );

if you want to return it as json you can just make json: true, this method return a URL for you with the payment, you can share this signed link with the customer to make the payment done (see Payment Links).

#Use Payment Action

you can use a Table Action to make it easy to link Payment with your table like this

use TomatoPHP\FilamentPayments\Filament\Actions\PaymentAction;

public function table(Table $table): $table
{
    return $table
        ->actions([
             PaymentAction::make('payment')
                ->request(function ($record){
                    return PaymentRequest::make(Order::class)
                        ->model_id($record->id)
                        ->currency('USD')
                        ->amount($record->total)
                        ->details($record->ordersItems()->pluck('product_id')->implode(', '))
                        ->success_url(url('/success'))
                        ->cancel_url(url('/cancel'))
                        ->customer(
                            PaymentCustomer::make($record->name)
                                ->email($record->account->email)
                                ->mobile($record->phone)
                        )
                        ->billing_info(
                            PaymentBillingInfo::make($record->address)
                                ->area($record->area->name)
                                ->city($record->city->name)
                                ->state($record->city->name)
                                ->postcode('12345')
                                ->country($record->country->iso3)
                        )
                        ->shipping_info(
                            PaymentShippingInfo::make($record->address)
                                ->area($record->area->name)
                                ->city($record->city->name)
                                ->state($record->city->name)
                                ->postcode('12345')
                                ->country($record->country->iso3)
                        );
                })
                ->pay(),
        ]);
}

#Integrate With Filament Subscription

if you like to use this package with Filament Subscription you can use this code

use TomatoPHP\FilamentPayments\Facades\FilamentPayments;
use TomatoPHP\FilamentPayments\Services\Contracts\PaymentBillingInfo;
use TomatoPHP\FilamentPayments\Services\Contracts\PaymentCustomer;
use TomatoPHP\FilamentPayments\Services\Contracts\PaymentRequest;
use TomatoPHP\FilamentPayments\Services\Contracts\PaymentShippingInfo;
use TomatoPHP\FilamentSubscriptions\Facades\FilamentSubscriptions;

public function boot(): void
    {
        FilamentSubscriptions::afterSubscription(function ($data) {
            //Payment Here
            return redirect()->to(FilamentPayments::pay(
                data: PaymentRequest::make(Plan::class)
                    ->model_id($data['new']->id)
                    ->currency('USD')
                    ->amount($data['new']->price)
                    ->details('Subscription Payment')
                    ->success_url(url('/success'))
                    ->cancel_url(url('/cancel'))
                    ->customer(
                        PaymentCustomer::make('John Doe')
                            ->email('[email protected]')
                            ->mobile('+201207860084')
                    )
                    ->billing_info(
                        PaymentBillingInfo::make('123 Main St')
                            ->area('Downtown')
                            ->city('Cairo')
                            ->state('Cairo')
                            ->postcode('12345')
                            ->country('EG')
                    )
                    ->shipping_info(
                        PaymentShippingInfo::make('123 Main St')
                            ->area('Downtown')
                            ->city('Cairo')
                            ->state('Cairo')
                            ->postcode('12345')
                            ->country('EG')
                    )
            ));
        });
    }

it will redirect you to payment after the hook is called.

#Payment Page Guard

The payment page (/pay/{trx}) requires an authenticated user. Since v5 it uses config('filament-payments.guard'), which defaults to your app's default guard (before v5 it was hard-coded to auth:accounts). To use another guard, or to get the old behaviour back, publish the config and set:

// config/filament-payments.php
'guard' => 'accounts',

The payment page (/pay/{trx}) and the gateway cancel return (GET /pay/{trx}/cancel) are protected by Laravel signed URLs, and only the payment owner can open or cancel a payment. Route names are unchanged, but links must now come from the package: FilamentPayments::pay(), the PaymentAction and the pay/initiate API already return signed links; if you build one yourself use the payment model:

$payment->payUrl();       // signed link to the payment page
$payment->cancelUrl();    // signed link a gateway can redirect the customer back to

A plain route('payment.index', $trx) (or a hand-written /pay/{trx} link) is rejected with a 403. Breaking changes:

  • Payment page links expire (default 24 hours) and cancel return links expire (default 3 days). Change it, or pass null to never expire, in the published config:
// config/filament-payments.php
'links' => [
    'pay_expires' => 60 * 24,      // minutes
    'cancel_expires' => 60 * 24 * 3,
],
  • Cancelling from the payment page is now a CSRF protected POST /pay/{trx}/cancel (route payment.cancel.submit). The signed GET cancel route is only meant for gateway redirects; custom drivers must use $payment->cancelUrl() for their cancel/return URL (extra query parameters go in cancelUrl(['session' => $payment->trx]) so they are part of the signature).
  • The signed-in user must own the payment: the payment model is the user, the user can access the payment model as a team/tenant (canAccessTenant() / belongsToTeam()), or the payment customer.email matches the user's email. Anyone else gets a 403. If your payment links are meant to be paid by a different account, set 'enforce_owner' => false in the config (the signed link is then the only check).

#Gateway Secrets

Gateway parameters are stored encrypted with your APP_KEY, and secret parameters are never sent to the browser: in the gateway edit modal they are empty password inputs, and leaving one blank keeps the current value. Each driver declares its secret keys; a custom driver opts in like this:

public static function secretKeys(): array
{
    return ['secret_key'];
}

If you rotate APP_KEY, re-enter your gateway keys.

#Publish Assets

you can publish config file by use this command

php artisan vendor:publish --tag="filament-payments-config"

you can publish views file by use this command

php artisan vendor:publish --tag="filament-payments-views"

you can publish languages file by use this command

php artisan vendor:publish --tag="filament-payments-lang"

you can publish migrations file by use this command

php artisan vendor:publish --tag="filament-payments-migrations"

#Other Filament Packages

Checkout our Awesome TomatoPHP