laravelとstripeで決済する

今までコピペコピぺで凌いできたので整理する

まずはプロジェクトを任意のディレクトリに作成
```
 composer create-project laravel/laravel stripetest "8.*" --prefer-dist
```
（これでできない場合、プロジェクト作成の段階でバージョンに原因があったり、使っているサーバーのPHPのバージョン、composerのパス等調べてみてください。）


続いてプロジェクト内に入ります。
```
cd stripetest
```
そしてstripeのパッケージが要ります。cashierというパッケージをインストールしましょう。
```
composer require laravel/cashier
```

ところがどっこいエラーが出ることも
```
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires laravel/cashier ^14.3 -> satisfiable by laravel/cashier[v14.3.0, 14.x-dev].
    - laravel/cashier[v14.3.0, ..., 14.x-dev] require illuminate/console ^9.21 -> found illuminate/console[v9.21.0, ..., 9.x-dev] but these were not loaded, likely because it conflicts with another require.

You can also try re-running composer require with an explicit version constraint, e.g. "composer require laravel/cashier:*" to figure out if any version is installable, or "composer require laravel/cashier:^2.1" if you know which you need.

Installation failed, reverting ./composer.json and ./composer.lock to their original content.

```
"composer require laravel/cashier:*"でインストールしてみてくださいとしれっと注意書きが。。。（ワイのような素人はエラーの一行目でパニックになるから見落としがちなんや...最後まできちんと読む勇気がいるンゴね。。。）

```
 composer require laravel/cashier:*
```
無事インストールができました。（これもできない場合、冒頭と同じようにプロジェクト作成の段階でバージョンに原因があったり、使っているサーバーのPHPのバージョン、composerのパス等調べてみてください。）

コントローラーを作成
```
php artisan make:controller StripePaymentsController
```


これでコンポーザーの出番は終了です。


続いてファイルをいじっていきましょう！

routes/web.phpを開いてルートを確認します。

```
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\StripePaymentsController; //追加①
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Route::post('payment', [StripePaymentsController::class, 'payment']); //追加②

```

追加①で先ほど作成したコントローラーを追記します。
追加②は決済した際のルートになります。後述するのでとりあえずコピペしてください。

```
return view('welcome');
```
を決済をするためのカード番号を入力するページにします。

resources/views/welcome.blade.phpを開いてください
```
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>決済してみるページ</title>

    </head>
    <form action="{{ asset('payment') }}" method="POST">
         @csrf
         <script
             src="https://checkout.stripe.com/checkout.js" class="stripe-button"
             data-key="{{ env('STRIPE_KEY') }}"
             data-amount="100"
             data-name="Stripe決済デモ"
             data-label="決済をする"
             data-description="これはデモ決済です"
             data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
             data-locale="auto"
             data-currency="JPY">
         </script>
    </form>
</html>
```
コピペしてください。

次にストライプのキーとシークレットが必要になります。（コード内の{{ env('STRIPE_KEY') }}に入ります。）
stripeで登録をして、keyとsecretを発行してください。その後.envファイルに追加してください。

```
STRIPE_KEY=pk_test_51LWDuCDFuWedbIpP5BtCXOzAIrhf****************
STRIPE_SECRET=sk_test_51LWDuCDFuWedbIpPmQH5vxV8eO***************
```

テスト環境のカード番号は42424242...
有効期限や3桁の番号はテキトーで大丈夫です。

決済を押す前に、paymentControllerのコードを編集しましょう。

```
<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Stripe\Stripe;
use Stripe\Customer;
use Stripe\Charge;

class StripePaymentsController extends Controller
{

    public function payment(Request $request)
    {

        try{
            Stripe::setApiKey(env('STRIPE_SECRET')); //①

            //ここで顧客情報を登録②
            $customer = Customer::create(array('email' => $request->stripeEmail,
                                               'source' => $request->stripeToken
                                              )
                                         );

            dump($customer);
            dump($customer->id);
            //お支払い処理③
            $charge = Charge::create(array('customer' => $customer->id,
                                           'amount' => 100,
                                           'currency' => 'jpy'
                                          )
                                     );

            //情報が色々みられます。
            dump($charge);
            dump($charge->source->id);
            dump($charge->source->brand);
            dump($charge->source->last4);
            dump($charge->source->exp_month);
            dump($charge->source->exp_year);

            return "COMPLETE";

        }catch(Exception $e){

            return $e->getMessage();

        }

    }

}


```

①では先ほどenvファイルに追加シークレットを使用します。
②で顧客情報をstripe側に登録します。これだけでstripeに顧客の情報を管理してくれますので、自サーバーで重要なカード番号とか管理しなくていいんですよね。素晴らしい！

代わりに顧客のIDを返してくれます。それが$customer->idです。cus_************と返ってきますので、（レンタルビデオ店の会員番号みたいなもん）これをデータベースに登録しておけば、次回このidを使うだけで支払い処理ができます。毎回毎回カード番号を打たなくてよくなります。amazonや楽天などで毎回入力しないのと同じ理屈です。楽ですね。

では新たに作ったcustomer->idを使って支払い処理をしましょう。今回はamount　で100円を指定していますが、前のカード情報入力画面で値段を設定しておけば$requestから値を指定できますので、慣れたら色々やってみてください。

最後にdumpであると便利な情報を抽出しました。これも慣れたら色々使ってみてください。