【Laravel】PAYJPで決済する① (新規決済のみ)

えび

Laravelのプロジェクトでpayjpを使用して
新規決済のみ行うシンプルなケースのメモ

既にカードが登録されている場合などは別記事に書く

usersテーブルにpayjpの顧客idカラムを追加

Schema::table('users', function (Blueprint $table) {
  $table->string('payjp_customer_id')->nullable()->comment('payjp顧客ID');
});

名前はなんでもいいけどここではpayjp_customer_idとする

payjpのパッケージをインストール

composer require payjp/payjp-php

.env及びconfigにkey設定

  • .env に追記
# PAYJP用keyを追加
PAYJP_PUBLIC_KEY=pk_XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
PAYJP_SECRET_KEY=sk_XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  • config/payjp.php を作成
<?php

return [
    'public_key' => env('PAYJP_PUBLIC_KEY', ''),
    'secret_key' => env('PAYJP_SECRET_KEY', ''),
];

これで、config('payjp.public_key') のようにキーの値を取得可能になる

さっそく支払いフォームを作ってみる

  • routes/web.php
Route::get('payment', [PaymentController::class, 'index'])->name('payment');
Route::post('payment', [PaymentController::class, 'payment']);
  • PaymentController.php
public function index()
{
  return view('payment');
}
  • payment.blade.php
<form action="{{ route('payment') }}" method="post">
  @csrf
  <script
    src="https://checkout.pay.jp/"
    class="payjp-button"
    data-key="{{ config('payjp.public_key') }}"
    data-text="カード情報を入力"
    data-submit-text="カードを登録する"
   ></script>
</form>

これで、「カード情報を入力」というボタンが表示される

クリックした際にはモーダルを表示してくれる

テストカード情報をもとにテストが可能

Controller側で登録・決済処理実装

  • PaymentController.phpに決済処理用のメソッドを追加
public function payment(Request $request)
{
  // 試しにデバッグしてみる
  dd ($request->all());
}

ここで$requestの内容をデバッグしてみると下記のような値が入っている

array:2 [▼
  "_token" => "zBF3gYHWAece3JD7plaHRkX6vBtgI0iYlWuPeeah"
  "payjp-token" => "tok_7df5ece8d772bf7a9c355fe5c995"
]

このpayjp-tokenを使って決済を行う

  • PaymentController.php
public function payment(Request $request)
{
  if (empty($request->get('payjp-token'))) {
    abort(404);
  }

  DB::beginTransaction();

  try {
    // ログインユーザー取得
    $user = auth()->user();
    // ⭐️ シークレットキーを設定
    \Payjp\Payjp::setApiKey(config('payjp.secret_key'));
    
    // ⭐️ 顧客情報登録
    $customer = \Payjp\Customer::create([
      // カード情報も合わせて登録する
      'card' => $request->get('payjp-token'),
      // 概要
      'description' => "userId: {$user->id}, userName: {$user->name}",
    ]);
    
    // ⭐️ DBにpayjpの顧客idを登録
    $user->payjp_customer_id = $customer->id;
    $user->save();

    // ⭐️ 支払い処理
    // 新規支払い情報作成
    \Payjp\Charge::create([
       // 上記で登録した顧客のidを指定
       "customer" => $customer->id,
       // 金額
       "amount" => 100,
       // 通貨
       "currency" => 'jpy',
    ]);
    
    DB::commit();

    return redirect(route('payment'))->with('message', '支払いが完了しました');
  
  } catch (\Exception $e) {
    Log::error($e);
    DB::rollback();
    return redirect()->back();
  }
}

登録したカード情報を利用して決済したい場合など

こちらの記事に書いた

【Laravel】PAYJPで決済する② (登録済みのカードも再利用)