PayPal APIの使い方 その4 〜 定期支払いの実装
「PayPalの使い方 その2 - Express Checkout APIによる課金システムの実装 解説」で作成したExpress Checkoutの実装を変更して定期支払いも試してみたのでまとめてみました。
定期支払いの概要まとめ
定期支払いの概要についてはgihyoのサイトのPayPalの連載記事が参考になります。
「PayPal API導入・活用ガイド - 第3回 定期支払いを実現するリカーリングペイメントの実装」
http://gihyo.jp/dev/serial/01/paypal_api/0003
また、定期支払いはExpress Checkout APIを使わなくても、Subscribeボタンでも実現可能です。
https://www.paypal.com/cgi-bin/webscr?cmd=_pdn_subscr_techview_outside
定期支払いのPayPalの公式ドキュメントはこちら
英語:https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_ECRecurringPayments
日本語:https://cms.paypal.com/jp/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_WPRecurringPayments
定期支払いの流れ
以下の図は、定期支払いの流れを説明した図です(PayPalのドキュメントから引用)。
定期支払いの実装は、Express Checkout APIの呼び出しに加えて定期支払いの各種設定を保存するRecurring Payment Profile(定期支払い個人設定)を作成します。
図の中で、主な処理は以下のようになります。
- (1) L_BILLINGTYPE0=RecurringPaymentsプロパティを指定してSetExpressCheckoutを呼ぶ
- (3) Tokenを指定してRePayPalにリダイレクト
- (4) GetExpressCheckoutDetailsを呼び出して定期支払いプロフィールに指定する情報を取得
- (6) 入会金などワンタイムペイメントが必要な場合のみDoExpressCheckoutPaymentで課金
- (7) CreateRecurringPaymentsProfileを呼び出して定期支払いプロフィールを作成
今回も説明用のサンプルをGithubにアップしましたので参考にしてください。
https://github.com/hrendoh/PayPal-Recurring-Payment-example
アプリケーションは、前のブログで紹介したExpress Checkoutのサンプルを基に定期支払いの処理を追加しています。
以下、Express Checkoutで定期支払いを開始する際に必要な手順の詳細を解説します。
(1) L_BILLINGTYPE0=RecurringPaymentsプロパティを指定してSetExpressCheckoutを呼ぶ
定期支払いもSetExpressCheckoutでトランザクションを開始します。
提起し払いの際に指定する必要のあるパラメータは以下の通りです。
- BILLINGTYPE
「RecurringPayments」を指定します。
- BILLINGAGREEMENTDESCRIPTION
BILLINGTYPEごとに説明を指定します。複数指定する場合は、L_BILLINGTYPE0に対してL_BILLINGAGREEMENETDESCRIPTION0、L_BILLINGTYPE1に対してL_BILLINGAGREEMENETDESCRIPTION1というように0-9まで指定できます*1。
- 「If there is no associated purchase」ワンタイムペイメントを同時に利用しない場合は、AMT=0を指定とドキュメントには書いてあります。ちなみにAMTを指定しなくても通りました。
ちなみに、パラメータ足りない場合、以下の様なエラーが返されました。「BILLINGAGREEMENTDESCRIPTION」を追加し忘れ。
SetExpressCheckout API call failed. Detailed Error Message: Recurring payments profile description must be provided if the billing agreement type is recurring payments.Short Error Message: Invalid DataError Code: 10478Error Severity Code: Error
正しくパラメータを渡すと、以下のような契約に同意するページが表示されます*2。
「BILLINGAGREEMENTDESCRIPTION」に指定した値が[注文概要]の[説明]に表示されています。
また、定期支払用に[同意して続行]にボタンのラベルが変わっています*3。
GetExpressCheckoutDetailsを呼び出して定期支払いプロフィールに指定する情報を取得
ワンタイムペイメントを含まない場合も、次のCreateRecurringPaymentsProfileに指定するパラメータをGetExpressCheckoutDetailsを呼び出して取得する必要があります。
CreateRecurringPaymentsProfileを呼び出して定期支払いプロフィールを作成
CreateRecurringPaymentsProfileの実行は、PayPalで支払いの場合とクレジットカードでダイレクト決済する場合で指定するパラメータが異なるので注意が必要です。
また、いくつかのパラメータはGetExpressCheckoutDetailsで取得した値を指定する必要があります。
必須パラメータ
- PROFILESTARTDATE
定期支払いの請求開始日。
- DESC
SetExpressCheckoutに指定したBILLINGAGREEMENTDESCRIPTIONパラメータと同じ値を指定します。
同じ値じゃないとエラーになるので注意。
- AMT
各課金の金額
- CURRENCYCODE
通貨
- BILLINGPERIOD:課金スケジュールの周期を指定します。
- Day
- Week
- SemiMonth
- Month
- Year
- BILLINGFREQUENCY
ドキュメントの説明が分かりにくい。
BILLINGPERIOD内の請求頻度、BILLINGPERIOD=MonthのときにBILLINGFREQUENCY=5にすると1ヶ月に5回請求される?
以下は、支払方法によって異なる必須パラメータ
- TOKEN:PayPal支払いの場合、Express CheckoutのTOKENを指定します。また、TOKENを指定する場合は以下のパラメータも必須になります。
- SHIPTONAME
- SHIPTOSTREET
- SHIPTOCITY
- SHIPTOSTATE
- SHIPTOZIP
- SHIPTOCOUNTRY
- CreditCard:クレジットカードによるダイレクト決済を利用する場合、このときTOKENは省略する。
- CREDITCARDTYPE
- ACCT
- EXPDATE
- CVV2
ダイレクト決済の例は実際には試していませんので、以下の説明などを参考にしてみてください。
https://www.x.com/blogs/magarvin/2009/12/21/sample-createrecurringpaymentsprofile--direct-payment
作成したPayPal決済のサンプルを実行してPOSTしたパラメータはこのようになります。
METHOD=CreateRecurringPaymentsProfile&VERSION=64&PWD=1308542256&USER=Seller_1308542242_biz_api1.gmail.com&SIGNATURE=A4U73r.r18rhxStXoULiMg6K9OGOAuMapjAYMHD5UPtAMTjgTgK5VKnK&TOKEN=EC-99H66270JP9985642&SHIPTONAME=Test+User&SHIPTOSTREET=Nishi+4-chome%2C+Kita+55-jo%2C+Kita-ku&SHIPTOCITY=Shibuya-ku&SHIPTOSTATE=Tokyo&SHIPTOZIP=150-0002&SHIPTOCOUNTRY=JP&PROFILESTARTDATE=2011-07-01T0%3A0%3A0&DESC=Test+Recurring+Payment%28%241+monthly%29&BILLINGPERIOD=Month&BILLINGFREQUENCY=5&AMT=1&CURRENCYCODE=USD&IPADDRESS=::1&BUTTONSOURCE=PP-ECWizard
CreateRecurringPaymentsProfileメソッドは応答に「PROFILEID」を返します。定期支払いプロフィールの情報を後から参照する際に必要となるので値はアプリケーション側で保持しておく必要があります。
プロフィール情報の参照
実際にサービスを提供する際には、定期支払いプロフィールのステータスが有効かどうかを定期的にチェックする必要があります。
最後に、定期支払いプロフィールステータスを確認するメソッドについて簡単にまとめておきます。
GetRecurringPaymentsProfileDetails
定期払いプロフィール情報を取得します。CreateRecurringPaymentsProfileを実行して取得した「PROFILEID」をパラメータに指定します。
ManageRecurringPaymentsProfileStatus
定期払いのキャンセル、一時停止、再開を実行します。
CreateRecurringPaymentsProfileを実行して取得した「PROFILEID」と以下の「ACTION」が必須パラメータです。
- Cancel: 有効または一時停止状態の設定のみをキャンセル
- Suspend: 有効状態の設定のみを一時停止
- Reactivate: 一時停止状態の設定のみを利用再開
UpdateRecurringPaymentsProfile
定期払いプロフィール情報を更新します。未払いの対応はこのメソッドで行います。