System Specification

Dr+ Membership & Payment

本番URL https://drtas.jp/  ·  LIVE 稼働中
更新日 2026-06-24  ·  決済 PayPal(Stripe審査否認により移行)

01ひと目でわかる要約

Dr+(ドクタス)の医学生コミュニティ向けLP。会員入会の決済までを1枚のLPで完結させる。

何のシステム

入会申込LP+決済フォーム入力 → PayPLで入会金+月会費を支払い → 会員化

ホスティング

さくらレンタルサーバーnginx + PHP 8.3 / モカと同居 / drtas.jp

決済手段

PayPal(カード対応)入会金¥50,000+月会費¥10,000/月

決済モデル

A:申込=即課金承認した瞬間に入会金+初月を課金。審査は事後

02システム構成

全てさくらサーバー1台に集約。外部に依存するのはPayPal APIのみ。

Client / ブラウザ

LP(静的HTML/CSS/JS)

index.html / join.html / thanks.html + assets。スマホ幅480px基準のデザイン。

POST /api/create-subscription.php(JSON)

さくら · nginx + PHP 8.3

決済バックエンド(PHP)

バリデーション → PayPal OAuth → サブスク作成 → 承認URLを返す。認証情報はドキュメントルート外から読込。

PayPal REST API(HTTPS)

PayPal(外部)

Billing Subscriptions / Orders

承認・課金・継続課金を担う。ダッシュボードで入金・解約・返金を管理。

Host: seopj.sakura.ne.jp Docroot: /home/seopj/www/drtas/ Deploy: rsync (ssh鍵 ~/.ssh/sakura) Stack: HTML / SCSS / JS / PHP

03決済仕様

入会金(初回1回)と月会費(毎月継続)を1本のPayPalサブスクに集約。

項目金額課金PayPalでの扱い
入会金¥50,000初回のみプランの setup_fee
月会費¥10,000 / 月毎月自動プランの月次サイクル
ゲスト単発参加費¥5,000都度Orders API(未実装
モデルA=即課金。 ユーザーがPayPalで「承認」した瞬間に、入会金+初月で¥60,000が実際に課金される。承認画面の手前まではテスト可だが、承認ボタンは本物の決済。審査は支払い後に行い、落ちた場合はサブスク解約+返金で対応する。

04申込 → 決済フロー

フォーム送信から会員化までの流れ。

User

/join.html でフォーム入力・送信

氏名・フリガナ・メール・電話・区分(医師/医学生)・所属など。医師は医師登録番号必須。

fetch POST

PHP backend

サブスク作成 → 承認URL返却

PayPal OAuth → /v1/billing/subscriptions → approveリンクをJSONで返す。

window.location リダイレクト

PayPal

ログイン / カード入力 → 承認

PayPalアカウント不要(カード決済可)。承認=即課金。

return_url

User

/thanks.html(入会完了)

入会金+初月の支払い完了を案内。翌月以降は自動課金。

事後

運営

入金確認・医師資格照合(審査)

問題あれば解約+返金。問題なければ会員コンテンツ案内。

05PayPal設定(本番・作成済み)

本番アカウントにProductとBillingプランをAPIで作成済み。再作成不要。

リソースID / 値
App IDAPP-8UA19271PX790591E
ProductPROD-77Y86687EA946822D
Plan(入会金+月会費)P-4L866503HH474474FNI5DS2Q
API環境live / https://api-m.paypal.com
通貨JPY(ゼロ十進・小数なし)

認証情報の置き場所

Client ID / Secret / Plan ID は ドキュメントルート外 に置き、Web公開されないようにしている。

場所権限
/home/seopj/drtas-secrets/paypal.php600(ディレクトリ 700)

PHPは dirname(__DIR__, 3) . '/drtas-secrets/paypal.php' で読み込む。

06ファイル構成

本番ドキュメントルート(/home/seopj/www/drtas/)に置くのは公開ファイルのみ。

www/drtas/ # ← 公開(nginx静的配信) ├── index.html # LP本体(特典・料金・FAQ・CTA) ├── join.html # 入会申込フォーム ├── thanks.html # 決済完了ページ ├── api/ │ └── create-subscription.php # 決済バックエンド └── assets/ # css / images / js / scss / videos drtas-secrets/ # ← 非公開(docroot外) └── paypal.php # PayPal認証情報(600)
デプロイの鉄則: .git / .dev.vars / CLAUDE.md / docs/ などは絶対にdocrootへ置かない(静的配信で外部から読めてしまう)。公開ファイルだけをrsyncする。

07データの流れと制約

PayPalはStripeと違い自由なmetadataを持てない。ここが設計上の最大の注意点。

申込項目保存先状態
氏名 / メールPayPal subscriber✅ 保存される
区分 / 医師登録番号PayPal custom_id(ASCIIのみ)✅ 保存される
所属 / フリガナ / 電話⚠️ どこにも保存されない
専門 / 紹介者 / 志望動機⚠️ どこにも保存されない
未解決: 日本語の申込詳細(所属・志望動機など)はPayPalに残せない(custom_idはASCII印字可能文字127字まで)。審査や連絡に使うなら、別途の保存先(Googleスプレッドシート / Cloudflare KV / 運営宛メール)をフォーム送信時に挟む必要がある。→ 残課題①

08運用フロー

審査(事後)

支払い後にPayPalで入金を確認し、医師は厚労省「医師等資格確認検索システム」で氏名+医籍登録番号を照合する。

非承認時

PayPalでサブスクをキャンセル → 入会金+初月分を返金 → お断りメール。

解約

会員からの退会連絡でサブスクをキャンセル(当月分は請求済み、翌月から停止)。

月次課金失敗

PayPalが自動リトライ(payment_failure_threshold=2)。超過でサブスク停止 → 手動判断。

運用手順の詳細はリポジトリ docs/operation.md 参照

09セキュリティ対応

対応状態
PayPal認証情報をdocroot外に隔離(600)✅ 完了
旧デプロイで露出していた .dev.vars / .git / CLAUDE.md をサーバーから削除✅ 完了
以後は公開ファイルのみrsync運用に変更✅ 完了
本番Secretのローテーション⚠️ 任意(残課題③)
旧状態では https://drtas.jp/.dev.vars 等が誰でも閲覧可能だった(露出していたのはStripeテストキーで実害は限定的)。現在は中身が出ないことを確認済み。

10残課題

本番の入会決済は稼働済み。残りは下記。