Laraveを使ってStripeの決済を導入する
Laravelで利用可能なインターネット決済APIの「Stripe」を試してみたので、基本的な利用方法をまとめておく。
「Stripeの特徴」
テスト環境のAPIキーの確認
StripeのAPIにアクセスするために、ダッシュボードの右上のアカウント情報からAPIキーを確認しておきましょう。Laravelでは、基本的にSecretKeyのみを使います。
テスト環境と本番環境のAPIキーが表示されている。今回はテスト環境のAPIを使用。
Laravelで環境をセットアップ
以下、Laravelは5.3を前提として解説します。
- composer.jsonに"laravel/cashier": "~7.0"を追加して、composer update。
- config/app.phpのServiceProviderにLaravel\Cashier\CashierServiceProviderを追加
<?php 'providers' => [ /* 中略*/ Laravel\Cashier\CashierServiceProvider::class, ],
- config/services.phpのstripeの項目にテスト用のSecret Keyを設定する。.envに記述してもOK。
<?php 'stripe' => [ 'model' => App\User::class, 'secret' => env('STRIPE_SECRET'), ],
- 今回はモデルには決済機能を組み込まないのでスルー。
Stripe APIを使ってカードのトークンを作り、決済手続きをする。(エラーチェックは省きます)
- /routes/web.phpにサンプルコードを記述
- 手順はシンプル
- 入力フォムから受け取ったカード番号、有効年、有効月、セキュリティコードをAPIに送信すると、クレジットカードのトークンが作成される
- 作ったトークンを元に、決済オブジェクトの作成を行う。基本的にはこれで手続きは終わり。とても簡単。
- amountは金額、captureをfalseにしておくと、仮売上の状態。デフォルトはtrueの実売上。
- 入力フォムから受け取ったカード番号、有効年、有効月、セキュリティコードをAPIに送信すると、クレジットカードのトークンが作成される
- 手順はシンプル
<?php <form class="card-block" method="post" action="{{URL::to("/payment")}}"> <div class="card"> <div class="card-header">カード情報入力</div> <div class="card-block"> <fieldset> <legend>CARD INFO</legend> <div class="form-group"> <label>NAME</label> <input type="text" class="form-control" name="name" placeholder="YOUR NAME" value="PIKO TAROU"> </div> <div class="form-group"> <label>NUMBER</label> <input type="text" class="form-control" name="number" placeholder="カード番号" value="4242424242424242" > </div> <div class="form-group"> <label>EXPIRE</label> <div class="row"> <div class="col-lg-3"> <input type="number" class="form-control" name="exp_month" placeholder="月" value="10"> </div> <div class="col-lg-3"> <input type="number" class="form-control" name="exp_year" placeholder="年" value="2020"> </div> </div> </div> <div class="form-group"> <label>CVC</label> <input type="number" class="form-control" name="cvc" placeholder="***" value="123"> </div> </fieldset> <fieldset> <legend>CHARGE OPTIONS</legend> <div class="form-group"> <label>PRICE</label> <input type="text" class="form-control" name="amount" placeholder="金額" value="1000" > </div> <div class="form-group"> <label>DESRIPTION</label> <input type="text" class="form-control" name="description" placeholder="説明文" value="hogehoge" > </div> </fieldset> </div> <div class="card-footer"> <input type="submit" class="btn btn-block btn-danger" value="決済"> </div> </div> </form>
<?php Route::post("/payment",function(Request $request){ // キーの設定 \Stripe\Stripe::setApiKey(Config::get("services.stripe.secret")); // トークンを作る $token=\Stripe\Token::create(array( "card" => [ "number" => $request->input("number"), "exp_month" => $request->input("exp_month"), "exp_year" => $request->input("exp_year"), "cvc" => $request->input("cvc"), "name" => $request->input("name") ] )); // 決済 $charge=\Stripe\Charge::create(array( "amount" => $request->input("amount"), "currency" => "jpy", "source" => $token, "description" => $request->input("description"), "capture"=>false )); // dd($charge); return back(); }
- 決済オブジェクト一覧を取得する
<?php Route::post("/index",function(Request $request){ // キーの設定 \Stripe\Stripe::setApiKey(Config::get("services.stripe.secret")); // 決済一覧を50件取得 $chargeList=\Stripe\Charge::all(array("limit" =>50)); return view("stripe/index",["chargeList"=>$chargeList]); }
- 決済オブジェクト一覧をbladeのViewで表示する
<?php @forelse ($chargeList->data as $key => $value) <tr> <td> <a href="{{URL::to("/view/".$value->id)}}">{{$value->id}}</a> </td> <td> {{$value->source->name}} </td> <td class="text-xs-center">¥{{$value->amount}}</td> <td class="text-xs-center">{{$value->source->brand}}</td> <td class="text-xs-center"> @if($value->refunded==true) 払い戻し済み @else @if($value->captured) 実売上 @else 仮売上 @endif @endif </td> <td class="text-xs-center"> @if($value->refunded==false) @if($value->captured==false) <a href="{{URL::to("/capture/".$value->id)}}">実売上にする</a> / @endif <a href="{{URL::to("/refund/".$value->id)}}">払い戻す</a> @endif </td> </tr> @empty @endforelse
- 決済を仮売上から実売上にする
<?php Route::any("capture/{id}",function($id){ // キーの設定 \Stripe\Stripe::setApiKey(Config::get("services.stripe.secret")); // 実売上に変更 $ch = \Stripe\Charge::retrieve($id); $ch->capture(); return back(); });
- 決済を全額払い戻し
<?php Route::any("refund/{id}",function($id){ // キーの設定 \Stripe\Stripe::setApiKey(Config::get("services.stripe.secret")); // 払い戻し $re = \Stripe\Refund::create(array( "charge" => $id )); return back(); });
- 決済を一部払い戻し
<?php Route::post("refund-amount/",function(Request $request){ // キーの設定 \Stripe\Stripe::setApiKey(Config::get("services.stripe.secret")); // 払い戻し $re = \Stripe\Refund::create(array( "charge" => $request->input("id"), "amount" =>$request->input("amount",0), )); return back(); });
申し込みからテストまで簡単にできるので、Web決済に悩んでいる方はStripeはとてもオススメです。
ただし、日本語ドキュメントはまだ揃っていないことに加え、ダッシュボードもまだ英語なので、そこはWebPayに軍配が上がる感じです。