One facade for checkout, payouts, subscriptions and virtual accounts. Webhooks arrive verified and deduplicated, as ordinary Laravel events.
composer require abraham-flutterwave/laravel-paymentPHP 8.1 and up, Laravel 9 to 13. 21 services with 112 methods, 19 artisan commands, and pay buttons for Blade, React, Vue and Svelte.
app/Http/Controllers/CheckoutController.php
public function store(Order $order)
{
return Flutterwave::redirect([
'tx_ref' => $order->reference,
'amount' => $order->total,
'currency' => 'NGN',
'email' => $order->customer_email,
]);
}Each one is a guide with the calls it needs.
Flutterwave::redirect()ChargeCompletedplans()->create()$user->chargeSavedCard()'subaccounts' => [...]transfers()->create()virtualAccounts()->dynamicFor()bvn()->matches()bills()->payValidated()fx()->tradeIfReady()stablecoins()->send()Route::flutterwaveAdmin()Blade components work with no build step. The React, Vue and Svelte components are tested on Inertia 1, 2 and 3, and publish into your app so you can edit them.
Version 3, at api.flutterwave.com/v3, with the v3 inline checkout script. Your v3 test and live keys work as they are.
For anything you fulfil, yes. Customers close tabs before the redirect, and bank transfers and USSD payments can finish minutes later. The webhook route is registered for you; you only listen for ChargeCompleted.
Use test keys and Flutterwave’s test cards. In your test suite, Flutterwave::fake() answers every API call, and sandbox transfers take a test_outcome so you choose whether they succeed.
Run php artisan flutterwave:ping-webhook with a test transaction id. It signs a real payload and posts it to your local route, so nothing has to be exposed to the internet.
Map its key to your own class in config/flutterwave.php, or to null to turn it off. Your class receives the same constructor arguments as the built-in one.
Install the package, add your keys and take a test payment in about ten minutes.