【Laravel5.8+Stripe12】クーポン機能を実装する

f:id:nekorokkekun:20190827102831p:plain:w1000
こちらの連載記事では、LaravelとStripeを使用して企業サイト兼Eコマース(ECサイト)を作成していきます。

Laravelのプロジェクト作成からStripeの実装まで行い、最終的に単発決済・サブスクリプションの実装までを目指します。

シリーズ

【Laravel5.8+Stripe⓪】ECサイト作成チュートリアル概要 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⓪】ECサイト作成チュートリアル概要 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe①】ベースプロジェクトの作成 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe②】メールフォームの実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe③】ユーザー認証機能のカスタマイズ - Laravelとねころっけくん5.8
【Laravel5.8+Stripe④】ディスカウントページを作成する - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑤】Laravel CasherとStripeを導入して管理者権限を設定する その1 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑥】Laravel CasherとStripeを導入して管理者権限を設定する その2 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑦】サブスクリプション決済の作成 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑧】請求書ダウンロード機能の実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑨】サブスクリプションプラン変更機能の実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑩】サブスクリプション中止機能の実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe11】Webhookの実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe12】クーポン機能を実装する - Laravelとねころっけくん5.8
【Laravel5.8+Stripe13】ショッピングカートの実装 - Laravelとねころっけくん5.8


ちなみにこちらの記事は、Easy E-Commerce Using Laravel and Stripeという書籍をもとに執筆しています。

今回の記事では、Stripeを使用したクーポンの実装を行なっていきましょう。

Stripeダッシュボード上からクーポンを作成

まずはStripeのダッシュボードにアクセスしましょう。

サイドメニューのBilling>クーポンへ移動すると、以下のような画面が表示されます。
f:id:nekorokkekun:20190826071253p:plain

【+ 新規】ボタンを押下するとクーポン作成フォームが出てくるので、任意の内容でクーポンを作成していきます。
f:id:nekorokkekun:20190826071600p:plain

後は【クーポンを作成】ボタンを押下することで簡単にStripeを使った決済で使用できるクーポンを作成することができます。

アプリとクーポンの統合

次にLaravelで作成するアプリと、Stripe上で作成したクーポンの統合方法を見ていきましょう。

まずはクーポンの入力フォームを作成していきます。
/resources/views/subscriptions/subscribe.blade.php

//省略
            value="{{ App::environment() == 'local' ? '111' : '' }}"
            >
        </div>
      </div>

     // クーポンの入力フォーム
      <div class="row">
        <div class="col-xs-12">
          <label for="coupon" class="control-label">
            Coupon Code
          </label>
        </div>
        <div class="col-sm-4">
          <input type="text"
            class="form-control"
            id="coupon"
            placeholder="Coupon Code"
            autofocus data-stripe="number"
            name="coupon"
            value="
            {{ App::environment() == 'local' ? 'StripeのクーポンID' : '' }}
            ">
        </div>
      </div>
    </div>

    <div class="center-block form-actions">
      <button type="submit" class="submit-button btn btn-primary btn-lg">
        Complete Order
      </button>
    </div>
//省略

クーポンの入力フォーム内にある

            {{ App::environment() == 'local' ? 'StripeのクーポンID' : '' }}

のStripeのクーポンIDですが、先ほどStripeのダッシュボード上で作成したクーポンの詳細ページに記載されています。

サイドメニュー>Billing>クーポンと移動し、先ほど作成したクーポンを押下するとクーポンの詳細ページにアクセスできます。

赤枠で囲ってある部分がクーポンIDです。
f:id:nekorokkekun:20190826073427p:plain


次にSubscriptionControllerのprocessアクションに追記していきましょう。
/app/Http/Controllers/SubscriptionsController.php

    public function process(Request $request)
    {
        $planId = $request->get('plan_id');
        if ($this->planNotAvailable($planId)) {
            return redirect()->back()->withErrors('Plan is required');
        }
        Stripe::setApiKey(env('STRIPE_API_SECRET'));
        $user = Auth::user();
        $coupon = $request->coupon; //追記
        $user->newSubscription('main', $planId)->withCoupon($coupon)->create($request->stripe_token, //追記
        ['email' => $user->email,
            'metadata' => [
                'name' => $user->name,
            ]]);
        return redirect('invoices');
    }

ユーザーが入力したクーポンIDを$couponに格納し、withCouponメソッドで適用できます。

使用方法については以下の記事や公式ドキュメントが参考になります。
Laravel Cashier 5.8 Laravel
Subscription with coupon using Laravel Cashier & Stripe - QCode


実際にクーポンIDを入力した上で、サブスクリプション 決済を行ってみましょう。

すると、使用したクーポンが適用されているはずです。ダウンロードしたレシートにもクーポン利用歴が記されています。
f:id:nekorokkekun:20190826074023p:plain

Stripeのダッシュボード上でもクーポン利用を確認できます。
f:id:nekorokkekun:20190826074350p:plain


最後に会員のみが閲覧できるdiscounts.blade.phpにクーポンを列挙すれば完成です。

下記は参考として、いくつかクーポンを作成しています。
/resources/views/member/discounts.blade.php

@extends('layouts.app')

@section('content')

<h1>Discounts Coupon Page</h1>
<table class="table">
  <thead class="thead-dark">
    <tr>
      <th scope="col">Coupon</th>
      <th scope="col">Coupon ID</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>初回購入割引</td>
      <td>MFcT2qRs</td>
    </tr>
    <tr>
      <td>2回目購入割引</td>
      <td>22IYuWhq</td>
    </tr>
    <tr>
      <td>1周年記念割引</td>
      <td>YUF9Gmtc</td>
    </tr>
  </tbody>
</table>
@endsection

連載記事

【Laravel5.8+Stripe⓪】ECサイト作成チュートリアル概要 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⓪】ECサイト作成チュートリアル概要 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe①】ベースプロジェクトの作成 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe②】メールフォームの実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe③】ユーザー認証機能のカスタマイズ - Laravelとねころっけくん5.8
【Laravel5.8+Stripe④】ディスカウントページを作成する - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑤】Laravel CasherとStripeを導入して管理者権限を設定する その1 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑥】Laravel CasherとStripeを導入して管理者権限を設定する その2 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑦】サブスクリプション決済の作成 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑧】請求書ダウンロード機能の実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑨】サブスクリプションプラン変更機能の実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑩】サブスクリプション中止機能の実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe11】Webhookの実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe12】クーポン機能を実装する - Laravelとねころっけくん5.8
【Laravel5.8+Stripe13】ショッピングカートの実装 - Laravelとねころっけくん5.8