◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り25日。API 連携を足したアプリは移行先の確認を●SDK 58 — React Native 0.88 に更新されました。Android のリリース版で R8 が既定オンになり、iOS は SceneDelegate を生成します●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り25日。API 連携を足したアプリは移行先の確認を●SDK 58 — React Native 0.88 に更新されました。Android のリリース版で R8 が既定オンになり、iOS は SceneDelegate を生成します●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/ビジネス
⟐ ビジネス/2026-09-22上級

決済が成功しても、渡してよい権限は決まりません。1つの Checkout に4種類の商品を載せたあとの分岐設計

チップ・記事単体・月額・買い切りの4商品を1つの Checkout に通したところ、決済成功をそのまま権限に変える実装が三度危うくなりました。金額ではなく metadata で分岐させ、権限ストアが読めない日は拒否側へ倒すまでの運用記録です。

Stripe20課金設計権限管理Cloudflare Workers26収益化70

✦ プレミアム記事

4つ目の商品を足そうとして、決済後の処理を読み返した夜のことでした。そこには、支払いが完了したら会員権を書き込む、という一本道が書いてありました。

商品が1種類しかなかったころは、それで正しかったのです。チップを足し、月額を足し、記事の単体購入を足す段になって、同じ一本道が三度も危うくなりました。

最初にお伝えしたいのは、決済の成功が教えてくれるのは「お金が動いた」という事実だけ、という一点です。誰に何を開けてよいかは、決済側ではなく、こちらが発行のときに決めておくものでした。

支払いの成否は金額が答え、権限の範囲は発行時の宣言が答えます。 この二つを同じ if 文に押し込まないことだけ、いまは崩さないようにしております。

1つ足すたびに、成功の意味が変わりました

私が運用しているサイトには、性格の違う支払いが4つ並んでおります。少額のチップ、記事1本の単体購入、月額のプラン、そして買い切りの永久アクセスです。

入口は1つの Checkout エンドポイントにまとめてあります。まとめたほうが、成功後の戻り先・言語・キャンセル先の扱いを一箇所で揃えられるからです。

問題は出口のほうでした。4つとも payment_status: paid で戻ってきますので、受け取り側から見ると全部同じ顔をしております。

商品mode渡すもの保持期間
チップ(¥150)payment何も渡しません—
記事単体(¥200)paymentその slug だけ10年
Pro(¥580/月)subscription会員権31日(更新で延長)
Premium(¥2,480)payment会員権10年

この表の1行目が、いちばん間違えやすいところでした。応援していただいた¥150で永久アクセスが開いてしまう実装は、書こうと思って書くものではありません。「支払いが成功したら会員権」という一行が残っているだけで、そうなってしまうのです。

「払われた」と「何を開ける」は、別々に持ちます

金額で判定したくなる誘惑は、最初にきちんと断っておいたほうがよいと感じています。¥150 と ¥2,480 は見分けがつきますので、一見すると成立してしまうのです。

ところが金額は、こちらの都合で動きます。感謝価格を用意した日、単体購入を¥250から¥200へ下げた日、そして同じ商品を別通貨で並べた日に、判定表は毎回作り直しになります。

種別は動きません。「これはチップです」という宣言は、値段を変えても通貨を変えても、意味が変わらないのです。

ですので、発行の時点で種別を確定し、それを決済の外側まで運ぶ形にしました。Stripe の場合は Checkout Session の metadata がその器になります。詳しい仕様は Stripe の Checkout Session ドキュメント に書かれています。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦Stripe Checkout の成功をそのまま権限に変えている実装を、金額ではなく metadata で分岐する形へ自分の手で書き換えられるようになります
✦チップや記事単体の支払いで上位プランが開いてしまう事故を、本番に出す前に自分のコードから見つけられるようになります
✦権限ストアが一時的に読めない場面で「とりあえず見せる」と書いてしまう前に、どちらへ倒すかを自分の基準で決められるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ ビジネス2026-10-23
ストアごとに形の違う売上 CSV は、4列に寄せてから足します。月末の為替と、元通貨の合計を残しておく理由
App Store と Google Play の売上 CSV を、日付・アプリ・金額・通貨の4列に寄せて月別に集計する Python スクリプトです。読めない行を捨てない作り方と、為替を月末の固定値にする理由、元通貨の合計で突き合わせる手順をまとめました。
⟐ ビジネス2026-10-19
アプリに課金を入れる前に決める、特商法表記の住所と電話番号の扱い方
有料プランを入れると、個人でも特定商取引法の表記ページが必要になる場面があります。住所と電話番号を載せる・請求時に開示する・別住所を使う、の3択を、消費者庁ガイドの表記事項に沿って比べ、決める順番を整理します。
⟐ ビジネス2026-10-17
予約や物販のアプリで Stripe を使ってよいか — Apple の線引きは「どこで消費されるか」です
予約や物販のアプリに Stripe を入れてよいのか、アプリ内課金を求められるのか。App Review Guidelines の 3.1.1 と 3.1.3 を「どこで消費されるか」で読み分け、売るもの別の判定表と審査メモの書き方をまとめました。