MagentoにはCommunity Edition 1.4ごろから継続課金(Recurringといいます)の仕組みが備わっています。
ずっとベータ版の扱いになっているのですが、ある程度までは実用として使えます。

このエントリではMagentoの継続課金がどのような仕組みになっているかを解説します。
これから継続課金を始めたい方に参考になれば幸いです。 

継続課金の基本的な流れ

Magentoにおける継続課金は以下のような流れで構成されています。

  1. 商品をカートに入れる
  2. 購入手続きを行う
  3. システムによる継続課金プロファイルの作成
  4. 課金タイミングごとに課金処理の実施

2までは普通の処理と何も変わりません。ですが、3と4は継続課金特有の処理です。
普通の処理では3のタイミングで注文データが作成されますが、継続課金では作成されません

継続課金プロファイルとは

継続課金プロファイルは、

  • どの商品を
  • いくらで
  • どのタイミング(日次・週次・月次・年次)で
  • いつまで

課金するかを管理しています。

継続課金では、注文完了時点で注文データが作成されないかわりに継続課金プロファイルというデータが作成されます。
このデータは注文データそのものではありませんが、このデータをもとにして都度の注文データを作成することになります。

継続課金と商品

Magento上で継続課金に利用できる商品は、商品管理画面で設定することができます。
すべての商品には「Recurring Profile」というタブが用意されていて、ここで設定した内容が継続課金に反映されます。

継続課金の設定

ただ、継続課金用に用意した商品は通常の商品とは別の扱いになってしまうことに注意してください。
継続課金を有効にした商品は、継続課金に対応した決済方法以外では購入できなくなるうえ、他の商品と一緒に購入することもできません。 

継続課金と決済方法

Magentoで継続課金を利用する場合、決済方法が対応している必要があります。
もしも、決済方法がひとつも対応していない場合は継続課金に対応した商品がサイト上に掲載されていても、購入することが出来ないので注意が必要です。

決済方法を継続課金に対応させるには

Magentoの決済方法は、Mage_Payment_Model_Method_Abstractを継承して実装します。
継続課金に対応させる場合は、これに加えて、Mage_Payment_Model_Recurring_Profile_MethodInterfaceを実装する必要があります。
このインターフェイスクラスには、

  • validateRecurringProfile
  • submitRecurringProfile
  • getRecurringProfileDetails
  • canGetRecurringProfileDetails
  • updateRecurringProfile
  • updateRecurringProfileStatus

という6つのメソッドが定義されていて、これら全てを実装しなければ継続課金を利用することはできません。

そしてMagento標準ではPaypal Express Checkoutのみが継続課金に対応しています。
いざオリジナルの実装をする際にはこの実装は大いに参考になるでしょう。 

PayPal Express Checkoutの実装

PayPal Express CheckoutはMagentoに標準で用意されているPayPal連携の実装の一つです。
別画面(PayPalの画面)に遷移するだけでなく、継続課金に関する実装や、支払方法選択後に決済サービス画面に移動して、再びサイト側に戻ってくるような実装の参考になります。

ただ、PayPal Express Checkoutの場合、継続課金プロファイルを作成したあとは、課金処理がPayPal側で自動的に行われる作りになっているため、サイト側で課金処理を行う実装はありません。
(かわりにPayPal側からのIPN通知を受け取って、注文データを作成する処理が実装されています)

他の決済方法を対応させる際のポイント

継続課金を行う決済方法には様々な仕様があります。
このエントリでは具体的な実装については触れることはしませんが、パターン別に分けてポイントを解説します。

クレジットカード登録機能を用いて継続課金を行うもの

クレジットカード決済各社は決済サービス側に顧客のクレジットカード番号を保持するサービスを提供しています。
この機能を利用して継続的に課金を行う方法があります。

この場合、決済プロファイルをベースにして個別の注文データを作成する処理を実装し、その処理の途中で登録済みのカードを使用するように決済サービスに指定します。

ただし、この場合はカード番号の有効期限切れなどは疎通してみないとわからないため、NGになった場合は顧客に個別連絡をする必要があります。 

専用のAPIとアカウント・仕様をもつもの

このパターンの場合は実装がかなり複雑になることがあります。
仕様にもよりますが、購入申込み時にベースとなる決済データを決済サービス側に作成する必要があり、かつ都度の決済では別のAPIを呼び出す必要があります。

また、締め日などの概念がある場合はバッチジョブの実行時に日付判定を入れる必要が出てくるため、テストケースが複雑になることがあり、完成までに時間がかかるケースがあります。 

その他

継続課金にできるものは、カード決済だけではありません。
正直言うと、全ての決済方法を継続課金対応することができます。

例えば銀行振込やコンビニ支払いといった支払方法は一見都度決済に見えますが、カード決済のように本人しか知っていてはいけない情報をサイト側が受領する必要がありません。
そのため、サイト側は毎回のタイミングで注文データを作成し、顧客に入金を促すメールを送付するだけで事足ります。

終わりに

弊社では様々な決済サービスにMagentoをつなぎこむエクステンションを開発しています。
諸事情により公開できていないものもありますが、よほど変わった仕様でない限りは基本的に実装が可能です。

また、近日中に継続課金機能を実装した決済エクステンションをリリースする予定にしております。