PayPalの定期支払を実装するには、めんどい作業をしましたので、やったことを記録しとっけます。
あくまでも最短ルートにしますので、ご容赦ください。
基礎知識として、PayPalにはSandboxとLive(production)環境があります、事前確認してみてください。
定期購読の開始(購読ボタン設置)
- Product(売りたい商品)の作成
- Productに対してPlan(どういうふうに支払う)の作成
- 画面に定期支払ボタンの設定
詳細は
Basic Integrationをご参照ください。
定期購読の停止(キャンセルボタンを設置)
- 定期購読ボタンのCallbackに定期購読IDが返されるので、それを保存します。
- キャンセルボタンを設置し、定期購読IDを渡すれば、ボタンのイベント処理からキャンセルAPIを呼び出す感じになります。
具体的に、自分でAPIを呼び出すか、SDKを利用して呼び出すかとなります。
言語によってキャンセルが実装されたり、されていなっかたりもありますので、適当に足りない部分を既存のSDK共通部分を利用しながら実装できたらよいかと思います。細かくは割愛させて頂きます。
ユーザーからキャンセルする場合の対応(PayPalの画面から)
- 今回はWebhookでの対応しました。
- IPNでの対応もできますが、今回は、割愛させて頂きます。
自分の場合、複雑のパターンを設計していなくて、基本的に定期支払がキャンセル(Canceled)、一時的(Suspended)の場合、キャンセルされたこととします。詳細はwebhookをご参照ください。
ローカルでテストするには、ngrokを利用した。
本番リリース
- https://developer.paypal.com/docs/subscriptions/integrate/#5-go-live
- SDKを利用した場合、SDKのGo liveページを参照(SDKによってsandbox, liveモード, client_idとsecretのスイッチ)
- 本番向けのwebhookの設置
課題
- webhookをテストするにはwebhook simulatorを利用しますが、本物ではない、クリックするたびに、イベントが送られる。実際にSandbox環境で定期支払をキャンセルしでもイベントが発生しません。
- webhookは、本番環境でテストしたところ、ユーザーからキャンセルされた場合、イベントが発生しますが、管理者側からキャンセルされた場合、イベント発生しません。
- 自分中の疑問ですが、結構一般的によくあるニーズなのに、これらを実装、テストまでには結構時間が掛かりました、なぜPayPalにはこんな難しい仕様としているんだろう。