Есть официальные образцы кода для нескольких языков, но не удалось найти их для Rails.
Есть ли образец кода IPN PayPal для Ruby on 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