System Specification
Dr+(ドクタス)の医学生コミュニティ向けLP。会員入会の決済までを1枚のLPで完結させる。
何のシステム
入会申込LP+決済フォーム入力 → PayPLで入会金+月会費を支払い → 会員化
ホスティング
さくらレンタルサーバーnginx + PHP 8.3 / モカと同居 / drtas.jp
決済手段
PayPal(カード対応)入会金¥50,000+月会費¥10,000/月
決済モデル
A:申込=即課金承認した瞬間に入会金+初月を課金。審査は事後
全てさくらサーバー1台に集約。外部に依存するのはPayPal APIのみ。
Client / ブラウザ
LP(静的HTML/CSS/JS)
index.html / join.html / thanks.html + assets。スマホ幅480px基準のデザイン。
さくら · nginx + PHP 8.3
決済バックエンド(PHP)
バリデーション → PayPal OAuth → サブスク作成 → 承認URLを返す。認証情報はドキュメントルート外から読込。
PayPal(外部)
Billing Subscriptions / Orders
承認・課金・継続課金を担う。ダッシュボードで入金・解約・返金を管理。
入会金(初回1回)と月会費(毎月継続)を1本のPayPalサブスクに集約。
| 項目 | 金額 | 課金 | PayPalでの扱い |
|---|---|---|---|
| 入会金 | ¥50,000 | 初回のみ | プランの setup_fee |
| 月会費 | ¥10,000 / 月 | 毎月自動 | プランの月次サイクル |
| ゲスト単発参加費 | ¥5,000 | 都度 | Orders API(未実装) |
フォーム送信から会員化までの流れ。
User
/join.html でフォーム入力・送信
氏名・フリガナ・メール・電話・区分(医師/医学生)・所属など。医師は医師登録番号必須。
PHP backend
サブスク作成 → 承認URL返却
PayPal OAuth → /v1/billing/subscriptions → approveリンクをJSONで返す。
PayPal
ログイン / カード入力 → 承認
PayPalアカウント不要(カード決済可)。承認=即課金。
User
/thanks.html(入会完了)
入会金+初月の支払い完了を案内。翌月以降は自動課金。
運営
入金確認・医師資格照合(審査)
問題あれば解約+返金。問題なければ会員コンテンツ案内。
本番アカウントにProductとBillingプランをAPIで作成済み。再作成不要。
| リソース | ID / 値 |
|---|---|
| App ID | APP-8UA19271PX790591E |
| Product | PROD-77Y86687EA946822D |
| Plan(入会金+月会費) | P-4L866503HH474474FNI5DS2Q |
| API環境 | live / https://api-m.paypal.com |
| 通貨 | JPY(ゼロ十進・小数なし) |
Client ID / Secret / Plan ID は ドキュメントルート外 に置き、Web公開されないようにしている。
| 場所 | 権限 |
|---|---|
| /home/seopj/drtas-secrets/paypal.php | 600(ディレクトリ 700) |
PHPは dirname(__DIR__, 3) . '/drtas-secrets/paypal.php' で読み込む。
本番ドキュメントルート(/home/seopj/www/drtas/)に置くのは公開ファイルのみ。
.git / .dev.vars / CLAUDE.md / docs/ などは絶対にdocrootへ置かない(静的配信で外部から読めてしまう)。公開ファイルだけをrsyncする。
PayPalはStripeと違い自由なmetadataを持てない。ここが設計上の最大の注意点。
| 申込項目 | 保存先 | 状態 |
|---|---|---|
| 氏名 / メール | PayPal subscriber | ✅ 保存される |
| 区分 / 医師登録番号 | PayPal custom_id(ASCIIのみ) | ✅ 保存される |
| 所属 / フリガナ / 電話 | — | ⚠️ どこにも保存されない |
| 専門 / 紹介者 / 志望動機 | — | ⚠️ どこにも保存されない |
custom_idはASCII印字可能文字127字まで)。審査や連絡に使うなら、別途の保存先(Googleスプレッドシート / Cloudflare KV / 運営宛メール)をフォーム送信時に挟む必要がある。→ 残課題①
支払い後にPayPalで入金を確認し、医師は厚労省「医師等資格確認検索システム」で氏名+医籍登録番号を照合する。
PayPalでサブスクをキャンセル → 入会金+初月分を返金 → お断りメール。
会員からの退会連絡でサブスクをキャンセル(当月分は請求済み、翌月から停止)。
PayPalが自動リトライ(payment_failure_threshold=2)。超過でサブスク停止 → 手動判断。
| 対応 | 状態 |
|---|---|
| PayPal認証情報をdocroot外に隔離(600) | ✅ 完了 |
| 旧デプロイで露出していた .dev.vars / .git / CLAUDE.md をサーバーから削除 | ✅ 完了 |
| 以後は公開ファイルのみrsync運用に変更 | ✅ 完了 |
| 本番Secretのローテーション | ⚠️ 任意(残課題③) |
https://drtas.jp/.dev.vars 等が誰でも閲覧可能だった(露出していたのはStripeテストキーで実害は限定的)。現在は中身が出ないことを確認済み。
本番の入会決済は稼働済み。残りは下記。