第 9 章 / 全 27 章
決済申請一覧
決済申請 とは、加盟店サイトでユーザーが商品をカートに入れて決済方法を選択した時点で生成される取引レコードです(Stripe の PaymentIntent、GMO の取引登録に相当)。この画面は 決済完了前の取引を追跡し、入金を消込む ためのものです。
決済申請と決済一覧は同じ取引テーブルをステータスで分けたものです。
| 画面 | 表示されるステータス |
|---|---|
| 決済申請一覧 | 申請中 / 振込待ち / 支払待ち / 与信済 / 失敗 / 期限切れ / キャンセル |
| 決済一覧 | 完了 / 一部返金 / 返金済 |
取引の項目
| 項目 | 説明 |
|---|---|
| 取引ID | システムが発行する一意の ID(通知の payment_id) |
| 注文番号 | 加盟店側の注文番号 |
| 加盟店 | 取引が発生した加盟店サイト |
| 商品名 / 金額 | カートの内容と請求額(円) |
| ユーザー名 / ユーザーID | 加盟店側のユーザー情報 |
| 決済種別 | クレジット / QR / コンビニ / 銀行振込 / その他 |
| 申請日時 / 完了日時 | 取引の生成時刻と完了時刻 |
| ステータス | 下記ライフサイクル |
銀行振込の取引には 振込ID(加盟店ごとに 7 桁または 8 桁、一意)、振込期限(申請から 7 日後)、入金額(累計)、過不足フラグ(不足 / 超過)が加わります。
ステータスのライフサイクル
| ステータス | 意味 | 次に進める操作 |
|---|---|---|
| 申請中 | 生成直後(まだ決済手段側の結果が無い) | 完了 / 失敗 / キャンセル |
| 振込待ち | 銀行振込。振込IDを発行し入金を待っている | 入金消込 / キャンセル / 期限切れ(期限超過時) |
| 支払待ち | コンビニ決済。受付番号を発行し店頭での支払いを待っている | 入金消込(店頭支払通知)/ キャンセル / 期限切れ(期限超過時) |
| 与信済 | クレジットの与信が取れている | 完了 / 失敗 / キャンセル |
| 完了 | 決済が成立(決済一覧へ移動) | 返金 |
| 期限切れ | 振込 / 支払期限を過ぎた | 期限後入金の消込(未消込入金画面から。期限切れ → 完了) |
| 失敗 / キャンセル | 終了状態 | なし |
| 返金済 | 全額返金済み(決済一覧) | なし |
すべての状態変更は、変更前後のステータス・実行者(管理画面 / Webhook / 入金通知(銀行) / 初期データ)・日時とともに ステータス変更履歴 に記録されます。
一覧の並びと絞り込み
- 振込待ち の取引は振込期限が近い順に上へ表示されます。期限超過 は行と期限を赤で強調し、「期限超過」バッジを付けます。それ以外は申請日時の新しい順です。
- 決済種別・ステータス・加盟店・申請日の期間(開始 / 終了)で絞り込めます。テスト / 本番はヘッダーのスイッチで切り替えます。
操作(マスター権限)
詳細画面の操作はマスター権限のアカウントでログインしている必要があります。一般権限では閲覧のみです。判定はサーバー側で行われます。
| 決済種別 | ボタン | 動作 |
|---|---|---|
| 銀行振込 | 入金消込 | 入金額を入力。一致 → 完了、不足 → 振込待ちのまま「不足」フラグ(次の入金で累計)、超過 → 完了 + 「超過」フラグ |
| 銀行振込 | 期限切れにする | 振込期限を過ぎた振込待ちのみ |
| クレジット等 | 完了にする / 失敗にする | デモ用の手動遷移(本番では PSP からの通知が行う) |
| 共通 | キャンセル | 申請中 / 振込待ち / 与信済のみ |
入金通知 API(デモ)
銀行からの入金通知を模した API です。振込IDと入金額を送ると、上と同じ消込ルールが実行され、履歴には実行者「入金通知(銀行)」として記録されます。コンビニ決済網からの店頭支払通知は POST /api/demo/cvs-notify(receiptNo = 受付番号)で、判定は同じです。
POST /api/demo/deposit-notify
Authorization: Bearer <DEPOSIT_NOTIFY_SECRET>
Content-Type: application/json
{ "eventId": "bank-20260901-0007", "transferId": "48213907", "amount": 24800, "mode": "test" }| 項目 | 説明 |
|---|---|
eventId | 任意(128 文字以内)。送信元のイベント ID。同じ ID の通知は 2 回目以降「重複」として扱い、消込を再適用しません |
transferId | 振込ID(7 桁または 8 桁の数字)。コンビニ通知では receiptNo(13 桁の受付番号) |
amount | 入金額(円、整数)。コンビニ通知では省略可(伝票額) |
mode | 必須。test または live。未指定は 400 invalid_input(fieldErrors.mode = "required") |
payerName / bankReference / receivedAt | 任意。振込名義・銀行参照番号・入金日時(ISO 8601、省略時は受信時刻) |
eventId が無い場合の重複判定キーは「送信元 | 振込ID または受付番号 | 金額 | 入金日時(分単位)| 銀行参照番号」のハッシュです。
応答例:
{ "ok": true, "data": { "notificationId": "…", "notificationNo": "DN-00012", "duplicate": false, "matched": true,
"transferId": "48213907", "paymentId": "pay_…", "amount": 24800, "received": 24800,
"depositAmount": 24800, "depositDiff": null, "status": "captured", "completed": true } }| 状況 | 応答 |
|---|---|
同じ通知の再送(eventId またはハッシュが一致) | 200、duplicate: true(notificationId / paymentId は最初の通知のもの)。消込は再適用しない |
| 振込IDが無い・存在しない | 202、未消込入金として記録(matched: false, reason: "not_found", unmatchedDepositId) |
mode と取引の環境(テスト / 本番)が違う | 202、消込せず未消込入金(reason: "mode_mismatch", paymentId)。テストの通知で本番の取引が完了することはありません |
| 取引が期限切れ | 202、未消込入金(reason: "late_deposit", paymentId)。「期限後入金」として消込できます(下記) |
| 取引がキャンセル済 | 202、未消込入金(reason: "cancelled_deposit")。却下(組戻し手配)のみ |
| 完了済みなど入金を受け付けない状態 | 409 invalid_transition(通知ログには「拒否」として残ります) |
| 不足入金 | 200、status: "awaiting_transfer"(コンビニは "awaiting_payment"), depositDiff: "short" |
| 超過入金 | 200、status: "captured", depositDiff: "excess" |
環境変数 DEPOSIT_NOTIFY_SECRET を設定すると Bearer 認証が必須になります。未設定の場合、本番環境では 404、開発環境では認証なしで利用できます。curl の例:
curl -X POST http://localhost:3000/api/demo/deposit-notify \
-H "Content-Type: application/json" \
-d '{"eventId":"bank-20260901-0007","transferId":"48213907","amount":24800,"mode":"test"}'過不足入金の対応
入金消込で不足 / 超過が出た取引は 過不足入金 画面に「未対応」で並びます。対応ステータスは次のとおり遷移します(画面上部にも図示)。
| 状況 | 操作 | 遷移 |
|---|---|---|
| 不足 | 追加入金を案内済にする(テンプレート deposit_short のメールを送信・記録) | 未対応 → 追加入金案内済 → (次の入金で入金消込が再判定し完了)→ 完了にする |
| 超過 | 差額を返金申請(理由: 重複決済の返金申請を作成し、返金管理で承認) | 未対応 → 差額返金手配中 → 完了にする |
各行から「返金管理で開く」「送信したメールを見る」で作成した返金申請 / 送信ログへ移動できます。取引詳細の「関連する入金通知・未消込入金」には同じ振込ID / 受付番号で届いた通知と候補の未消込入金を表示し、入金消込ダイアログでは候補をクリックすると金額が入力され、確定前に判定結果(一致 / 不足 / 超過)をプレビューします。
申請一覧の 期限超過 タブは、振込待ち / 支払待ちのまま期限を過ぎた取引(ステータス未変更)を抽出します。「期限切れ」ステータスとは別物で、期限切れ処理が走るまでは入金消込・キャンセルができます。
入金通知ログ
受信した入金通知(銀行 / コンビニ)は結果にかかわらずすべて 入金通知ログ 画面(取引グループ、未消込入金の隣)に記録されます。通知番号(DN-00001 形式)、送信元、振込ID / 受付番号、金額、入金日時、結果(消込済 / 重複 / 未消込 / 拒否)と理由、対象取引・未消込入金へのリンクを表示し、送信元・結果・受信日で絞り込めます。CSV 出力あり。ヘッダーのテスト / 本番スイッチで環境ごとに切り替わります。
未消込入金と API 再通知(銀行振込のみ)
顧客が 振込IDを付け忘れて振り込んだ 場合、入金通知は取引に結び付かず、そのままではユーザーの購入が反映されません。この機能はサポートが振込IDを付与し、手動で加盟店側を更新するのではなく API(Webhook)で加盟店に反映させる ための仕組みです。クレジットや QR などプロバイダ側で確定する決済には付きません。
流れ
- 未消込入金の発生:
POST /api/demo/deposit-notifyにtransferIdが無い(または該当する取引が無い)入金通知が届くと、404 ではなく 202 で「未消込入金」として記録します。環境(mode)が取引と違う入金、期限切れ・キャンセル済の取引への入金も同様に未消込入金になり、理由(環境不一致 / 期限後入金 / キャンセル済への入金)と対象取引が一覧に表示されます。銀行明細を見たサポートが 未消込入金 → + 入金を登録 から手で登録することもできます。 - 振込IDの付与(消込): 一覧の 振込IDを付与して消込(admin / accounting)で振込IDを入力します。ダイアログには同じモードの振込待ち取引が 残額の一致するものを先頭に 候補表示され、クリックで入力できます。環境の違う取引・期限切れの取引は候補に理由付きで表示されますが選択できません。実行すると通常の入金消込と同じ判定(一致 → 完了、不足 → 振込待ちのまま不足フラグ、超過 → 完了 + 超過フラグ)が走り、完了した時点で加盟店の通知先に `payment.completed` が送信されます。
- 期限後入金として消込: 理由が「期限後入金」の行(取引が期限切れ)には 期限後入金として消込(admin / accounting、理由必須)が表示されます。実行すると取引は 期限切れ → 完了 に遷移し(履歴の操作「期限後入金の消込」)、
payment.completedの送信と決済完了メールが通常どおり行われます。金額が一致しない場合も完了にし、差額は過不足入金に記録します。キャンセル済の取引への入金は消込できません(却下のみ)。 - API 再通知: 加盟店側が通知を取りこぼした場合は、取引詳細の API 再通知(銀行振込の完了 / 一部返金済 / 返金済の取引のみ、admin / cs / developer)で
payment.completedを再送します。送信結果は Webhook 送信ログで確認でき、取引には再通知回数と最終再通知日時が残ります。 - 却下: 組戻し(返金)済みや二重入金など取引に結び付けない入金は 却下 し、区分(組戻し手配 / その他)と理由を残します。期限後・キャンセル後の入金を組み戻す場合は「組戻し手配」を選びます。未処理の期限後入金は通知センターに日次で「期限後入金 N 件」(警告)として届きます。
| 操作 | API | 権限 |
|---|---|---|
| 未消込入金の登録 | POST /api/unmatched-deposits { amount, payerName, receivedAt?, bankReference?, givenTransferId?, note? } | ○ |
| 候補の取得 | GET /api/unmatched-deposits/<id> → { deposit, candidates } | ○ |
| 振込IDを付与して消込 | POST /api/unmatched-deposits/<id>/match { transferId } → { deposit, payment, renotified } | M |
| 期限後入金として消込 | POST /api/unmatched-deposits/<id>/late-match { reason } → { deposit, payment, renotified } | M |
| 却下 | POST /api/unmatched-deposits/<id>/dismiss { reason, kind? }(kind: returned = 組戻し手配 / other) | ○ |
| API 再通知 | POST /api/payments/<id>/renotify → { deliveryId, renotifyCount, renotifiedAt } | M |
エラー: 振込IDが存在しない / 銀行振込でない → 404 transfer_not_found、振込待ち以外 → 409 invalid_transition、モード違い → 409 mode_mismatch、処理済みの入金 → 409 deposit_not_open、クレジット等への再通知 → 409 not_bank_transfer、未完了の取引への再通知 → 409 invalid_transition。すべて操作ログ(deposit.register / deposit.match / deposit.dismiss / payment.renotify)に記録されます。