オンライン決済実装研究所
実装ガイド

PaymentIntent の状態遷移を実装事故ベースで理解する

PaymentIntent の状態遷移を、作成、認証、確定、失敗、再試行の流れに沿って整理します。Webhook 連携の観点にも触れます。

この記事の要点

PaymentIntent は単なる決済オブジェクトではなく、決済の途中状態を扱う設計の中心です。状態遷移を理解しておくと、二重計上や webhook の処理漏れをかなり防げます。

公開日: 2026/4/10 更新日: 2026/4/12 著者: オンライン決済実装研究所 編集部
StripePaymentIntentWebhook

先に押さえること

PaymentIntent は「支払いが今どの段階にいるか」を表す箱です。

成功したかどうかだけを見る設計 にすると、再認証・失敗・再試行・Webhook再送のどこかで破綻します。

最低限の状態イメージ

requires_payment_method
  -> requires_confirmation
  -> requires_action
  -> processing
  -> succeeded

別ルート:
requires_confirmation
  -> requires_capture
  -> succeeded

終端:
canceled

失敗やキャンセルの分岐もあるため、アプリ側では「最終成功」だけでなく「いま何待ちか」を持つ必要があります。

Stripe の公式ステータスはもう少し細かく、特に見落としやすいのが次の2つです。

さらに、すべての決済がこの順番で必ず全部の状態を通るわけではありません。
アプリは「想定していた矢印」ではなく、受け取った status を正として扱う方が安全です。

実装で特に危ない状態

processing

processing は「だいたい成功」ではありません。
支払手段によっては、ここから成功にも失敗にも進みえます。

requires_capture

別途 capture する設計では、succeeded ではなく requires_capture で一度止まります。
このケースを知らずに「認証済みだから売上計上」とすると、未 capture の売上が混ざります。

canceled

Checkout Session と違って、PaymentIntent 自体はキャンセルされることがあります。
内部注文でも failed と canceled を分けておくと、再購入導線や CS 対応が整理しやすいです。

実装で事故になりやすい点

1. succeeded 以前に受注確定してしまう

認証待ちや processing の段階で内部注文を確定すると、返金や取消の整合性が崩れます。

2. webhook と同期レスポンスの責務が重なる

画面レスポンスで注文確定もやり、Webhookでも確定すると二重反映が起きます。

3. 冪等性キーと内部注文IDが結びついていない

再送や再試行のたびに別注文として扱うと、運用時に追跡できません。
冪等性キー は「API 再実行の安全性」、内部注文 ID は「業務上の一意性」で、役割が違います。

4. requires_capture を見落とす

手動 capture を使うのに succeeded だけで分岐していると、認証済み未売上の注文が漏れます。

5. 3Dセキュアを状態ではなく画面挙動で判定する

3Dセキュア は UI 上ではモーダルや別画面に見えますが、サーバーから見ると requires_action を経由する決済状態です。
見た目ではなく status と Webhook イベントで判断してください。

内部注文モデルへの写し方

Stripe のステータスをそのまま UI に見せるより、社内では少し抽象化した方が運用しやすいです。

Stripe 側内部状態の例補足
requires_payment_methodpending_payment_method入力不足や失敗後の再入力待ち
requires_actionpending_customer_action3DS 認証など利用者操作待ち
processingpending_settlement非同期確定待ち
requires_captureauthorized後 capture 前提
succeededpaid初めて受注確定候補になる
canceledcanceledabandoned / duplicate など

実務でのすすめ方

併読推奨

よくある質問

失敗時に新しい PaymentIntent を作るべきですか?

ケース次第ですが、元の Intent をどう扱うかを先に決めずに再生成すると整合性事故が起きやすいです。

requires_confirmation は必ず通りますか?

いいえ。確認方法や UI によっては見えにくいことがあります。全ステータスを必ず順番通りに通る前提にはしないでください。

次に読む記事

障害運用

Stripe Webhook で起きやすい失敗を運用視点で10個に整理する

Stripe Webhook で起きやすい失敗を、署名検証、再送、冪等性、順不同イベント、監視不足の観点から整理します。

Webhook障害の多くは、イベントを一回だけ来る前提で処理していることが原因です。署名、保存、冪等性、再処理導線までを最初から含めると、後の運用が大きく楽になります。

2026/4/10 Stripe / Webhook / 冪等性
実装ガイド

Stripe で決済機能を実装する手順をサンプルコード付きで追う

Checkout Sessions と Webhook を使って、商品選択から決済完了反映までを Node.js サンプルコード付きで段階的に説明します。

最初の実装は hosted checkout がいちばん事故りにくいです。金額は必ずサーバーで決め、注文確定は Webhook を正とし、フロントはリダイレクトと結果表示に責務を絞ると安定します。

2026/4/12 Stripe / Checkout / Webhook
実装比較

アプリに決済機能を組み込む方法を Stripe 中心に比較する

VibeCoding 初学者向けに、Stripe を軸に PayPal・Square・PAY.JP・KOMOJU を比較し、どの導入方式を選ぶと失敗しにくいか整理します。

最初に選ぶべきは料金表ではなく、Hosted checkout、埋め込みフォーム、定期課金、複数事業者対応のどれが必要かです。Stripe は守備範囲が広く、国内手段や既存ユーザー基盤が重要なら他候補も十分ありえます。

2026/4/12 Stripe / 決済代行 / PAY.JP