WooCommerce でライセンスキーを発効し販売

はじめに

Web サービスを構築していますが、その中で課金を行う為に、以前プラグインを2つ開発しました。課金を行って制限を解除するという事をやっています。ただ EC 関連は、日進月歩で目まぐるしく仕様が変化しそれに合わせていかねばなりません。そのあたりに限界を感じ、「餅は餅屋」ということわざにならい、EC 関連は、WooCommerce に任せる事にしました。

WooCommerce でサービス販売時にライセンスキーを発効して、ユーザーにライセンスキーを入力していただき制限を解除する事を考えてみました。テーマ販売や、プラグイン販売にも応用できると思います。

プラグイン

以下のプラグインを使用します。

販売

800万以上サイトで有効化中

ライセンスキー管理

900以上サイトで有効化中

また、上記2つのプラグインの仲立ちをする以下のプラグイン2つを開発しました。

WooCommerce でライセンスキーを発効

ライセンスキーを有効化・無効化するフォームをショートコードで埋め込む

実際の流れ

WooCommerce で商品を作成

商品の設定

商品データーは、基本的な商品とし、バーチャルチェックします。また、Add License Key をチェックし、以下の値を設定します。

  • Max allowed domains : ライセンス認証可能ドメイン数です。1以上の整数を指定します。
  • Expiry days : ライセンス認証の期限です。これは、ライセンスそのものの期限では無く認証の期限です。期限前に認証が済んでいれば、期限後もライセンスは継続されます。 日にちを指定します。

Software License Manager の設定画面でキーを確認

Software License Manager の設定画面
  • Secret Key for License Creation は、ライセンスキーを1回毎に発効するための元のキーです。

Software License Manager for WooCommerce を設定

Software License Manager for WooCommerce の設定画面
  • License Server URL : Software License Manager が動作するサーバーの URL です。これは、別サーバーでも動作します。デフォルトでは、同サーバーの URL が入ります。
  • Secret Key for License Creation : Software License Manager のものと同じものを入力します。

商品購入時の画面とメール

商品購入画面
商品を購入した際のメール
  • 商品を購入すると、購入画面とメールに、ライセンスキーが付加されます。

受注

受注画面
  • 受注画面から、ライセンスキーが確認できます。

クライアント側でのライセンスキー認証

クライアント側で、 Software License Manager Client を利用します。ショートコードを投稿や固定ページ内においたり、プラグインやテーマ内に書き込んで使用します。

Software License Manager の設定画面
  • Secret Key for License Verification Requests は、認証用のキーです。ライセンスキーとこのキーで認証を行います。

Software License Manager Client を設定

Software License Manager Client の設定画面
  • 管理画面がありますが、 ライブラリとしてプラグインやテーマに組み込むことができます。 その場合は、「license-checker/class-slmclient.php」と「license-checker/jquery.slmclient.js」をプラグインやテーマにコピーし、以下のように使用してください。
/* Javascript を読み込む URL を指定してください。 */
class-slmclient.php 46 行
$this->script_url = *********** . 'license-checker/jquery.slmclient.js';

/* サンプル1 属性無しで書くと、管理画面で設定した値を利用します。 */
if ( ! class_exists( 'SlmClient' ) ) {
	require_once dirname( __FILE__ ) . 'class-slmclient.php';
}
echo do_shortcode('[slmcl]');

/* サンプル2 属性を付加して書くと、その値を優先し、管理画面で設定した値は無視します。 */
if ( ! class_exists( 'SlmClient' ) ) {
	require_once dirname( __FILE__ ) . 'class-slmclient.php';
}
echo do_shortcode('[slmcl item_reference="test_plugin" sales_site_url="https://test.com/product/test2/" license_server_url="https://test.com/" special_secretkey="5d1291a361ef14.63243498"]');
  • ショートコードの属性は以下の通りです。
    • item_reference : 名前です。ライセンスが認証されたら、オプションテーブルに、license_key_*** という名前で中身がライセンスキーのものを書き込みます。例えば、item_reference が、test だったら、 license_key_test になります。プラグインやテーマからライセンスの有無を調べるには、このオプションテーブルの有無を get_option で調べるだけです。管理画面では、Name に該当します。
    • sales_site_url : WooCommerce の入ったショッピングサイトの商品の URL です。フォーム内の Purchase(購入)ボタンに対応します。管理画面では、Sales Site URL に該当します。
    • license_server_url : Software License Manager が動作するサーバーの URL です。これは、別サーバーでも動作します。デフォルトでは、同サーバーの URL が入ります。管理画面では、License Server URL に該当します。
    • special_secretkey : Software License Manager の設定画面にある、Secret Key for License Verification Requests です。管理画面では、Special Secret Key for License に該当します。
  • また、ライセンスキーを無効化する際のアクションフックを提供しています。
/* サンプル1 配列無しで書くと、管理画面で設定した値を利用します。 */
do_action( 'deactive_slm_key', $arg = array() );

