CashierはStripeとBraintreeによるサブスクリプション(定期課金)サービスの読みやすく、スラスラと記述できるインターフェイスを提供します。これにより書くことが恐ろしくなるような、サブスクリプション支払いのための決まりきったコードのほとんどが処理できます。基本的なサブスクリプション管理に加え、Cashierはクーポン、サブスクリプションの変更、サブスクリプション数、キャンセル猶予期間、さらにインボイスのPDF発行まで行います。サブスクリプションを提供するのではなく、「一回だけ」の支払いを取り扱う場合は、Cashierを使用してはいけません。StripeかBraintreeのSDKを直接使用してください。updateコマンドを実行します。"~7.0"サービスプロバイダ次にconfig/app.php設定ファイルへ、Laravel\Cashier\CashierServiceProviderサービスプロバイダを登録します。データベースマイグレーションCashierを使用する前に、データベースを準備する必要があります。usersテーブルに、いくつかのカラムを追加し、顧客のサブスクリプション情報すべてを保持する新しいsubscriptionsテーブルを作成します。Artisanコマンドを実行します。Billableモデル次に、モデル定義にBillableトレイトを追加します。このトレイトは、サブスクリプションの作成、クーポンの適用、クレジットカード情報の更新など、一般的な支払いタスクを実行する様々なメソッドを提供しています。最後に、Stripeキーをservices.php設定ファイルへ設定します。APIキーはStripeのコントロールパネルから取得します。Caveats多くの操作において、StripeとBraintreeで実装しているCashierの機能は同じものです。両方のサービスはクレジットカードでの支払いを提供していますが、BraintreeはPayPalでの支払いもサポートしています。Braintreeには、Stripeが提供してる機能のいくつかが欠けています。以下の点を考慮し、StripeとBraintreeのどちらを使うのか決めてください。BraintreeはPayPalをサポートしていますが、Stripeはしていません。Braintreeはサブスクリプション数のincrement(追加)とdecrement(減少)メソッドをサポートしていません。これはCashierではなく、Braintreeの制限です。Braintreeはパーセンテージをもとにしたディスカウントはサポートしていません。これはCashierではなく、Braintreeの制限です。updateコマンドを実行します。"~2.0"サービスプロバイダ次にconfig/app.php設定ファイルへ、Laravel\Cashier\CashierServiceProviderサービスプロバイダを登録します。クレジットクーポンのプランCashierをBraintreeで使用する前に、plan-creditディスカウントをBraintreeのコントロールパネルで定義する必要があります。このディスカウントは、年払いから月払い、もしくは月払いから年払いの変更時に代金を確実に按分するために使用されます。ディスカウント値はBraintreeコントロールパネルで好きな値に設定できます。Cashierはクーポンを毎回適用するごとに、自身の定義済みカスタム値でディスカウント値をオーバーライドします。Braintreeは繰り返されるサブスクリプションに渡る、按分をネイティブにサポートしていないため、このクーポンが必要です。データベースマイグレーションCashierを使用する前に、データベースも準備する必要があります。usersテーブルにカラムをいくつか追加し、顧客のサブスクリプション情報を保存するために新しいsubscriptionsテーブルを作成します。Artisanコマンドを実行するだけです。Billableモデル次にBillableトレイをモデルに追加してください。次に、以下のオプションをservices.phpファイルで設定します。SDK呼び出しコードをAppServiceProviderサービスプロバイダのbootメソッドに追加します。\Braintree_Configuration::environment(config('services.braintree.environment'));\Braintree_Configuration::merchantId(config('services.braintree.merchant_id'));\Braintree_Configuration::publicKey(config('services.braintree.public_key'));\Braintree_Configuration::privateKey(config('services.braintree.private_key'));通貨設定Cashierのデフォルト通貨は米ドル(USD)です。サービスプロバイダの一つで、bootメソッド中でCashier::useCurrencyメソッドを呼び出し、デフォルト通貨を変更可能です。useCurrencyメソッドは2つの文字列を引数に取ります。'€');サブスクリプションサブスクリプション作成サブスクリプションを作成するには最初にbillableなモデルのインスタンスを取得しますが、通常はApp\Userのインスタンスでしょう。モデルインスタンスが獲得できたら、モデルのサブスクリプションを作成するために、newSubscriptionメソッドを使います。'monthly')->create($creditCardToken);newSubscriptionメソッドの最初の引数は、サブスクリプションの名前です。アプリケーションでサブスクリプションを一つしか取り扱わない場合、mainかprimaryと名づけましょう。2つ目の引数には、ユーザが購入したStripe/Braintreeのプランを指定します。この値はStripe/Braintreeのプランの識別子です。createメソッドはサブスクリプションを開始すると同時に、カスタマーIDと関連する支払い情報をデータベースに保存します。ユーザ詳細情報の指定ユーザに関する詳細情報を追加したい場合は、createメソッドの第2引数に渡すことができます。$email,]);Stripe/Braintreeがサポートしている追加のフィールドについての更なる情報は、Stripeの顧客の作成ドキュメントか、Braintreeのドキュメントを確認してください。クーポンサブスクリプションの作成時に、クーポンを適用したい場合は、withCouponメソッドを使用してください。->create($creditCardToken);サブスクリプション状態の確認ユーザがアプリケーションで何かを購入したら、バラエティー豊かで便利なメソッドでサブスクリプション状況を簡単にチェックできます。初めにsubscribedメソッドがtrueを返したら、サブスクリプションが現在試用期間であるにしても、そのユーザはアクティブなサブスクリプションを持っています。//}subscribedメソッドはルートミドルウェアで使用しても大変役に立つでしょう。ユーザのサブスクリプション状況に基づいてルートやコントローラへのアクセスをフィルタリングできます。$next($request);}ユーザがまだ試用期間であるかを調べるには、onTrialメソッドを使用します。このメソッドはまだ使用期間中であるとユーザに警告を表示するために便利です。//}subscribedToPlanメソッドは、そのユーザがStripe/BraintreeのプランIDで指定したプランを購入しているかを確認します。以下の例では、ユーザのmainサブスクリプションが、購入され有効なmonthlyプランであるかを確認しています。//}キャンセルしたサブスクリプションの状態ユーザが一度アクティブな購入者になってから、サブスクリプションをキャンセルしたことを調べるには、cancelledメソッドを使用します。//}また、ユーザがサブスクリプションをキャンセルしているが、まだ完全に期限が切れる前の「猶予期間」中であるかを調べることもできます。ユーザが3月5日にサブスクリプションをキャンセルし、3月10日に無効になる場合、そのユーザは3月10日までは「猶予期間」中です。subscribedメソッドは、この期間中、まだtureを返すことに注目して下さい。//}プラン変更アプリケーションの購入済みユーザが新しいサブスクリプションプランへ変更したくなるのはよくあるでしょう。ユーザを新しいサブスクリプションに変更するには、swapメソッドへプランの識別子を渡します。App\User::find(1);$user->subscription('main')->swap('provider-plan-id');ユーザが試用期間中の場合、試用期間は継続します。そのプランに「購入数」が存在している場合、購入個数も継続します。プランを変更し、ユーザの現プランの試用期間をキャンセルする場合は、skipTrialメソッドを使用します。購入数はStripe版のCashierでのみサポートしています。Braintreeには、Stripeの"quantity"(購入数)にあたる機能がありません。購入数はサブスクリプションに影響をあたえることがあります。あるアプリケーションで「ユーザごと」に毎月10ドル課金している場合です。購入数を簡単に上げ下げするには、incrementQuantityとdecrementQuantityメソッドを使います。現在の購入数を5個減らす$user->subscription('main')->decrementQuantity(5);もしくは特定の数量を設置するには、updateQuantityメソッドを使ってください。$user->subscription('main')->updateQuantity(10);サブスクリプション数の詳細については、Stripeドキュメントを読んでください。サブスクリプションの税金ユーザが支払うサブスクリプションに対する税率を指定するには、BillableモデルへtaxPercentageメソッドを実装し、小数点以下が1桁以内で、0から100までの数値を返します。20;}taxPercentageメソッドにより、モデルごとに税率を適用できるため、多くの州や国に渡るユーザベースで税率を決める場合に便利です。taxPercentageメソッドは、サブスクリプションの課金時のみに適用されます。Cashierで「一回のみ」の支払いを行う場合は、税率を自分で適用する必要があります。サブスクリプションキャンセルサブスクリプションをキャンセルするにはcancelメソッドをユーザのサブスクリプションに対して使ってください。$user->subscription('main')->cancel();サブスクリプションがキャンセルされるとCashierは自動的に、データベースのends_atカラムをセットします。このカラムはいつからsubscribedメソッドがfalseを返し始めればよいのか、判定するために使用されています。顧客が3月1日にキャンセルしたが、そのサブスクリプションが3月5日に終了するようにスケジュールされていれば、subscribedメソッドは3月5日になるまでtrueを返し続けます。ユーザがサブスクリプションをキャンセルしたが、まだ「猶予期間」が残っているかどうかを調べるにはonGracePeriodメソッドを使います。//}サブスクリプションを即時キャンセルしたい場合は、ユーザのサブスクリプションに対し、cancelNowメソッドを呼び出してください。$user->subscription('main')->cancelNow();サブスクリプション再開ユーザがキャンセルしたサブスクリプションを、再開したいときには、resumeメソッドを使用してください。サブスクリプションを再開するには、そのユーザに有効期間が残っている必要があります。$user->subscription('main')->resume();ユーザがサブスクリプションをキャンセルし、それからそのサブスクリプションを再開する場合、そのサブスクリプションの有効期日が完全に切れていなければすぐに課金されません。顧客のクレジットカード情報を更新する場合は、updateCardメソッドを使います。このメソッドは、Stripeトークンを受け付け、新しいクレジットカードをデフォルトの支払先として登録します。$user->updateCard($creditCardToken);サブスクリプションのトレイトカードの事前登録あり顧客へ試用期間を提供し、支払情報を事前に登録してもらう場合、サブスクリプションを作成するときにtrialDaysメソッドを使ってください。->create($creditCardToken);このメソッドはデータベースのサブスクリプションレコードへ、試用期間の終了日を設定すると同時に、Stripe/Braintreeへこの期日が過ぎるまで、顧客へ課金を始めないように指示します。顧客のサブスクリプションが試用期間の最後の日までにキャンセルされないと、期限が切れると同時に課金されます。そのため、ユーザに試用期間の終了日を通知しておくべきでしょう。ユーザが使用期間中であるかを判定するには、ユーザインスタンスに対しonTrialメソッドを使うか、サブスクリプションインスタンスに対してonTrialを使用してください。次の2つの例は、同じ目的を達します。//}カードの事前登録なし事前にユーザの支払い方法の情報を登録してもらうことなく、試用期間を提供する場合は、そのユーザのレコードのtrial_ends_atに、試用の最終日を設定するだけです。典型的な使い方は、ユーザ登録時に設定する方法でしょう。モデル定義のtrial_ends_atに対する、日付ミューティタを付け加えるのを忘れないでください。trial)」と呼んでいます。Userインスタンスに対し、onTrialメソッドがtrueを返す場合、現在の日付はtrial_ends_atの値を過ぎていません。ユーザは試用期間中}特に、ユーザが「包括的な試用」期間中であり、まだサブスクリプションが作成されていないことを調べたい場合は、onGenericTrialメソッドが使用できます。ユーザは「包括的」な試用期間中}ユーザに実際のサブスクリプションを作成する準備ができたら、通常はnewSubscriptionメソッドを使います。'monthly')->create($creditCardToken);StripeのWebフック処理StripeとBraintree、両方共にWebフックによりアプリケーションへ様々なイベントを通知できます。StripeのWebフックを処理するには、CashierのWebフックコントローラへのルートを定義する必要があります。このコントローラは通知されるWebフックリクエストをすべて処理し、正しいコントローラメソッドをディスパッチします。ルートを登録したら、Stripeコントロールパネル設定のWebフックURLも、合わせて設定してください。このコントローラはデフォルトで、(Stripeの設定により決まる)課金の失敗が多すぎる場合、サブスクリプションを自動的にキャンセル処理します。処理したいWebフックイベントをどれでも処理できるようにするために、このコントローラを拡張する方法を以降で学びます。CSRFバリデーションをバイパスする必要があるため、VerifyCsrfTokenミドルウェアのURIを例外としてリストしておくか、ルート定義をwebミドルウェアグループのリストから外しておきましょう。'stripe/*',];Webフックハンドラの定義Cashierは課金の失敗時にサブスクリプションを自動的に処理しますが、他にもStripeのWebフックイベントを処理したい場合は、Webフックコントローラをシンプルに拡張します。メソッド名はCashierの命名規則に沿う必要があります。メソッドはhandleのプレフィックスで始まり、処理したいStripeのWebフックの名前を「キャメルケース」にします。Webフックを処理する場合は、handleInvoicePaymentSucceededメソッドをコントローラに追加します。CashierのWebフックコントローラで、顧客のサブスクリプションを簡単にキャンセルできます。前記と同じように、コントローラのルートを指定するだけです。課金の失敗はコントローラにより捉えられ、処理されます。コントローラはStripeによりサブスクリプションが不能だと判断されると(通常は課金に3回失敗時)、その顧客のサブスクリプションをキャンセルします。BraintreeのWebフック処理StripeとBraintree、両方共にWebフックによりアプリケーションへ様々なイベントを通知できます。BraintreeのWebフックを処理するには、CashierのWebフックコントローラへのルートを定義する必要があります。このコントローラは通知されるWebフックリクエストをすべて処理し、正しいコントローラメソッドをディスパッチします。ルートを登録したら、Braintreeコントロールパネル設定のWebフックURLも、合わせて設定してください。このコントローラはデフォルトで、(Braintreeの設定により決まる)課金の失敗が多すぎる場合、サブスクリプションを自動的にキャンセル処理します。処理したいWebフックイベントをどれでも処理できるようにするために、このコントローラを拡張する方法を以降で学びます。CSRFバリデーションをバイパスする必要があるため、VerifyCsrfTokenミドルウェアのURIを例外としてリストしておくか、ルート定義をwebミドルウェアグループのリストから外しておきましょう。'braintree/*',];Webフックハンドラの定義Braintreeは課金の失敗時にサブスクリプションを自動的に処理しますが、他にもStripeのWebフックイベントを処理したい場合は、Webフックコントローラをシンプルに拡張します。メソッド名はCashierの命名規則に沿う必要があります。メソッドはhandleのプレフィックスで始まり、処理したいStripeのWebフックの名前を「キャメルケース」にします。Webフックを処理する場合は、handleDisputeOpenedメソッドをコントローラに追加します。Cashierは顧客のサブスクリプションを簡単にキャンセルできるWebフックコントローラを含んでいます。コントローラのルートを指定するだけです。'\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook');これだけです。支払いが失敗すると、コントローラにより捉えられ、処理されます。Braintreeが購入に失敗したと判断すると(通常は支払いに3回失敗した場合)、その顧客のサブスクリプションはキャンセルされます。BraintreeのコントロールパネルでWebフックのURIを設定する必要があることを忘れないで下さい。Stripeを使用している場合、chargeメソッドにはアプリケーションで使用している通貨の最低単位で金額を指定しますが、Braintreeのchargeメソッドには、ドル単位の金額を指定します。何かを購入している顧客のクレジットカードに、「一回だけ」の課金をしたい場合は、billableモデルのインスタンスに対し、chargeメソッドを使います。Braintreeはドル単位で課金する$user->charge(1);chargeメソッドは第2引数に配列を受け付け、裏で作成されるStripe/Braintreeの課金作成に対するオプションを指定できます。StripeとBraintreeの課金作成時に使用できるオプションについては、ドキュメントを参照してください。$value,]);chargeメソッドは、課金に失敗した場合に例外を投げます。課金に成功すると、メソッドはtripe/Braintreeレスポンスをそのまま返します。一回だけ課金をしつつ、顧客へ発行するPDFのレシートとしてインボイスも生成したいことがあります。invoiceForメソッドは、まさにそのために存在しています。例として、「一回だけ」の料金を5ドル課金してみましょう。5);金額は即時にユーザのクレジットカードへ課金されます。invoiceForメソッドは第3引数として配列を受け付け、裏で作成されるStripe/Braintreeの課金オプションを指定できます。invoiceForメソッドは、課金失敗時にリトライするStripeインボイスを生成します。APIを使用し、生成したインボイスを閉じる必要があります。インボイスinvoicesメソッドにより、billableモデルのインボイスの配列を簡単に取得できます。$user->invoicesIncludingPending();顧客へインボイスを一覧表示するとき、そのインボイスに関連する情報を表示するために、インボイスのヘルパメソッドを表示に利用できます。ユーザが簡単にダウンロードできるように、テーブルで全インボイスを一覧表示する例を見てください。PHPライブラリーをインストールしておく必要があります。dompdf/dompdfルートやコントローラの中でdownloadInvoiceメソッドを使うと、そのインボイスのPDFダウンロードを生成できます。このメソッドはブラウザへダウンロードのHTTPレスポンスを正しく行うHTTPレスポンスを生成します。kawase(Translation).masterは過去のリポジトリです。注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。閉じる移動クリックで即時移動します。適用ボタンクリック後に、全項目まとめて適用されます。Scaffoldスカフォールド型枠生成スカフィールドLargeスクリーン表示幅640px80%90%100%インデントなし1rem2rem3rem本文フォントコードフォントフォント適用確認フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。バックスラッシュを含むインライン\Code\Blockの例です。以下はコードブロックの例です。}}設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。