lab404/laravel-stripe-server

Laravel Stripe Server 是一个用于处理 Stripe SCA 结账的库。

1.2.0 2020-07-14 17:03 UTC

This package is auto-updated.

Last update: 2024-09-15 02:09:10 UTC


README

Laravel Stripe Server 是一个用于处理模型 Stripe SCA 结账的库。

需求

  • Laravel 6.x 或 7.x
  • PHP >= 7.2

Laravel 支持

预期工作流程

  • 您有一个 Order 模型,其中包含 stripe 结账。您在控制器中创建订单。

示例模型

use App\Models\Order;
use Lab404\StripeServer\Facades\Stripe;
use Illuminate\Http\Request;

class OrderController
{
    public function store(Request $request)
    {
        // Create your order
        $order = new Order($request->validated());
        $order->save();
        
        // Create your checkout session
        $session = Stripe::requestCreateSession()
                    ->setCustomerEmail($request->user()->email)
                    ->setReturnUrls($confirm_url, $cancel_url)
                    ->setProduct('T-shirt', 5000, 'EUR', 1, $picture_url)
                    ->call();
        
        // Create your checkout model
        $checkout = Stripe::registerCheckout($session, $order);
        
        return Stripe::redirectSession($response->id);
    }
}
  • 您的用户被重定向到 stripe,他填写了他的信息,然后被重定向到您的成功 URL。订单尚未付款。异步地,插件将尝试从 Stripe 获取新的事件,并派发 CheckoutSessionCompleted 事件

示例监听器

use Lab404\StripeServer\Events\CheckoutSessionCompleted;
use Lab404\StripeServer\Models\StripeCheckout;

class CheckoutListener
{
    public function handle(CheckoutSessionCompleted $event): void
    {
        /** @var StripeCheckout $checkout */
        $checkout = $event->checkout;
        /** Your charged model */
        $chargeable = $checkout->chargeable;
        /** The PaymentIntent returned by Stripe */
        $payment = $event->paymentIntent;
      
        /** Important! Mark the checkout as paid */
        $checkout->markAsPaid();
    }
}
  • 您可以使用模型如下所示
$order = Order::with('checkout')->first();
if ($order->checkout->is_paid) {
    echo 'Order is paid';
} else {
    echo 'Order is not paid';
}

安装

  1. 使用 Composer 需求
composer require lab404/laravel-stripe-server
  1. config/services.php 中配置您的 Stripe 密钥。

  2. 使用 php artisan vendor:publish --tag=stripe-server 发布 migrationsviews

  3. 迁移 2019_06_19_101000_create_stripe_checkouts_table.php

  4. app\Console\Kernel.php 中安排命令

protected function schedule(Schedule $schedule)
{
    $schedule->command('stripe:checkout-session-completed')->everyMinute();
}
  1. Lab404\StripeServer\Models\HasStripeCheckoutHasStripeCheckouts(如果模型可以拥有多个结账)添加到您的可收费模型中。

深入研究

Stripe 文档

访问 Stripe 管理员

使用外观

Stripe::method();

使用 DI

public function index(Lab404\StripeServer\Stripe $stripe)
{
    $stripe->method();
}

使用容器

app('stripe')->method();

可用方法

  • redirectSession(string $session_id): Illuminate\Contracts\View\View
  • registerCheckout(\Stripe\Checkout\Session $session, Model $model): Illuminate\Database\Eloquent\Model
  • requestCreateCharge(): StripeServer\Requests\CreateCharge
  • requestCreateSession(): StripeServer\Requests\CreateSession
  • requestPaymentIntent(string $id): StripeServer\Requests\PaymentIntent
  • requestEvents(string $type, int $hours = 24): StripeServer\Requests\Events
  • requestSessionCheckoutCompletedEvents(int $hours = 24): StripeServer\Requests\Events

与您的模型一起工作

具有多个结账的模型

当模型具有 Lab404\StripeServer\Models\HasStripeCheckouts 时,您有权访问以下方法和范围

// Scopes
Model::hasCheckouts()->get();
Model::hasPaidCheckouts()->get();
Model::hasUnpaidCheckouts()->get();

// Methods
$models->checkouts(); // returns all checkout for the model

// Eager loading
$models = Model::with('checkouts')->get(); 

具有一个结账的模型

当模型具有 Lab404\StripeServer\Models\HasStripeCheckout 时,您有权访问以下方法和范围

// Scopes
Model::hasCheckout()->get();
Model::hasPaidCheckout()->get();
Model::hasUnpaidCheckout()->get();

// Methods
$models->checkout(); // returns the checkout for the model

// Eager loading
$models = Model::with('checkout')->get(); 

自定义 StripeCheckout 模型

config/stripe-server.php 中配置 model。您的自定义模型应扩展默认模型。

自定义重定向器

当您使用 redirectSession() 方法时,将返回一个 Illuminate\View\View 实例。您可以这样做

return Stripe::redirectSession('...')->with([
    'title' => 'My custom title',
    'message' => 'My customer redirect message'
]);

Artisan 命令

stripe:checkout-session-completed

获取所有 checkout.session.completed Stripe 事件,并为每个具有 succeeded 状态的事件派发 CheckoutSessionCompleted 事件。

stripe:events

获取所有 Stripe 事件,并为每个事件派发 StripeEvent

stripe:purge

删除所有未付款的 StripeCheckout,这些结账早于给定天数。使用 --days 选项自定义,默认为 7。它方便在调度器中调用

$schedule->command('stripe:purge')->dailyAt('12:00');

Nova

如果您使用 Laravel Nova,则可以添加 Lab404\StripeServer\Nova\StripeCheckout 资源

Laravel\Nova\Nova::resources([
    Lab404\StripeServer\Nova\StripeCheckout::class,
]);

此资源不会动态注册,因为它相当简单,您可能想覆盖它。即将推出更多 Nova 功能,如退款操作或卡。

待办事项和想法

[x] 清理未付款的 stripe 结账
[ ] 退款
[ ] Nova 操作

测试

待办事项

贡献

该包仍在开发中,欢迎贡献力量!

贡献者

许可证

MIT