Top-up Balance & Credit Management
Sometimes you might want to allow your users to top up their account balance with credits, which they can use to pay for the services provided by your application. This is a common requirement for many SaaS applications.
To implement this, you can use the handy Laravel Wallet package, which provides a simple way to manage user balances and transactions, in combination with the events that come with SaaSykit.
So for example, once a user purchases a product or subscribes to a plan, you can listen to the event that's triggered by SaaSykit and add credits to their account balance.
Unfortunately, the Laravel Wallet package introduces a "transactions" table that conflicts with the one used by SaaSykit. Luckily, the Laravel Wallet package allows us to customize the table names it uses, so we can avoid this conflict.
In the following section, we will guide you through the steps to set up the Laravel Wallet package and configure it to work seamlessly with SaaSykit.
Installationโ
- To install the Laravel Wallet package, you can run the following command:
composer require bavix/laravel-wallet
- After installing the package, you need to publish its configuration file by running:
php artisan vendor:publish --tag=laravel-wallet-config
- Now, create a new model under the
app/Modelsdirectory calledWalletTransactionand extend it from theBavix\Wallet\Models\Transactionclass:
<?php
namespace App\Models;
class WalletTransaction extends \Bavix\Wallet\Models\Transaction
{
}
- Next, you need to update the
config/wallet.phpfile to use the newWalletTransactionmodel and change the table names to avoid conflicts with SaaSykit:
// some other configurations...
'transaction' => [
/**
* The table name for transactions.
*
* This value is used to store transactions in a database.
*
* @see Transaction
*/
'table' => env('WALLET_TRANSACTION_TABLE_NAME', 'wallet_transactions'), // <--- use a different table name
/**
* The model class for transactions.
*
* This value is used to create new transactions.
*
* @see Transaction
*/
'model' => \App\Models\WalletTransaction::class, // <--- use the new model
],
// some other configurations...
- Finally, you need to run the migrations to create the necessary tables in your database:
php artisan migrate
Usageโ
Now that you have installed and configured the Laravel Wallet package, you can start using it to manage user balances and transactions.
- Add the
HasWallettrait to yourUsermodel:
<?php
use Bavix\Wallet\Interfaces\Wallet;
use Bavix\Wallet\Traits\HasWallet;
class User extends Authenticatable implements FilamentUser, MustVerifyEmail, TwoFactorAuthenticatable, Wallet // <--- implement the Wallet interface
{
use HasApiTokens, HasFactory, HasRoles, Notifiable, TwoFactorAuthentication;
use HasWallet; // <--- use the HasWallet trait
// other methods and properties...
}
-
Now because the
Walletinterface uses thetransactionstable to store transactions, you need to remove the "transactions()" function from theUsermodel because it conflicts with its definition, and revise where it's being used in the application. -
That's it! You can now use the
deposit()method to add credits to the user's account balance:
$user = auth()->user();
// Add 100 credits to the user's account balance
$user->deposit(100);
- You can also use the
withdraw()method to deduct credits from the user's account balance:
// Deduct 50 credits from the user's account balance
$user->withdraw(50);
- To check the user's account balance, you can use the
balanceproperty:
$balance = $user->balance; // This will return the user's account balance
You can use the deposit() and withdraw() methods in your application wherever you need to add or deduct credits from the user's account balance, such as when they purchase a product or subscribe to a plan in combination with the events that come with SaaSykit.