{success} クレジットカード決済を行う請求データのクレジットカード決済を行うバッチです。
毎月末日の23時にクレジットカード決済を行う請求データのクレジットカード決済を行うバッチです。
KIZUNA来月利用料の先払い請求レコードのうち、クレジットカード払いのものを月末23時にGMO PAYMENT GATEWAYにクレジットカード決済リクエスト投げ、その結果をDBに更新します。
クレジットカード決済が成功した場合は、オーナーアカウントのメールアドレス宛に決済完了の旨メール送信します。
| 項目 | 条件 |
|---|---|
| payment_year | 翌月の年 |
| payment_month | 翌月の月 |
| status | 1 : 未入金 |
| closed | 0 |
| payment_method | 1 : クレジットカード払い |
| payment_type | 1 : 毎月 |
| 項目 | 条件 |
|---|---|
| status | IN_USE or SUSPENDED |
| 今月解約ではない | scheduled_cancellation_date is nullor DATE_FORMAT(scheduled_cancellation_date, '%Y%m') > 翌月Ym |
| 項目 | 条件 |
|---|---|
| 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
organization_paymentsを取得し、その請求データ分の決済実行ジョブをQueueに登録します。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 : 毎月 |
{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利用料金の決済完了メールの設定を行います。
App\Notifications\SettleMonthlyBillingNotification