# オンライン決済実装研究所 > Stripe の導入判断、PaymentIntent と Webhook の設計、定期課金や Connect、運用上の注意点までを記事と用語集で整理する技術メディア。 これは主要コンテンツを 1 ファイルにまとめた LLM 向けのロングコンテキストです。 - Canonical Site: https://media-payment-impl-lab.pages.dev/ - LLM Index: https://media-payment-impl-lab.pages.dev/llms.txt - Language: ja-JP - Audience: Stripe の導入判断、実装設計、運用改善を担当する開発者、テックリード、運用担当者。 - Organization: パブロフ株式会社 このファイルは要約ではなく、記事本文と用語本文を取り込みやすい形で並べたものです。 時間依存の強い Stripe 仕様や料金、法令・規約解釈は、本文の更新日と公式一次情報を必ず確認してください。 ## Site Overview # オンライン決済実装研究所 > Stripe の導入判断、PaymentIntent と Webhook の設計、定期課金や Connect、運用上の注意点までを記事と用語集で整理する技術メディア。 - Canonical: https://media-payment-impl-lab.pages.dev/ - Language: ja-JP - Organization: パブロフ株式会社 - Audience: Stripe の導入判断、実装設計、運用改善を担当する開発者、テックリード、運用担当者。 ## Primary Pages - [運営情報](https://media-payment-impl-lab.pages.dev/about.md): 編集方針、更新ポリシー、想定読者。 - [編集部プロフィール](https://media-payment-impl-lab.pages.dev/authors/editorial-team.md): 執筆主体と専門領域。 - [用語集一覧](https://media-payment-impl-lab.pages.dev/glossary.md): Stripe 実装で登場する用語の索引。 ## Featured Articles - [アプリに決済機能を組み込む方法を Stripe 中心に比較する](https://media-payment-impl-lab.pages.dev/posts/app-payment-provider-comparison-for-beginners.md): 最初に選ぶべきは料金表ではなく、Hosted checkout、埋め込みフォーム、定期課金、複数事業者対応のどれが必要かです。Stripe は守備範囲が広く、国内手段や既存ユーザー基盤が重要なら他候補も十分ありえます。 - [Stripe Checkoutを実務目線で整理する導入ガイド|判断軸・実装フロー・運用の注意点](https://media-payment-impl-lab.pages.dev/posts/stripe-checkout.md): Stripe Checkoutは、決済画面を比較的短期間で導入しやすい選択肢ですが、要件によっては独自実装や他のStripe製品との比較が必要です。本稿では、導入前に確認すべき判断軸、実装の基本フロー、つまずきやすいポイント、運用で見る指標を実務目線で整理します。 - [Stripeの主要機能を地図として把握する(一覧と詳細記事への導線)](https://media-payment-impl-lab.pages.dev/posts/stripe-major-features-overview.md): Stripeは「決済API」だけでなく、課金・分配・リスク・対面・請求の各レイヤーが揃っています。まず全体像を表に落とし、深掘り記事と用語集へ辿れるようにします。 ## Latest Articles - [アプリに決済機能を組み込む方法を Stripe 中心に比較する](https://media-payment-impl-lab.pages.dev/posts/app-payment-provider-comparison-for-beginners.md): 最初に選ぶべきは料金表ではなく、Hosted checkout、埋め込みフォーム、定期課金、複数事業者対応のどれが必要かです。Stripe は守備範囲が広く、国内手段や既存ユーザー基盤が重要なら他候補も十分ありえます。 - [決済システム運用で事故を減らすチェックリストを作る](https://media-payment-impl-lab.pages.dev/posts/payment-system-operations-checklist.md): 決済実装の本番事故は、API 呼び出しそのものよりも Webhook 再送、返金、問い合わせ対応、テスト鍵混在で起きます。公開前に『状態』『証跡』『再実行』『照合』の4点を揃えるだけで壊れにくさが大きく変わります。 - [Stripe Billingとサブスクリプションを実装目線で整理する](https://media-payment-impl-lab.pages.dev/posts/stripe-billing-subscriptions-guide.md): 定期課金は「プラン」「請求サイクル」「失効カード」の3つがセットです。Billing を中心に置きつつ、顧客ポータルと請求書をどう位置づけるかを実務の言葉でまとめます。 - [Stripe Checkoutを実務目線で整理する導入ガイド|判断軸・実装フロー・運用の注意点](https://media-payment-impl-lab.pages.dev/posts/stripe-checkout.md): Stripe Checkoutは、決済画面を比較的短期間で導入しやすい選択肢ですが、要件によっては独自実装や他のStripe製品との比較が必要です。本稿では、導入前に確認すべき判断軸、実装の基本フロー、つまずきやすいポイント、運用で見る指標を実務目線で整理します。 - [Stripe Connectでマーケットプレイス決済を設計するときの要点](https://media-payment-impl-lab.pages.dev/posts/stripe-connect-platform-guide.md): Connect は『誰の Stripe アカウントで課金し、誰にいくら渡すか』をデータモデル化する仕組みです。早めにタイプと送金フローを固定しないと、KYC・レポート・返金で詰みやすいです。 - [Stripeの主要機能を地図として把握する(一覧と詳細記事への導線)](https://media-payment-impl-lab.pages.dev/posts/stripe-major-features-overview.md): Stripeは「決済API」だけでなく、課金・分配・リスク・対面・請求の各レイヤーが揃っています。まず全体像を表に落とし、深掘り記事と用語集へ辿れるようにします。 ## About # オンライン決済実装研究所 について > Stripe を中心としたオンライン決済の比較、実装、運用を整理する技術メディアです。 - Canonical: https://media-payment-impl-lab.pages.dev/about/ - Organization: パブロフ株式会社 - Organization URL: https://www.pavlov-inc.co.jp/ - Language: ja-JP ## Editorial Policy - 概念説明だけで終わらせず、内部注文、監視、再処理、CS までつながる実務観点を優先します。 - 仕様解説は一次情報と実装事故の観点を突き合わせて、判断に使える差分を残します。 - 更新日は、本文の意味が変わる修正や導線追加を伴う更新時にのみ更新します。 ## Intended Audience - Stripe 導入を始めるプロダクト開発者 - 決済フローの責務分割を整理したいテックリード - Webhook、返金、チャージバック運用で詰まりやすい運用担当 ## Main Entry Points - [比較記事](https://media-payment-impl-lab.pages.dev/category/comparison.md): 導入方式やサービス選定の比較。 - [実装ガイド](https://media-payment-impl-lab.pages.dev/category/tutorial.md): Stripe 実装の入り口から詳細設計まで。 - [運用と障害対応](https://media-payment-impl-lab.pages.dev/category/operations.md): 監視、照合、返金、再処理の実務。 - [用語集一覧](https://media-payment-impl-lab.pages.dev/glossary.md): 用語の短い定義を確認する索引。 ## Editorial Team # オンライン決済実装研究所 編集部 > オンライン決済と Stripe 実装の編集チーム - Canonical: https://media-payment-impl-lab.pages.dev/authors/editorial-team/ - Type: Organization - Organization: パブロフ株式会社 ## Profile Stripe の導入判断、決済状態、Webhook、課金、運用事故対応までを、実務で迷いやすい論点ごとに整理する編集チームです。 ## Specialties - Stripe 実装比較 - PaymentIntent と Webhook の設計 - 課金・運用オペレーション - 障害対応と再処理フロー ## Suggested Reading - [Stripe の主要機能マップ](https://media-payment-impl-lab.pages.dev/posts/stripe-major-features-overview.md): Stripe 全体像の入口。 - [PaymentIntent の状態遷移](https://media-payment-impl-lab.pages.dev/posts/paymentintent-state-machine.md): 決済状態と内部状態をどう切り分けるか。 - [決済システム運用チェックリスト](https://media-payment-impl-lab.pages.dev/posts/payment-system-operations-checklist.md): 公開後の事故を減らす観点整理。 ## Categories # 比較記事 > Checkout と Payment Element のような導入方式比較や、決済代行の選定観点をまとめたカテゴリです。実装自由度、運用負荷、失敗しやすさの差で読み分けられます。 - Canonical: https://media-payment-impl-lab.pages.dev/category/comparison/ - Category Slug: comparison 最初に選択を誤ると後で移行コストが膨らむテーマを、判断基準つきで整理するカテゴリです。まずは導入速度、UI自由度、保守負荷の3軸で読み分けるのが近道です。 ## Recommended - [Stripe Checkout と Payment Element の違いを実装目線で比較する](https://media-payment-impl-lab.pages.dev/posts/stripe-checkout-vs-payment-element.md): 最短で公開したいなら Checkout、ブランド体験や独自フローを強く作りたいなら Payment Element です。判断を4軸に固定すると、案件ごとの迷いがかなり減ります。 - [アプリに決済機能を組み込む方法を Stripe 中心に比較する](https://media-payment-impl-lab.pages.dev/posts/app-payment-provider-comparison-for-beginners.md): 最初に選ぶべきは料金表ではなく、Hosted checkout、埋め込みフォーム、定期課金、複数事業者対応のどれが必要かです。Stripe は守備範囲が広く、国内手段や既存ユーザー基盤が重要なら他候補も十分ありえます。 ## Articles - [アプリに決済機能を組み込む方法を Stripe 中心に比較する](https://media-payment-impl-lab.pages.dev/posts/app-payment-provider-comparison-for-beginners.md): 最初に選ぶべきは料金表ではなく、Hosted checkout、埋め込みフォーム、定期課金、複数事業者対応のどれが必要かです。Stripe は守備範囲が広く、国内手段や既存ユーザー基盤が重要なら他候補も十分ありえます。 - [Stripe Checkout と Payment Element の違いを実装目線で比較する](https://media-payment-impl-lab.pages.dev/posts/stripe-checkout-vs-payment-element.md): 最短で公開したいなら Checkout、ブランド体験や独自フローを強く作りたいなら Payment Element です。判断を4軸に固定すると、案件ごとの迷いがかなり減ります。 ## Related Glossary - [Stripe Checkout](https://media-payment-impl-lab.pages.dev/glossary/stripe-checkout.md) - [Payment Element](https://media-payment-impl-lab.pages.dev/glossary/payment-element.md) # 実装ガイド > Stripe 実装の入り口から PaymentIntent、サブスク、Connect まで、設計と実装をつなぐ記事をまとめたカテゴリです。 - Canonical: https://media-payment-impl-lab.pages.dev/category/tutorial/ - Category Slug: tutorial 概念だけでなく、内部注文との紐づけ方や API の責務分割まで追いたいときの入口です。まず全体像、その次に個別テーマへ進むと理解しやすくなります。 ## Recommended - [Stripeの主要機能を地図として把握する(一覧と詳細記事への導線)](https://media-payment-impl-lab.pages.dev/posts/stripe-major-features-overview.md): Stripeは「決済API」だけでなく、課金・分配・リスク・対面・請求の各レイヤーが揃っています。まず全体像を表に落とし、深掘り記事と用語集へ辿れるようにします。 - [Stripe で決済機能を実装する手順をサンプルコード付きで追う](https://media-payment-impl-lab.pages.dev/posts/stripe-payment-integration-step-by-step.md): 最初の実装は hosted checkout がいちばん事故りにくいです。金額は必ずサーバーで決め、注文確定は Webhook を正とし、フロントはリダイレクトと結果表示に責務を絞ると安定します。 - [PaymentIntent の状態遷移を実装事故ベースで理解する](https://media-payment-impl-lab.pages.dev/posts/paymentintent-state-machine.md): PaymentIntent は単なる決済オブジェクトではなく、決済の途中状態を扱う設計の中心です。状態遷移を理解しておくと、二重計上や webhook の処理漏れをかなり防げます。 ## Articles - [Stripe Billingとサブスクリプションを実装目線で整理する](https://media-payment-impl-lab.pages.dev/posts/stripe-billing-subscriptions-guide.md): 定期課金は「プラン」「請求サイクル」「失効カード」の3つがセットです。Billing を中心に置きつつ、顧客ポータルと請求書をどう位置づけるかを実務の言葉でまとめます。 - [Stripe Checkoutを実務目線で整理する導入ガイド|判断軸・実装フロー・運用の注意点](https://media-payment-impl-lab.pages.dev/posts/stripe-checkout.md): Stripe Checkoutは、決済画面を比較的短期間で導入しやすい選択肢ですが、要件によっては独自実装や他のStripe製品との比較が必要です。本稿では、導入前に確認すべき判断軸、実装の基本フロー、つまずきやすいポイント、運用で見る指標を実務目線で整理します。 - [Stripe Connectでマーケットプレイス決済を設計するときの要点](https://media-payment-impl-lab.pages.dev/posts/stripe-connect-platform-guide.md): Connect は『誰の Stripe アカウントで課金し、誰にいくら渡すか』をデータモデル化する仕組みです。早めにタイプと送金フローを固定しないと、KYC・レポート・返金で詰みやすいです。 - [Stripeの主要機能を地図として把握する(一覧と詳細記事への導線)](https://media-payment-impl-lab.pages.dev/posts/stripe-major-features-overview.md): Stripeは「決済API」だけでなく、課金・分配・リスク・対面・請求の各レイヤーが揃っています。まず全体像を表に落とし、深掘り記事と用語集へ辿れるようにします。 - [StripeのPayment Linksと請求・税まわりを入口から整理する](https://media-payment-impl-lab.pages.dev/posts/stripe-payment-links-and-invoicing.md): 『まず売上を出す』フェーズでは Payment Links が強い一方、B2B の承認フローや複雑な税務は Invoice / Tax とセットで検討が必要です。早すぎる自動化も事故の元です。 - [Stripe Terminalで対面決済を組み込むときの設計メモ](https://media-payment-impl-lab.pages.dev/posts/stripe-terminal-in-store-payments.md): 対面決済は『端末』の話に見えますが、核心は POS・店舗運用・決済状態をどう同期するかです。在庫引当・返品・日次精算との境界を先に決めると実装が安定します。 - [決済 API の冪等性を実装事故ベースで理解する](https://media-payment-impl-lab.pages.dev/posts/payment-api-idempotency-guide.md): 決済 API の事故で多いのは、通信失敗後の再実行を『もう一度 POST するだけ』で済ませることです。冪等性キーを内部注文 ID と束ねると、二重課金と調査コストを大きく減らせます。 - [Stripe で決済機能を実装する手順をサンプルコード付きで追う](https://media-payment-impl-lab.pages.dev/posts/stripe-payment-integration-step-by-step.md): 最初の実装は hosted checkout がいちばん事故りにくいです。金額は必ずサーバーで決め、注文確定は Webhook を正とし、フロントはリダイレクトと結果表示に責務を絞ると安定します。 - [PaymentIntent の状態遷移を実装事故ベースで理解する](https://media-payment-impl-lab.pages.dev/posts/paymentintent-state-machine.md): PaymentIntent は単なる決済オブジェクトではなく、決済の途中状態を扱う設計の中心です。状態遷移を理解しておくと、二重計上や webhook の処理漏れをかなり防げます。 ## Related Glossary - [PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent.md) - [Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook.md) - [Checkout Session](https://media-payment-impl-lab.pages.dev/glossary/checkout-session.md) # 運用と障害対応 > Webhook 再送、チャージバック、監視、返金、再処理など、本番運用で事故を減らすための記事をまとめたカテゴリです。 - Canonical: https://media-payment-impl-lab.pages.dev/category/operations/ - Category Slug: operations 公開後に効いてくる監視、照合、CS、返金、再処理の論点を扱うカテゴリです。開発時に後回しにしがちな運用責務を、実務フローとして読める形に寄せています。 ## Recommended - [決済システム運用で事故を減らすチェックリストを作る](https://media-payment-impl-lab.pages.dev/posts/payment-system-operations-checklist.md): 決済実装の本番事故は、API 呼び出しそのものよりも Webhook 再送、返金、問い合わせ対応、テスト鍵混在で起きます。公開前に『状態』『証跡』『再実行』『照合』の4点を揃えるだけで壊れにくさが大きく変わります。 - [Stripe Webhook で起きやすい失敗を運用視点で10個に整理する](https://media-payment-impl-lab.pages.dev/posts/stripe-webhook-failures.md): Webhook障害の多くは、イベントを一回だけ来る前提で処理していることが原因です。署名、保存、冪等性、再処理導線までを最初から含めると、後の運用が大きく楽になります。 - [Stripe Radarとチャージバック(Dispute)を運用で回すための整理](https://media-payment-impl-lab.pages.dev/posts/stripe-radar-disputes-overview.md): 不正対策は『ブロック率』だけを追うと売上と衝突します。Radar はスコアとルールの基盤、Dispute は証拠とプロセスの勝負です。両方のオペを分けて設計します。 ## Articles - [決済システム運用で事故を減らすチェックリストを作る](https://media-payment-impl-lab.pages.dev/posts/payment-system-operations-checklist.md): 決済実装の本番事故は、API 呼び出しそのものよりも Webhook 再送、返金、問い合わせ対応、テスト鍵混在で起きます。公開前に『状態』『証跡』『再実行』『照合』の4点を揃えるだけで壊れにくさが大きく変わります。 - [Stripe Radarとチャージバック(Dispute)を運用で回すための整理](https://media-payment-impl-lab.pages.dev/posts/stripe-radar-disputes-overview.md): 不正対策は『ブロック率』だけを追うと売上と衝突します。Radar はスコアとルールの基盤、Dispute は証拠とプロセスの勝負です。両方のオペを分けて設計します。 - [Stripe Webhook で起きやすい失敗を運用視点で10個に整理する](https://media-payment-impl-lab.pages.dev/posts/stripe-webhook-failures.md): Webhook障害の多くは、イベントを一回だけ来る前提で処理していることが原因です。署名、保存、冪等性、再処理導線までを最初から含めると、後の運用が大きく楽になります。 ## Related Glossary - [Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook.md) - [返金](https://media-payment-impl-lab.pages.dev/glossary/refund.md) - [Dispute(チャージバック)](https://media-payment-impl-lab.pages.dev/glossary/stripe-dispute.md) ## Articles ### アプリに決済機能を組み込む方法を Stripe 中心に比較する - HTML: https://media-payment-impl-lab.pages.dev/posts/app-payment-provider-comparison-for-beginners/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/app-payment-provider-comparison-for-beginners.md - Published: 2026-04-12 - Updated: 2026-04-12 - Category: 実装比較 - Tags: Stripe, 決済代行, PAY.JP, KOMOJU 最初に選ぶべきは料金表ではなく、Hosted checkout、埋め込みフォーム、定期課金、複数事業者対応のどれが必要かです。Stripe は守備範囲が広く、国内手段や既存ユーザー基盤が重要なら他候補も十分ありえます。 ## 結論 VibeCoding 初学者が最初に迷うべき点は、**どの会社を選ぶかより、どの実装方式で始めるか** です。 最短で公開したいなら hosted checkout、ブランド体験を強く作りたいなら埋め込みフォーム、定期課金なら Billing、複数の売り手がいるなら marketplace 対応まで見て選ぶべきです。 その前提でいうと、**迷ったら最初の1本目は Stripe** がいちばん扱いやすいです。 ただし、PayPal の既存ユーザー基盤、Square の店舗連携、PAY.JP の国内カード中心運用、KOMOJU のローカル決済対応は、それぞれ明確な強みがあります。 ## まず選ぶべきは「会社名」ではなく「実装方式」 | 実装方式 | 何をするか | 初学者との相性 | 代表例 | | --- | --- | --- | --- | | Hosted checkout | 決済画面を外部に任せる | とても良い | Stripe Checkout、PayPal Checkout、Square Quick Pay | | 埋め込みフォーム | 自社画面に決済 UI を置く | 中級向け | Stripe Elements / Payment Element、PayPal Card Fields、payjp.js | | 定期課金 | 月額や年額を継続請求する | 設計が必要 | Stripe Billing、PayPal Subscriptions | | 複数事業者対応 | 出品者や加盟店へ分配する | 難しい | Stripe Connect、KOMOJU Platform API | 初学者が最初から埋め込みフォームを選ぶと、入力 UI、エラー処理、3Dセキュア、Webhook、返金、運用監視まで一気に背負いやすくなります。 「まず課金できる状態を作る」ことが目的なら、**hosted checkout から始めて、必要になったら埋め込みへ移る** 方が安全です。 ## 主要サービスを実装目線で比較する | サービス | 強い領域 | 向いているケース | 最初に注意する点 | | --- | --- | --- | --- | | Stripe | Hosted checkout、Elements、定期課金、マーケットプレイスまで横断しやすい | SaaS、Webアプリ、単発売り切り、サブスク、将来の拡張も見たい | 機能が広い分、PaymentIntent や Webhook などの概念整理が必要 | | PayPal | PayPal ボタン、カード、Venmo、Pay Later などを前面に出しやすい | PayPal 利用者が多い商材、越境寄り、決済ブランドの安心感が重要 | Orders API の create と capture の役割を混ぜないこと | | Square | Web Payments SDK と店舗エコシステムの接続がしやすい | 実店舗とオンラインをまたぐ、小売や飲食で POS 連携も視野に入る | Location、Order、Payment の概念を最初に揃える必要がある | | PAY.JP | payjp.js で PCI DSS 対応のカード入力欄を置ける | 国内カード中心のシンプルな Web アプリ | 3Dセキュア時は名義とメールまたは電話番号の扱いを忘れやすい | | KOMOJU | コンビニ、各種ウォレット、国内向け手段を比較的早い段階で検討しやすい | 日本向けローカル決済を早めに入れたい | 支払手段ごとに確定タイミングと運用フローが変わる | ここで大事なのは、**「何ができるか」より「何を先に壊さず出せるか」** です。 ## こんな選び方なら失敗しにくい ### まずは Stripe を選ぶケース - 単発決済とサブスクの両方がありえる - まずは Web アプリで素早く公開したい - 将来、埋め込み UI や marketplace へ拡張する可能性がある - 英語ドキュメントでも追える ### PayPal を先に比較対象へ入れるケース - PayPal 残高払いを強く使いたい - Venmo や Pay Later を含む購入導線が重要 - カード番号入力よりもボタン起点の購入体験が合う ### Square を先に見るケース - 実店舗と Web を同じ売上基盤で扱いたい - すでに POS や店舗運用がある - 小売や飲食で在庫や対面決済も一緒に考える ### PAY.JP / KOMOJU を先に比較するケース - 日本向け商材で、国内の決済手段や審査運用を重視したい - ローカル決済の比率が高そう - サポートや運用を日本語中心で回したい ## 初学者がやりがちな悪い比較軸 ### 手数料だけで決める 本番で差が出るのは、数パーセントの料率よりも **実装工数、障害調査時間、返金運用、問い合わせ対応** です。 ### いきなり埋め込みフォームを選ぶ 見た目は自由になりますが、3Dセキュア、エラー表示、二重送信、Webhook 再送、成功画面と実際の入金確定のズレまで自前で理解する必要があります。 ### 「定期課金はあとで足せる」と軽く見る 単発決済と定期課金では、扱う状態がかなり違います。 サブスクを将来入れる予定があるなら、最初から Stripe Billing のような拡張先を意識した方が後戻りしにくいです。 ## 最初の実装順はこの順番が安全 1. 自社の注文 ID を先に作る 2. サーバー側で金額を確定する 3. 決済代行側の注文やセッションを作る 4. Webhook で支払い確定を反映する 5. 返金、失敗、問い合わせ時に追跡できるようにする この順番を守ると、どの決済代行を選んでも実装の芯がぶれません。 ## 迷ったときのおすすめ - 最初の公開を急ぐ: [Stripe Checkout と Payment Element の違いを実装目線で比較する](https://media-payment-impl-lab.pages.dev/posts/stripe-checkout-vs-payment-element/) - Stripe で1本目を作る: [Stripe で決済機能を実装する手順をサンプルコード付きで追う](https://media-payment-impl-lab.pages.dev/posts/stripe-payment-integration-step-by-step/) - サブスクを見据える: [Stripe Billingとサブスクリプションを実装目線で整理する](https://media-payment-impl-lab.pages.dev/posts/stripe-billing-subscriptions-guide/) - 運用事故を減らす: [決済システム運用で事故を減らすチェックリストを作る](https://media-payment-impl-lab.pages.dev/posts/payment-system-operations-checklist/) --- ### 決済システム運用で事故を減らすチェックリストを作る - HTML: https://media-payment-impl-lab.pages.dev/posts/payment-system-operations-checklist/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/payment-system-operations-checklist.md - Published: 2026-04-12 - Updated: 2026-04-12 - Category: 障害運用 - Tags: 運用, Webhook, 返金, 監視 決済実装の本番事故は、API 呼び出しそのものよりも Webhook 再送、返金、問い合わせ対応、テスト鍵混在で起きます。公開前に『状態』『証跡』『再実行』『照合』の4点を揃えるだけで壊れにくさが大きく変わります。 ## 結論 決済機能は「実装できたら終わり」ではなく、**本番で壊れたときにどう直すかまで含めて完成** です。 特に VibeCoding では、API をつなぐところまでは早くても、その後の **Webhook 再送、返金、照合、問い合わせ対応** が抜けがちです。 ## 最低限そろえるべき運用の土台 | 項目 | ないと何が起きるか | | --- | --- | | 注文状態の設計 | `paid` と `refunded` の区別が曖昧になり、社内説明が崩れる | | 外部 ID の保存 | ダッシュボード上の決済と自社注文を結びつけられない | | イベント保存 | Webhook 再送や障害再処理ができない | | 再実行導線 | 一度失敗した処理を手作業でしか直せない | | 監視 | 決済停止に気づくのが数時間遅れる | | 返金手順 | CS と経理で認識がズレる | | 照合手順 | 入金と注文の不一致を放置しやすい | 「イベントを保存して後からやり直せる」だけで、運用の強さはかなり変わります。 ## 本番前チェックリスト ### 1. 状態を最初に決める 少なくとも以下は分けて持った方が安全です。 - `pending` - `paid` - `failed` - `canceled` - `refunded` - `partially_refunded` 支払い成功と売上確定、返金完了と顧客通知完了を同じ状態にすると、運用で必ず詰まります。 ### 2. 外部 ID を必ず保存する 最低限、以下を自社 DB に残してください。 - 自社注文 ID - 決済代行側の注文 / セッション / PaymentIntent / Capture ID - 顧客 ID - Webhook event ID - 返金 ID これがあると、障害時に「Stripe 側では成功、内部注文では pending」のような不整合を追えます。 ### 3. Webhook を証跡として保存する Webhook は通知ではなく、**非同期の事実ログ** として扱います。 保存しておく情報の例: - event ID - event type - 受信時刻 - 署名検証の結果 - 処理結果 - エラーメッセージ - 再実行回数 Stripe は Webhook 配信失敗時に再送します。 保存していないと、失敗したイベントを後から安全に再処理できません。 ### 4. 冪等性キーを使う 重複課金や二重 capture を避けるには、各社の冪等性の仕組みを使うべきです。 | サービス | 代表的な仕組み | 覚えておくこと | | --- | --- | --- | | Stripe | `Idempotency-Key` | create / update の再試行で同じ結果を返せる | | PayPal | `PayPal-Request-Id` | Orders API などの POST で重複実行を抑える | | Square | `idempotency_key` | `CreatePayment` などで必須になる場面がある | 初学者ほど、通信タイムアウト時に「もう一度 POST する」だけの実装になりがちです。 このとき冪等性がないと、決済だけ二重で成功する事故が起きます。 ## 見落としやすい運用ポイント ### success ページと入金確定は別物 ユーザーが success ページを見たことと、内部状態を `paid` にしてよいことは同じではありません。 同期レスポンスと Webhook の責務を混ぜないでください。 ### 遅延決済は「後から成功する」 銀行振込、コンビニ、口座振替系は、決済完了まで時間差が出ることがあります。 カードだけの感覚で設計すると、「今はまだ processing」を扱えずに破綻します。 ### 3Dセキュアは追加入力が必要なことがある たとえば PAY.JP の 3Dセキュアでは、名義とメールまたは電話番号のような追加項目が必要です。 決済 UI の見た目だけ先に作ると、認証フロー直前で必要項目が足りなくなります。 ### 返金は「Stripe で返したら終わり」ではない 返金したら、最低でも以下を反映する必要があります。 - 内部注文状態 - 顧客への通知 - 会計 / 経理向けの記録 - ライセンスや利用権限の停止 ## 監視で最低限ほしいもの | 指標 | 目的 | | --- | --- | | 決済成功率 | 失敗増加の早期検知 | | Webhook 失敗率 | 非同期連携の異常検知 | | Webhook 最終受信時刻 | 受信停止の検知 | | 返金件数 | 障害や CS 増加の把握 | | pending 滞留件数 | 確定漏れや処理漏れの発見 | アラートは Slack でもメールでも構いません。 重要なのは、**誰が見て、何分以内に何をするか** が決まっていることです。 ## 障害時の初動 1. 同じ副作用が二重実行されないように処理を止める 2. 外部 ID と内部注文 ID の対応を確認する 3. 保存済みイベントから再処理できるか確認する 4. 返金が必要か、顧客通知が必要かを切り分ける 5. 原因が分かるまで手動オペの条件を明文化する この初動手順がないと、障害そのものより **人の判断のブレ** で被害が広がります。 ## 小規模でも作っておきたい運用画面 - 注文を ID で検索できる - 決済事業者側の ID を見られる - 受信した Webhook 一覧を見られる - 失敗イベントを再処理できる - 返金履歴を確認できる 最初は簡易な管理画面でも十分です。 重要なのは「障害時に SQL を直接叩かなくても状況把握できる」ことです。 ## 併読推奨 - [Stripe Webhook で起きやすい失敗を運用視点で10個に整理する](https://media-payment-impl-lab.pages.dev/posts/stripe-webhook-failures/) - [PaymentIntent の状態遷移を実装事故ベースで理解する](https://media-payment-impl-lab.pages.dev/posts/paymentintent-state-machine/) - [Stripe で決済機能を実装する手順をサンプルコード付きで追う](https://media-payment-impl-lab.pages.dev/posts/stripe-payment-integration-step-by-step/) --- ### Stripe Billingとサブスクリプションを実装目線で整理する - HTML: https://media-payment-impl-lab.pages.dev/posts/stripe-billing-subscriptions-guide/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/stripe-billing-subscriptions-guide.md - Published: 2026-04-12 - Updated: 2026-04-12 - Category: 実装ガイド - Tags: Stripe, Billing, Subscription 定期課金は「プラン」「請求サイクル」「失効カード」の3つがセットです。Billing を中心に置きつつ、顧客ポータルと請求書をどう位置づけるかを実務の言葉でまとめます。 ## 結論 [Stripe Billing](https://media-payment-impl-lab.pages.dev/glossary/stripe-billing/) は **時間軸のある課金(プラン・更新・請求書)** をプロダクト側に持たせるための層です。 単発の [PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/) だけでは表現しづらい「次回請求」「試用終了」「座席数変更」を扱うときに効きます。 ## このテーマで判断すべき軸 - **課金単位**(月額固定 / 従量 / 複合プラン) - **誰がカードを更新するか**(自社サポートか、顧客自身か)→ [Customer Portal](https://media-payment-impl-lab.pages.dev/glossary/customer-portal/) - **請求書の要否**(B2B でインボイス必須か)→ [Invoice](https://media-payment-impl-lab.pages.dev/glossary/stripe-invoice/) - **試用・クーポン・税** の扱い → [Stripe Tax](https://media-payment-impl-lab.pages.dev/glossary/stripe-tax/) との組み合わせ ## 実装の基本フロー 1. [Customer](https://media-payment-impl-lab.pages.dev/glossary/stripe-customer/) を自社アカウントと紐づけて一意に保つ 2. Price / Product でプランを表現し、[Subscription](https://media-payment-impl-lab.pages.dev/glossary/stripe-subscription/) で契約状態を持つ 3. 請求タイミングでは Invoice が生成・更新される前提で、**Webhook で請求結果を取り込む** 4. カード失効時は回収メール・ポータル導線・社内オペをセットで設計する ## オブジェクトの役割分担 | オブジェクト | 役割 | 内部モデルで分ける理由 | | --- | --- | --- | | [Customer](https://media-payment-impl-lab.pages.dev/glossary/stripe-customer/) | 顧客の箱 | ユーザー退会や統合時に参照の起点になる | | [Subscription](https://media-payment-impl-lab.pages.dev/glossary/stripe-subscription/) | 契約の継続状態 | 契約有効か、変更予約があるかを表す | | [Invoice](https://media-payment-impl-lab.pages.dev/glossary/stripe-invoice/) | 請求書と回収状態 | 未払い、回収済み、回収不能を分けて扱える | | [PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/) | 個別請求の決済状態 | 支払い処理そのものの成否を追える | | [Customer Portal](https://media-payment-impl-lab.pages.dev/glossary/customer-portal/) | 顧客セルフサーブ | CS で抱える作業を減らせる | ここを混ぜると、「契約は有効だが今月分の請求は失敗」や「請求書は発行済みだがカードは未更新」のような現実の状態が表せなくなります。 ## 失敗しやすい点 - 「サブスク=PaymentIntent を毎月叩く」で代用し、**リトライ・猶予・請求書再発行** を自前実装で積み上げる - 社内の「契約ID」と Stripe の Subscription ID の同期を後回しにし、解約・プラン変更で不整合が残る - [Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook/) を請求確定の正とせず、ダッシュボードの画面操作だけで状態を信じる - `customer.subscription.updated` だけ追い、`invoice.paid` や `invoice.payment_failed` を見ない ## 先に決めておくと楽になる運用ルール - 契約有効判定は `Subscription` 基準か、請求回収完了基準か - 一時的な回収失敗時に即停止するか、猶予期間を置くか - プラン変更を即時反映するか、次回請求から反映するか - 請求書 PDF やカード更新を顧客セルフサービスに寄せるか ## 運用で見る指標 - 更新成功率(失敗理由の内訳:残高・期限・3DS 等) - 猶予期間中の解約・更新コンバージョン - 請求書の未払い件数と回収までの日数 ## 次に読む記事 - [Stripe の主要機能マップ](https://media-payment-impl-lab.pages.dev/posts/stripe-major-features-overview/) - [PaymentIntent の状態遷移](https://media-payment-impl-lab.pages.dev/posts/paymentintent-state-machine/) - [Webhook の失敗パターン](https://media-payment-impl-lab.pages.dev/posts/stripe-webhook-failures/) 用語の短い定義は [用語集一覧](https://media-payment-impl-lab.pages.dev/glossary/) から辿れます。 --- ### Stripe Checkoutを実務目線で整理する導入ガイド|判断軸・実装フロー・運用の注意点 - HTML: https://media-payment-impl-lab.pages.dev/posts/stripe-checkout/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/stripe-checkout.md - Published: 2026-04-12 - Updated: 2026-04-12 - Category: 実装ガイド - Tags: Stripe, Stripe Checkout, オンライン決済, 実装ガイド, PM Stripe Checkoutは、決済画面を比較的短期間で導入しやすい選択肢ですが、要件によっては独自実装や他のStripe製品との比較が必要です。本稿では、導入前に確認すべき判断軸、実装の基本フロー、つまずきやすいポイント、運用で見る指標を実務目線で整理します。 ## 結論 Stripe Checkoutは、**決済画面を自前で細かく作り込まずに、比較的短いリードタイムでオンライン決済を導入したい場合**に有力な選択肢です。 一方で、実務では「導入できるか」よりも、**自社の要件に対してどこまで無理なく運用できるか**で判断したほうが失敗しにくくなります。特に確認したいのは次の3点です。 - **購入フローを標準的な形に寄せられるか** - **注文管理・会員管理・在庫管理との接続を整理できるか** - **決済成功画面ではなく、サーバー側のイベント連携を前提に業務を組めるか** Checkoutは便利ですが、導入後に課題になりやすいのはUIよりも、以下のような運用接続です。 - 受注確定のタイミング - 重複注文の扱い - 決済失敗時の再試行導線 - CSへの問い合わせ対応 - 経理・会計との照合 そのため、実務目線では「Checkoutを入れる」こと自体を目的にせず、**決済、受注、通知、会計確認まで含めた業務フローを先に描く**のが進めやすいです。 ## このテーマで判断すべき軸 Stripe Checkoutを選ぶかどうかは、機能の有無だけでなく、**業務要件との相性**で判断するのが現実的です。 ### 1. 画面要件をどこまで自社で持ちたいか まず確認したいのは、決済画面の自由度です。 | 判断軸 | Checkoutが合いやすいケース | 別案も比較したいケース | |---|---|---| | UIの自由度 | 標準的な購入画面で問題ない | 入力項目や導線を細かく制御したい | | ブランド体験 | 決済部分は標準化してよい | 決済画面も含めて一貫した独自体験が必要 | | 開発速度 | 早く導入したい | 開発コストを払ってでも柔軟性を優先したい | 実務では、社内から「デザインをもっと寄せたい」という要望が後から出やすいため、**どのレベルまで標準画面を受け入れるか**を先に合意しておくと進めやすくなります。 ### 2. 単発決済か、継続課金か 取り扱う課金モデルによって、設計上の注意点が変わります。 - **単発決済中心**: 比較的シンプルに進めやすい - **継続課金あり**: 解約、請求失敗、プラン変更、トライアル終了時の通知設計まで必要 - **混在する**: 商品ごとの分岐が増え、受注・会員状態の整合が難しくなりやすい Checkout自体の導入可否だけでなく、**その後の契約状態の管理主体をどこに置くか**を決めておく必要があります。 ### 3. 商品・注文データをどこで正として持つか 実装で見落としやすい論点です。 主に次の2パターンがあります。 - **自社DBを正にする** - 商品名、金額、注文番号、顧客属性を自社側で管理しやすい - 既存の基幹・EC・会員基盤とつなぎやすい - **Stripe側のオブジェクト活用を厚めにする** - 実装は整理しやすい場合がある - 既存業務とのマッピング設計が必要 実務上は、**注文番号と社内の顧客IDをどうひも付けるか**が重要です。これが曖昧だと、CS対応や経理確認で手間が増えます。 ### 4. 不正・誤操作・重複をどう扱うか 決済成功だけを見ていると、業務事故が起きやすくなります。 確認しておきたい観点は以下です。 - 同一ユーザーの連打・再送で重複注文しないか - 在庫引当をいつ行うか - 決済未完了の注文をどう扱うか - メール再送や失敗時の復帰導線をどうするか Checkoutを導入すると、決済画面自体の負担は下がりますが、**注文状態の遷移設計は依然として自社責任**です。 ### 5. 社内運用に乗るか 意外と重要なのが、非エンジニア部門との接続です。 - CSは何を見て問い合わせ対応するか - 経理はどの単位で消込・照合するか - マーケはクーポンや計測をどう見たいか - 法務・情報セキュリティのレビューで何を確認するか 導入判断では、機能比較だけでなく、**運用チームが迷わず扱えるか**を判断軸に入れるべきです。 ## 実装の基本フロー 実装はシンプルに見えますが、実務上は「決済開始」より「決済後の整合」を丁寧に設計するのが重要です。 ### 全体フロー 1. 商品・料金・注文条件をサーバー側で確定する 2. Checkoutのセッション生成処理を用意する 3. ユーザーを決済画面へ遷移させる 4. 決済結果に応じてStripe側のイベントを受け取る 5. 自社の注文状態・契約状態・通知処理を更新する 6. 管理画面、CS、経理向けの確認導線を整える ### 事前設計で決めておく項目 #### 商品・金額の決め方 - フロントから受け取った金額をそのまま信用しない - 割引、税、送料がある場合は計算責任を明確にする - 商品マスタ変更時の影響範囲を確認する #### 顧客の識別方法 - 会員IDとStripe上の顧客情報のひも付け - ゲスト購入を許可するか - メールアドレス変更時の扱い #### 注文状態の定義 最低限でも次のような状態を決めておくと運用しやすくなります。 | 状態 | 意味 | 注意点 | |---|---|---| | 作成済み | 購入開始前後の仮注文 | 長期間残るレコードの掃除方針が必要 | | 決済処理中 | ユーザーが支払い中 | 画面離脱時の扱いを定義する | | 支払い確認済み | サーバー側で確認できた状態 | 成功画面だけで確定しない | | 失敗 | 決済不成立 | 再試行導線が必要 | | キャンセル | ユーザー離脱または取消 | 在庫やクーポンの戻しを確認 | ### 実装時の役割分担 #### フロントエンド - 商品選択や購入開始の導線を提供する - 決済完了を楽観的に確定しない - エラーメッセージや再試行導線を整理する #### バックエンド - 注文条件を確定する - セッション作成を行う - Webhookなどのサーバー間連携を処理する - 冪等性、重複防止、状態遷移を担保する #### 管理・運用側 - 注文照会 - 返金やキャンセルのオペレーション - 監査ログや問い合わせ対応履歴の確認 ### 実務での基本方針 導入時は、次の方針を明文化しておくとレビューしやすくなります。 - **金額と商品内容はサーバー側で確定する** - **決済完了判定はサーバー間連携を基準にする** - **注文と決済のID対応を追跡可能にする** - **失敗系の導線を正常系と同じ優先度で設計する** ## 失敗しやすい点 Checkoutの導入でよくあるつまずきは、実装そのものよりも、前提整理不足によるものです。 ### 成功画面の表示だけで受注完了にしてしまう もっとも避けたいパターンのひとつです。 ユーザーの画面遷移結果だけでは、通信断や離脱、再読み込みなどに弱く、**業務上の確定条件としては不十分**になりやすいです。実務では、サーバー側で受け取るイベントや照合結果をもとに、受注確定を行う設計が無難です。 ### フロントから送られた金額をそのまま使う 実装初期に起きやすい問題です。 - 改ざん耐性の観点で不安が残る - クーポンや税計算の整合が崩れやすい - CSや経理が確認しづらい **商品IDやプランIDを受け取り、金額はサーバー側で決定する**設計のほうがレビューしやすくなります。 ### 注文と決済の対応関係が曖昧 よくある症状は以下です。 - 決済は見つかるが、どの注文か分からない - 顧客問い合わせ時に照会できない - 返金対象を取り違える 対策としては、次を最低限そろえたいところです。 - 自社注文番号 - 顧客ID - Stripe関連ID - 処理時刻 - 状態変更履歴 ### Webhookの再送や順序を軽視する サーバー間連携は、正常に一度だけ届く前提で設計すると危険です。実際の運用では、**再送、遅延、重複処理への備え**が必要になります。 そのため、以下を確認しておくと安全です。 - 同一イベントの重複処理を防げるか - イベント受信前後で注文状態が壊れないか - 一部失敗時のリカバリ手段があるか 具体仕様は導入時点の公式情報レビューが必要ですが、少なくとも**冪等性を前提に状態更新する**方針は外しにくいです。 ### 例外系の運用設計がない 導入時は正常系のデモが通ると安心しがちですが、運用では例外のほうが問い合わせになります。 - 支払い途中離脱 - 失敗後の再購入 - クーポン適用漏れの問い合わせ - 二重注文の返金依頼 - メール未着 これらを**誰が、どの画面を見て、どう判断するか**まで決めておかないと、運用負荷が読みづらくなります。 ### 計測要件を後付けにする 導入後に起きやすいのが、マーケやPMからの「どこで離脱しているか見たい」という要望です。 事前に整理したい項目は次の通りです。 - 購入開始数 - 決済画面到達数 - 支払い成功数 - 支払い失敗数 - 再試行率 - クーポン利用率 決済は後からイベント設計を追加しにくい場面があるため、**計測設計を初期段階で入れておく**と手戻りを減らせます。 ## 運用で見る指標 導入後は「決済できたか」だけでなく、売上、失敗、問い合わせ、業務負荷の観点で追うのが実務的です。 ### 最低限見たい指標 | 指標 | 何を見るか | 見る理由 | |---|---|---| | 購入開始数 | 決済導線に入った件数 | 母数把握のため | | 決済成功率 | 成功件数 / 開始件数 | UXと支払い成立の健全性確認 | | 決済失敗率 | 失敗件数 / 開始件数 | 手段別の課題発見に有効 | | 離脱率 | 開始後に完了しない割合 | 導線や入力体験の見直し材料 | | 再試行率 | 失敗後に再挑戦した割合 | リカバリ導線の評価 | | 問い合わせ率 | 注文あたりの問い合わせ件数 | 運用負荷の把握 | | 返金率 | 返金件数 / 成功件数 | 商品要件や誤購入の兆候確認 | ### 定性面で見たいポイント 数値だけでは見えない運用課題もあります。 - 「決済できたか分からない」という問い合わせが多くないか - 失敗時の案内文が分かりにくくないか - 会員登録と購入導線の関係で迷いが出ていないか - 管理画面上でCSが必要情報を即座に確認できるか ### 定例レビューで確認したい論点 月次や隔週で見るなら、以下の観点が有効です。 - 成功率が落ちた期間とリリースの関係 - 特定の支払い方法やデバイスで失敗が偏っていないか - クーポンやキャンペーン施策で想定外の挙動が出ていないか - 返金や手動対応が増えていないか 技術的には安定していても、**運用負荷が上がっているなら改善余地がある**と判断したほうがよいケースがあります。 ## Stripe Checkoutを採用しやすいケースと再検討したいケース 導入判断の整理用に、実務で使いやすい形でまとめます。 ### 採用しやすいケース - まずは短期間で決済を立ち上げたい - 標準的な購入フローで十分 - 決済フォームの保守を軽くしたい - PCIや入力フォーム実装の負担を減らしたい - サブスクまたは単発売上の基本フローを早めに作りたい ### 再検討したいケース - 決済画面を自社UIに強く統合したい - 入力項目や分岐が複雑 - 1つの注文に複雑な業務ルールが多い - 会員状態、権限付与、在庫、配送条件の連携が重い - 決済前後で独自の確認ステップが多い この場合は、Checkoutを基準にしつつ、他の実装方式と比較レビューする進め方が妥当です。 ## 導入前チェックリスト 実務上、最低限このあたりが埋まっていれば、実装レビューが進めやすくなります。 - 商品・料金の正本はどこか - 税、割引、送料の計算責任はどこか - ゲスト購入の可否 - 注文番号と決済IDの対応方法 - 決済完了の確定条件 - 在庫引当のタイミング - メール送信の起点 - 失敗時の再試行導線 - 返金・キャンセルの運用手順 - CSが参照する管理画面項目 - 経理照合に必要なデータ項目 - KPIと計測イベントの定義 ## 次に読む記事 - Stripe CheckoutとPayment Elementの違いを実装要件で比較する - Webhook前提で設計する決済完了判定と冪等性の基本 - サブスク導入時に整理したい請求失敗・解約・権限連携の設計 ## まとめ Stripe Checkoutは、決済導入の初速を出しやすい一方で、実務では**注文管理・状態遷移・問い合わせ対応まで含めた設計**が重要です。 特に押さえたいのは次の点です。 - Checkoutの適性は、UIではなく業務要件との相性で判断する - 成功画面ではなく、サーバー側連携を基準に受注確定する - 金額、注文、顧客の対応関係を追跡可能にする - 例外系と運用導線を先に設計する - 導入後は成功率だけでなく、問い合わせ率や返金率も見る 導入可否の議論を短くするには、Stripe Checkout単体の機能説明ではなく、**自社の販売フローにどう組み込むか**を最初に整理するのが現実的です。レビュー段階では、最新のStripe公式仕様と自社要件を照合しながら、実装方式を確定していく進め方が安全です。 --- ### Stripe Connectでマーケットプレイス決済を設計するときの要点 - HTML: https://media-payment-impl-lab.pages.dev/posts/stripe-connect-platform-guide/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/stripe-connect-platform-guide.md - Published: 2026-04-12 - Updated: 2026-04-12 - Category: 実装ガイド - Tags: Stripe, Connect, プラットフォーム Connect は『誰の Stripe アカウントで課金し、誰にいくら渡すか』をデータモデル化する仕組みです。早めにタイプと送金フローを固定しないと、KYC・レポート・返金で詰みやすいです。 ## 結論 [Stripe Connect](https://media-payment-impl-lab.pages.dev/glossary/stripe-connect/) は **複数の売り手が関与する決済** を、Stripe 上の「接続アカウント」として表現するためのプロダクトです。 単一事業者の [Checkout](https://media-payment-impl-lab.pages.dev/glossary/stripe-checkout/) / [Payment Element](https://media-payment-impl-lab.pages.dev/glossary/payment-element/) だけでは足りない **分配・レポート・本人確認** を扱うレイヤーと捉えると説明がしやすくなります。 ## このテーマで判断すべき軸 - **マネーフロー**(顧客→プラットフォーム→出品者、直収かスプリットか) - **誰が返金・争議の一次窓口か**(CS と規約の書き分け) - **本人確認(KYC)を誰が案内するか** - **レポート粒度**(出品者別売上、手数料、税) ## 最初に決めるべきアカウントモデル Stripe Connect の mental model として、いまも `Standard` `Express` `Custom` は重要です。 | タイプ | 向いているケース | 注意点 | | --- | --- | --- | | Standard | Stripe ダッシュボードを売り手に持たせたい | 既存 Stripe 利用者との接続に向くが制御は限定的 | | Express | オンボーディングは簡素化したいが、ある程度プラットフォームで主導したい | 実務では一番バランスが良いことが多い | | Custom | UI も要件収集もすべて自前で握りたい | 実装責務と運用責務が最も重い | Stripe 公式でも、**アカウント作成後に type は変更できません**。 また最近は controller properties の考え方が強くなっていますが、初期設計では依然として「誰がダッシュボードを持ち、誰が要件収集責務を持つか」で整理するのが分かりやすいです。 ## 実装の基本フロー 1. プラットフォームの Stripe アカウントと、接続アカウントの関係をデータモデルに持つ 2. 決済作成時に **どの接続アカウントに紐づくか** を必ず決める(曖昧なまま進めない) 3. [Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook/) で送金・更新・本人確認状態を取り込み、社内の「出品者ステータス」と同期する 4. 返金・Dispute 時のルールを、利用規約と実装の両方で先に固定する ## Webhook で特に注意する点 Connect では Webhook が 1 系統ではありません。 - 自分のプラットフォームアカウント用 Webhook - 接続アカウントのイベントを受ける Connect Webhook 接続アカウント由来のイベントにはトップレベルの `account` が付きます。 これを保存しないと、どの出品者の問題か後で追えません。 ## 失敗しやすい点 - 「とりあえず Standard」で始め、後から送金サイクルや手数料モデルが合わず作り直す - 接続アカウント ID と自社のユーザーIDの同期を疎かにし、手動補正が常態化する - [PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/) 単体の設計だけ見て、Connect 特有のイベントや制約を読み落とす - Connected account の `account.updated` を見ず、要件不足や payout 停止に気づけない ## 運用で見る指標 - オンボーディング完了率と滞留理由 - 送金失敗・返金・チャージバックの接続アカウント別分布 - サポート問い合わせのタイプ(本人確認・振込・レシート等) ## 次に読む記事 - [Stripe の主要機能マップ](https://media-payment-impl-lab.pages.dev/posts/stripe-major-features-overview/) - [Radar と Dispute の運用で押さえること](https://media-payment-impl-lab.pages.dev/posts/stripe-radar-disputes-overview/) - [Webhook の失敗パターン](https://media-payment-impl-lab.pages.dev/posts/stripe-webhook-failures/) 関連用語: [Connect](https://media-payment-impl-lab.pages.dev/glossary/stripe-connect/)、[Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook/)、[Customer](https://media-payment-impl-lab.pages.dev/glossary/stripe-customer/)。一覧は [用語集](https://media-payment-impl-lab.pages.dev/glossary/) です。 --- ### Stripeの主要機能を地図として把握する(一覧と詳細記事への導線) - HTML: https://media-payment-impl-lab.pages.dev/posts/stripe-major-features-overview/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/stripe-major-features-overview.md - Published: 2026-04-12 - Updated: 2026-04-12 - Category: 実装ガイド - Tags: Stripe, プロダクト一覧, 設計 Stripeは「決済API」だけでなく、課金・分配・リスク・対面・請求の各レイヤーが揃っています。まず全体像を表に落とし、深掘り記事と用語集へ辿れるようにします。 ## 結論 Stripe を「カード決済API」だけで捉えると、後工程で **課金・分配・リスク・オフライン** の要件が出たときに手戻りが起きやすいです。 まずは **プロダクト群をレイヤーで分けて地図化** し、詳細は領域ごとの記事へ渡すのが安全です。 ## 主要機能マップ(一覧資料) | レイヤー | 代表プロダクト・概念 | ざっくり役割 | 詳細記事 | | --- | --- | --- | --- | | 決済UI | [Stripe Checkout](https://media-payment-impl-lab.pages.dev/glossary/stripe-checkout/)、[Payment Element](https://media-payment-impl-lab.pages.dev/glossary/payment-element/) | hosted UI と埋め込みUIの二系統 | [Checkout と Payment Element の比較](https://media-payment-impl-lab.pages.dev/posts/stripe-checkout-vs-payment-element/) | | 決済コア | [PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/)、[Customer](https://media-payment-impl-lab.pages.dev/glossary/stripe-customer/)、[PaymentMethod](https://media-payment-impl-lab.pages.dev/glossary/payment-method/)、[SetupIntent](https://media-payment-impl-lab.pages.dev/glossary/setup-intent/) | 支払い状態・顧客・支払手段の管理 | [PaymentIntent の状態遷移](https://media-payment-impl-lab.pages.dev/posts/paymentintent-state-machine/) | | イベント連携 | [Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook/) | 非同期の決済確定・更新の受け口 | [Webhook の失敗パターン](https://media-payment-impl-lab.pages.dev/posts/stripe-webhook-failures/) | | 定期課金・請求 | [Billing](https://media-payment-impl-lab.pages.dev/glossary/stripe-billing/)、[Subscription](https://media-payment-impl-lab.pages.dev/glossary/stripe-subscription/)、[Invoice](https://media-payment-impl-lab.pages.dev/glossary/stripe-invoice/)、[Customer Portal](https://media-payment-impl-lab.pages.dev/glossary/customer-portal/) | プラン課金と請求書ライフサイクル | [Billing とサブスクリプション](https://media-payment-impl-lab.pages.dev/posts/stripe-billing-subscriptions-guide/) | | プラットフォーム | [Connect](https://media-payment-impl-lab.pages.dev/glossary/stripe-connect/) | 出品者・加盟店への送金とオンボーディング | [Connect とプラットフォーム決済](https://media-payment-impl-lab.pages.dev/posts/stripe-connect-platform-guide/) | | リスク | [Radar](https://media-payment-impl-lab.pages.dev/glossary/stripe-radar/)、[Dispute](https://media-payment-impl-lab.pages.dev/glossary/stripe-dispute/) | 不正スコアとチャージバック対応 | [Radar と Dispute の要点](https://media-payment-impl-lab.pages.dev/posts/stripe-radar-disputes-overview/) | | 対面 | [Terminal](https://media-payment-impl-lab.pages.dev/glossary/stripe-terminal/) | 実店舗のカードターミナル連携 | [Terminal と対面決済](https://media-payment-impl-lab.pages.dev/posts/stripe-terminal-in-store-payments/) | | 低コード・請求周辺 | [Payment Links](https://media-payment-impl-lab.pages.dev/glossary/payment-link/)、請求書、[Tax](https://media-payment-impl-lab.pages.dev/glossary/stripe-tax/) | リンク決済・税計算・インボイスの入口 | [Payment Links と請求まわり](https://media-payment-impl-lab.pages.dev/posts/stripe-payment-links-and-invoicing/) | ## このテーマで判断すべき軸 - **誰が売り手か**(自社のみか、マルチベンダーか)→ Connect の要否 - **課金モデル**(単発・従量・座席・複合)→ Billing / Invoice の深さ - **チャネル**(Webのみか店舗もか)→ Terminal の要否 - **リスク許容**(手動レビュー・ルール運用)→ Radar / Dispute オペ設計 ## 実装の基本フロー 1. 決済手段の入口(Checkout か Payment Element)を決める 2. [PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/) と内部注文IDを常にペアで扱う 3. 確定通知は [Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook/) を正とし、画面戻りは補助にする 4. 定期課金が絡むなら Subscription と Invoice の状態を注文と分離して追う ## 失敗しやすい点 - 一覧のどれか1つだけ導入して「あとから Connect が必要」と設計が崩れる - UIとAPIの責務を混同し、hosted と埋め込みを途中で乗り換える - 用語が多いまま議論が進み、仕様書と実装の語彙がズレる → [用語集一覧](https://media-payment-impl-lab.pages.dev/glossary/) で揃える ## 運用で見る指標 - Webhook 処理の成功率・再送率・遅延 - Dispute 率と証拠提出のリードタイム - サブスクの更新失敗(カード期限・残高)と回収フロー ## 次に読む記事 - [Billing とサブスクリプション実務の整理](https://media-payment-impl-lab.pages.dev/posts/stripe-billing-subscriptions-guide/) - [Connect とプラットフォーム決済の設計観点](https://media-payment-impl-lab.pages.dev/posts/stripe-connect-platform-guide/) - [Radar と Dispute の運用で押さえること](https://media-payment-impl-lab.pages.dev/posts/stripe-radar-disputes-overview/) --- ### StripeのPayment Linksと請求・税まわりを入口から整理する - HTML: https://media-payment-impl-lab.pages.dev/posts/stripe-payment-links-and-invoicing/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/stripe-payment-links-and-invoicing.md - Published: 2026-04-12 - Updated: 2026-04-12 - Category: 実装ガイド - Tags: Stripe, Payment Links, 請求 『まず売上を出す』フェーズでは Payment Links が強い一方、B2B の承認フローや複雑な税務は Invoice / Tax とセットで検討が必要です。早すぎる自動化も事故の元です。 ## 結論 [Payment Links](https://media-payment-impl-lab.pages.dev/glossary/payment-link/) は **URL を共有して決済まで完結させる低コードの入口** です。 一方、B2B での稟議・支払条件・再請求が絡むと、[Invoice](https://media-payment-impl-lab.pages.dev/glossary/stripe-invoice/) や [Billing](https://media-payment-impl-lab.pages.dev/glossary/stripe-billing/) の方が自然なことが多く、**「誰がいつ何に同意したか」** の証跡設計が重要になります。 ## Payment Links / Checkout / Invoicing の境界 | 手段 | 向いているケース | 先に知っておくこと | | --- | --- | --- | | Payment Links | 商品数が少なく、まず売りたい | サーバーなしで始めやすいが、動的カートや複雑な顧客紐付けは弱い | | Checkout | 価格や顧客情報をサーバーで組み立てたい | Checkout Sessions API を使うと税・割引・配送も扱いやすい | | Invoicing | B2B 請求、支払条件、PDF、督促が重要 | 決済画面というより請求業務の設計が中心になる | ## このテーマで判断すべき軸 - **販売チャネル**(個人向け一括販売か、法人の請求書払いか) - **税** の責任分界(自動計算か、税理士確認か)→ [Stripe Tax](https://media-payment-impl-lab.pages.dev/glossary/stripe-tax/) - **カスタマイズ**(ブランド、文言、追加フォーム)の要否 - **Webhook での取り込み**(決済完了を自社の契約・ライセンスと同期するか) ## 実装の基本フロー 1. まずは Link 生成→共有→支払いという最短導線を決める 2. 成功通知は [Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook/) を正にし、内部の「契約ステータス」を更新する 3. 請求書が絡むなら、承認メール・PDF・入金確認のどこをソースオブトゥルースにするか決める 4. 税コード・顧客所在地の入力品質を上げないと、自動税もブレる ## 失敗しやすい点 - Link を社内にばらまき、**どのキャンペーン由来か** がトラッキングできなくなる - 請求書の「未払い」とサービス提供の開始条件が曖昧で、CS と実装が食い違う - [Customer](https://media-payment-impl-lab.pages.dev/glossary/stripe-customer/) を作らずに運用し、後からサブスクやポータルに移行しづらくなる - Payment Links で動的カートや細かな顧客制御までやろうとして、結局 Checkout Sessions API を作り直す ## 運用で見る指標 - Link 別のコンバージョンと離脱理由(アンケートやログ) - 請求書の平均回収日数と督促回数 - 税設定変更時の差分(返金・再計算の発生) ## 次に読む記事 - [Billing とサブスクリプション実務の整理](https://media-payment-impl-lab.pages.dev/posts/stripe-billing-subscriptions-guide/) - [Stripe の主要機能マップ](https://media-payment-impl-lab.pages.dev/posts/stripe-major-features-overview/) - [Checkout と Payment Element の比較](https://media-payment-impl-lab.pages.dev/posts/stripe-checkout-vs-payment-element/) 用語: [Payment Links](https://media-payment-impl-lab.pages.dev/glossary/payment-link/)、[Invoice](https://media-payment-impl-lab.pages.dev/glossary/stripe-invoice/)、[Stripe Tax](https://media-payment-impl-lab.pages.dev/glossary/stripe-tax/)。全体索引は [用語集一覧](https://media-payment-impl-lab.pages.dev/glossary/) です。 --- ### Stripe Terminalで対面決済を組み込むときの設計メモ - HTML: https://media-payment-impl-lab.pages.dev/posts/stripe-terminal-in-store-payments/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/stripe-terminal-in-store-payments.md - Published: 2026-04-12 - Updated: 2026-04-12 - Category: 実装ガイド - Tags: Stripe, Terminal, 対面 対面決済は『端末』の話に見えますが、核心は POS・店舗運用・決済状態をどう同期するかです。在庫引当・返品・日次精算との境界を先に決めると実装が安定します。 ## 結論 [Stripe Terminal](https://media-payment-impl-lab.pages.dev/glossary/stripe-terminal/) は **実店舗でカードを読み取り、[PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/) を完了させる** ためのプロダクト群です。 「端末SDKの話」だけで閉じると、**在庫・会計・レシート** と決済の境界が曖昧になり、返品や日次締めで不整合が出やすいです。 Stripe 公式でも、Terminal は **対面決済とオンライン決済を統一的に扱う** 文脈で説明されています。 そのため、端末単体ではなく「注文 ID と店舗 ID と決済 ID をどう揃えるか」が本質です。 ## このテーマで判断すべき軸 - **店舗ごとの Stripe 設定**(ロケーション、端末の紐づけ) - **オフライン時の扱い**(通信断、再送) - **レシートと返品** の責務(POS か決済か) - **オンライン決済との ID 設計** を共通化するか分けるか ## アーキテクチャで押さえること | 層 | 役割 | | --- | --- | | Reader | カード読み取りと顧客操作 | | Terminal SDK | 端末との接続と支払い開始 | | 自社 backend | 注文、在庫、会計、店舗 ID の正 | | POS / 店舗アプリ | 商品選択、返品、レシート、店員操作 | この 4 つが別責務だと最初から分けておくと、障害切り分けが楽になります。 ## 実装の基本フロー 1. 店舗・レジ・端末を識別子でマスタ管理し、取引ログに必ず載せる 2. 注文確定と決済確定の順序ルール(先払いか後払いか)を固定する 3. [Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook/) で成功・失敗・取消を取り込み、POS 側の状態と突合する 4. 日次の売上照合(Stripe のレポートと POS の締め)を手順化する ## 失敗しやすい点 - 画面表示だけで成功とみなし、POS と Stripe の状態を突合しない - 端末のシリアルと店舗の対応が手運用になり、問い合わせ時に追えない - オンライン用の [Customer](https://media-payment-impl-lab.pages.dev/glossary/stripe-customer/) 設計をそのまま店舗に持ち込み、不要な複雑さが増える ## 運用で見る指標 - 端末別の決済成功率と通信エラー率 - 取消・返品の件数と処理時間 - 日次差異(POS と Stripe)の有無 ## 次に読む記事 - [Stripe の主要機能マップ](https://media-payment-impl-lab.pages.dev/posts/stripe-major-features-overview/) - [Checkout と Payment Element の比較](https://media-payment-impl-lab.pages.dev/posts/stripe-checkout-vs-payment-element/) - [PaymentIntent の状態遷移](https://media-payment-impl-lab.pages.dev/posts/paymentintent-state-machine/) 用語: [Terminal](https://media-payment-impl-lab.pages.dev/glossary/stripe-terminal/)、[PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/)。一覧は [用語集](https://media-payment-impl-lab.pages.dev/glossary/) です。 --- ### Stripe Radarとチャージバック(Dispute)を運用で回すための整理 - HTML: https://media-payment-impl-lab.pages.dev/posts/stripe-radar-disputes-overview/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/stripe-radar-disputes-overview.md - Published: 2026-04-12 - Updated: 2026-04-12 - Category: 障害運用 - Tags: Stripe, Radar, Dispute 不正対策は『ブロック率』だけを追うと売上と衝突します。Radar はスコアとルールの基盤、Dispute は証拠とプロセスの勝負です。両方のオペを分けて設計します。 ## 結論 [Stripe Radar](https://media-payment-impl-lab.pages.dev/glossary/stripe-radar/) は **決済前のリスク評価とルール実行** のための仕組み、[Dispute](https://media-payment-impl-lab.pages.dev/glossary/stripe-dispute/)(チャージバック)は **決済後の争い** のためのプロセスです。 混同すると「Radar で止めれば Dispute は起きないはず」という期待が生まれ、運用が破綻しやすいです。 ## Stripe 公式で押さえるべき事実 - dispute が始まると、Stripe は disputed amount と dispute fee を残高から差し引く - dispute が open の間は、通常の refund とは別の dispute 対応フローとして扱う - 反証期限は長くありません - 3Dセキュアは一部の不正 dispute で liability shift に寄与するが、すべての dispute を防ぐわけではない ## このテーマで判断すべき軸 - **許容する偽陽性**(止めすぎによる機会損失)と **許容する偽陰性**(通しすぎによるチャージバック)のバランス - **3DS や追加認証** をどの金額・どの国で強制するか - **証拠のテンプレ**(配送証跡、ログ、利用規約同意)を誰が揃えるか ## 実装の基本フロー 1. 決済メタデータに、後から Dispute で説明できる情報(配送先、注文ID、顧客メール等)を載せる習慣をつける 2. Radar ルール変更は **変更理由と期待効果** を残し、A/B 的に振る舞いを観測する 3. [Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook/) で Dispute イベントを受け、期限と担当をチケット化する 4. CS・物流・開発で **証拠提出のチェックリスト** を共通化する ## 失敗しやすい点 - ルールを厳しくしすぎて正規ユーザーが通らず、サポート負荷だけが増える - Dispute 通知をメールのみで追い、**期限切れ** で自動敗訴扱いに近い状態になる - [PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/) と注文の紐づけが弱く、証拠を集めるのに数日かかる - 3Dセキュアや配送証跡を持っているのに、提出テンプレがなく evidence 化できない ## 運用で見る指標 - Radar ルール別のブロック率・誤検知っぽい問い合わせ件数 - Dispute 率(カードブランド・国・商品カテゴリ別) - 証拠提出までのリードタイムと勝率(社内定義) ## 次に読む記事 - [Stripe の主要機能マップ](https://media-payment-impl-lab.pages.dev/posts/stripe-major-features-overview/) - [Webhook の失敗パターン](https://media-payment-impl-lab.pages.dev/posts/stripe-webhook-failures/) - [PaymentIntent の状態遷移](https://media-payment-impl-lab.pages.dev/posts/paymentintent-state-machine/) 用語: [Radar](https://media-payment-impl-lab.pages.dev/glossary/stripe-radar/)、[Dispute](https://media-payment-impl-lab.pages.dev/glossary/stripe-dispute/)、[Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook/) — [用語集一覧](https://media-payment-impl-lab.pages.dev/glossary/) から辿れます。 --- ### 決済 API の冪等性を実装事故ベースで理解する - HTML: https://media-payment-impl-lab.pages.dev/posts/payment-api-idempotency-guide/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/payment-api-idempotency-guide.md - Published: 2026-04-12 - Updated: 2026-04-12 - Category: 実装ガイド - Tags: Stripe, 冪等性, 決済API 決済 API の事故で多いのは、通信失敗後の再実行を『もう一度 POST するだけ』で済ませることです。冪等性キーを内部注文 ID と束ねると、二重課金と調査コストを大きく減らせます。 ## 結論 冪等性は「高級な最適化」ではなく、**決済 API を本番で壊さないための最低限の安全装置** です。 Stripe の公式 API でも、create / update 系の安全な再試行のために `Idempotency-Key` が前提になっています。 PayPal や Square でも同様の仕組みがあり、主要な決済 API では共通の基本知識です。 ## 何を防ぐのか 典型的な事故は次の 3 つです。 1. 決済 API への POST がタイムアウトした 2. ユーザーが購入ボタンを連打した 3. ワーカーやジョブが失敗して同じ処理を再実行した 冪等性がないと、このとき「サーバー側では成功していたが、アプリは失敗だと思って再送する」という最悪の二重課金パターンが起きます。 ## Stripe での基本ルール Stripe の idempotent requests では、同じ意味の create / update リクエストを **同じキーで再送** します。 押さえるべき点は以下です。 - `Idempotency-Key` はクライアントではなく **サーバー側で決める** - 同じ論理操作には同じキーを使う - 別の操作には別のキーを使う - 一度使ったキーを、別パラメータの別操作へ流用しない Stripe は最初のレスポンス結果を保存し、同じキーの再送には同じ結果を返します。 成功だけでなく、失敗や `500` も含めて同じ結果が返る点が重要です。 ## 内部注文 ID とどう結びつけるか おすすめは、**内部注文 ID を先に作ってから、その注文に対する API リクエストの冪等性キーを派生させる** ことです。 ```txt order_20260412_001 -> checkout-session:order_20260412_001 -> refund:order_20260412_001:1 ``` こうしておくと、調査時に「このキーはどの注文のどの操作か」がすぐ分かります。 ## どこで使うべきか ### create 系 API - Checkout Session 作成 - PaymentIntent 作成 - Refund 作成 - Subscription 作成 ### update 系 API - capture - amount update - metadata update 一方で、GET や自然に idempotent な処理は別問題です。 ## 実装パターン ### 悪い例 ```ts await stripe.checkout.sessions.create(payload); ``` 通信エラー時にこのまま再送すると、同じ意図の Session が複数できる余地があります。 ### 良い例 ```ts const order = await db.orders.insert({ ... }); const session = await stripe.checkout.sessions.create(payload, { idempotencyKey: `checkout-session:${order.id}` }); ``` これで「この注文の checkout session 作成」という論理操作が一意になります。 ## 冪等性があっても防げないこと ### 業務ロジックの重複 同じ Session を一回しか作らなくても、Webhook を二回処理すれば二重反映は起きます。 Webhook 側は `event.id` で別に重複防止が必要です。 ### 意味の違う再実行 同じキーでパラメータだけ変えて再送するのは危険です。 「同じ論理操作」かどうかをサーバー側で決める必要があります。 ### UI 連打の完全防止 フロント側でもボタン disable や pending 表示は必要です。 冪等性は最後の砦であって、UI 改善の代わりではありません。 ## 主要サービスの違い | サービス | 代表的な仕組み | メモ | | --- | --- | --- | | Stripe | `Idempotency-Key` | create / update の再試行を安全にする | | PayPal | `PayPal-Request-Id` | 同じ POST の再送で最新状態を返す | | Square | `idempotency_key` | `CreatePayment` などで必須の場面がある | ## つまづきポイント ### キーをクライアントが自由に決める ユーザー操作単位で安定しないキーになると、同じ注文でも違うキーで飛びやすくなります。 ### 返金と購入で同じキー設計を使い回す 購入と返金は別操作です。 `refund:{orderId}:{attempt}` のように意味単位で分けた方が安全です。 ### 冪等性を入れたから内部注文の unique 制約は不要だと思う それは別レイヤーです。 DB の unique 制約、注文 ID、Webhook の重複防止は残ります。 ## 併読推奨 - [冪等性キーとは](https://media-payment-impl-lab.pages.dev/glossary/idempotency-key/) - [Stripe Webhook で起きやすい失敗を運用視点で10個に整理する](https://media-payment-impl-lab.pages.dev/posts/stripe-webhook-failures/) - [Stripe で決済機能を実装する手順をサンプルコード付きで追う](https://media-payment-impl-lab.pages.dev/posts/stripe-payment-integration-step-by-step/) - [決済システム運用で事故を減らすチェックリストを作る](https://media-payment-impl-lab.pages.dev/posts/payment-system-operations-checklist/) --- ### Stripe で決済機能を実装する手順をサンプルコード付きで追う - HTML: https://media-payment-impl-lab.pages.dev/posts/stripe-payment-integration-step-by-step/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/stripe-payment-integration-step-by-step.md - Published: 2026-04-12 - Updated: 2026-04-12 - Category: 実装ガイド - Tags: Stripe, Checkout, Webhook, サンプルコード 最初の実装は hosted checkout がいちばん事故りにくいです。金額は必ずサーバーで決め、注文確定は Webhook を正とし、フロントはリダイレクトと結果表示に責務を絞ると安定します。 ## 結論 Stripe を初めて組み込むなら、**Checkout Sessions + Webhook** の組み合わせがいちばん事故りにくいです。 フロントは「決済ページへ飛ばす」、サーバーは「金額を決めてセッションを発行する」、Webhook は「最終的な注文確定を反映する」と責務を分けてください。 ## 全体フロー ```txt 1. ユーザーが購入ボタンを押す 2. 自社サーバーが注文IDを作る 3. サーバーが Stripe Checkout Session を作る 4. ブラウザを Stripe Checkout へリダイレクトする 5. 決済完了後、ユーザーは success_url に戻る 6. Stripe から webhook が届く 7. webhook を正として注文を paid に更新する ``` この構成なら、ユーザーが success ページを閉じても、Webhook さえ受けられれば内部状態を正しく保てます。 ## Step 1: サーバー側に商品マスターと注文モデルを置く 最初にやるべきことは、**金額をクライアントに決めさせない** ことです。 ```ts type Plan = { name: string; amount: number; currency: 'jpy'; }; const PLANS: Record = { starter: { name: 'Starter', amount: 1200, currency: 'jpy' }, pro: { name: 'Pro', amount: 3500, currency: 'jpy' } }; ``` さらに、自社 DB 側では最低限これだけ持っておくと後で楽です。 | カラム | 用途 | | --- | --- | | `id` | 自社の注文 ID | | `status` | `pending` `paid` `failed` `refunded` など | | `amount` | 自社で確定した請求額 | | `currency` | 通貨 | | `stripeSessionId` | Checkout Session との対応付け | | `stripePaymentIntentId` | 後で追跡するための参照 | | `paidAt` | 反映時刻 | ## Step 2: Checkout Session を作る API を用意する 以下は Node.js + Express を想定した最小構成です。 フレームワークは違っても、考え方は同じです。 ```ts import express from 'express'; import Stripe from 'stripe'; const app = express(); const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!); app.post('/api/checkout/session', express.json(), async (req, res) => { const { planId, userId } = req.body; const plan = PLANS[planId]; if (!plan) { return res.status(400).json({ error: 'invalid_plan' }); } const order = await db.orders.insert({ userId, planId, amount: plan.amount, currency: plan.currency, status: 'pending' }); const session = await stripe.checkout.sessions.create( { mode: 'payment', line_items: [ { price_data: { currency: plan.currency, unit_amount: plan.amount, product_data: { name: plan.name } }, quantity: 1 } ], success_url: `${process.env.APP_URL}/checkout/success?session_id={CHECKOUT_SESSION_ID}`, cancel_url: `${process.env.APP_URL}/checkout/cancel`, client_reference_id: order.id, metadata: { orderId: order.id } }, { idempotencyKey: `checkout-session:${order.id}` } ); await db.orders.update(order.id, { stripeSessionId: session.id }); return res.json({ url: session.url }); }); ``` ポイントは3つです。 - `amount` は必ずサーバーのマスターから決める - `order.id` を `metadata` と `client_reference_id` に入れる - `idempotencyKey` を付けて二重作成を防ぐ ## Step 3: フロントは API を叩いてリダイレクトするだけにする ```ts const buy = async (planId: string) => { const response = await fetch('/api/checkout/session', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ planId, userId: currentUser.id }) }); const data = await response.json(); if (!response.ok || !data.url) { throw new Error('checkout_session_create_failed'); } window.location.assign(data.url); }; ``` フロントでやるべきことはここまでです。 金額計算、割引適用、注文確定まで全部フロントでやる設計は壊れやすくなります。 ## Step 4: success ページは「結果表示」に徹する success ページでは、`session_id` を受け取って注文内容を表示して構いません。 ただし、**success ページが表示されたことをもって受注確定にしない** でください。 理由は単純で、ユーザーが戻り先に来ないケースがあるからです。 Stripe 公式も、支払いの履行は Webhook を使う前提で説明しています。 ## Step 5: Webhook で注文確定を反映する Webhook は raw body のまま署名検証する必要があります。 JSON にパースした後では署名検証に失敗します。 Express では、**Webhook ルートだけ `express.raw()` を使い、共通の JSON parser を先に当てない** のが基本です。 ```ts const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET!; app.post( '/api/stripe/webhook', express.raw({ type: 'application/json' }), async (req, res) => { const signature = req.headers['stripe-signature']; let event: Stripe.Event; try { event = stripe.webhooks.constructEvent( req.body, signature as string, endpointSecret ); } catch (error) { return res.status(400).send('invalid_signature'); } if ( event.type === 'checkout.session.completed' || event.type === 'checkout.session.async_payment_succeeded' ) { const checkoutSession = event.data.object as Stripe.Checkout.Session; const orderId = checkoutSession.metadata?.orderId; if (!orderId) { return res.status(400).send('missing_order_id'); } await db.transaction(async () => { const order = await db.orders.findById(orderId); if (!order || order.status === 'paid') return; await db.orders.update(orderId, { status: 'paid', stripePaymentIntentId: String(checkoutSession.payment_intent ?? ''), paidAt: new Date() }); }); } if (event.type === 'checkout.session.async_payment_failed') { const checkoutSession = event.data.object as Stripe.Checkout.Session; const orderId = checkoutSession.metadata?.orderId; if (orderId) { await db.orders.update(orderId, { status: 'failed' }); } } return res.json({ received: true }); } ); ``` ここで重要なのは、**同じイベントが再送されても壊れないこと** です。 Webhook は一回だけ届く前提で組んではいけません。 ## Step 6: ローカルでテストする Stripe CLI を使うとローカルでかなり確認しやすくなります。 ```bash stripe listen --forward-to localhost:3000/api/stripe/webhook stripe trigger checkout.session.completed ``` CLI の `listen` で出た `whsec_...` を `STRIPE_WEBHOOK_SECRET` に使ってください。 Dashboard のエンドポイント用 secret と混ぜると、署名検証が通らなくなります。 ## つまづきポイント ### 1. クライアントから送られた金額をそのまま使う これは最初にやりがちな事故です。価格改ざんにも、プラン不整合にも弱くなります。 ### 2. success ページで受注確定してしまう 戻り先ページは補助導線です。確定の責務は Webhook に寄せてください。 ### 3. `express.json()` を webhook より先に適用する Stripe は raw body を要求します。 Express では middleware の順番がずれるだけで署名検証が失敗します。 Webhook ルートは route-specific に `express.raw()` を使うと事故が減ります。 ### 4. 遅延決済のイベントを見ない カードだけなら目立ちませんが、銀行振込など即時でない手段を有効にすると `checkout.session.async_payment_succeeded` を見ない設計は危険です。 ### 5. テスト鍵と本番鍵を混ぜる `sk_test_` と `sk_live_` の混在は非常に多いです。 Webhook secret も test と live で別物です。 ### 6. 内部注文 ID と Stripe オブジェクトを紐づけない `metadata.orderId` がないと、本番障害時にダッシュボードと自社 DB を横断して追うのが難しくなります。 ## Checkout から Payment Element に進むタイミング 次の要件が出たら、Payment Element への移行を考える価値があります。 - 決済フォームを他の入力欄と完全に一体化したい - フロントの UI 分岐を細かく作りたい - 決済前後の体験をブランドとして強く作り込みたい 逆に、最初の公開段階では無理に移らなくて構いません。 ## 併読推奨 - [Stripe Checkout と Payment Element の違いを実装目線で比較する](https://media-payment-impl-lab.pages.dev/posts/stripe-checkout-vs-payment-element/) - [PaymentIntent の状態遷移を実装事故ベースで理解する](https://media-payment-impl-lab.pages.dev/posts/paymentintent-state-machine/) - [決済 API の冪等性を実装事故ベースで理解する](https://media-payment-impl-lab.pages.dev/posts/payment-api-idempotency-guide/) - [Stripe Webhook で起きやすい失敗を運用視点で10個に整理する](https://media-payment-impl-lab.pages.dev/posts/stripe-webhook-failures/) - [決済システム運用で事故を減らすチェックリストを作る](https://media-payment-impl-lab.pages.dev/posts/payment-system-operations-checklist/) --- ### Stripe Checkout と Payment Element の違いを実装目線で比較する - HTML: https://media-payment-impl-lab.pages.dev/posts/stripe-checkout-vs-payment-element/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/stripe-checkout-vs-payment-element.md - Published: 2026-04-10 - Updated: 2026-04-12 - Category: 実装比較 - Tags: Stripe, Checkout, Payment Element 最短で公開したいなら Checkout、ブランド体験や独自フローを強く作りたいなら Payment Element です。判断を4軸に固定すると、案件ごとの迷いがかなり減ります。 ## 結論 いちばん短くいうと、**最短導入は Checkout、画面自由度は Payment Element** です。 比較軸を先に固定しておくと迷いません。 | 比較軸 | Checkout | Payment Element | | --- | --- | --- | | 導入速度 | かなり速い | やや重い | | UI自由度 | 限定的 | 高い | | 組み込み機能 | 税・割引・配送などを使いやすい | 周辺機能は自前設計が増える | | 監修コスト | 低い | 中〜高 | | 実装ミス耐性 | 高め | 設計次第 | ## 先に整理: API と UI は同じ話ではない 2026 年時点の Stripe 公式ドキュメントでは、**Checkout Sessions API が複数の UI の backend** になっています。 - Stripe-hosted page - Embedded Checkout - Stripe Elements を使う custom payment flow そのうえで、実務上よくある意思決定は次の比較です。 - **Checkout**: Stripe がかなり面倒を見る prebuilt checkout - **Payment Element**: 自社画面へ埋め込むカスタマイズ前提の決済 UI この記事では、この UI / 運用責務の違いに絞って比較します。 ## こんなときは Checkout - まず決済を通したい - 自社デザインのこだわりが強くない - ABテストより早期公開を優先したい - 社内の運用負荷を抑えたい - 税・クーポン・配送・サブスクまで built-in 機能を活かしたい ## こんなときは Payment Element - ブランド体験を壊したくない - 周辺フォームと一体化したい - エラーハンドリングや分岐を細かく制御したい - 将来のカスタマイズ余地を多く残したい - 決済前後の UI を 1 画面の中で密に制御したい ## 実装責務の差 | 観点 | Checkout | Payment Element | | --- | --- | --- | | 決済画面 | Stripe が強く面倒を見る | 自社画面に埋め込む | | 支払い手段表示 | Stripe 側に寄せやすい | 自社側の分岐が増える | | 成功 / 失敗導線 | prebuilt に寄せやすい | 自前実装が増える | | 3Dセキュア対応 | かなり吸収される | 状態管理と UI の責務が残る | | Webhook 設計 | 必須だが比較的単純 | 必須かつ分岐が増えやすい | ## 設計判断でよくある失敗 ### 「いま欲しい自由度」と「半年後の運用」を分けずに決める 多くの案件で問題になるのは、初期の見た目要件だけで Payment Element を選び、後から監視・再送・保守の負荷が膨らむことです。 逆に Checkout で始めてから、要件が固まった時点で Payment Element へ移る二段階運用はかなり現実的です。 ### 「Payment Element = PaymentIntent 固定」と思い込む 古い記事や実装例ではそう見えやすいですが、現在は Checkout Sessions API を backend にしながら Payment Element を使う案もあります。 「どの API を使うか」と「どの UI を見せるか」は分けて考えた方が整理しやすいです。 ## おすすめの意思決定手順 1. まずは導入速度を優先するか決める 2. 決済フォーム以外のUI要件を棚卸しする 3. 将来の分岐や決済手段追加まで想定する 4. 税・割引・配送・サブスクの built-in 機能をどこまで使うか確認する 5. 障害時の調査・切り戻しのしやすさで再評価する ## 次に読む記事 - [Stripe Checkout とは](https://media-payment-impl-lab.pages.dev/glossary/stripe-checkout/) - [Payment Element とは](https://media-payment-impl-lab.pages.dev/glossary/payment-element/) - [Stripe で決済機能を実装する手順をサンプルコード付きで追う](https://media-payment-impl-lab.pages.dev/posts/stripe-payment-integration-step-by-step/) - [決済 API の冪等性を実装事故ベースで理解する](https://media-payment-impl-lab.pages.dev/posts/payment-api-idempotency-guide/) --- ### PaymentIntent の状態遷移を実装事故ベースで理解する - HTML: https://media-payment-impl-lab.pages.dev/posts/paymentintent-state-machine/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/paymentintent-state-machine.md - Published: 2026-04-10 - Updated: 2026-04-12 - Category: 実装ガイド - Tags: Stripe, PaymentIntent, Webhook PaymentIntent は単なる決済オブジェクトではなく、決済の途中状態を扱う設計の中心です。状態遷移を理解しておくと、二重計上や webhook の処理漏れをかなり防げます。 ## 先に押さえること `PaymentIntent` は「支払いが今どの段階にいるか」を表す箱です。 **成功したかどうかだけを見る設計** にすると、再認証・失敗・再試行・Webhook再送のどこかで破綻します。 ## 最低限の状態イメージ ```txt requires_payment_method -> requires_confirmation -> requires_action -> processing -> succeeded 別ルート: requires_confirmation -> requires_capture -> succeeded 終端: canceled ``` 失敗やキャンセルの分岐もあるため、アプリ側では「最終成功」だけでなく「いま何待ちか」を持つ必要があります。 Stripe の公式ステータスはもう少し細かく、特に見落としやすいのが次の2つです。 - `requires_capture`: オーソリのみ取り、後から capture するフロー - `canceled`: ユーザー放棄、重複、Fraud 判定などで終了した状態 さらに、**すべての決済がこの順番で必ず全部の状態を通るわけではありません**。 アプリは「想定していた矢印」ではなく、受け取った `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が結びついていない 再送や再試行のたびに別注文として扱うと、運用時に追跡できません。 [冪等性キー](https://media-payment-impl-lab.pages.dev/glossary/idempotency-key/) は「API 再実行の安全性」、内部注文 ID は「業務上の一意性」で、役割が違います。 ### 4. `requires_capture` を見落とす 手動 capture を使うのに `succeeded` だけで分岐していると、認証済み未売上の注文が漏れます。 ### 5. 3Dセキュアを状態ではなく画面挙動で判定する [3Dセキュア](https://media-payment-impl-lab.pages.dev/glossary/3d-secure/) は UI 上ではモーダルや別画面に見えますが、サーバーから見ると `requires_action` を経由する決済状態です。 見た目ではなく `status` と Webhook イベントで判断してください。 ## 内部注文モデルへの写し方 Stripe のステータスをそのまま UI に見せるより、社内では少し抽象化した方が運用しやすいです。 | Stripe 側 | 内部状態の例 | 補足 | | --- | --- | --- | | `requires_payment_method` | `pending_payment_method` | 入力不足や失敗後の再入力待ち | | `requires_action` | `pending_customer_action` | 3DS 認証など利用者操作待ち | | `processing` | `pending_settlement` | 非同期確定待ち | | `requires_capture` | `authorized` | 後 capture 前提 | | `succeeded` | `paid` | 初めて受注確定候補になる | | `canceled` | `canceled` | abandoned / duplicate など | ## 実務でのすすめ方 - 画面側: 「次に進めるか」を返す - サーバー側: `PaymentIntent` と内部注文を紐づける - Webhook 側: 最終反映の責務を集約する - 管理画面: 状態遷移を追跡できるようにする ## 併読推奨 - [PaymentIntent とは](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/) - [Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook/) - [Stripe Checkout と Payment Element の違いを実装目線で比較する](https://media-payment-impl-lab.pages.dev/posts/stripe-checkout-vs-payment-element/) - [決済 API の冪等性を実装事故ベースで理解する](https://media-payment-impl-lab.pages.dev/posts/payment-api-idempotency-guide/) --- ### Stripe Webhook で起きやすい失敗を運用視点で10個に整理する - HTML: https://media-payment-impl-lab.pages.dev/posts/stripe-webhook-failures/ - Markdown: https://media-payment-impl-lab.pages.dev/posts/stripe-webhook-failures.md - Published: 2026-04-10 - Updated: 2026-04-12 - Category: 障害運用 - Tags: Stripe, Webhook, 冪等性 Webhook障害の多くは、イベントを一回だけ来る前提で処理していることが原因です。署名、保存、冪等性、再処理導線までを最初から含めると、後の運用が大きく楽になります。 ## 結論 Webhook を「通知」ではなく **非同期の事実ストリーム** として扱うと設計が安定します。 Stripe の公式仕様上も、署名検証、raw body、再送、手動再処理は避けて通れません。 タイトル通り、実務で本当に多い失敗を 10 個に分けて整理します。 ## 起きやすい失敗 10 個 1. 署名検証を入れていない 2. raw body を壊してから検証している 3. CLI 用 secret と Dashboard 用 secret を混同している 4. イベント保存前に副作用を起こしている 5. event ID 単位の重複防止がない 6. 同期レスポンスと Webhook の両方で注文確定している 7. イベントが順番通りに来る前提で内部状態を組んでいる 8. 遅延決済のイベントを処理対象に入れていない 9. 手動再処理導線がなく、障害時に API と SQL を直叩きする 10. Connect で「自分のアカウント用」と「接続アカウント用」の Webhook を分けていない ## 最初に潰すべき 4 つ ### 1. 署名検証を入れていない Stripe は `Stripe-Signature` ヘッダーでイベントを検証できます。 これを外すと、到達した JSON をそのまま信じる設計になります。 ### 2. raw body を壊している Stripe は **生のリクエスト本文** で署名検証します。 `express.json()` で先に JSON へ変換すると、同じ内容に見えても検証に失敗します。 ### 3. イベント保存前に副作用を起こしている メール送信、在庫引当、権限付与を先にやると、途中失敗時に再実行できません。 まず event ID と payload を保存して、その後に業務処理へ進める方が安全です。 ### 4. event ID 単位の重複防止がない Stripe は未配信イベントを自動再送します。 同じ `event.id` を二度処理しても副作用が一回で止まるようにしないと、二重反映が起きます。 ## 実装順のおすすめ ### Step 1: 受信して署名検証し、まず保存する 受信直後に業務処理を全部やるより、受けたイベントをまず保存してから後段に渡す方がトラブルに強いです。 保存時点で最低限持ちたいもの: - `event.id` - `event.type` - `livemode` - `account`(Connect の場合) - 受信時刻 - 処理ステータス - 失敗理由 ### Step 2: 副作用は一箇所に寄せる メール送信、在庫反映、契約更新などの副作用が複数箇所に散ると、再送時に事故ります。 ### Step 3: 「未処理」「処理中」「処理済み」を持つ Stripe の手動再処理ガイドでも、処理中・処理済みの記録を DB に持って重複を防ぐ考え方が出てきます。 ### Step 4: 運用画面を先に作る 本番で強いのは、イベント単位で「受信」「処理済み」「失敗」「再実行」を見られる画面です。 ## 見落としやすい失敗 ### 順不同イベントを直列フローだと思い込む たとえば `invoice.paid` より先に `customer.subscription.updated` を見たり、`payment_intent.succeeded` より先に周辺イベントを見ることがあります。 イベントの到着順ではなく、**取得したオブジェクトの現在状態** を正にしてください。 ### success ページを正とする Checkout の戻り先ページは UI の完了表示であって、バックエンドの確定処理そのものではありません。 同期レスポンスで確定し、さらに Webhook でも確定すると二重計上の温床になります。 ### Connect の Webhook を普通の Webhook と同じだと思う Connect では「自分のアカウントのイベント」と「接続アカウントのイベント」の 2 系統があります。 接続アカウントのイベントにはトップレベルの `account` プロパティが付きます。 ### 再送を待つだけで手動回復手順がない Stripe は未配信イベントを最大 3 日程度自動再送しますが、それとは別に undelivered events を手動処理する手順を用意しておくべきです。 ## 監視で最低限ほしいもの | 項目 | 目的 | | --- | --- | | 受信件数 | 受信停止の検知 | | 失敗件数 | 異常増加の検知 | | 再送件数 | 下流不安定の検知 | | 最終処理時刻 | 遅延の検知 | | `livemode` 別件数 | test / live 混入の検知 | | `account` 別失敗率 | Connect 事故の局所化 | ## 併読推奨 - [Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook/) - [PaymentIntent の状態遷移を実装事故ベースで理解する](https://media-payment-impl-lab.pages.dev/posts/paymentintent-state-machine/) - [決済 API の冪等性を実装事故ベースで理解する](https://media-payment-impl-lab.pages.dev/posts/payment-api-idempotency-guide/) - [決済システム運用で事故を減らすチェックリストを作る](https://media-payment-impl-lab.pages.dev/posts/payment-system-operations-checklist/) --- ## Glossary ### 3Dセキュア - HTML: https://media-payment-impl-lab.pages.dev/glossary/3d-secure/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/3d-secure.md - Published: 2026-04-12 - Updated: 2026-04-12 カード決済で追加認証を行う 3Dセキュアの役割と、Stripe 実装で何が起きるかを短く整理します。 3Dセキュアは、**カード保有者本人であることを追加認証する仕組み** です。 Stripe ではカード支払い時に `requires_action` などの状態として表れます。 不正対策だけでなく、SCA などの規制対応とも関係するため、「たまに出るモーダル」ではなく決済状態の一部として扱うべきです。 --- ### Checkout Session - HTML: https://media-payment-impl-lab.pages.dev/glossary/checkout-session/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/checkout-session.md - Published: 2026-04-12 - Updated: 2026-04-12 Stripe の Checkout Sessions API で扱う Checkout Session の役割と、決済 UI との関係を短く整理します。 Checkout Session は、**Stripe の checkout ライフサイクルを表すオブジェクト** です。 税、割引、配送、サブスクなどの built-in 機能をまとめて扱いやすく、hosted checkout だけでなく embedded checkout や custom flow の backend としても使えます。 --- ### Customer Portal - HTML: https://media-payment-impl-lab.pages.dev/glossary/customer-portal/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/customer-portal.md - Published: 2026-04-12 - Updated: 2026-04-12 顧客がカード更新や請求書取得をセルフサービスできる Stripe のポータル機能の位置づけです。 Customer Portal は、**顧客向けのセルフサービス画面** で、カード更新や請求書ダウンロードなどを Stripe 側で提供します。 自前で同等 UI を作る代わりに、運用コストを下げる選択肢です。 --- ### Customer(Stripe) - HTML: https://media-payment-impl-lab.pages.dev/glossary/stripe-customer/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/stripe-customer.md - Published: 2026-04-12 - Updated: 2026-04-12 Stripe における顧客オブジェクトの役割と、PaymentMethod や Subscription と束ねて持つ理由を短く整理します。 Customer は、**支払い主体としての顧客** を表すオブジェクトです。 カードなどの [PaymentMethod](https://media-payment-impl-lab.pages.dev/glossary/payment-method/) や定期課金の起点として使われ、自社のユーザーIDと必ず紐づけるのが安全です。 --- ### Dispute(チャージバック) - HTML: https://media-payment-impl-lab.pages.dev/glossary/stripe-dispute/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/stripe-dispute.md - Published: 2026-04-12 - Updated: 2026-04-12 カード決済後の争いである Dispute の意味と、証拠・期限・社内オペが重要になる理由を短くまとめます。 Dispute(チャージバック)は、**決済完了後に顧客が異議を申し立てたケース** を扱うプロセスです。 証拠提出の期限管理と、注文・配送ログの紐づけが実務上のボトルネックになりやすいです。 --- ### Invoice(Stripe) - HTML: https://media-payment-impl-lab.pages.dev/glossary/stripe-invoice/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/stripe-invoice.md - Published: 2026-04-12 - Updated: 2026-04-12 Stripe の請求書オブジェクトの役割と、サブスクリプション課金・手動請求との関係を短くまとめます。 Invoice は、**請求書およびその支払い状態** を表すオブジェクトです。 [Billing](https://media-payment-impl-lab.pages.dev/glossary/stripe-billing/) の更新サイクルと連動することが多く、B2B の支払条件とセットで設計します。 --- ### Payment Element - HTML: https://media-payment-impl-lab.pages.dev/glossary/payment-element/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/payment-element.md - Published: 2026-04-12 - Updated: 2026-04-12 自サイトに埋め込む Stripe の決済 UI コンポーネントの役割と、Checkout との使い分けの目安です。 Payment Element は、**自社フローに埋め込む決済 UI** です。 表示する支払い手段や外観を調整しやすい一方、実装・運用の責務は Checkout より広がります。 古い実装例では [PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/) と強く結びついて見えますが、現在は [Checkout Session](https://media-payment-impl-lab.pages.dev/glossary/checkout-session/) を backend にしながら使う設計もあります。 --- ### Payment Links - HTML: https://media-payment-impl-lab.pages.dev/glossary/payment-link/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/payment-link.md - Published: 2026-04-12 - Updated: 2026-04-12 URL を共有して決済まで完結させる Stripe の低コード機能の位置づけと、本格課金設計との境界を短く述べます。 Payment Links は、**ホスト型の支払いページへのリンク** を素早く作る機能です。 まず売上検証を早く回したい一方、複雑な契約変更や B2B 稟議が絡むと [Invoice](https://media-payment-impl-lab.pages.dev/glossary/stripe-invoice/) 側の設計が必要になることがあります。 --- ### PaymentIntent - HTML: https://media-payment-impl-lab.pages.dev/glossary/paymentintent/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/paymentintent.md - Published: 2026-04-10 - Updated: 2026-04-10 Stripeにおける PaymentIntent の役割を短く整理します。 `PaymentIntent` は、決済の途中状態を表す中心オブジェクトです。 単に「支払いが成功したか」ではなく、認証待ち、処理中、失敗、再試行といった状態を扱うため、**注文状態と決済状態をどう分けるか** の設計に直結します。 特に重要なのは次の3点です。 - 内部注文IDと必ず紐づける - Webhookイベントと合わせて追跡する - 成功前に受注確定しない --- ### PaymentMethod - HTML: https://media-payment-impl-lab.pages.dev/glossary/payment-method/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/payment-method.md - Published: 2026-04-12 - Updated: 2026-04-12 カードやウォレット等の支払い手段を表す Stripe オブジェクトの役割と、Customer との紐づけの重要性です。 PaymentMethod は、**実際に課金に使う手段**(カード等)を表すオブジェクトです。 [Customer](https://media-payment-impl-lab.pages.dev/glossary/stripe-customer/) に紐づけて保持し、[PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/) の `payment_method` として参照するのが典型パターンです。 --- ### SetupIntent - HTML: https://media-payment-impl-lab.pages.dev/glossary/setup-intent/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/setup-intent.md - Published: 2026-04-12 - Updated: 2026-04-12 将来の支払いのために支払い手段を保存するときに使う SetupIntent の役割を、PaymentIntent との違いで短く整理します。 SetupIntent は、**いま課金せずに支払い手段を登録・確認する** ためのフローです。 即時売上確定は [PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/)、カード保存や確認だけが目的なら SetupIntent、という切り分けが一般的です。 --- ### Stripe Billing - HTML: https://media-payment-impl-lab.pages.dev/glossary/stripe-billing/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/stripe-billing.md - Published: 2026-04-12 - Updated: 2026-04-12 定期課金や請求サイクルを扱う Stripe のプロダクト領域と、単発決済レイヤーとの境界を短くまとめます。 Stripe Billing は、**時間のある課金**(プラン、更新、請求書)を扱うためのプロダクト群です。 単発の [PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/) だけでは表現が重くなる領域を、[Subscription](https://media-payment-impl-lab.pages.dev/glossary/stripe-subscription/) や [Invoice](https://media-payment-impl-lab.pages.dev/glossary/stripe-invoice/) としてモデル化します。 --- ### Stripe Checkout - HTML: https://media-payment-impl-lab.pages.dev/glossary/stripe-checkout/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/stripe-checkout.md - Published: 2026-04-12 - Updated: 2026-04-12 Stripe の prebuilt checkout の役割と、Payment Element との違いを短く整理します。 Stripe Checkout は、**Stripe の prebuilt checkout** です。 一般には Stripe-hosted な決済画面を指して使われがちですが、現在の Stripe 公式では Checkout Sessions API を使った hosted / embedded の checkout が整理されています。 PCI 範囲を抑えつつ最短で導入したい場合に向きます。ブランド一体の UI や細かいフォーム制御が主目的なら [Payment Element](https://media-payment-impl-lab.pages.dev/glossary/payment-element/) との比較が定番です。 --- ### Stripe Connect - HTML: https://media-payment-impl-lab.pages.dev/glossary/stripe-connect/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/stripe-connect.md - Published: 2026-04-12 - Updated: 2026-04-12 マーケットプレイス等で複数の売り手に紐づく決済と送金を扱う Stripe のプロダクトの要点です。 Stripe Connect は、**接続アカウント** を介してプラットフォームと売り手の資金移動を管理する仕組みです。 分配・本人確認・レポート要件が絡むため、単一事業者向けの決済設計とは別レイヤーとして切り出して考えます。 --- ### Stripe Radar - HTML: https://media-payment-impl-lab.pages.dev/glossary/stripe-radar/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/stripe-radar.md - Published: 2026-04-12 - Updated: 2026-04-12 決済前のリスク評価とルール実行に使う Stripe Radar の位置づけを、チャージバック対策との違いも含めて短く整理します。 Stripe Radar は、**決済承認前の不正対策**(スコアリング、ルール、レビュー)を支援する機能群です。 チャージバック発生後の争議処理は [Dispute](https://media-payment-impl-lab.pages.dev/glossary/stripe-dispute/) として別プロセスです。 --- ### Stripe Tax - HTML: https://media-payment-impl-lab.pages.dev/glossary/stripe-tax/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/stripe-tax.md - Published: 2026-04-12 - Updated: 2026-04-12 取引に応じた税計算・集計を支援する Stripe Tax の役割と、専門家レビューが必要になりうる点を短くまとめます。 Stripe Tax は、**所在地や商品カテゴリに応じた税の自動計算** を支援する機能です。 設定や例外処理は事業内容に依存するため、重要案件では税務専門家の確認を前提にします。 --- ### Stripe Terminal - HTML: https://media-payment-impl-lab.pages.dev/glossary/stripe-terminal/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/stripe-terminal.md - Published: 2026-04-12 - Updated: 2026-04-12 実店舗向けのカード端末と SDK を束ねた Stripe Terminal の役割を、オンライン決済との共通点とともに短く説明します。 Stripe Terminal は、**対面でカードを読み取り決済を完了させる** ためのハードウェア・ソフトウェア群です。 裏側では [PaymentIntent](https://media-payment-impl-lab.pages.dev/glossary/paymentintent/) を正として扱う点はオンラインと同じです。 --- ### Subscription(Stripe) - HTML: https://media-payment-impl-lab.pages.dev/glossary/stripe-subscription/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/stripe-subscription.md - Published: 2026-04-12 - Updated: 2026-04-12 Stripe における定期課金契約オブジェクトの役割と、社内の契約IDとの同期が重要な理由を短く述べます。 Subscription は、**顧客とプラン(Price)の継続契約** を表すオブジェクトです。 更新・失敗・解約は [Webhook](https://media-payment-impl-lab.pages.dev/glossary/webhook/) で追うのが一般的で、社内の契約番号と ID を一対一で同期しておくと運用が楽です。 --- ### Webhook - HTML: https://media-payment-impl-lab.pages.dev/glossary/webhook/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/webhook.md - Published: 2026-04-10 - Updated: 2026-04-12 Webhook の役割と、Stripe運用でなぜ重要かを短く整理します。 Webhook は、ある出来事が起きたときにサーバー間で通知を飛ばす仕組みです。 Stripe 実装では「支払い成功を画面レスポンスだけで判断しない」ために重要です。 設計では以下を前提にします。 - 再送がありうる - 順不同に見えることがある - 受信直後に副作用を詰め込みすぎない - 署名検証には raw body が必要 --- ### 返金 - HTML: https://media-payment-impl-lab.pages.dev/glossary/refund/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/refund.md - Published: 2026-04-12 - Updated: 2026-04-12 決済後に売上を戻す Refund の役割と、注文状態・会計・顧客通知まで含めて扱う必要性を短く整理します。 返金は、**決済後に売上の全部または一部を戻す処理** です。 決済代行で返金しただけでは終わりません。 内部注文状態、権限停止、会計記録、顧客通知までそろって初めて運用が閉じます。 --- ### 冪等性キー - HTML: https://media-payment-impl-lab.pages.dev/glossary/idempotency-key/ - Markdown: https://media-payment-impl-lab.pages.dev/glossary/idempotency-key.md - Published: 2026-04-12 - Updated: 2026-04-12 決済 API の再試行で二重作成を防ぐ冪等性キーの役割と、内部注文 ID との違いを短く整理します。 冪等性キーは、**同じ意味の API リクエストを安全に再試行するための識別子** です。 通信タイムアウトや 5xx のあとに同じ POST を再送しても、二重作成や二重課金を防ぎやすくなります。 ただし、これは API レベルの安全装置であり、業務上の一意性は内部注文 ID で別に持つ必要があります。 ---