Simple Membershipプラグイン(WordPressプラグイン)のおぼえがき

目次

はじめに

当記事は筆者が以前仕事で使用したWordPressプラグインである「Simple Membership」についてのおぼえがきです。 筆者と同様の問題で躓いた方の助けになれば幸いです。

本章以降の内容はすべて以下の環境で利用したもので、変化がある可能性があります。 最新の情報については、各プラグインの公式ページを参照してください。 また、本記事では決済方法としてPayPalを利用することを前提としています。

名称 バージョン
WordPress 5.4.2
Simple Membership 3.9.7
Loco Translate 2.3.3

Simple Membershipについて

Simple Membershipプラグイン(https://simple-membership-plugin.com/)は、WordPressでのメンバーシップ管理を実装するプラグインです。 有料会員限定コンテンツの実装とPayPalやStripeを通じた支払い設定を手軽に行えるプラグインとして人気があるようです。

導入すると有料コンテンツ閲覧のための支払いの斡旋ページの生成、有料登録時のメール認証、会員ランクによるページの出し分け、 会員プロフィールなどの機能が利用できます。

Loco Translateを導入したが一部の翻訳がされていない

Loco Translate内のデータが不完全なようです。

wp_content/plugins/simple-membership/languages/simple-membership-ja.po wp_content/plugins/simple-membership/languages/simple-membership-ja.mo

上記の2ファイルを

wp_content/languages/plugins/

に移動します。

有料登録プロセス

Simple Membershipの有料登録までのプロセスは2つあります。公式ドキュメント

  1. 未登録→支払い→有料会員
    1. PayPalの支払いボタンをクリックし、決済を行う
    2. 利用した決済サービスに登録したメールアドレス宛に、ユーザ情報登録のリンクを含んだメールが届く
    3. リンク先でユーザ情報の登録を行う
    4. 登録ユーザが有料会員として追加される
  2. 未登録→無料会員→支払い→有料会員
    1. 無料会員用の登録フォームから無料会員登録をする
    2. PayPalの支払いボタンをクリックし、決済を行う
    3. 登録ユーザが有料会員として追加される

初期状態は無料会員の設定が存在せず、1の状態です。(無料会員設定の作成方法は公式ドキュメントの無料会員追加方法のページに委ねます)

注意点は、1の支払いも2の支払いも同じ支払いボタンで行われるということです。

無料会員状態を必ず経由させる場合は、支払いボタンを未登録のユーザに表示させないようにする必要があります。

無料会員を有料会員に格上げする目的で設置した支払いボタンから未登録ユーザが支払いを行っても有料会員になってしまうため、未登録ユーザが利用できないような形式にしましょう。

有料登録(定期購読)したユーザの登録解除

Simple Membershipは外部サービスを利用して決済を行うため、WordPressのページ上からは登録解除を行うことができません。

PayPalで定期購読しているユーザが登録解除を行いたい場合は、PayPal上から登録解除を行う必要があります。

これは運営側が強制的に定期購読をやめさせたい場合も同様にPayPal上から登録解除を行わなくてはいけません。仕組みは後述しますが、 月額制のWebサイトを運営する場合はこれによって問題が発生しかねないため注意してください。

定期購読の支払い時差による二重支払いリスク

Simple Membershipは定期購読の実装が可能なため、有料会員の有効期限を設定可能です。(公式ドキュメント)

有効期限を設定している場合、Simple Membershipは日付が変わった時点でその日の日付と支払いが行われた日付を比較し、有効期限切れであれば期限切れアカウントとして処理します。 しかし、PayPalは「登録を行った時間」を支払い更新時間とするため、支払い周期と有効期限が同じである場合にその時差の間は期限切れになってしまいます。

f:id:tolt:20200918015347p:plain
更新時間の差による期限切れ発生時間
その間に新たに支払いを行ってしまうと二重支払いとなってしまうため、Simple Membership側の有効期限を少し長めに設定することにより回避することをおすすめします。

localhostでテストをする際PayPal決済をしても登録できない

PayPalの即時決済情報(IPN)が届いていないことが原因です。PayPalのIPN情報が届くような環境を作る必要があります。

PayPalのIPNとは

IPNとは、決済ボタンなどPayPal外部からPayPalにアクセスして決済を行った場合に、PayPalから外部Webサイトに向けて支払いが行われた旨を伝えるために送られる通知で、この情報を受け取りSimple Membershipは有料登録が行われたと判断します。

送信されたIPNはIPN送信履歴ページ(要ログイン)で確認することができます。 この履歴が「再試行中」や「失敗」になっているなら、そのIPNは正常に届いていません。

PayPal IPNの設定については、公式ドキュメントをはじめに参照してください。 また、PayPalには実際の金銭を扱わず取引テストを行えるサンドボックス機能が存在するため、そちらの利用も合わせてお勧めします。

localhostでIPNを受信する

localhost上で決済ボタンを押した場合、PayPalhttp://localhost:[port]に向かってIPNを送信しようとしますが、当然localhostには届きません。 その対策として、localhostの環境をngrokで一時的に外部公開し、そのURL(https://ngrok.io/[address])から決済を行うことで受信することができます。

ngrok経由で決済を行った場合にも「再試行中」と表示されて正常にIPNが送信されないことがあり、 その原因の一つとしてIPN応答先情報(IPNを送る先)のURLにhttps:が抜けてしまっている場合があります。 これは力技ですが、Simple Membershipが生成するPayPal決済ボタンのソースを書き換えることで対応可能です。

wp-content/plugins/simple-membership/views/payments/payment-gateway/paypal_button_shortcode_view.php

に存在するswpm_render_pp_subscription_button_sc_output関数のnotify_urlを、

$notify_url = 'https:' . SIMPLE_WP_MEMBERSHIP_SITE_HOME_URL . '/?swpm_process_ipn=1';

に変更することで対処できます。プラグインのソースを書き換えているため、決済できることが確認できたら戻すことをお勧めします。

ローカル環境でメール送信ができない

WP Mail SMTPを導入してください。