/* サンプル2 配列を付加して書くと、その値を優先し、管理画面で設定した値は無視します。 */
$arg = array( 'item_reference' => 'test_plugin', 'sales_site_url' => 'https://test.com/product/test2/', 'license_server_url' => 'https://test.com/', 'special_secretkey' => '5d1291a361ef14.63243498' );
do_action( 'deactive_slm_key', $arg );
  • アクションフックの配列の属性値は、上記のショートコードの属性値と同じです。

ライセンス認証

実際に、ショートコードを組み込んだプラグインの認証画面を以下に示します。※ プラグインは、Add Mulitple User です。

  • メールで送られてきたライセンスキーを入力して Activate ボタンで認証します。
  • License Key が送信されると入力不可になり、Confirm(確認)ボタンを押します。
  • 認証されると、License Key が表示されたままになります。

サーバー側でのライセンス管理

Software License Manager のライセンス管理画面を見るとライセンスキーがあり、ステータスactive になっているのが見てとれます。

終わりに

自分の以下の プラグインや Web サービスにこのシステムを適用させました。


Comments

“WooCommerce でライセンスキーを発効し販売” への7件のフィードバック

  1. こんにちは、
    記事拝見させて頂き、ライセンス番号発行のソフトウェア販売ECサイトを開始することができました。ありがとうございました。
    この度2つ目のソフトウェアを販売しようとしたのですが、このSLMは決済時にproduct情報を記録しないため、ライセンス認証の時に製品を特定できません。安い方の製品のライセンス番号で、高い方の製品のアクティベートができる状態になってしまいます。
    決済時に製品情報を記録する方法はないのでしょうか?
    PHPのコードを調べてproduct_refに記録しようとしましたが、知識が足りずproduct情報を引っ張ることができませんでした。
    何かお知恵ありましたら情報いただけると幸いです。

    1. Katsushi Kawamoriのアバター
      Katsushi Kawamori

      別の記事、「ライセンスキー認証でプラグインの更新を制御」も参考にしてください。コツは、’$licensecheckermyplugin’、’LicenseCheckerMyPlugin’、’plugin_license_key_page_my_plugin’、をそれぞれ別名にする事です。

  2. 早速のご返答ありがとうございます。
    別の記事を見させて頂きました。
    説明不足のところがあるのと、私の理解不足で間違った質問をしていると思われますが、失礼ながら今一度説明させてください。

    取り扱っているものはwindowsソフトウェアです。
    そして「Software License Manager for WooCommerce」を利用させて頂いていますが、「Software License Manager Client」は使用しておりません。
    ソフトウェア上からREST APIを使用し、ライセンス認証と使用PCを特定できるDomain情報を登録しております。

    「購入時にライセンス番号生成」→「ソフトウェアからアクティベーション」となりますが、前述のとおり、購入時にライセンステーブルへ製品情報が記録されていないため、アクティベーション時にどの製品のアクティベーションかわからない状態です。ライセンス番号と製品が一致した時のみアクティベーションを通したいのです。(他の製品のライセンス番号でアクティベーションさせないため)

    「Software License Manager Client」もテストしてみましたが、製品ごとにアクセスできるよう処理を分割すれば”アクティベーション時”にそれぞれの登録ができる、と理解しましたが合っているでしょうか?

    私の目的では”購入時”に製品の登録が必要だと思っています。購入時の登録に絡むのが「Software License Manager for WooCommerce」のclass-slmforwoocommerce.phpだと思い眺めてみても、私のPHPの知識では修正ポイントがわかりませんでした。

    見当違いかもしれません、検討すべきところご指摘頂けたら有り難いです。
    よろしくお願いいたします。

    1. Katsushi Kawamoriのアバター
      Katsushi Kawamori

      言われている事が少しわかってきました。現状では難しいですが、新しいプラグイン「WooCommerce でライセンスキーを発行するプラグイン及びそれを Web サービスで利用するためのコード」を改変すると、上手くいくかもしれません。このプラグインは販売サイト上の REST API で、暗号化されたライセンスキーを、インデックス配列で出しているのですが、商品 ID をキーとして配列で出し、そちらの Windows ソフト内で、openssl で復号化できれば、ご希望の事ができるかもしれません。

  3. 情報ありがとうございます。
    ご紹介頂いたプラグインで情報取れそうですね。
    様々なプラグインを開発されていて頭が下がります。
    OpenSSLをC#でやり取りする方向でトライしてみます。

    野良プログラマの質問にお付き合いくださり感謝いたします。
    ありがとうございました。
    河森様の益々のご発展をお祈り申し上げます。

    1. Katsushi Kawamoriのアバター
      Katsushi Kawamori

      前述のプラグインですが、REST API の出力を、最新の ver 1.02 において商品 ID をキーとし、ライセンスキーを暗号化したものを値としました。

  4. 度々すみません。
    REST APIで取得、OpenSSLで復号、トライしてみます。
    ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.