beebmx/laravel-pay

使用 Laravel 创建支付

0.7.0 2023-11-15 22:23 UTC

This package is auto-updated.

Last update: 2024-09-16 00:11:17 UTC


README

Latest Stable Version License

Laravel 的支付功能受到官方文档 Laravel Cashier 的启发。与 Cashier 相比,其方法略有不同,主要行为是支付交易。

安装

您可以通过 composer 安装此软件包

composer require beebmx/laravel-pay

您可以使用以下命令发布并运行迁移

php artisan vendor:publish --provider="Beebmx\LaravelPay\PayServiceProvider" --tag="pay-migrations"
php artisan migrate

您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="Beebmx\LaravelPay\PayServiceProvider" --tag="pay-config"

配置

在使用 Laravel 的支付 之前,您需要将 Payable 特性添加到您的用户模型中,默认位置在 App\Models\Users

use Beebmx\LaravelPay\Payable;

class User extends Authenticatable {

    use Payable;
}

自定义模型

您可以使用自己的模型来满足您的需求,只需在 App\Providers\AppServiceProvider 中设置,并在 boot 方法中通知 Laravel 的支付

use App\Models\Address;
use App\Models\Pay\User;
use App\Models\Transaction;
use App\Models\TransactionItem;
use Beebmx\LaravelPay\Pay;

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Pay::useCustomerModel(User::class);
    Pay::useAddressModel(Address::class);
    Pay::useTransactionModel(Transaction::class);
    Pay::useTransactionItemModel(TransactionItem::class);
}

请记住,如果您为自定义模型更改此设置,请确保使用 Laravel 的支付 扩展这些模型

use Beebmx\LaravelPay\Address as PayAddress;

class Address extends PayAddress
{
    //
}

驱动程序

沙盒

这是一个 playground,具有与测试或生产驱动程序相同的全部功能。

Stripe

要使用 stripe 驱动程序,您需要将其设置为默认驱动程序,并配置您的 testingproduction 密钥

<?php

return [
    'default' => 'stripe',
    
    'drivers' => [
        'stripe' => [
            'driver' => Beebmx\LaravelPay\Drivers\StripeDriver::class,
            'secret' => env('STRIPE_SECRET_KEY', null),
            'public' => env('STRIPE_PUBLIC_KEY', null),
            'webhooks' => [
                'handler' => Beebmx\LaravelPay\Http\Webhooks\StripeHandler::class,
                'events' => [
                    'customer.deleted',
                    'customer.updated',
                    'invoice.payment_action_required',
                    'payment_intent.canceled',
                    'payment_intent.payment_failed',
                    'payment_intent.requires_action',
                    'payment_intent.succeeded',
                ],
            ],
        ],
    ]
];

Conekta

要使用 conekta 驱动程序,您需要将其设置为默认驱动程序,并配置您的 testingproduction 密钥

<?php

return [
    'default' => 'conekta',
    
    'drivers' => [
        'conekta' => [
            'driver' => Beebmx\LaravelPay\Drivers\ConektaDriver::class,
            'secret' => env('CONEKTA_SECRET_KEY', null),
            'public' => env('CONEKTA_PUBLIC_KEY', null),
            'webhooks' => [
                'handler' => Beebmx\LaravelPay\Http\Webhooks\ConektaHandler::class,
            ],
        ],
    ]
];

客户

创建客户

一个 user 可以是客户(这不是强制要求)并将在相应的驱动程序中创建客户。要创建客户,只需使用 createCustomerWithDriver 方法即可。

$customer = $user->createCustomerWithDriver();

基本信息

当一个 user 成为 customer 时,用于创建它的列来自模型,但您可以使用以下方式自定义此信息:

public function driverName()
{
    return "{$this->your_own_colunm_name} {$this->your_own_colunm_lastname}";
}

public function driverEmail()
{
    return $this->your_own_colunm_email;
}

public function driverPhone()
{
    return $this->your_own_colunm_phone;
}

创建一个用户对于定期支付或避免每次都请求支付方式可能很有用。

支付方式

要添加支付方式,首先您需要在驱动程序平台上有一个客户。拥有客户后,只需添加正确的 tokenpayment_method

$paymentMethod = $user->addPaymentMethod('pm_card_visa');

运输

如果您的支付包含运输,则在执行支付之前添加正确的地址

$address = $user->addresses->first();
$user->shipping($address);

请记住,此软件包有一个内置的 address 模型。

支付

执行支付就像

$user->charge([
    'name' => 'Product',
    'price' => 500,
]);

如果您有多个产品或服务

$user->charge([[
    'name' => 'Product 01',
    'price' => 100
], [
    'name' => 'Product 02',
    'price' => 200
]]);

