跳到主要內容

Laravel Cashier(Stripe)

📝 此頁面為 Laravel 官方文檔的繁體中文翻譯。查看原始英文版本

Laravel Cashier(Stripe)

簡介

Laravel Cashier StripeStripe 的訂閱計費服務提供了一個表達力強、流暢的介面。它處理了幾乎所有您不想編寫的樣板訂閱計費代碼。除了基本的訂閱管理之外,Cashier 還可以處理優惠券、訂閱方案轉換、訂閱「數量」、取消寬限期,甚至產生發票 PDF。

升級 Cashier

升級到新版本的 Cashier 時,務必仔細查閱升級指南

[!WARNING] 為防止重大變更,Cashier 使用固定的 Stripe API 版本。Cashier 16 使用 Stripe API 版本 2025-06-30.basil。Stripe API 版本將在次要版本中更新,以便利用新的 Stripe 功能和改進。

安裝

首先,使用 Composer 套件管理器安裝 Stripe 的 Cashier 套件:

composer require laravel/cashier

安裝套件後,使用 vendor:publish Artisan 命令發佈 Cashier 的遷移:

php artisan vendor:publish --tag="cashier-migrations"

然後,執行 migrate 命令來建立所需的資料表:

php artisan migrate

要發佈 Cashier 的配置檔,請使用:

php artisan vendor:publish --tag="cashier-config"

配置

可計費模型

在使用 Cashier 之前,您需要將 Billable trait 新增到您的使用者模型定義中。此 trait 提供了各種方法來允許您執行計費任務,例如建立訂閱、應用優惠券和更新付款方式:

use Laravel\Cashier\Billable;

class User extends Authenticatable
{
    use Billable;
}

API 金鑰

接下來,您應在 .env 檔案中配置您的 Stripe 金鑰:

STRIPE_KEY=pk_test_...
STRIPE_SECRET=sk_test_...

貨幣配置

您可以透過設定 CASHIER_CURRENCY 環境變數來指定用於定價的貨幣,預設為 usd

快速入門

銷售產品

Cashier 可以輕鬆處理一次性產品購買。當使用者想要購買產品時,使用 checkout 方法將他們重導向到 Stripe 託管的結帳頁面。Cashier 會自動處理成功的付款並觸發相關事件。

use Illuminate\Http\Request;
use Laravel\Cashier\Cashier;

Route::get('/product/{product}/checkout', function (Request $request, string $product) {
    $checkout = $request->user()->checkout([$product => 1]);

    return $checkout->redirect();
});

銷售訂閱

要建立訂閱,您需要首先建立一個 Stripe 價格 ID。然後使用 newSubscription 方法開始訂閱:

use Illuminate\Http\Request;

Route::post('/subscribe', function (Request $request) {
    $subscription = $request->user()->newSubscription('default', 'price_monthly')
        ->create($request->paymentMethodId);

    return redirect('/home');
});

客戶

檢索客戶

您可以使用 asStripeCustomer 方法檢索 Stripe 客戶物件:

$stripeCustomer = $user->asStripeCustomer();

建立客戶

當使用者開始首次付款時,Cashier 會自動在 Stripe 中建立客戶。如果您想手動建立客戶,可以使用 createAsStripeCustomer 方法。

付款方式

Cashier 提供了管理付款方式的完整方法。使用 createPaymentMethodpaymentMethodsdefaultPaymentMethodupdateDefaultPaymentMethodaddPaymentMethoddeletePaymentMethod 等方法。付款方式通常使用 Stripe 的 Elements UI 元件在前端收集。

訂閱

建立訂閱

使用 newSubscription 方法建立訂閱。第一個參數是訂閱的名稱,第二個參數是 Stripe 中的價格 ID:

$user->newSubscription('default', 'price_monthly')
    ->create($paymentMethodId);

檢查訂閱狀態

您可以使用 subscribed 方法檢查使用者是否已訂閱:

if ($user->subscribed('default')) {
    // ...
}

Cashier 還提供了 onTrialcancelledonGracePeriod 等方法來檢查訂閱狀態。

更改價格

使用 swap 方法將訂閱變更為新價格:

$user->subscription('default')->swap('price_yearly');

取消訂閱

使用 cancel 方法取消訂閱:

$user->subscription('default')->cancel();

恢復訂閱

如果訂閱仍在寬限期內,可以使用 resume 方法恢復訂閱:

$user->subscription('default')->resume();

訂閱試用

Cashier 支援在建立訂閱時提供試用期。使用 trialDays 方法指定試用天數,或使用 trialUntil 設定特定的結束日期。

處理 Stripe Webhook

Cashier 自動處理 Stripe webhook。發佈 webhook 處理器路由:

php artisan vendor:publish --tag="cashier-webhooks"

然後在 Stripe 儀表板中配置 webhook URL。Cashier 處理諸如 customer.subscription.updatedcharge.refundedinvoice.payment_succeeded 等常見 webhook。

單次扣款

使用 charge 方法對客戶進行單次扣款:

$user->charge(1000, 'payment_method_id');

金額以貨幣最小單位(美分)為單位。使用 refund 方法退款:

$user->refund($paymentIntentId);

發票

使用 invoices 方法檢索使用者的發票。使用 downloadInvoice 方法產生並下載發票 PDF。Cashier 使用 DomPDF 產生 PDF 檔案。

結帳

Cashier 支援 Stripe Checkout 來處理一次性付款和訂閱。checkout 方法返回一個結帳實例,可以將使用者重導向到 Stripe 託管的結帳頁面。

return $user->checkout(['price_standard' => 1])->redirect();

處理付款失敗

Cashier 包含內建支援來處理需要額外確認的付款,特別是由於強客戶認證(SCA)的要求。您可以使用 payment 方法檢索失敗付款的付款意圖並顯示確認頁面。

測試

Cashier 附帶了一個 Stripe「fake」實作,允許您在測試 Cashier 時定義預期行為。這允許您在不需要實際呼叫 Stripe API 的情況下測試您的程式碼:

use Laravel\Cashier\Http\Controllers\WebhookController;

$webhookController = new WebhookController;
$response = $webhookController->handleWebhook($requestPayload);