亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

Laravel開發:如何使用Laravel Cashier實現訂閱功能?

Laravel Cashier是一個易于使用的Stripe付款處理包,可以幫助我們在Laravel應用程序中實現訂閱功能。在此教程中,我們將學習如何使用Laravel Cashier實現訂閱功能。

步驟1:安裝Laravel Cashier

在我們開始使用Laravel Cashier之前,需要安裝它。在Laravel項目中運行以下命令來安裝Laravel Cashier:

composer require laravel/cashier

登錄后復制

步驟2:配置Stripe憑據

Laravel Cashier需要您配置Stripe憑據才能正常工作。如果您還沒有Stripe賬戶,可以在https://stripe.com/上注冊一個新賬戶。然后,登錄到Stripe Dashboard,點擊API選項卡,復制您的私鑰并將其添加到.env文件中。

STRIPE_SECRET_KEY=your_stripe_secret_key
STRIPE_PUBLIC_KEY=your_stripe_public_key

登錄后復制

步驟3:創建訂閱計劃

在我們實現訂閱功能之前,我們需要在Stripe Dashboard中創建訂閱計劃。轉到您的Stripe Dashboard并創建一個新的訂閱計劃。

在創建訂閱計劃時,請確保設置適當的金額,計費周期和試用期(如有需要)。

步驟4:創建Subscriber模型

Subscriber模型將繼承Laravel Cashier的Billable Trait,并定義有關訂閱的所有信息。通過執行以下命令在Laravel項目中創建Subscriber模型:

php artisan make:model Subscriber -m

登錄后復制

此命令將創建一個Subscriber模型文件和一個遷移文件。

在遷移文件中,我們需要將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');
    }
}

登錄后復制

我們在Subscriber模型中添加了訂閱所需的所有字段以及軟刪除支持。

步驟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';
    }
}

登錄后復制

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

步驟6:實現訂閱功能

現在,我們已經配置好了Laravel Cashier并創建了Subscriber模型,我們可以開始使用Laravel Cashier來實現訂閱功能。

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

在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');
});

登錄后復制

現在,我們需要添加一個SubscriptionController來處理我們的訂閱功能。使用以下命令創建SubscriptionController:

php artisan make:controller SubscriptionController

登錄后復制

在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,
        ]);
    }
}

登錄后復制

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

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

@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

登錄后復制

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

現在,我們需要添加存儲用戶付款信息和創建訂閱邏輯的存儲庫。

<?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,
        ]);
    }
}

登錄后復制

在上面的代碼中,我們創建了一個SubscriberRepository類,用于存儲用戶信息和創建訂閱。在我們的createFromRequest()方法中,我們將創建一個新的Stripe Customer,然后將其相關信息存儲到我們的Subscriber模型中。在subscribe()方法中,我們使用Laravel Cashier的newSubscription()函數來為用戶創建新的訂閱。

步驟7:處理訂閱回調

在訂閱回調中,我們需要更新用戶訂閱的當前狀態。如果訂閱被取消或期滿,我們需要根據需要取消或恢復用戶訂閱。

在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,
    ]);
}

登錄后復制

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

現在,我們已經成功地使用Laravel Cashier實現了訂閱功能,并可以讓用戶創建和管理其訂閱了!

以上就是Laravel開發:如何使用Laravel Cashier實現訂閱功能?的詳細內容,更多請關注www.xfxf.net其它相關文章!

分享到:
標簽:Cashier laravel 訂閱功能
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定