次のようにすると Stripeには影響のない任意のパラメーター(metadata)を渡すことができます。
$stripe_invoice = $user->invoiceFor($item->name, $item->price_withtax_no, [
'metadata' => [
'myparam01' => 'アイテムごとの任意のパラメーター01' ,
'myparam02' => 'アイテムごとの任意のパラメーター02' ,
]
],[
'metadata' => [
'myparam01' => 'インボイスごとの任意のパラメーター01' ,
'myparam02' => 'インボイスごとの任意のパラメーター02' ,
]
]);
3番目の引数にに渡すと、「インボイスアイテムごと」4番目の引数にに渡すと、「インボイスごと」になります。
なお、インボイスとインボイスアイテムの関係は次のようにインボイスの下にインボイスアイテムがぶら下がる感じになっています。
インボイス
├── インボイスアイテム1
└── インボイスアイテム2
Stripe API Invoiceitems( create ) : https://stripe.com/docs/api/invoiceitems/create
Stripe API Invoices( create ) : https://stripe.com/docs/api/invoices/create
サブスクリプション時に metadata を渡すには
->withMetadata([
]);
が使用できますが、条件によってはうまくデータが渡らないことがあります。 anchorBillingCycleOn() と同時に使うとうまく渡らないことがあります。
// まだStripe Customer でない場合は新規登録する
if ( ! $user->hasStripeId() ){
$user->createAsStripeCustomer([
"description" => $user->email,
"source" => $stripe_token
]);
}
Laravel Cashier( Billable トレイト )( SubscriptionBuilder )で実装されている機能はどういったものがあるでしょうか?
ファイルから public function を抜き出してみます。
URL: https://github.com/laravel/cashier/blob/822b6535e755fd36dec8ecceb52cc8909c8a953e/src/Billable.php
// ユーザーが既に Stripe Customer になっているかどうか判定する
// @return bool
public function hasStripeId()
// ユーザーをStripe Customer として登録する
// @return \Stripe\Customer
public function createAsStripeCustomer(array $options = [])
// ユーザーのStripe Customer 情報を更新する
// @return \Stripe\Customer
public function updateStripeCustomer(array $options = [])
// ユーザーのStripe Customer 情報を取得して返す
// @return \Stripe\Customer
public function asStripeCustomer()
// インボイス付き課金 を実行する
// @return \Stripe\Invoice|bool
public function invoiceFor($description, $amount, array $tabOptions = [], array $invoiceOptions = [])
public function invoice(array $options = [])
public function upcomingInvoice()
public function findInvoice($id)
public function findInvoiceOrFail($id)
public function downloadInvoice($id, array $data)
public function invoices($includePending = false, $parameters = [])
public function invoicesIncludingPending(array $parameters = [])
public function charge($amount, array $options = [])
public function refund($charge, array $options = [])
public function hasCardOnFile()
public function tab($description, $amount, array $options = [])
public function newSubscription($subscription, $plan)
// 現在サブスクリプションがトライアル中かどうかを判別する
public function onTrial($subscription = 'default', $plan = null)
// あるユーザーのサブスクリプションを全て取得
public function subscriptions()
// あるユーザーのサブスクリプションを「名前から」取得
public function subscription($subscription = 'default')
public function onGenericTrial()
public function subscribed($subscription = 'default', $plan = null)
public function cards($parameters = [])
public function defaultCard()
public function updateCard($token)
public function updateCardFromStripe()
public function deleteCards()
public function applyCoupon($coupon)
public function subscribedToPlan($plans, $subscription = 'default')
public function onPlan($plan)
public function preferredCurrency()
public function taxPercentage()
public function __construct($owner, $name, $plan)
public function quantity($quantity)
public function trialDays($trialDays)
public function trialUntil(Carbon $trialUntil)
public function skipTrial()
public function anchorBillingCycleOn($date)
public function withCoupon($coupon)
// サブスクリプション作成時にメタデータをセットする(インボイス全体のmetadataではなく、インボイスアイテムのmetadataに格納されます)
public function withMetadata($metadata)
public function add(array $options = [])
public function create($token = null, array $options = [])
https://readouble.com/laravel/5.8/ja/billing.html
https://laravel.com/docs/5.8/billing
● インストール Laravel アプリケーションをセットアップ後 composer からインストールします
composer require laravel/cashier
モデルの boot() メソッドで設定します
protected static function boot()
{
parent::boot();
\Laravel\Cashier\Cashier::useCurrency('jpy', '¥');
}
$subscription_name = 'main';
$stripe_plan_id_name = 'plan_123456789';
$user->newSubscription($subscription_name, $stripe_plan_id_name)->create($stripe_token);
引数の説明
* サブスクリプション名($subscription_name)をどう命名するかですが、これは公式サイトにあるように main でOKです。
サブスクリプションのプランが例えば「ノーマル」と「ヘビー」と2つあって、途中で「ノーマル」から「ヘビー」に切り替わる場合も サブスクリプション名は変わりません。(代わりにプランIDが変更になります。)あるサービスでサブスクリプションが同時に2種類契約されるということはほぼないと思いますので、 main でOKだと思います。
1ユーザーに複数のサブスクリプション契約を許す場合は、商品ごとのユニークな名前(商品ID)を渡しておけば良いと思います。
// $subscription_name : サブスクリプション名(任意の文字列・プランごとにユニークな名前が良い)(subscriptions テーブルの name カラムに格納されます )
// $plan : Stripe のプランID
// $token : ユーザーがカード番号を入れた後にStripeから自動発行されるトークン
newSubscription( string $subscription , string $plan )->create( string $token );
(ユーザー情報を登録しておくとStripe管理画面を見た時に情報が沢山あるので分かりやすくなります)
$new_subscription = $user->newSubscription($subscription_name, $stripe_plan_id_name);
$new_subscription->create($stripe_token, [
'name' => "山田 太郎" ,
'phone' => '090-123-4567 ,
'address' => [
'postal_code' => '123-4567' ,
'state' => '東京都' ,
'line1' =>'住所1' ,
'line2' =>'住所2' ,
] ,
]);
if ( $auth__user->subscribed( $subscription_name ) ){
dd("すでに{$subscription_name}に登録済みです。”);
}
$c = Carbon::parse('first day of next month'); // 月の初め(1日)をセット
$c->startOfDay(); // 時間 00:00:00 をセット
$user->newSubscription($subscription_name, $stripe_plan_id_name)
->anchorBillingCycleOn( $c) // 請求アンカーを指定する
->create($stripe_token);
$user->invoiceFor('商品名', 価格, [
'quantity' => 50,
], [
'tax_percent' => 21,
]);
引数は
【string 商品名】,【int 価格】,【array インボイスアイテムへの支払いオプション】,【array インボイス自身に対する支払いオプション】
です。
Stripe API Invoiceitems( create ) : https://stripe.com/docs/api/invoiceitems/create