A lightweight, plug-and-play Laravel package for managing virtual wallets, supporting multiple wallet types, transaction logs, and seamless integration with any model like User
.
πΌ Multi-Wallet Support β Create and manage multiple wallet types per user.
π Transaction Management β All wallet operations are recorded for full traceability.
π³ Payment Processing β Seamlessly handle payments between wallets or external systems.
π¦ Deposit Handling β Accept and log deposits from users or third-party services.
π Multiple Currency Support β Manage wallet balances in different currencies with ease.
πΆ Wallet Status Tracking β Monitor and update wallet statuses like active, frozen, or closed.
π Secure & Reliable β Built using Laravel's Eloquent, enums, morphs & policy-friendly structure.
βοΈ Highly Configurable β Override models, table names, and more via config.
π§© Easy Integration β Just use a trait on your model and you're ready to go.
πΈ Balance Management β Simple credit, debit, transfer, and balance APIs.
composer require haxneeraj/laravel-virtual-wallet
php artisan vendor:publish --provider="Haxneeraj\LaravelVirtualWallet\LaravelVirtualWalletServiceProvider"
php artisan migrate
After publishing the config file, you can modify config/laravel-virtual-wallet.php
to override models, table names, and enums if needed.
Add the trait and implement the interface in your User
(or any Eloquent model):
use Haxneeraj\LaravelVirtualWallet\Interfaces\WalletInterface;
use Haxneeraj\LaravelVirtualWallet\Traits\HasVirtualWallet;
class User extends Authenticatable implements WalletInterface
{
use HasVirtualWallet;
}
$user->wallets()->create([
'wallet_type' => 'main', // Type of wallet (e.g., 'main', 'bonus', 'savings'). Define these in your WalletType enum.
'currency' => 'usd', // ISO currency code. Ensure 'usd' or your required currencies are defined in your Currency enum.
'balance' => 100, // Initial wallet balance. Usually set to 0 or default starting value.
'currency_type' => 'fiat_currency', // Define whether the currency is fiat, crypto, token, etc. Set values in CurrencyType enum.
'status' => 'active' // Current status of wallet (e.g., 'active', 'frozen', 'closed'). Defined in WalletStatus enum.
]);
$paymentData = new PaymentData([
'owner_type' => User::class,
'owner_id' => $this->user->id,
'txid' => 'test-txid',
'amount' => 100,
'description' => 'Test deposit',
'wallet_type' => 'wallet1',
'method' => 'automatic',
'transaction_type' => 'deposit',
'status' => 'approved',
'currency' => 'usd',
'currency_type' => 'fiat_currency'
]);
$user->deposit($paymentData);
$paymentData = new PaymentData([
'owner_type' => User::class,
'owner_id' => $this->user->id,
'txid' => 'test-txid-withdraw1',
'amount' => 50,
'description' => 'Test withdrawal',
'wallet_type' => 'wallet1',
'method' => 'automatic',
'transaction_type' => 'withdraw',
'status' => 'approved',
'currency' => 'usd',
'currency_type' => 'fiat_currency'
]);
$user->pay($paymentData);
$balance = $user->getBalance('main');
$user->hasSufficientBalance(50, 'main');
Method | Parameters | Returns | Description |
---|---|---|---|
wallets() |
string $walletType = null |
MorphMany |
Get all wallets or filter by type |
getBalance() |
string $walletType = null |
int OR float |
Get wallet balance |
hasBalance() |
string $walletType = null |
bool |
Check if wallet has positive balance |
hasSufficientBalance() |
int OR float $amount, string $walletType = null |
bool |
Check if wallet has sufficient balance |
Method | Parameters | Returns | Description |
---|---|---|---|
pay() |
PaymentData $paymentData |
void |
Process payment from wallet(s) |
Method | Parameters | Returns | Description |
---|---|---|---|
deposit() |
PaymentData $paymentData |
void |
Deposit funds into wallet |
The PaymentData
object is used for both payments and deposits. It accepts the following parameters:
owner_type
: Owner model typeowner_id
: Owner model IDamount
: The amount to processwallet_type
: Type of wallet (optional)description
: Transaction descriptionstatus
: Transaction statusmethod
: Payment methodtransaction_type
: Type of transactiontxid
: Transaction ID
The package throws the following exceptions:
InvalidWalletException
: When wallet type is invalid or wallet not foundInsufficientBalanceException
: When wallet balance is insufficient
This package comes with feature and unit tests to ensure everything works smoothly.
π Run Tests
composer test
Contributions, issues and feature requests are welcome!
- Fork it
- Create your feature branch (
git checkout -b feature/awesome
) - Commit your changes (
git commit -am 'Add something awesome'
) - Push to the branch (
git push origin feature/awesome
) - Create a new Pull Request
Neeraj Saini
π§ [email protected]
π https://github.com/haxneeraj/laravel-virtual-wallet
Licensed under the MIT License.