Laravel Wallet 快速開發錢包功能應用

緣由:

最近由於項目(基於laravel)須要一個用戶錢包功能,因而準備手擼一個,分析了一下咱們項目對錢包需求的功能點,大概有:充值、消費(購買平臺服務)、轉帳、提現、而且須要查看全部的資金變更記錄。

契機:

本着程序員最高的神聖規則:不重複製造輪子 。在 github 上搜索 wallet,果真有人開源了一個:https://github.com/bavix/laravel-wallet 有兩百多個 start ,懷着試試的想法,我探索一下。

搭建實驗室:

安裝laravel框架:composer create-project --prefer-dist laravel/laravel laravel
修改.env 的數據
引入UI:composer require laravel/ui
建立用戶系統:artisan ui vue --auth
執行遷移:artisan migrate
編譯資源:yarn dev

開始引入laravel-wallet:

引入laravel-wallet:composer require bavix/laravel-wallet
【若是是用lumen須要在bootstrap/app.php添加:
$app->register(\Bavix\Wallet\WalletServiceProvider::class);
生成遷移文件:artisan vendor:publish --tag=laravel-wallet-migrations
生成配置文件:artisan vendor:publish --tag=laravel-wallet-config

數據庫中增長了三張表:

wallet表:

transfers:表

transactions表:
php

開始簡單的測試:

先在系統中註冊兩個用戶,conner1, conner2;
修改 User 模型:vue

use  Bavix\Wallet\Traits\HasWallet;
use Bavix\Wallet\Interfaces\Wallet;
class User extends Model implements Wallet {
use HasWallet;
}

而後修改 默認的 HomeControoler.php, 根據文檔測試功能laravel

public function index(){
//獲取當前用戶
$user = Auth::user();
//初始化錢包
$user->balance;
}

上面代碼會在 wallet 中建立一條用戶關聯的錢包,格式以下:git


接下來咱們看看簡單的充值和提現功能程序員

public function index(){
//獲取當前用戶
$user = Auth::user();
//初始化錢包
$user->balance;
//充值 100
$user->deposit(100);
//打印看一下是個啥
dd($user->balance); // 字符串類型的一百
// 繼續充兩次看看數據庫有些什麼記錄
$user->deposit(100);
$user->deposit(100);
}

transactions表中有這樣三條記錄:github

wallet表中爲:數據庫


而後繼續,咱們試試提現:bootstrap

$user->withdrap(50);

transactions表 增長一條記錄:微信


wallet表 少50
到目前沒感受不到有什麼特殊的地方,接下來咱們來看看代碼是怎麼實現的,首先是充值,deposit():
首先這個 Bavix\Wallet\Interfaces\Wallet 文件中找到方法以下app

/**
* @param int $amount
* @param array|null $meta
* @param bool $confirmed
* @return Transaction
*/

public function deposit($amount, ?array $meta = null, bool $confirmed = true): Transaction;

註釋很清楚,繼續看 trait Bavix\Wallet\Traits\HasWallet; 中

/**
* The input means in the system
*
* @param int $amount
* @param array|null $meta
* @param bool $confirmed
*
* @return Transaction
* @throws
*/

public function deposit($amount, ?array $meta = null, bool $confirmed = true): Transaction
{
$self = $this;
return app(DbService::class)->transaction(static function () use ($self, $amount, $meta, $confirmed) {
return app(CommonService::class)
->deposit($self, $amount, $meta, $confirmed);
});
}

到這裏仍是沒有看處處理邏輯,只是加了一個當前錢包實例進去,$self,繼續深刻,在commonService中:

/**
* @param Wallet $wallet
* @param int $amount
* @param array|null $meta
* @param bool $confirmed
* @return Transaction
*/

public function deposit(Wallet $wallet, $amount, ?array $meta, bool $confirmed = true): Transaction
{
return app(LockService::class)->lock($this, __FUNCTION__, function () use ($wallet, $amount, $meta, $confirmed) {
$walletService = app(WalletService::class);
$walletService->checkAmount($amount);

/**
* @var WalletModel $wallet
*/

$wallet = $walletService->getWallet($wallet);

$transactions = $this->multiOperation($wallet, [
app(Operation::class)
->setType(Transaction::TYPE_DEPOSIT)
->setConfirmed($confirmed)
->setAmount($amount)
->setMeta($meta)
]);

return current($transactions);
});
}

這裏就是具體的調用了,驗證金額等,調用 Operation 定義的方法 來處理。
感受仍是挺優雅的………
有興趣的童鞋一塊兒來探索吧:
https://bavix.github.io/laravel-wallet/


本文分享自微信公衆號 - PHP開源Hub(php_open)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索