Subscriptions Pluginの機能強化

こんにちは。このプラグインに以下の変更を加えましたが、DiscourseチームはPRを受け付けてくれますでしょうか。

また、皆様に詳細なテストを行っていただけると幸いです。現在、私にとって重要なシナリオでフローをテストしています。


元のプラグインは優れた基盤ですが、主にStripe経由の定期購読に焦点を当てています。以下の変更を行いました。

新機能と機能強化の概要

1. マルチプロバイダー決済システム(Razorpay対応) プラグインはStripeにハードコードされなくなりました。複数の決済ゲートウェイを可能にするプロバイダーベースのアーキテクチャを使用するようになりました。

  • Razorpay連携: Razorpayが2番目の決済プロバイダーとして完全に統合されました。これは、Razorpayが好まれるゲートウェイであるインドのような市場のコミュニティにとって不可欠です。
  • セキュアなWebhook: Razorpay連携は堅牢であり、決済後のブラウザをユーザーが閉じた場合でもサブスクリプションが欠落しないように、サーバー間での決済確認のためのセキュアなWebhookハンドラーが含まれています。

2. 期間指定可能な都度払いサブスクリプション 標準の定期購読を超えた、新しい柔軟な製品タイプを導入します。

  • 有効期限付きアクセス: 管理者は、指定された期間(例:7日間のイベントパス、30日間のトライアル、または90日間のパッケージ)のグループアクセスを許可する都度払いプランを作成できるようになりました。
  • 自動有効期限切れ: 期限切れのサブスクリプションをチェックし、関連グループからユーザーを削除するための日次バックグラウンドジョブが自動的に実行され、アクセス制御が完全に自動化されます。

3. 価格ページ全体のオーバーホール デフォルトのユーザー向けサブスクリプションページは、コンバージョンとユーザーエクスペリエンスを向上させるために完全に再構築されました。

  • モダンなカードベースUI: 古い製品リストは、読みやすく比較しやすい、クリーンでレスポンシブなカードベースのレイアウトに置き換えられました。
  • テーマ対応: 新しいデザインはDiscourseのテーマ変数を使用しており、ライトモードとダークモードの両方と完全に互換性があります。
  • シングルページチェックアウト: チェックアウトプロセス全体が価格ページで実行されるようになりました。「購読」をクリックすると、ページ上に直接決済フォームが表示され、冗長なステップが排除され、ユーザーの負担が軽減されます。

4. 高度なアップセルと価値表示ロジック 新しい価格カードは、強力なアップセルツールとして設計されています。

  • 実効月額コスト: UIは、すべてのプランタイプ(3ヶ月または年間の都度払いプランを含む)の「月額コスト」を自動的に計算して表示し、ユーザーがさまざまなオプションの価値を簡単に比較できるようにします。
  • 明確な割引: 長期プランには「₹X節約」バッジが自動的に表示され、基本プランよりも価値の高いプランを選択するメリットが明確に伝えられます。

5. 一元化された管理者とユーザーダッシュボード 管理者とユーザーの請求ページの両方が、よりシンプルで強力になるようにリファクタリングされました。

  • 単一の一元化されたビュー: 支払いタイプごとに別々のリストがあったものが、すべてのプロバイダー(Stripe、Razorpay、手動)からのすべてのサブスクリプションを表示する単一のテーブルになりました。
  • 明確な情報: これらのビューには、プロバイダー、ステータス、有効期限/更新日、および各トランザクションの金額が明確に表示され、管理者とユーザーの両方にエンタイトルメントの完全な履歴を提供します。

6. 管理者向けのサブスクリプションの手動管理 管理者がより多くの制御を行えるように、新しいツールセットが追加されました。

  • サブスクリプションの付与: 管理者は、特定の期間、任意のサブスクリプションプランを任意のユーザーに手動で付与できるようになりました。これは、オフライン決済の処理、無料アクセスの提供、または修正を行う場合に最適です。
  • アクセス権の取り消し: 非定期購読プランのアクセスは、管理者ダッシュボードから即座に取り消すことができます。

7. グループ管理の重大なバグ修正

  • 元のグループ削除ロジックの重大なバグが修正されました。サブスクリプションがキャンセルまたは取り消された場合、システムは、ユーザーが同じグループに対して他に有効なサブスクリプションを持っているかどうかを確認する「安全チェック」を実行するようになりました。ユーザーは、他に有効なアクセス方法がない場合にのみグループから削除され、ユーザーが誤って削除されるのを防ぎます。
「いいね!」 4

GitHubリポジトリへのリンクを含めることはできますか?

「いいね!」 1

はい、もちろんです。1日ください。新しいフィールドを持つこのプラグインバージョンに切り替える際に、Stripeのレガシーデータの処理に関連するいくつかのバグを修正しています。

リポジトリとともに最初の投稿を更新しました。

セットアップと設定ガイド

このガイドでは、必要な支払いプロバイダーの設定と、最初の製品およびプランの作成について説明します。

1. プロバイダーの設定

まず、Admin > Settings > Plugins に移動し、discourse_subscriptions_payment_provider 設定からプライマリ支払いプロバイダーを選択します。次に、以下の選択したプロバイダーの手順に従ってください。

A) Stripe の設定

プロバイダーとして Stripe を選択した場合:

  1. API キーの入力: Discourse の設定で、Stripe API キーを入力します。
  • discourse_subscriptions_public_key (Stripe の公開可能キー)
  • discourse_subscriptions_secret_key (Stripe のシークレットキー)
  1. Webhook の設定: この手順は、定期的な支払い、キャンセル、その他のサブスクリプションイベントの追跡に不可欠です。
  • Stripe ダッシュボードで、Developers > Webhooks に移動します。
  • **「エンドポイントの追加」**をクリックします。
  • Endpoint URL に以下を入力します。
    https://your-discourse-url.com/s/hooks
  • **「イベントの選択」**をクリックし、次の 3 つのイベントを追加します。
    • checkout.session.completed
    • customer.subscription.deleted
    • customer.subscription.updated
  • **「エンドポイントの追加」**をクリックします。
  • 次のページで、Signing secret ( whsec_... で始まります) を見つけます。
  • このシークレットをコピーして、Discourse の discourse_subscriptions_webhook_secret 設定に貼り付けます。
B) Razorpay の設定

プロバイダーとして Razorpay を選択した場合:

  1. API キーの入力:
  • Razorpay ダッシュボードで、Settings > API Keys に移動して新しいキーペアを生成します。
  • キーをコピーして、対応する Discourse 設定に貼り付けます。
    • discourse_subscriptions_razorpay_key_id
    • discourse_subscriptions_razorpay_key_secret
  1. Webhook の設定: この手順は、支払いが正常にキャプチャされたことを確認するために不可欠です。
  • Razorpay ダッシュボードで、Settings > Webhooks に移動します。
  • **「+ 新しい Webhook を追加」**をクリックします。
  • Webhook URL に以下を入力します。
    https://your-discourse-url.com/s/hooks/razorpay
  • Secret を作成し、次のステップのために安全に保管してください。
  • Active Events で、payment.captured のみを選択します。
  • **「Webhook を作成」**をクリックします。
  • 作成したシークレットをコピーして、Discourse の discourse_subscriptions_razorpay_webhook_secret 設定に貼り付けます。

2. 製品とプランの作成

Admin > Plugins > Subscriptions に移動して、製品とプランを管理します。

製品の作成
  1. Products タブに移動します。
  2. **「Create New Product」**をクリックします。
  3. 詳細を入力します。「Description」フィールドはマークダウンをサポートしており、新しい価格設定ページでユーザーに表示されます。
製品のプラン作成
  1. 製品を作成したら、その横にある編集アイコン (✎) をクリックします。
  2. **「Pricing Plans」セクションで、「Add New Plan」**をクリックします。
  3. 2 種類のプランを作成できます。
  • 定期プラン (例: 月次/年次) を作成する場合:
    • **「Recurring Plan?」**ボックスをチェックします。
    • AmountBilling Interval (月、年など) を設定します。
    • User Group に割り当てます。
  • 一度限りの期間限定プラン (例: 30 日パス) を作成する場合:
    • 「Recurring Plan?」ボックスをチェックせずにそのままにします。
    • Amount を設定します。
    • 新しいフィールド **「Duration (in days)」**が表示されます。ユーザーがアクセスできる日数を入力します (例: 30)。
    • User Group に割り当てます。

3. 新しい管理ツール

このバージョンには、サブスクリプションを手動で管理するための新しいツールが含まれています。

  • サブスクリプションの付与:
    • メインの Admin > Plugins > Subscriptions ページから、**「Grant Subscription」**ボタンをクリックします。
    • 表示されるモーダルで、ユーザー名とプランを選択します。
    • 選択したプランが一度限りのプランの場合、日数を指定できます。これを空白のままにすると、ユーザーは関連グループへの永続的なアクセス権を付与されます。
  • サブスクリプションの取り消し:
    • 管理セクションの Subscriptions タブに移動します。
    • 非定期サブスクリプション (つまり、手動または Razorpay) には、**「Revoke Access」**ボタンがあります。
    • これをクリックすると、ユーザーは直ちに関連グループから削除され、アクセスが終了します。
「いいね!」 3

以下の変更/修正を加えてリポジトリを更新しました。これで、本番サイトにインストールして使用する準備が整いました。

安定性とセキュリティ強化の概要

1. 最新のStripe Checkout連携 プラグインが、最新のStripe Checkoutリダイレクトベースのフローを使用するように更新されました。

  • 意味すること: オンページクレジットカードフォームの代わりに、ユーザーは支払いを完了するために安全なStripeホストページにリダイレクトされます。
  • 利点: これはStripeが推奨する方法です。セキュリティが向上し、サイトのPCIコンプライアンスの負担が軽減され、Apple PayやGoogle Payなどのサポートにより、より良いユーザーエクスペリエンスを提供します。

2. 確実な再購入ロジック 既にアクティブなサブスクリプションを持つ製品をユーザーが再購入できないようにするロジックが完全にオーバーホールされました。

  • 修正内容: product_idを各ローカルサブスクリプションレコードに追加しました。チェックは、外部API呼び出しを一切行わずにローカルデータベースに対する単純で非常に高速なクエリで行われるため、100%信頼性が高くなりました。
  • 結果: アクティブなサブスクリプション(定期または期限付き)を持つユーザーは、それが期限切れになるまで、同じ製品の再購入を正しくブロックされるようになります。

3. すべてのダッシュボードでのデータ整合性 ユーザー請求ページと管理者サブスクリプションダッシュボードが、常に正確でリアルタイムなデータを表示するように修正されました。

  • 修正内容: 両ページとも、支払いプロバイダー(Stripe)から直接、すべてのサブスクリプションの最新のステータスと更新/有効期限を取得するようになりました。
  • 結果: 管理パネルに表示される内容は、ユーザーが見ている内容と常に一致し、両方ともStripeでのサブスクリプションの真の状態を反映します。プラン詳細に「N/A」と表示されるバグや、誤った「アクティブ」ステータスは解決されました。

4. 強力なWebhookとジョブ処理

  • 重複サブスクリプションの解消: Webhookハンドラーが修正され、Stripeからのイベントシーケンスを正しく処理し、1つのトランザクションで正確に1つのサブスクリプションレコードが作成されるようになりました。
  • 信頼性の高い有効期限切れジョブ: ワンタイムプランの有効期限を処理する毎日のバックグラウンドジョブが強化されました。必要なAPIキーが正しく設定され、元のプランがStripeから削除された場合でもサブスクリプションの有効期限が切れるようになり、グループ権限が常に正確であることが保証されます。
「いいね!」 1

わあ、これらの変更をしてくれてありがとうございます!

現状では、非常に大きな変更を一度にマージすることはできません。これらの変更を discourse-subscriptions プラグインにマージしたい場合は、各変更を個別に抽出し、テストを含む個別の PR を作成する必要があります。また、現在サブスクリプションプラグインを使用しており、すでに多くの加入者がいる既存のユーザーに対して、破壊的な変更がないことを確認してください。

「いいね!」 5

承知いたしました、ありがとうございます。仕様を検討した後、時間をかけて複数のPRを作成します。

「いいね!」 5