Appearance
決済・アクセス制御方式の選定
| 項目 | 内容 |
|---|---|
| Issue | #2384 |
| 親 Issue | #2381 有料記事の体制を整える |
| 関連 Issue | #2390 決済・購読・アクセス制御 |
| 最終更新 | 2026-06-20 |
1. 目的
有料記事(月 1 回更新)の 決済方法・購入管理・アクセス制御 の方式を選定し、実装 sub-issue(#2390)に渡せる要件を文書化する。
決済システムはバグが許されない領域であるため、決済 UI は Stripe Checkout に委譲し、購入記録と閲覧可否は WordPress 側の Webhook・カスタムテーブル・アクセス制御 Service を正とする。
2. 販売形態の確定
| 項目 | 決定 |
|---|---|
| 販売形態 | 単号購入のみ |
| 月額サブスク | 対象外(継続課金・解約・失効の運用コストが大きいため) |
| バックナンバー | 各号を個別商品として販売 |
| 購入後のアクセス | 永久アクセス(購入した号は継続して閲覧可能) |
単号購入を採用した理由
- 月 1 配信のコンテンツ特性に合う(号ごとに完結した価値提供)
- サブスクに比べ決済・失効・解約フローが単純で、バグリスクが低い
- 初号〜数号は販売実績が未知数のため、購入ハードルを下げやすい
方式比較・未採用案・履歴は 決済-アクセス制御-検討.md に分離する。
3. 採用方式
| 項目 | 方針 |
|---|---|
| 決済 UI | Stripe Checkout Session API |
| 購入記録 | db_paid_article_purchase |
| 閲覧判定 | PaidArticleAccessService |
| 購入導線 | 未ログイン時はログイン画面へ誘導し、購入 URL を redirect_to で保持 |
| Webhook 正本 | checkout.session.completed で購入記録を付与 |
4. 未購入者への表示ルール
| ルール案 | 内容 | 推奨 |
|---|---|---|
| リードのみ | タイトル・冒頭・目次・固定セクション見出しのみ表示。本文・データは購入 CTA | 推奨(SEO・訴求のバランス) |
| 全文非表示 | タイトルと「有料記事」バッジ、購入ボタンのみ | 訴求は弱いが実装は単純 |
| ログイン必須(未購入も可) | 会員登録後にリード表示 | 初期は不要(単号購入に WP アカウント必須はハードル) |
推奨: リードのみ表示 + Stripe Checkout への購入ボタン
5. 過去号アクセスポリシー
| 項目 | 方針 |
|---|---|
| 購入済み号 | 永久アクセス(サブスク失効の概念なし) |
| 未購入の過去号 | リードのみ。バックナンバーは 号ごとに単品購入 |
| 購入記録の保持 | 返金・問い合わせ対応のため 最低 7 年 は注文 ID・購入者・post_id を保持(会計・税法は別途専門家確認) |
購入記録の管理方式
購入記録は db_paid_article_purchase を正とする。ゲスト購入は扱わず、wp_users.ID と paid_article 投稿 ID を紐づける。
6. 決済プロバイダ・手数料
金額は 2026 年時点の公開情報に基づく目安。実際の契約・キャンペーンで変動するため、導入前に各サービスで再確認すること。
| プロバイダ | 手数料(目安) | 入金サイクル | 備考 |
|---|---|---|---|
| Stripe(日本・カード) | 3.6% | 週次など(アカウント設定による) | Checkout 利用で PCI DSS は Stripe 側 |
例: 1 号 500 円の場合、Stripe 手数料 ≒ 18 円。
7. 個人情報・領収書・返金ポリシー
| 項目 | 方針 |
|---|---|
| 個人情報 | 自サイトプライバシーポリシー + Stripe のデータ処理 |
| 領収書 | Stripe レシートを基本とする |
| 返金 | 返金ポリシーをサイトに明記し、Stripe から返金操作する |
| 特商法表記 | 自サイトに記載 |
方針: 返金ポリシー(デジタルコンテンツの扱い・期限)は 初号公開前 に #2392 運用チェックリストに明文化する。
自サイト販売では、利用規約(terms)・特定商取引法表記(tokushoho)・プライバシーポリシーを固定ページで表示し、フッター導線と有料記事 CTA 付近から参照できること。本文の正本は db_legal_document_version(管理画面「法務文書」)。Tokusho Generator / [tokusho] ショートコードには依存しない。会員再同意は利用規約の現行版(document_type=terms)のみ。詳細: 法務文書版管理.md。
8. #2390 への引き渡し要件(サマリ)
実装 Issue #2390 では、自サイト販売で以下を満たす。
| 要件 | 方針 |
|---|---|
| 未購入者表示 | リードのみ + 購入 CTA |
| 購入済み表示 | 対象 post_id の永久閲覧(db_paid_article_purchase) |
| ゲスト購入 | WP ログイン必須 |
| 購入記録の正 | カスタムテーブル(#2597) |
| Webhook | 署名検証・冪等キーを必須とする |
| 購入可否テスト | Stripe テストモードで購入から閲覧可否まで確認する |
9. Stripe Checkout 単号購入(#2630)
Stripe Checkout + 自前アクセス制御の Checkout Session 作成部分。
| 項目 | 設計 |
|---|---|
| 決済モード | mode: payment(都度課金のみ) |
| 通貨 | JPY(currency: jpy) |
| 価格 | db_member_plan_master.plan_key = paid_article_single の price |
| metadata | user_id, post_id(Webhook #2631 で購入記録 INSERT に使用) |
| success_url | 記事パーマリンク + ?paid_article_checkout=success&session_id={CHECKOUT_SESSION_ID} |
| cancel_url | 記事パーマリンク + ?paid_article_checkout=cancel |
| 購入導線 | リード CTA → admin-post.php?action=paid_article_checkout&post_id=... → Stripe Checkout |
| Webhook | POST /wp-json/commerce/v1/stripe-webhook(#2631)— checkout.session.completed で購入記録 INSERT |
| 未ログイン | ログイン画面へ誘導(redirect_to で購入 URL を保持) |
| 購入済み | Checkout 作成をスキップ(PaidArticleAccessService で判定) |
10. 技術選定(#2629〜#2631)
Webhook・購入テーブル・アクセス制御は自サイト決済の必須要件とする。さらに Checkout Session API(動的生成) を採用し、user_id / post_id の metadata 付与・価格の DB 正本・号追加時の手動 Link 運用を避ける。
選定理由の詳細(「リンク貼り付けだけでは足りない」根拠、回避リスク、見直しトリガー)は Stripe決済-技術選定理由.md を参照。
11. 関連ドキュメント
- Stripe決済-技術選定理由.md — 採用構成の選定根拠(#2629〜#2631)
- Issue #2381 有料記事の体制を整える
- 画像スナップショット方針(#2386)
- docs/design/README.md