鍍金池/ 教程/ PHP/ Laravel Cashier
Laravel Cashier
Eloquent ORM
HTTP 響應(yīng)
發(fā)行說明
擴(kuò)展包開發(fā)
HTTP 控制器
事件
擴(kuò)展框架
Contracts
開發(fā)
配置
表單驗證
錯誤與日志
Hashing
貢獻(xiàn)指南
郵件
Session
遷移與數(shù)據(jù)填充
查詢構(gòu)造器
Redis
升級向?qū)?/span>
概覽
緩存
服務(wù)提供者
Envoy 任務(wù)執(zhí)行器
隊列
單元測試
服務(wù)容器
文件系統(tǒng) / 云存儲
認(rèn)證
請求的生命周期
加密
模板
視圖 (View)
Laravel Homestead
Laravel 安裝指南
介紹
Command Bus
分頁
輔助方法
應(yīng)用程序結(jié)構(gòu)
HTTP 路由
HTTP 請求
基本用法
本地化
HTTP 中間件
結(jié)構(gòu)生成器
Facades
Laravel Elixir

Laravel Cashier

介紹

Laravel Cashier 提供語義化,流暢的接口和 Stripe 的訂購管理服務(wù)集成。它幾乎處理了所有讓人退步三舍的訂購管理相關(guān)邏輯。除了基本的訂購管理,Cashier 還可以處理折價券,訂購轉(zhuǎn)換,管理訂購「數(shù)量」、服務(wù)有效期限,甚至產(chǎn)生收據(jù)的 PDF。

配置文件

Composer

首先,把 Cashier 擴(kuò)展包加到 composer.json

"laravel/cashier": "~4.0" (For Stripe APIs on 2015-02-18 version and later)
"laravel/cashier": "~3.0" (For Stripe APIs up to and including 2015-02-16 version)

注冊服務(wù)

然后,在 app 配置文件注冊 Laravel\Cashier\CashierServiceProvider

遷移

使用 Cashier 前,我們需要增加幾個字段到數(shù)據(jù)庫。別擔(dān)心,你可以使用 cashier:table Artisan 命令,建立遷移文件來添加必要字段。例如,要增加字段到 users 數(shù)據(jù)表,使用 php artisan cashier:table users。建立完遷移文件后,只要執(zhí)行 migrate 命令即可。

配置模型

然后,把 Billable trait 和相關(guān)的日期字段參數(shù)加到模型里:

use Laravel\Cashier\Billable;
use Laravel\Cashier\Contracts\Billable as BillableContract;

class User extends Eloquent implements BillableContract {

    use Billable;

    protected $dates = ['trial_ends_at', 'subscription_ends_at'];

}

Stripe Key

最后, 在 services.php 配置文件中設(shè)置你的 Stripe key:

'stripe' => [
    'model'  => 'User',
    'secret' => env('STRIPE_API_SECRET'),
],

或者,也可以在初始化文件或服務(wù)注冊里(如 AppServiceProvider )加入 Stripe key:

User::setStripeKey('stripe-key');

訂購方案

當(dāng)有了模型實(shí)例,你可以很簡單的處理客戶訂購的 Stripe 里的方案:

$user = User::find(1);

$user->subscription('monthly')->create($creditCardToken);

如果你想在建立訂購的時候使用折價券,可以使用 withCoupon 方法:

$user->subscription('monthly')
     ->withCoupon('code')
     ->create($creditCardToken);

subscription 方法會自動建立與 Stripe 的交易,以及將 Stripe customer ID 和其他相關(guān)帳款信息更新到數(shù)據(jù)庫。如果你的方案有在 Stripe 配置試用期,試用到日期也會自動記錄起來。

如果你的方案有試用期間,但是沒有在 Stripe 里配置,你必須在處理訂購后手動保存試用到日期。

$user->trial_ends_at = Carbon::now()->addDays(14);

$user->save();

自定義額外用戶詳細(xì)數(shù)據(jù)

如果你想自定義額外的顧客詳細(xì)數(shù)據(jù),你可以將數(shù)據(jù)數(shù)組作為 create 方法的第二個參數(shù)傳入:

$user->subscription('monthly')->create($creditCardToken, [
    'email' => $email, 'description' => 'Our First Customer'
]);

想知道更多 Stripe 支持的額外字段,可以查看 Stripe 的在線文檔 建立客戶。

一次性付款

如果你想使用一次性付款而不是信用卡訂購方案,你可以使用 charge 方法:

$user->charge(100);

charge 方法接受一個用最低單位貨幣的數(shù)量參數(shù)。 比如,上面的例子中會付款 100 美分 或者 1.00 美元,而不是用戶的信用卡。

charge 方法也接受一個數(shù)組作為第二個參數(shù),允許你傳入一些創(chuàng)建 Stripe 訂購的選項:

$user->charge(100, [
    'source' => $token,
    'receipt_email' => $user->email,
]);

如果付款失敗,charge 方法會返回 false。一般來說,這意味著付款被拒絕:

if ( ! $user->charge(100))
{
    // The charge was denied...
}

如果付款成功, 一個完整的 Stripe 響應(yīng)會從這個方法返回。

免信用卡試用

如果你提供免信用卡試用服務(wù),把 cardUpFront 屬性設(shè)為 false

