日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

Laravel開(kāi)發(fā):如何使用Laravel Cashier實(shí)現(xiàn)訂閱功能?

Laravel Cashier是一個(gè)易于使用的Stripe付款處理包,可以幫助我們?cè)贚aravel應(yīng)用程序中實(shí)現(xiàn)訂閱功能。在此教程中,我們將學(xué)習(xí)如何使用Laravel Cashier實(shí)現(xiàn)訂閱功能。

步驟1:安裝Laravel Cashier

在我們開(kāi)始使用Laravel Cashier之前,需要安裝它。在Laravel項(xiàng)目中運(yùn)行以下命令來(lái)安裝Laravel Cashier:

composer require laravel/cashier

登錄后復(fù)制

步驟2:配置Stripe憑據(jù)

Laravel Cashier需要您配置Stripe憑據(jù)才能正常工作。如果您還沒(méi)有Stripe賬戶,可以在https://stripe.com/上注冊(cè)一個(gè)新賬戶。然后,登錄到Stripe Dashboard,點(diǎn)擊API選項(xiàng)卡,復(fù)制您的私鑰并將其添加到.env文件中。

STRIPE_SECRET_KEY=your_stripe_secret_key
STRIPE_PUBLIC_KEY=your_stripe_public_key

登錄后復(fù)制

步驟3:創(chuàng)建訂閱計(jì)劃

在我們實(shí)現(xiàn)訂閱功能之前,我們需要在Stripe Dashboard中創(chuàng)建訂閱計(jì)劃。轉(zhuǎn)到您的Stripe Dashboard并創(chuàng)建一個(gè)新的訂閱計(jì)劃。

在創(chuàng)建訂閱計(jì)劃時(shí),請(qǐng)確保設(shè)置適當(dāng)?shù)慕痤~,計(jì)費(fèi)周期和試用期(如有需要)。

步驟4:創(chuàng)建Subscriber模型

Subscriber模型將繼承Laravel Cashier的Billable Trait,并定義有關(guān)訂閱的所有信息。通過(guò)執(zhí)行以下命令在Laravel項(xiàng)目中創(chuàng)建Subscriber模型:

php artisan make:model Subscriber -m

登錄后復(fù)制

此命令將創(chuàng)建一個(gè)Subscriber模型文件和一個(gè)遷移文件。

在遷移文件中,我們需要將Billable Trait添加到模型中。修改Subscriber模型遷移文件,如下所示:

<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
class CreateSubscribersTable extends Migration
{
    public function up()
    {
        Schema::create('subscribers', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->string('stripe_id')->nullable();
            $table->string('card_brand')->nullable();
            $table->string('card_last_four')->nullable();
            $table->timestamp('trial_ends_at')->nullable();
            $table->timestamps();
        });
        Schema::table('subscribers', function (Blueprint $table) {
            $table->softDeletes();
        });
    }
    public function down()
    {
        Schema::table('subscribers', function (Blueprint $table) {
            $table->dropSoftDeletes();
        });
        Schema::dropIfExists('subscribers');
    }
}

登錄后復(fù)制

我們?cè)赟ubscriber模型中添加了訂閱所需的所有字段以及軟刪除支持。

步驟5:配置Laravel Cashier

在Subscriber模型中添加Laravel Cashier Trait,如下所示:

<?php
namespace App;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
use IlluminateDatabaseEloquentSoftDeletes;
use LaravelCashierBillable;
class Subscriber extends Authenticatable
{
    use Notifiable, SoftDeletes, Billable;
    protected $dates = ['deleted_at'];
    protected $fillable = [
        'name', 'email', 'password',
    ];
    protected $hidden = [
        'password', 'remember_token',
    ];
    public function getStripeKeyName()
    {
        return 'stripe_id';
    }
}

登錄后復(fù)制

在上面的代碼中,我們添加了Billable Trait并指定了Stripe中的“stripe_id”。

步驟6:實(shí)現(xiàn)訂閱功能

現(xiàn)在,我們已經(jīng)配置好了Laravel Cashier并創(chuàng)建了Subscriber模型,我們可以開(kāi)始使用Laravel Cashier來(lái)實(shí)現(xiàn)訂閱功能。

