bavix/laravel-wallet

与虚拟钱包一起工作非常简单。

11.3.0 2024-09-11 19:12 UTC

README

Laravel Wallet

Maintainability Test Coverage Financial Contributors on Open Collective Mutation testing badge

Latest Stable Version Latest Unstable Version License composer.lock

Sparkline

laravel-wallet - 与虚拟钱包一起工作非常简单。

[基准测试] [文档] [入门]

  • 供应商: bavix
  • : laravel-wallet
  • Composer: composer require bavix/laravel-wallet

支持策略

重要

如果您正在使用laravel-wallet ^10.0与laravel ^11,则最低php版本为8.2。

升级指南

要执行迁移,您将需要指导

社区

我想为使用钱包包的开发者创建一个舒适的地方。这将帮助您更快地找到错误,获取反馈并讨论想法。

telegram

Telegram: @laravel_wallet

扩展

用法

HasWallet特性类和Wallet接口添加到模型中。

use Bavix\Wallet\Traits\HasWallet;
use Bavix\Wallet\Interfaces\Wallet;

class User extends Model implements Wallet
{
    use HasWallet;
}

现在我们进行交易。

$user = User::first();
$user->balanceInt; // 0

$user->deposit(10);
$user->balance; // 10
$user->balanceInt; // int(10)

$user->withdraw(1);
$user->balance; // 9

$user->forceWithdraw(200, ['description' => 'payment of taxes']);
$user->balance; // -191

购买

CanPay特性类和Customer接口添加到您的User模型中。

use Bavix\Wallet\Traits\CanPay;
use Bavix\Wallet\Interfaces\Customer;

class User extends Model implements Customer
{
    use CanPay;
}

HasWallet特性类和接口添加到Item模型中。

从版本9.x开始有两个产品接口

  • 对于无限数量的产品(ProductInterface);
  • 对于有限数量的产品(ProductLimitedInterface);

无限数量产品的示例

use Bavix\Wallet\Traits\HasWallet;
use Bavix\Wallet\Interfaces\Customer;
use Bavix\Wallet\Interfaces\ProductInterface;

class Item extends Model implements ProductInterface
{
    use HasWallet;

    public function getAmountProduct(Customer $customer): int|string
    {
        return 100;
    }

    public function getMetaProduct(): ?array
    {
        return [
            'title' => $this->title, 
            'description' => 'Purchase of Product #' . $this->id,
        ];
    }
}

有限数量产品的示例

use Bavix\Wallet\Traits\HasWallet;
use Bavix\Wallet\Interfaces\Customer;
use Bavix\Wallet\Interfaces\ProductLimitedInterface;

class Item extends Model implements ProductLimitedInterface
{
    use HasWallet;

    public function canBuy(Customer $customer, int $quantity = 1, bool $force = false): bool
    {
        /**
         * This is where you implement the constraint logic. 
         * 
         * If the service can be purchased once, then
         *  return !$customer->paid($this);
         */
        return true; 
    }
    
    public function getAmountProduct(Customer $customer): int|string
    {
        return 100;
    }

    public function getMetaProduct(): ?array
    {
        return [
            'title' => $this->title, 
            'description' => 'Purchase of Product #' . $this->id,
        ];
    }
}

我不建议在处理购物车时使用有限接口。如果您正在处理购物车,则应重写PurchaseServiceInterface接口。通过它,您可以使用一个请求检查所有产品的可用性,数据库中将不会有N查询。

继续购买。

$user = User::first();
$user->balance; // 100

$item = Item::first();
$user->pay($item); // If you do not have enough money, throw an exception
var_dump($user->balance); // 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)

预加载

// When working with one wallet
User::with('wallet');

// When using the multi-wallet functionality
User::with('wallets');

如何处理分数?

HasWalletFloat特性类和WalletFloat接口添加到模型中。

use Bavix\Wallet\Traits\HasWalletFloat;
use Bavix\Wallet\Interfaces\WalletFloat;
use Bavix\Wallet\Interfaces\Wallet;

class User extends Model implements Wallet, WalletFloat
{
    use HasWalletFloat;
}

现在我们进行交易。

$user = User::first();
$user->balance; // 100
$user->balanceFloat; // 1.00

$user->depositFloat(1.37);
$user->balance; // 237
$user->balanceFloat; // 2.37

性能比较

所有版本

使用基准测试生成的表格。拉取请求

支持者

Supported by JetBrains

贡献者

代码贡献者

此项目得益于所有贡献者。[贡献].

财务贡献者

成为财务贡献者,帮助我们维持我们的社区。[贡献]

个人

组织

请贵组织支持此项目。您的标志将在这里显示,并带有链接到您的网站。[贡献]