protected $cardUpFront = false;

建立帳號時,記得把試用到日期記錄起來:

$user->trial_ends_at = Carbon::now()->addDays(14);

$user->save();

訂購轉(zhuǎn)換

使用 swap 方法可以把用戶轉(zhuǎn)換到新的訂購:

$user->subscription('premium')->swap();

如果用戶還在試用期間,試用服務(wù)會跟之前一樣可用。如果訂單有「數(shù)量」,也會和之前一樣。

訂購數(shù)量

有時候訂購行為會跟「數(shù)量」有關(guān)。例如,你的應(yīng)用程序可能會依照帳號的用戶人數(shù),每人每月收取 $10 元。你可以使用 incrementdecrement 方法簡單的調(diào)整訂購數(shù)量:

$user = User::find(1);

$user->subscription()->increment();

// Add five to the subscription's current quantity...
$user->subscription()->increment(5);

$user->subscription()->decrement();

// Subtract five to the subscription's current quantity...
$user->subscription()->decrement(5);

取消訂購

取消訂購相當(dāng)簡單:

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

當(dāng)客戶取消訂購時,Cashier 會自動更新數(shù)據(jù)庫的 subscription_ends_at 字段。這個字段會被用來判斷 subscribed方法是否該返回 false。例如,如果顧客在三月一號取消訂購,但是服務(wù)可以使用到三月五號為止,那么 subscribed 方法在三月五號前都會傳回 true。

恢復(fù)訂購

如果你想要恢復(fù)客戶之前取消的訂購,使用 resume 方法:

$user->subscription('monthly')->resume($creditCardToken);

如果客戶取消訂購后,在服務(wù)過期前恢復(fù),他們不用在當(dāng)下付款。他們的服務(wù)會立刻重啟,而付款則會遵循平常的流程。

確認(rèn)訂購狀態(tài)

要確認(rèn)用戶是否訂購了服務(wù),使用 subscribed 方法:

if ($user->subscribed())
{
    //
}

subscribed 方法很適合用在 路由中間件:

public function handle($request, Closure $next)
{
    if ($request->user() && ! $request->user()->subscribed())
    {
        return redirect('billing');
    }

    return $next($request);
}

你可以使用 onTrial 方法,確認(rèn)用戶是否還在試用期間:

if ($user->onTrial())
{
    //
}

要確認(rèn)用戶是否曾經(jīng)訂購但是已經(jīng)取消了服務(wù),可以使用 cancelled 方法:

if ($user->cancelled())
{
    //
}

你可能想確認(rèn)用戶是否已經(jīng)取消訂單,但是服務(wù)還沒有到期。例如,如果用戶在三月五號取消了訂購,但是服務(wù)會到三月十號才過期。那么用戶到三月十號前都是有效期間。注意, subscribed 方法在過期前都會返回 true

if ($user->onGracePeriod())
{
    //
}

everSubscribed 方法可以用來確認(rèn)用戶是否訂購過應(yīng)用程序里的方案:

if ($user->everSubscribed())
{
    //
}

onPlan 方法可以用方案 ID 來確認(rèn)用戶是否訂購某方案:

if ($user->onPlan('monthly'))
{
    //
}

處理交易失敗

如果顧客的信用卡過期了呢?無需擔(dān)心,Cashier 包含了 Webhook 控制器,可以幫你簡單的取消顧客的訂單。只要在路由注冊控制器:

Route::post('stripe/webhook', 'Laravel\Cashier\WebhookController@handleWebhook');

這樣就成了!失敗的交易會經(jīng)由控制器捕捉并進(jìn)行處理??刂破鲿M(jìn)行至多三次再交易嘗試,都失敗后才會取消顧客的訂單。上面的 stripe/webhook URI 只是一個例子,你必須使用配置在 Stripe 里的 URI 才行。

處理其它 Stripe Webhooks

如果你想要處理額外的 Stripe webhook 事件,可以繼承 Webhook 控制器。你的方法名稱要對應(yīng)到 Cashier 預(yù)期的名稱,尤其是方法名稱應(yīng)該使用 handle 前綴,后面接著你想要處理的 Stripe webhook 。例如,如果你想要處理 invoice.payment_succeeded webhook ,你應(yīng)該增加一個 handleInvoicePaymentSucceeded 方法到控制器。

class WebhookController extends Laravel\Cashier\WebhookController {

    public function handleInvoicePaymentSucceeded($payload)
    {
        // Handle The Event
    }

}

注意: 除了更新你數(shù)據(jù)庫里的訂購信息以外, Webhook 控制器也會經(jīng)由 Stripe API 取消你的訂購。

收據(jù)

你可以很簡單的經(jīng)由 invoices 方法拿到客戶的收據(jù)數(shù)據(jù)數(shù)組:

$invoices = $user->invoices();

你可以使用這些輔助方法,列出收據(jù)的相關(guān)信息給客戶看:

{{ $invoice->id }}

{{ $invoice->dateString() }}

{{ $invoice->dollars() }}

使用 downloadInvoice 方法產(chǎn)生收據(jù)的 PDF 下載。是的,它非常容易:

return $user->downloadInvoice($invoice->id, [
    'vendor'  => 'Your Company',
    'product' => 'Your Product',
]);
上一篇:事件下一篇:Hashing