ECサイト運営開発記

PHPフレームワーク Laravelの使い方を中心とした通販サイトの開発日記

Laraveを使ってStripeの決済を導入する

Laravelで利用可能なインターネット決済APIの「Stripe」を試してみたので、基本的な利用方法をまとめておく。

f:id:nohohon_x:20161029025137p:plain

「Stripeの特徴」

  • 月額固定料金なし
  • 1取引あたり3.6%の手数料
  • JavaScriptのコードを貼り付けるだけで、ネット決済システムを導入可能
  • 定期支払も可能。
  • PHPRubyPythonJavaなど様々な言語やプラットフォームに対応
  • Apple Payにも対応
  • シンプルでわかりやすいAPIが用意されている
  • APIから決済成立/全額払い戻す/一部返金など様々な操作が可能

アカウントの作成

アカウントの作成はメールアドレスとパスワードの登録だけで可能。テスト環境はそれだけで用意ができます。

Stripe: Register


テスト環境のAPIキーの確認

StripeのAPIにアクセスするために、ダッシュボードの右上のアカウント情報からAPIキーを確認しておきましょう。Laravelでは、基本的にSecretKeyのみを使います。
f:id:nohohon_x:20161029030528p:plain


テスト環境と本番環境のAPIキーが表示されている。今回はテスト環境のAPIを使用。
f:id:nohohon_x:20161029030522p:plain


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の実売上。
<?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">&yen;{{$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に軍配が上がる感じです。

stripe.com