在我們開(kāi)始之前,我們需要確保用戶已登錄。我們將使用Laravel的Authentication功能來(lái)處理此步驟。

在web.php中添加以下路由:

Route::group(['middleware' => ['auth']], function () {
    Route::get('/subscribe', 'SubscriptionController@index')->name('subscribe.index');
    Route::post('/subscribe', 'SubscriptionController@store')->name('subscribe.store');
    Route::get('/subscribe/cancel', 'SubscriptionController@cancel')->name('subscribe.cancel');
    Route::get('/subscribe/resume', 'SubscriptionController@resume')->name('subscribe.resume');
    Route::get('/subscribe/invoice', 'SubscriptionController@invoice')->name('subscribe.invoice');
});

登錄后復(fù)制

現(xiàn)在,我們需要添加一個(gè)SubscriptionController來(lái)處理我們的訂閱功能。使用以下命令創(chuàng)建SubscriptionController:

php artisan make:controller SubscriptionController

登錄后復(fù)制

在SubscriptionController中添加index方法,

<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use LaravelCashierExceptionsIncompletePayment;
use Stripe{EphemeralKey, PaymentIntent, PaymentMethod};
class SubscriptionController extends Controller
{
    public function index(Request $request)
    {
        $intent = $request->user()->createSetupIntent();
        return view('subscription.index', [
            'intent' => $intent,
        ]);
    }
}

登錄后復(fù)制

在上面的代碼中,我們創(chuàng)建了一個(gè)Setup Intent用于收集用戶的付款信息。然后,我們將此Setup Intent傳遞到視圖中,并在用于訂閱的表單中使用它。

在訂閱表單中,我們可以使用Stripe.js來(lái)收集用戶的付款信息。以下是一個(gè)基本的訂閱表單示例:

@extends('layouts.app')
@section('content')
{!! Form::open(['route' => 'subscribe.store', 'class' => 'form-horizontal']) !!}
<div class="form-group row">
    <label for="name">{{ __('Plan') }}</label>
    <select name="plan" id="plan" class="form-control">
        <option value="price_123456">Basic Plan - $20/month</option>
        <option value="price_123457">Standard Plan - $50/month</option>
        <option value="price_123458">Premium Plan - $100/month</option>
    </select>
    <div id="card-element"></div>
</div>
<div class="form-group row">
    <div id="card-errors" class="mx-auto" role="alert"></div>
</div>
<div class="form-group row mb-0">
    <button type="submit" class="btn btn-primary">
        {{ __('Subscribe') }}
    </button>
</div>
{!! Form::close() !!}
<script src="https://js.stripe.com/v3/"></script>
<script>
    let stripe = Stripe('{{ env('STRIPE_PUBLIC_KEY') }}');
    let elements = stripe.elements();
    let card = elements.create('card', {
            hidePostalCode: true,
            style: {
            base: {
                iconColor: '#666EE8',
                color: '#31325F',
                lineHeight: '40px',
                fontWeight: 300,
                fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
                fontSize: '15px',
                '::placeholder': {
                    color: '#CFD7E0',
                },
            },
            },
        }
    );
    card.mount('#card-element');
    let cardErrors = document.getElementById('card-errors');
        card.addEventListener('change', function(event) {
        if (event.error) {
            cardErrors.textContent = event.error.message;
        } else {
            cardErrors.textContent = '';
        }
    });
    let submitButton = document.querySelector('button[type=submit]');
    let form = document.querySelector('form');
    let clientSecret = null;
    submitButton.addEventListener('click', async function(ev) {
        ev.preventDefault();
        submitButton.disabled = true;
        let {setupIntent, error} = await stripe.confirmCardSetup(
            clientSecret, {
            payment_method: {
                card: card,
            }
        });
        if (error) {
            cardErrors.textContent = error.message;
            submitButton.disabled = false;
            return;
        }
        let paymentMethodId = setupIntent.payment_method;
        axios.post('{{ route('subscribe.store') }}', {
            plan: document.querySelector('#plan').value,
            payment_method: paymentMethodId,
            _token: '{{ csrf_token() }}'
        }).then(function(response) {
            window.location.href = response.data.success_url;
        }).catch(function(error) {
            submitButton.disabled = false;
        });
    });
    (async () => {
        let {setupIntent} = await axios.get('/api/create-setup-intent', {
            headers: {
                'X-CSRF-Token': document.head.querySelector('meta[name="csrf-token"]').content
            }
        }).then(response => response.data)
        clientSecret = setupIntent.client_secret;
    })();
