みかづきメモ

学習したことのメモとか、日記とか、備忘録。

Rails で PayPal の Express Checkout を導入してみる

Ruby on Rails で、 PayPal の Express Checkout を導入してみます。


基本的には、 ActiveMerchantOffsitePayments を導入して、設定などをすれば終わりです。

ただ、 IPN の受け取りだけは、うまくいかなかったので、その部分のメモです。

普通に実装すると、以下のようになります。

def ipn_reveive
  notify = OffsitePayments::Integrations::Paypal::Notification.new(request.raw_post)
  if notify.acknowledge
    # ごちゃ 
    head :no_content
  else
    logger.error 'Invalid IPN'
    head :bad_request
  end
end

ただ、これじゃうまく動かないので、適当に cmd=_notify-validate を追加します。

# notify.acknowledge が動かないので、自分でリクエスト投げる
raw = request.raw_post + '&cmd=_notify-validate'
if Rails.env.production?
  url = 'https://www.paypal.com/cgi-bin/webscr'
else
  url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'
end

uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
result = http.post(uri.path, raw).body
if result == 'VERIFIED'
  # OK
end

理由としては、ドキュメントを読んだ感じだと、POST の場合、
cmd=** などのコマンドの指定は、 Body に含める必要があるっぽい。

即時支払い通知(IPN) - PayPal