[Laravel PAYJP]で決済する(定期課金のみ)

PHP

初めに

Webアプリをせっかく作るのであれば

収益を上げてみたいですよね。

収益を上げるという目的があれば

開発のモチベーションが上がると思うので

今回はPAY.jpでの定期課金の実装手順に

ついて解説していきます。

前提条件

Pay.jpのアカウント作成方法

Laravelの環境構築

Laravel/uiの導入方法は
今回省略させていただきます。

もしまだできていない方は以下に手順を

乗せておきますので参考になれば幸いです。

[Laravel 8 インストール]

https://readouble.com/laravel/8.x/ja/installation.html

[Laravel/ui 導入手順]

https://qiita.com/daisu_yamazaki/items/b946594896179abcd203

テーブル構成

テーブル構成は作りたいもので変わると思いますが

一例として載せておきます。

 public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('email')->nullable(false);
            $table->timestamp('email_verified_at')->nullable();
            $table->tinyInteger('email_verified')->default(0);
            $table->string('email_verify_token')->nullable();
            $table->string('password')->nullable(false);
            $table->string('corporate_id')->nullable(false)->unique();
            //ここから追加
            $table->string('payjp_customer_id')->nullable()->comment('payjp顧客ID');
            //ここまで追加
            $table->rememberToken();
            $table->timestamps();
        });
    }

Pay.jpインストール

公式のGit.hubは以下となります。

https://github.com/payjp/payjp-php

composer require payjp/payjp-php

環境変数設定

.envファイルにpay.jpの環境変数をセットしてください。

PAYJP_PUBLIC_KEY=pk_XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
PAYJP_SECRET_KEY=sk_XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

次にconfig配下にpayjp.php を作成します。

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

Routes Controller Bladeの作成

Route::get('payment', [App\Http\Controllers\UserController::class, 'index'])->name('payment');
Route::post('payment', [App\Http\Controllers\UserController::class, 'payment']);
 public function index(){
        return view('user.payment');
    }

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\Subscription::create([
       // 上記で登録した顧客のidを指定
       "customer" => $customer->id,

       "plan" => $request->input('plan'),


    ]);

    DB::commit();

    return redirect(route('payment'))->with('message', '支払いが完了しました');

  } catch (\Exception $e) {
    Log::error($e);
    DB::rollback();
    return redirect()->back();
  }
}
<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>

   <input type="hidden" name="plan" value="作成したプランIDを記入">
</form>

Pay.jp定期課金プラン作成

ホーム画面->プラン->プランを作成をクリック

以下のように入力をして保存をクリック。

作成後プランIDを先ほど作成したbladeファイルのvalue属性に設定してください。

実際に使ってみよう!

テスト用で使えるカード情報は以下のリンクにあります。

https://pay.jp/docs/testcard

有効期限、CVC番号、名前は適当で大丈夫です。

カードを登録後Pay.jpホーム画面の定期課金に情報が

反映されていれば正常に動作しています。

最後に

今回はPay.jpの定期課金について

解説をしました。

良いアプリは収益も上げることが

できるのでもし実装に困っているのであれば

参考になれば幸いです!