【Laravel5.8+Stripe⑧】請求書ダウンロード機能の実装

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

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

シリーズ

【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という書籍をもとに執筆しています。

今回は、請求書ダウンロード機能を実装していきます。

請求書ダウンロード機能

まずは請求書ダウンロード機能を実装していきます。

まずはルーティングの作成からしていきましょう。
/routes/web.php

Route::get('invoices', 'SubscriptionsController@invoices')->name('invoices');

次にSubscriptionController内にinvoicesアクションを追加します。
/app/Http/Controllers/SubscriptionsController.php

public function invoices()
{
    $user = Auth::user();
    return view('subscriptions.invoices', compact('user'));
}

次に各サブスクリプションの支払い情報を表示するinvoice.blade.phpを作成します。
/resources/views/subscriptions/invoices.blade.php

@extends('app')
@section('content')
<table class="table">
    @foreach ($user->invoices() as $invoice)
        <tr>
            <td>{{ $invoice->date() }}</td>
            <td>{{ $invoice->total() }}</td>
            <td><a href="/invoices/download/{{ $invoice->id }}">Download Receipt</a></td>
        </tr>
    @endforeach
</table>
@endsection

invoicesという関数が登場しますが、こちらはLaravel Cashier独自のメソッドとなります。
使用できる関数自体は/vendor/laravel/cashier/src/Invoice.phpに書かれているため、参考にしてみてください。

また、こちらの記事にも解説が記載されています。
Laravel Cashier - Laravel - The PHP Framework For Web Artisans


次に、請求書ダウンロード機能に関するルーティングを追加しましょう。
/routes/web.php

Route::get('invoices/download/{id}','SubscriptionsController@downloadInvoice');

/app/Http/Controllers/SubscriptionsController.php

    public function downloadInvoice($id)
    {
        return Auth::user()->downloadInvoice($id, [
            'header'  => 'We Dew Lawns',
            'vendor'  => 'WeDewLawns',
            'product' => Auth::user()->stripe_plan,
            'street' => '123 Lawn Drive',
            'location' => 'Lawndale NC, 28076',
            'phone' => '703.555.1212',
            'url' => 'www.wedewlawns.com',
        ]);
    }

downloadInvoiceメソッドに関してはドキュメントに説明があります。

ルートやコントローラの中でdownloadInvoiceメソッドを使うと、そのインボイスのPDFダウンロードを生成できます。このメソッドはブラウザへダウンロードのHTTPレスポンスを正しく行うHTTPレスポンスを生成します。
Laravel Cashier 5.8 Laravel

実際にinvoices.blade.phpのDownload Receiptリンクをクリックしてみると、以下のような請求書をダウンロードすることができます。
f:id:nekorokkekun:20190825081035p:plain

もしダウンロードしたReceiptのフォーマットをカスタマイズしたいのであれば、以下の手順でvendorからreceipt.blade.phpをviewsディレクトリにコピーしましょう。

$ php artisan vendor:publish

Which provider or tag's files would you like to publish?:
  [0 ] Publish files from all providers and tags listed below
  [1 ] Provider: BeyondCode\DumpServer\DumpServerServiceProvider
  [2 ] Provider: Fideloper\Proxy\TrustedProxyServiceProvider
  [3 ] Provider: Illuminate\Foundation\Providers\FoundationServiceProvider
  [4 ] Provider: Illuminate\Mail\MailServiceProvider
  [5 ] Provider: Illuminate\Notifications\NotificationServiceProvider
  [6 ] Provider: Illuminate\Pagination\PaginationServiceProvider
  [7 ] Provider: Laravel\Cashier\CashierServiceProvider
  [8 ] Provider: Laravel\Tinker\TinkerServiceProvider
  [9 ] Tag: config
  [10] Tag: laravel-errors
  [11] Tag: laravel-mail
  [12] Tag: laravel-notifications
  [13] Tag: laravel-pagination
 > Provider: Laravel\Cashier\CashierServiceProvider
Copied Directory [/vendor/laravel/cashier/resources/views] To [/resources/views/vendor/cashier]
Publishing complete.

上記の流れで、/resources/views/vendor/cashier/receipt.blade.phpが生成されているはずです。

連載記事

【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