usersテーブルにpayjpの顧客idカラムを追加
Schema::table('users', function (Blueprint $table) {
$table->string('payjp_customer_id')->nullable()->comment('payjp顧客ID');
});
名前はなんでもいいけどここではpayjp_customer_id
とする
payjpのパッケージをインストール
- payjp/payjp-phpを使用する
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を使用して
新規決済のみ行うシンプルなケースのメモ
既にカードが登録されている場合などは別記事に書く