xtwoend / hyperf-wallet
Easy work with virtual wallet.
Requires
- php: ^7.3|^8.0
- ext-pdo: *
- brick/math: ~0.8
- doctrine/dbal: ^2.8|^3.0
- hyperf/db-connection: ^2.1
- ramsey/uuid: ^3.0|^4.0
Requires (Dev)
- brianium/paratest: ^6.2
- cknow/laravel-money: ^6.1
- infection/infection: ~0.17
- laravel/cashier: ^12.5
- nunomaduro/collision: ^5.4
- orchestra/testbench: ^6.4
- phpmetrics/phpmetrics: ^v2.7
- phpstan/phpstan: ^0.12
- phpunit/phpunit: ^9.4
- psalm/plugin-laravel: ^1.4
- vimeo/psalm: ^4.1
Suggests
- bavix/laravel-wallet-swap: Addition to the laravel-wallet library for quick setting of exchange rates
- bavix/laravel-wallet-vacuum: Addition to the laravel-wallet library for quick fix race condition
This package is auto-updated.
Last update: 2024-10-29 06:18:59 UTC
README
laravel-wallet - Easy work with virtual wallet.
- Vendor: bavix
- Package: laravel-wallet
- 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.
Extensions
Usage
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->deposit(10); $user->balance; // int(10) $user->withdraw(1); $user->balance; // int(9) $user->forceWithdraw(200, ['description' => 'payment of taxes']); $user->balance; // int(-191)
Purchases
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
User::with('wallet');
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->depositFloat(1.37); $user->balance; // int(237) $user->balanceFloat; // float(2.37)
Supported by
Contributors
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]
Individuals
Organizations
Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]