Есть ли образец кода IPN PayPal для Ruby on Rails?

Есть официальные образцы кода для нескольких языков, но не удалось найти их для Rails.

Ответы

Ответ 1

Я публикую здесь мой пример рабочего кода для контроллера Rails. Это делает проверку. Надеюсь это будет полезно.

class PaymentNotificationsController < ApplicationController
  protect_from_forgery :except => [:create] #Otherwise the request from PayPal wouldn't make it to the controller
  def create
    response = validate_IPN_notification(request.raw_post)
    case response
    when "VERIFIED"
      # check that paymentStatus=Completed
      # check that txnId has not been previously processed
      # check that receiverEmail is your Primary PayPal email
      # check that paymentAmount/paymentCurrency are correct
      # process payment
    when "INVALID"
      # log for investigation
    else
      # error
    end
    render :nothing => true
  end 
  protected 
  def validate_IPN_notification(raw)
    live = 'https://ipnpb.paypal.com/cgi-bin'
    sandbox = 'https://ipnpb.sandbox.paypal.com/cgi-bin'
    uri = URI.parse(sandbox + '/webscr?cmd=_notify-validate')
    http = Net::HTTP.new(uri.host, uri.port)
    http.open_timeout = 60
    http.read_timeout = 60
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER
    http.use_ssl = true
    response = http.post(uri.request_uri, raw,
                         'Content-Length' => "#{raw.size}",
                         'User-Agent' => "My custom user agent"
                       ).body
  end
end

Код вдохновлен Railscast 142 и этот пост Tanel Suurhans

Ответ 2

PayPal Ruby Merchant SDK предоставляет ipn_valid? логический метод, чтобы сделать вас очень легким.

def notify
  @api = PayPal::SDK::Merchant.new
  if @api.ipn_valid?(request.raw_post)  # return true or false
    # params contains the data
  end
end

https://github.com/paypal/merchant-sdk-ruby/blob/master/samples/IPN-README.md

Ответ 3

драгоценный камень IPN

Драйвер DWilke Paypal IPN можно найти здесь:

https://github.com/dwilkie/paypal

Проверьте модуль IPN. Это хороший код:

https://github.com/dwilkie/paypal/blob/master/lib/paypal/ipn/ipn.rb

Тестирование против симулятора

Здесь вы можете протестировать его против симулятора IPN:

https://developer.paypal.com/webapps/developer/applications/ipn_simulator

Я использую ngrok, чтобы выставить localhost: 3000 на общедоступный URL-адрес, затем наведите на него симулятор.

Ответ 4

У меня есть реализация IPN в одном из моих проектов, и ваш код выглядит хорошо. Итак, в чем проблема u r?

Ответ 5

Посмотрите на ActiveMerchant, который включает в себя несколько реализаций шлюза, среди которых IPN Paypal.

НТН

Ответ 6

вы можете просто сделать это, чтобы получить информацию об ipn. результат покажет вам подтверждение или нет. вы можете получить все детали из тела

post '/english/ipn' do

url = " https://sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate&# {@query}"

body = request.body.string

result = RestClient.post url, body

конец

Ответ 7

Существует несколько драгоценных камней PayPal, и по крайней мере один из них (paypal-sdk-rest) включает PayPal::SDK::Core::API::IPN.valid? метод.

Вот как это использовать:

class YourController < ApplicationController

  skip_before_action :verify_authenticity_token, only: :your_action

  def your_action
    verified = PayPal::SDK::Core::API::IPN.valid?(request.raw_post)

    if verified
      # Verification passed, do something useful here.
      render nothing: true, status: :ok
    else
      # Verification failed!
      render nothing: true, status: :unprocessable_entity
    end
  end

end