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表:
laravel wallet ,如何快速开发出一个钱包功能的应用?
transfers:表
laravel wallet ,如何快速开发出一个钱包功能的应用?
transactions表:
laravel wallet ,如何快速开发出一个钱包功能的应用?

开始简单的测试:

先在系统中注册两个用户,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 中创建一条用户关联的钱包,格式如下:

laravel wallet ,如何快速开发出一个钱包功能的应用?
接下来我们看看简单的充值和提现功能

public function index(){
    //获取当前用户
    $user = Auth::user();
    //初始化钱包
    $user->balance;
    //充值 100
    $user->deposit(100);
    //打印看一下是个啥
    dd($user->balance); // 字符串类型的一百
    // 继续充两次看看数据库有些什么记录
    $user->deposit(100);
    $user->deposit(100);
}

transactions表中有这样三条记录:

laravel wallet ,如何快速开发出一个钱包功能的应用?

wallet表中为:

laravel wallet ,如何快速开发出一个钱包功能的应用?
然后继续,我们试试提现:

$user->withdrap(50);

transactions表 增加一条记录:

laravel wallet ,如何快速开发出一个钱包功能的应用?
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 协议》,转载必须注明作者和本文链接
join_jiang
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

这 优雅是真相了 越看越看不懂

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!