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表:
开始简单的测试:
先在系统中注册两个用户,conner1, conner2;
修改 User 模型:
use Bavix\Wallet\Traits\HasWallet;
use Bavix\Wallet\Interfaces\Wallet;
class User extends Model implements Wallet {
use HasWallet;
}
然后修改 默认的 HomeControoler.php, 根据文档测试功能
public function index(){
//获取当前用户
$user = Auth::user();
//初始化钱包
$user->balance;
}
上面代码会在 wallet 中创建一条用户关联的钱包,格式如下:
接下来我们看看简单的充值和提现功能
public function index(){
//获取当前用户
$user = Auth::user();
//初始化钱包
$user->balance;
//充值 100
$user->deposit(100);
//打印看一下是个啥
dd($user->balance); // 字符串类型的一百
// 继续充两次看看数据库有些什么记录
$user->deposit(100);
$user->deposit(100);
}
transactions表中有这样三条记录:
wallet表中为:
然后继续,我们试试提现:
$user->withdrap(50);
transactions表 增加一条记录:
wallet表 少50
到目前没感觉不到有什么特殊的地方,接下来我们来看看代码是怎么实现的,首先是充值,deposit():
首先这个 Bavix\Wallet\Interfaces\Wallet 文件中找到方法如下
/**
* @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 定义的方法 来处理。
感觉还是挺优雅的………
有兴趣的童鞋一起来探索吧:
bavix.github.io/laravel-wallet/
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: