Commerce License
Commerce製品を通じてロールなどのサイトリソースへのアクセスを販売するためのフレームワークを提供します。
commerce_license
インストール
composer require 'drupal/commerce_license:^3.0'
composer require 'drupal/commerce_license:8.x-2.0'
概要
Commerce Licenseは、サイトの特定の機能へのアクセスを販売する製品の作成を可能にします。これはロール、Nodeの公開、またはカスタムライセンスタイププラグインによって制御されるその他のアクセス権限などが該当します。
製品が購入されると、ユーザー用のLicenseエンティティが作成されます。Licenseエンティティが付与するものの性質はライセンスタイププラグインによって処理され、各Licenseエンティティは1つのライセンスタイププラグインに関連付けられます。ライセンスを販売する製品バリエーションには、ユーザーがその製品バリエーションを購入した際にライセンスを作成するためのテンプレートとして機能する、設定済みのライセンスタイププラグインフィールド値があります。
このモジュールは、新規、保留中、アクティブ、一時停止、期限切れ、取り消し、キャンセルなどの状態を含むライセンスの包括的なワークフロー管理を提供します。Commerce Checkoutと統合して認証済みユーザーのみがライセンスを購入できるようにし、オプションでCommerce Recurringと統合してサブスクリプションベースのライセンス更新をサポートします。
Features
- 設定可能なワークフロー状態(new、pending、active、renewal_in_progress、suspended、expired、revoked、canceled、failed)を持つLicenseエンティティタイプ
- ライセンスのアクティブ化/非アクティブ化時にユーザーロールを付与/取り消すRoleライセンスタイププラグイン
- Unlimited、Rolling Interval、Fixed Reference Date Intervalの期間プラグインによる柔軟なライセンス有効期限システム
- 製品バリエーション用('Provides a license')および注文アイテム用('Provides an order item type for use with licenses')のエンティティトレイト
- 注文の支払い時または注文確定時の自動ライセンスアクティブ化(製品バリエーションタイプごとに設定可能)
- 設定可能なウィンドウ内で有効期限前に顧客が再購入できるライセンス更新サポート
- Advanced Queue統合による信頼性の高い処理を伴うCronベースの自動ライセンス期限切れ処理
- ライセンス期限切れ時にユーザーに送信されるメール通知
- 設定要件と検証のステータスレポートを提供するライセンスダッシュボード
- フィルタリングと一括操作が可能なすべてのライセンスを管理するViewsベースの管理インターフェース
- ライセンス状態変更を追跡するCommerce Log統合
- 自動更新されるサブスクリプションベースのライセンス用のオプションのCommerce Recurring統合
- ユーザーが既に持っているライセンスの購入を防ぐ既存権限チェック
- ライセンス付与されたロールの手動削除を防ぐユーザー編集フォームでの付与ロール保護
Use Cases
ロールベースのアクセスを持つ会員制サイト
ユーザーがプレミアムコンテンツへのアクセスを購入する会員制サイトを作成します。適切な権限を持つ「プレミアム会員」ロールを設定し、このロールを付与するライセンストレイトを持つ製品バリエーションを作成し、有効期限(例:1年のローリングインターバル)を設定すると、ユーザーが製品を購入したときに、設定された期間自動的にロールを受け取ります。ライセンスが期限切れになると、ロールは自動的に削除されます。
ソフトウェアライセンス販売
ライセンスがダウンロードまたはサポートエリアへのアクセスを提供するロールを付与する、期間限定のソフトウェアライセンスを販売します。ローリングインターバルの有効期限を使用して、購入から一定期間有効なライセンスを提供します。顧客はライセンスが期限切れになるとメール通知を受け取り、更新のために再購入できます。
Commerce Recurringによるサブスクリプションベースのアクセス
ライセンスが支払いとともに自動更新される定期サブスクリプション製品を作成します。ライセンストレイトとサブスクリプショントレイトの両方を持つ製品バリエーションを設定し、ライセンスの有効期限を「Unlimited」に設定し、請求スケジュールを選択します。サブスクリプションが支払いと更新を処理し、ライセンスがアクセスを処理します。サブスクリプションがキャンセルされると、ライセンスは自動的にキャンセルされます。
固定更新日を持つ年間会員
購入時期に関係なく、すべて同じ日(例:12月31日)に期限切れになる会員を実装します。基準日を1月1日、インターバルを1年とした「Interval based on reference date」有効期限タイプを使用します。すべてのライセンスが年末に期限切れになり、同期された更新期間を作成します。
早期更新ウィンドウ
顧客が有効期限前にライセンスを更新できるようにします。製品バリエーションタイプで「Allow renewal before expiration」を有効にし、更新ウィンドウ(例:30日)を設定します。更新ウィンドウ内のアクティブなライセンスを持つ顧客は、ライセンスを延長するために再購入できます。有効期限は更新日からではなく、現在の有効期限から延長されます。
Tips
- /admin/commerce/config/licenses/dashboardのライセンスダッシュボードを使用して、チェックアウトフローから製品までのライセンス設定チェーン全体を検証してください。
- テスト用に、最小限のステップを持つシンプルなチェックアウトフローを作成しますが、ゲストチェックアウトは必ず無効にしてください。
- Commerce Recurringをサブスクリプションに使用する場合、サブスクリプションがライフサイクルを制御するため、常にライセンスの有効期限を「Unlimited」に設定してください。
- Roleライセンスタイプは、ユーザー編集フォームで付与されたロールを保護し、管理者がライセンス付与されたロールを誤って削除することを防ぎます。
- 有効にすると、ライセンス状態の遷移はCommerce Logに記録され、ライセンス変更の監査証跡を提供します。
- カスタムライセンスタイプは、LicenseTypeInterfaceを実装することで作成できます。ロール以外のカスタム機能へのアクセスを付与するのに便利です。
- 期限切れメールテンプレート(commerce-license-expire.html.twig)は、テーマでオーバーライドして通知メールをカスタマイズできます。
Technical Details
Admin Pages 7
/admin/commerce/licenses
システム内のすべてのライセンスを表示および管理します。ID、ラベル、ライセンスタイプ、所有者、状態、付与日、有効期限、更新日のカラムを持つフィルタリング可能なテーブルですべてのライセンスを一覧表示します。削除を含む一括操作をサポートします。
/admin/commerce/config/licenses
ライセンスダッシュボードとライセンスタイプ管理へのアクセスを提供するライセンス設定セクション。
/admin/commerce/config/licenses/dashboard
完全なライセンス設定チェーンを検証する包括的なステータスレポートを表示します。チェックアウトフロー、注文タイプ、注文アイテムタイプ、製品バリエーションタイプ、製品タイプ、製品のステータスを表示し、ライセンス販売用のすべてのコンポーネントが適切に設定されていることを確認します。
/admin/commerce/config/licenses/license-types
ライセンスタイプバンドルごとにライセンスエンティティのフィールド、フォーム、表示設定を管理します。
/admin/commerce/licenses/{commerce_license}
タイプ、所有者、状態、ライセンス対象の製品バリエーション、有効期限タイプ、作成/付与/更新/期限切れのタイムスタンプ、アクティビティログを含むすべてのフィールドを表示する単一のライセンスエンティティを表示します。
/admin/commerce/licenses/{commerce_license}/edit
ライセンスエンティティの編集フォーム。所有者情報、利用可能なトランジションを含むライセンス状態、タイムスタンプ(期限切れ、更新、付与、変更、作成)、ライセンスタイプ固有のフィールドを表示します。
/admin/commerce/licenses/add/{type}
新しいライセンスを手動で作成するための管理フォーム。これは通常の製品購入フローをバイパスするため、その影響を理解している管理者のみが使用してください。
権限 9
Hooks 2
hook_commerce_license_type_info_alter
利用可能なライセンスタイププラグインのリストを変更します。プラグインの削除やプラグインラベルの変更に使用できます。
hook_commerce_license_period_info_alter
利用可能なライセンス期間プラグインのリストを変更します。プラグインの削除やプラグインラベルの変更に使用できます。
Troubleshooting 6
チェックアウトフローがゲストチェックアウトを許可していないことを確認してください(Loginペインで'Guest checkout: Not allowed'が必要)。注文アイテムタイプに'Provides an order item type for use with licenses'トレイトがあることを確認してください。/admin/commerce/config/licenses/dashboardのライセンスダッシュボードを使用して設定を検証してください。
製品バリエーションの'Activate license when order is placed'設定が期待する動作と一致していることを確認してください。非同期の支払いゲートウェイを使用している場合、ライセンスはORDER_PAIDイベントを介した支払い確認でアクティブ化されます。
既存権限チェッカーがこれを防ぐはずです。ライセンスタイププラグインがExistingRightsFromConfigurationCheckingInterfaceを実装し、checkUserHasExistingRights()メソッドが適切な結果を返していることを確認してください。
Cronが定期的に実行されていることを確認してください。Advanced Queueモジュールが適切に設定され、'commerce_license'キューが処理されていることを確認してください。commerce_license.cronサービスはCron中に期限切れジョブをキューに入れ、Advanced Queueがそれらを処理します。
ライセンスのlicense_roleフィールドに正しいロールが設定されていることを確認してください。RoleライセンスタイププラグインのgrantLicense()およびrevokeLicense()メソッドによってユーザーエンティティが適切に保存されていることを確認してください。
サブスクリプションを使用する場合、ライセンスの有効期限が「Unlimited」に設定されていることを確認してください。サブスクリプションがライフサイクルを制御するため、ライセンスは独立して期限切れになるべきではありません。LicenseSubscriptionTypeプラグインがサブスクリプションイベントを処理していることを確認してください。
Security Notes 5
- 'administer commerce_license'権限は'restrict access'としてマークされており、信頼できる管理者にのみ付与する必要があります。
- 'access commerce_license overview'権限も制限されており、システム内のすべてのライセンスを表示するアクセスを提供します。
- ライセンスタイププラグインはユーザー権限をエスカレートできます(例:管理者ロールの付与)。モジュールは、製品バリエーションで許可されたライセンスタイプのみが選択できることを検証します。
- ライセンスを直接作成/編集する管理フォームは、その影響を理解している開発者のみが使用する必要があります。値の変更はライセンス状態の一貫性を壊す可能性があります。
- ライセンスが常に認証済みユーザーに関連付けられるようにするため、ライセンス販売のチェックアウトフローではゲストチェックアウトを無効にする必要があります。