</script>
@endsection

登錄后復(fù)制

在上面的代碼中,我們使用了Stripe.js來(lái)構(gòu)建一個(gè)簡(jiǎn)單的訂閱表單。我們通過(guò)使用Stripe.js中的create()方法創(chuàng)建一個(gè)card元素,然后將其掛載到#card-element div中。這里我們還使用了axios來(lái)處理POST請(qǐng)求,其中包含訂閱計(jì)劃信息和付款信息。如果付款被成功處理,我們將重定向用戶到成功頁(yè)面。

現(xiàn)在,我們需要添加存儲(chǔ)用戶付款信息和創(chuàng)建訂閱邏輯的存儲(chǔ)庫(kù)。

<?php
namespace AppRepositories;
use AppSubscriber;
use IlluminateSupportFacadesConfig;
use LaravelCashierExceptionsPaymentActionRequired;
use LaravelCashierExceptionsPaymentFailure;
use LaravelCashierSubscription;
use StripeStripe;
class SubscriberRepository
{
    public function createFromRequest(array $data)
    {
        $subscriber = Subscriber::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
        $subscriber->createAsStripeCustomer([
            'name' => $subscriber->name,
            'email' => $subscriber->email,
        ]);
        return $subscriber;
    }
    public function subscribe(Subscriber $subscriber, string $plan, string $paymentMethod)
    {
        $subscriber->newSubscription('main', $plan)->create($paymentMethod, [
            'email' => $subscriber->email,
        ]);
    }
}

登錄后復(fù)制

在上面的代碼中,我們創(chuàng)建了一個(gè)SubscriberRepository類,用于存儲(chǔ)用戶信息和創(chuàng)建訂閱。在我們的createFromRequest()方法中,我們將創(chuàng)建一個(gè)新的Stripe Customer,然后將其相關(guān)信息存儲(chǔ)到我們的Subscriber模型中。在subscribe()方法中,我們使用Laravel Cashier的newSubscription()函數(shù)來(lái)為用戶創(chuàng)建新的訂閱。

步驟7:處理訂閱回調(diào)

在訂閱回調(diào)中,我們需要更新用戶訂閱的當(dāng)前狀態(tài)。如果訂閱被取消或期滿,我們需要根據(jù)需要取消或恢復(fù)用戶訂閱。

在SubscriptionController中添加以下方法:

public function store(Request $request, SubscriberRepository $subscriberRepository)
{
    $paymentMethod = $request->input('payment_method');
    $plan = $request->input('plan');
    $subscriberRepository->subscribe(
        $request->user(),
        $plan,
        $paymentMethod
    );
    return response()->json([
        'success_url' => route('subscribe.invoice'),
    ]);
}
public function cancel(Request $request)
{
    $request->user()->subscription('main')->cancel();
    return redirect()->route('subscribe.index')
        ->with('success', 'Your subscription has been cancelled.');
}
public function resume(Request $request)
{
    $request->user()->subscription('main')->resume();
    return redirect()->route('subscribe.index')
        ->with('success', 'Your subscription has been resumed.');
}
public function invoice(Request $request)
{
    $invoice = $request->user()->invoices()->latest()->first();
    return view('subscription.invoice', [
        'invoice' => $invoice,
    ]);
}

登錄后復(fù)制

在上面的代碼中,我們處理了創(chuàng)建新的訂閱,取消/恢復(fù)用戶訂閱,并顯示訂閱的最新發(fā)票。

現(xiàn)在,我們已經(jīng)成功地使用Laravel Cashier實(shí)現(xiàn)了訂閱功能,并可以讓用戶創(chuàng)建和管理其訂閱了!

以上就是Laravel開(kāi)發(fā):如何使用Laravel Cashier實(shí)現(xiàn)訂閱功能?的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注www.xfxf.net其它相關(guān)文章!

分享到:
標(biāo)簽:Cashier laravel 訂閱功能
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定