Develop with pleasure!

福岡でCloudとかBlockchainとか。

RubyでPayPal

RailsアプリでPayPalのIPN(即時支払い通知)と連携するのに、paypalというPluginが用意されてる。

サイトに記載されているとおりにPluginをインストール、

ruby ./script/plugin install svn://vault.jadedpixel.com/paypal/trunk/paypal


しようとしたが、接続できないと起こられる。TortoiseSVNでアクセスしても接続エラーが発生する…。

と困ってたら、GitHubにPayPalプロジェクトを発見。変更されたのか?とりあえず、下記コマンドを実行することでインストールできる。

ruby script/plugin install git://github.com/openhood/paypal.git


※事前にクライアントにGitがインストールされており、gitコマンドが利用可能である必要がある。

これで無事インストール完了。

PayPalのIPNにから受け取った通知の検証リクエストを発行するには、

class PaymentsController < ApplicationController

  def notify
     # IPNの検証通知の送付先URLを設定(↓はSandbox)
     Paypal::Notification.ipn_url = "https://www.sandbox.paypal.com/cgi-bin/webscr"
     # PayPalへの検証通知オブジェクトを生成
     notify = Paypal::Notification.new(request.raw_post)
     
     # PayPalへの検証通知をPOST送信(これがtrueなら検証通知自体は成功)
     if notify.acknowledge
       # 後は、notify.complete?がtrueであれば支払完了となるのでその際に必要な処理を定義
       ...
     end
  end
end


といった感じになる。


Sandboxを使って定期購読のテストをしてるけど、IPNを利用してPayPalでの定期購読の決済処理を行うとIPNの通知が以下の3段階で来る。

  • 購読の登録通知
  • 購読料の支払い通知(Pending)
  • 購読料の支払い通知(Complete)


ユーザーがPayPalで支払を済ませると購読の登録通知と購読料の支払い通知(Pending)のリクエストが送られてきて、売り手が、PayPalにログインして、該当の支払についてAcceptボタンを押下すると最後の購読料の支払い通知(Complete)が帰ってくるという仕組みみたい。

毎回Accept押さないと行けないの?と思い、PayPalのカスタマーセンターのお姉ちゃんに尋ねてみると、どうも一番最初に取引する際に一度だけAcceptを押す必要があるみたい。1回でも行えば、それ以降は別のユーザーから購読の申し込みがあっても、ユーザーからの申し込みが処理された段階で「購読料の支払い通知(Complete)」になるとのこと。ただ、Sandboxの場合は、テストツールという位置付けなので、毎回Acceptボタンを押さないといけないらしい。

まぁ、実際にちゃんと言われたように動作するかは、Sandboxじゃなくて実環境で試してみないと何とも。