如果您有要应用的折扣,可以设置它

$user
    ->discount(200)
    ->charge([[
        'name' => 'Product 01',
        'price' => 100,
        'quantity' => 2
    ], [
        'name' => 'Product 02',
        'price' => 200,
        'quantity' => 1,
    ]]);

或者,您可以使用更多信息设置它

$user
    ->discount([
        'amount' => 200, 
        'code' => 'coupon-code',
    ])
    ->charge([[
        'name' => 'Product 01',
        'price' => 100,
        'quantity' => 2
    ], [
        'name' => 'Product 02',
        'price' => 200,
        'quantity' => 1,
    ]]);

重要的是用户至少有一个 payment method

如果您有运输地址

$address = $user->addresses->first();

$user
    ->shipping($address)
    ->charge([
        'name' => 'Testing product',
        'price' => 500,
    ]);

如果您不需要创建 payment method,您可以使用一次性支付 token 创建 charge

$user
    ->token('tok_visa4242')
    ->charge([
        'name' => 'Testing product',
        'price' => 500,
    ]);

如果您使用 token 选项,则 createCustomerWithDriver 是可选的,不是必需的。

如果您需要支付 transaction,您可以使用 getTransaction() 方法检索它

$payment = $user->charge([
    'name' => 'Product',
    'price' => 500,
]);

$payment->getTransaction()

Webhooks

默认情况下,Payments for Laravel 提供了方便的 Webhooks 管理。

首先,在您的 App\Http\Middleware\VerifyCsrfToken 文件中,您需要允许 WebhookController 的路径

protected $except = [
    'pay/webhooks',
];

默认路径是 pay/webhooks,但您可以在配置文件中更改它,更新 pay.pathpay.webhooks

您可以在驱动程序提供商网站上手动创建您的端点或使用以下命令:

php artisan pay:webhook

驱动程序 sandbox 不允许创建 Webhooks。

处理器

《WebhookController》总是对来自驱动程序提供商发出的事件做出响应,并将其传递到正确的处理器。默认情况下,每个驱动程序都在 config/pay.php 文件中定义了自己的处理器。

'drivers' => [
    'stripe' => [
        'webhooks' => [
            'handler' => Beebmx\LaravelPay\Http\Webhooks\StripeHandler::class,
            'events' => [
                'customer.deleted',
                'customer.updated',
                'invoice.payment_action_required',
                'payment_intent.canceled',
                'payment_intent.payment_failed',
                'payment_intent.requires_action',
                'payment_intent.succeeded',
            ],
        ],
    ],

    'conekta' => [
        'webhooks' => [
            'handler' => Beebmx\LaravelPay\Http\Webhooks\ConektaHandler::class,
        ],
    ],
],

您可以通过自己的实现来更改处理器,只需扩展正确的处理器即可。

<?php

use Beebmx\LaravelPay\Http\Webhooks\StripeHandler as PayStripeHandler;

class StripeHandler extends PayStripeHandler
{
    // ...
}

方法名称应遵循约定,所有方法都应该以 handle 为前缀,后面紧跟您希望处理的自定义 webhook 的 "camel case" 名称。例如,如果您希望处理 payment_intent.succeeded webhook,则应将 handlePaymentIntentSucceeded 方法添加到控制器中。

<?php

use Beebmx\LaravelPay\Http\Webhooks\StripeHandler as PayStripeHandler;

class StripeHandler extends PayStripeHandler
{
    public function handlePaymentIntentSucceeded($payload)
    {
        // ...
    }
}

在处理的每个方法中,始终都会收到一个与 $payload 对应的数组。

Webhook 事件

在每次 webhook 调用中,可能会触发以下事件

  • Beebmx\LaravelPay\Events\WebhookReceived
  • Beebmx\LaravelPay\Events\WebhookHandled

您可以根据需要创建自己的 payload 实现。

<?php

namespace App\Listeners;

use Beebmx\LaravelPay\Events\WebhookReceived;

class StripeEventListener
{
    public function handle(WebhookReceived $event)
    {
        // $event->payload['type']
    }
}

要监听此实现,需要在您的 App\Providers\EventServiceProvider 中注册。

<?php

namespace App\Providers;

use App\Listeners\StripeEventListener;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Beebmx\LaravelPay\Events\WebhookReceived;

class EventServiceProvider extends ServiceProvider
{
    protected $listen = [
        WebhookReceived::class => [
            StripeEventListener::class,
        ],
    ];
}

测试

composer test

变更日志

有关最近更改的更多信息,请参阅变更日志

致谢

许可证

MIT 许可证(MIT)。有关更多信息,请参阅许可证文件