Awesome Open Source
Awesome Open Source

Laravel Wallet

Maintainability Test Coverage Financial Contributors on Open Collective Mutation testing badge

Package Rank Latest Stable Version Latest Unstable Version License composer.lock


laravel-wallet - Easy work with virtual wallet.

[Documentation] [Get Started]

[Документация] [Как начать]

  • Vendor: bavix
  • Package: laravel-wallet
  • Version: Latest Stable Version
  • PHP Version: 7.3+ (if you are using version 5.x then 7.2+)
  • Laravel Version: 5.5, 5.6, 5.7, 5.8, 6.x, 7.x, 8.x
  • Composer: composer require bavix/laravel-wallet

Upgrade Guide

Starting with version 5.x, support for Laravel 5 has been discontinued. Update laravel or use version 4.x.

To perform the migration, you will be helped by the instruction.


Extension Description
Swap Addition to the laravel-wallet library for quick setting of exchange rates
Vacuum Addition to the laravel-wallet library for quick fix race condition


Add the HasWallet trait and Wallet interface to model.

use Bavix\Wallet\Traits\HasWallet;
use Bavix\Wallet\Interfaces\Wallet;

class User extends Model implements Wallet
    use HasWallet;

Now we make transactions.

$user = User::first();
$user->balance; // int(0)

$user->balance; // int(10)

$user->balance; // int(9)

$user->forceWithdraw(200, ['description' => 'payment of taxes']);
$user->balance; // int(-191)


Add the CanPay trait and Customer interface to your User model.

use Bavix\Wallet\Traits\CanPay;
use Bavix\Wallet\Interfaces\Customer;

class User extends Model implements Customer
    use CanPay;

Add the HasWallet trait and Product interface to Item model.

use Bavix\Wallet\Traits\HasWallet;
use Bavix\Wallet\Interfaces\Product;
use Bavix\Wallet\Interfaces\Customer;

class Item extends Model implements Product
    use HasWallet;

    public function canBuy(Customer $customer, int $quantity = 1, bool $force = null): bool
         * If the service can be purchased once, then
         *  return !$customer->paid($this);
        return true; 
    public function getAmountProduct(Customer $customer)
        return 100;

    public function getMetaProduct(): ?array
        return [
            'title' => $this->title, 
            'description' => 'Purchase of Product #' . $this->id,
    public function getUniqueId(): string
        return (string)$this->getKey();

Proceed to purchase.

$user = User::first();
$user->balance; // int(100)

$item = Item::first();
$user->pay($item); // If you do not have enough money, throw an exception
var_dump($user->balance); // int(0)

if ($user->safePay($item)) {
  // try to buy again )

var_dump((bool)$user->paid($item)); // bool(true)

var_dump($user->refund($item)); // bool(true)
var_dump((bool)$user->paid($item)); // bool(false)

Eager Loading


How to work with fractional numbers?

Add the HasWalletFloat trait and WalletFloat interface to model.

use Bavix\Wallet\Traits\HasWalletFloat;
use Bavix\Wallet\Interfaces\WalletFloat;
use Bavix\Wallet\Interfaces\Wallet;

class User extends Model implements Wallet, WalletFloat
    use HasWalletFloat;

Now we make transactions.

$user = User::first();
$user->balance; // int(100)
$user->balanceFloat; // float(1.00)

$user->balance; // int(237)
$user->balanceFloat; // float(2.37)

Supported by

Supported by JetBrains


Code Contributors

This project exists thanks to all the people who contribute. [Contribute].

Financial Contributors

Become a financial contributor and help us sustain our community. [Contribute]



Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
php (15,964
laravel (1,579
composer (247
wallet (130
eloquent (102
virtual (38
purchase (20

Find Open Source By Browsing 7,000 Topics Across 59 Categories