月次決済実行バッチ


{success} クレジットカード決済を行う請求データのクレジットカード決済を行うバッチです。


概要

毎月末日の23時にクレジットカード決済を行う請求データのクレジットカード決済を行うバッチです。

KIZUNA来月利用料の先払い請求レコードのうち、クレジットカード払いのものを月末23時にGMO PAYMENT GATEWAYにクレジットカード決済リクエスト投げ、その結果をDBに更新します。

クレジットカード決済が成功した場合は、オーナーアカウントのメールアドレス宛に決済完了の旨メール送信します。


条件

organizaiton_paymentsテーブル

項目 条件
payment_year 翌月の年
payment_month 翌月の月
status 1 : 未入金
closed 0
payment_method 1 : クレジットカード払い
payment_type 1 : 毎月

organizaitonsテーブル

項目 条件
status IN_USE or SUSPENDED
今月解約ではない scheduled_cancellation_date is null
or DATE_FORMAT(scheduled_cancellation_date, '%Y%m') > 翌月Ym

organization_payment_settingsテーブル

項目 条件
credit_card_number not null
SELECT *
  FROM organization_payments op
  LEFT JOIN organizations o
    ON op.organization_id = o.id
  LEFT JOIN organization_payment_settings ops
    ON ops.id = op.organization_payment_setting_s_id
 WHERE op.payment_year = {today()->firstOfMonth()->addMonth()->year}                  -- [organization_payments] 翌月の年
   AND op.payment_month = {today()->firstOfMonth()->addMonth()->month}                -- [organization_payments] 翌月の月
   AND op.status = 1                                                                  -- [organization_payments] 請求状態:未入金
   AND op.closed = 0                                                                  -- [organization_payments] 請求データクローズフラグ:false
   AND op.payment_method = 1                                                          -- [organization_payments] 請求方法:クレジットカード払い
   AND op.payment_type = 1                                                            -- [organization_payments] 請求種類:毎月
   AND op.deleted_at IS NULL
   AND (                                                                              -- [organizations] 今月での解約予定はないか?
        o.scheduled_cancellation_date IS NULL                                         -- [organizations] 解約予定日がNULL
     OR DATE_FORMAT(o.scheduled_cancellation_date, '%Y%m') > {today()->format('Ym')}  -- [organizations] 解約予定日が来月以降
   )
   AND o.status IN (5, 10)                                                            -- [organizations] 監理団体のステータスが「5:利用中」か「10:アカウント停止」
   AND o.deleted_at IS NULL
   AND ops.credit_card_number IS NOT NULL                                             -- [organization_payment_settings] クレカ番号がNULLではない
   AND ops.deleted_at IS NULL

処理内容

  • 翌月のKIZUNA利用料のクレジット払いの請求データorganization_paymentsを取得し、その請求データ分の決済実行ジョブをQueueに登録します。
  • 決済実行ジョブを順番に実行していきます。
    • 決済実行ジョブ内でGMO PAYMENT GATEWAYのAPIに決済のリクエストを投げます。
    • GMO PAYMENT GATEWAYのAPIからの結果を監理団体 決済履歴organization_payment_logsに登録します。
    • クレジットカード決済に成功した場合、決済完了した旨をオーナーアカウントのメールアドレスへ送信します。

登録・更新内容

organization_payment_logsテーブル

{primary} 該当の請求データを該当件数分、新規作成します。このデータは、請求発行画面の決済履歴を表示する際に使用します。

物理名 論理名 登録値 備考
organization_id 監理団体ID 請求データorganizationPaymentの値コピー
organization_payment_setting_id 監理団体 支払設定ID 請求データorganizationPaymentの値コピー
organization_payment_id 支払方法 請求データorganizationPaymentの値コピー
settled 支払時期 GMO PAYMENT GATEWAYの決済結果 true or false
errors 請求種類 1 : 毎月

organization_paymentsテーブル

{primary} 該当の請求データを該当件数分、クレジットカード決済結果をorganization_paymentsテーブルに更新します。

 

決済成功時
物理名 論理名 登録値 備考
settled_at 決済日時 now() 現在日時を登録
status 請求状態 5 : 入金済み
closed 請求データクローズフラグ true フラグ立てます
決済失敗時
物理名 論理名 登録値 備考
settled_at 決済日時 now() 現在日時を登録

決済失敗時は、請求状態は「1:未入金」、請求データクローズフラグは立てないので、決済日時のみ更新します。


メール本文

翌月のKIZUNA利用料金が確定した旨、オーナーアカウントのメールアドレスへ送信

<div style="width:100%; background:#f13757; padding:40px 20px;">
    <div style="width:80%;margin:0 auto; background:#fff; padding: 20px; border-radius:8px;">
        <div><img src="{{ $logo_src }}" alt="" style="width: 200px;"></div>
        <p style="font-weight:bold; font-size:2rem;">KIZUNA利用料金の決済が完了しました。</p>
        <p>決済処理を行いました。管理画面の請求情報から内容を確認してください。</p>
        <p>引き続きご利用の程宜しくお願い致します。</p>
        <p>このメールに見覚えがなかったり、</p>
        <p>ご不明点があれば下記メールアドレス迄お問合せ下さい。</p>
        <p>{{ $contact_email }}</p>
    </div>
</div>

対象クラスファイル

App\Console\Kernelの設定値

$schedule->command('monthlybatch:executeSettlement')->lastDayOfMonth('23:00');

月初処理バッチ

監理団体のステータスを更新するジョブApp\Jobs\SettleMonthlyBillingを実行します。

App\Console\Commands\SettleMonthlyBillingNotification

月次決済処理を行うジョブ

クレカ決済対象の請求データorganization_paymentsレコードを取得し、その件数分決済実行ジョブApp\Jobs\ExecuteSettlementをQueueに登録します。

KIZUNAがいっぱい売れて、クレカ決済の件数がものすごく多くなった時、1つのジョブで全件クレカ決済処理するとタイムアウトになってしまうのを避けるため、このジョブは各監理団体毎に決済処理する「決済実行するジョブ」を登録するジョブとなっています。

App\Jobs\SettleMonthlyBilling

決済実行ジョブ

いち監理団体毎の決済処理を行うジョブです。

Queueに登録された決済実行ジョブが順に処理されます。

GMO PYAMENT GATEWAYのAPIにクレジットカード決済のリクエストを投げ、その結果を該当する請求データorganization_paymentsと監理団体 決済履歴データorganization_payment_logsに登録・更新します。

クレジットカード決済が成功した場合は、オーナーアカウントのメールアドレス宛に決済完了の旨メール送信します。

App\Jobs\ExecuteSettlement

KIZUNA利用料金の決済完了メール

KIZUNA利用料金の決済完了メールの設定を行います。

App\Notifications\SettleMonthlyBillingNotification