запутался и дезориентировался с PayPal IPN
-
13-12-2019 - |
Вопрос
Я использую этот драгоценный камень для платежей в PayPal https://github.com/tc/paypal_adaptive
Я очень смущен и дезориентирован этим драгоценным камнем.Он плохо документирован, и мне трудно понять, как получить данные от PayPal по ответу ipn.
Я надеюсь, что этот вопрос поможет большему количеству людей, столкнувшихся с той же проблемой.
Мои шаги:
1º Я отправляю запрос на PayPal со своего orders_controller.rb
с методом preapproval_pay.
def preapproval_payment
preapproval_request = PaypalAdaptive::Request.new
data = {
"returnUrl" => response_paypal_user_orders_url(current_user),
"cancelUrl"=> cancel_payment_gift_url(@gift),
"requestEnvelope" => {"errorLanguage" => "en_US"},
"senderEmail" => "gift_1342711309_per@gmail.com",
"startingDate" => Time.now,
"endingDate" => Time.now + (60*60*24) * 30,
"currencyCode"=>"USD",
"maxAmountPerPayment" => "@gift.price",
"ipnNotificationUrl" => ipn_notification_url,
"ip" => request.remote_ip
}
preapproval_response = preapproval_request.preapproval(data)
puts data
if preapproval_response.success?
redirect_to preapproval_response.preapproval_paypal_payment_url
else
redirect_to gift_url(@gift), alert: t(".something_was_wrong")
end
end
2º Это данные моего запроса в моей консоли журнала из команды puts data
:
{"returnUrl"=>"http://localhost:3000/en/u/maserranocaceres/orders/response_paypal", "cancelUrl"=>"http://localhost:3000/en/gifts/gift-1/cancel_payment", "requestEnvelope"=>{"errorLanguage"=>"en_US"}, "senderEmail"=>"gift_1342711309_per@gmail.com", "startingDate"=>2012-07-29 13:05:49 +0200, "endingDate"=>2012-08-28 13:05:49 +0200, "currencyCode"=>"USD", "maxAmountPerPayment"=>9, "ipnNotificationUrl"=>"http://localhost:3000/ipn_notification?locale=en", "ip"=>"127.0.0.1"}
3º Я перенаправляюсь на страницу PayPal и успешно совершаю платеж через PayPal :D.
4º После успешного завершения оплаты меня перенаправляют на:
http://localhost:3000/en/u/maserranocaceres/orders/response_paypal
У меня есть response_paypal
действие в orders_controller.rb
.Это действие GET, и мой код для этого действия:
def response_paypal
respond_to do |format|
format.html { redirect_to user_orders_url(current_user), :alert => "works fine return url"}
end
end
До этого момента все работает нормально.
Теперь мне нужно получить данные, которые я получил от PayPal, и сохранить в моей базе данных новый заказ, если платеж будет успешно обработан.
5º Для этого я создаю файл в lib/paypal_ipn.rb
и я добавляю в этот файл содержимое из https://github.com/tc/paypal_adaptive/blob/master/templates/paypal_ipn.rb
# Allow the metal piece to run in isolation
require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)
class PaypalIpn
def self.call(env)
if env["PATH_INFO"] =~ /^\/paypal_ipn/
request = Rack::Request.new(env)
params = request.params
ipn = PaypalAdaptive::IpnNotification.new
ipn.send_back(env['rack.request.form_vars'])
if ipn.verified?
#mark transaction as completed in your DB
output = "Verified."
else
output = "Not Verified."
end
[200, {"Content-Type" => "text/html"}, [output]]
else
[404, {"Content-Type" => "text/html"}, ["Not Found"]]
end
end
end
В моем маршруты.рб Я добавить:
match "/ipn_notification" => PaypalIpn
Мои 2 проблемы:
а) Я не вижу, чтобы после совершения платежа этот файл был запущен, и я не вижу в своей консоли данных, которые я получаю от PayPal.
б) Я хочу отправить в PayPal в своем запросе идентификатор объекта @gift
за возможность восстановиться позже в paypal_ipn.rb
и сохранить мою базу данных.
Что я делаю не так и как мне решить эти проблемы?
Спасибо
Решение
Я не использовал этот драгоценный камень, но раньше использовал PayPal IPN.Вот некоторые вещи, которые вы должны проверить:
Настроена ли ваша учетная запись PayPal для использования IPN?Чтобы это работало, вы должны включить этот параметр в учетной записи.
Проверили ли вы, что когда вы передаете ipn_notification_url во время процесса оплаты, он соответствует вашему маршруту «/ipn_notification»?
Чтобы это работало, PayPal должен иметь возможность напрямую взаимодействовать с сервером, на котором работает это приложение.Это означает, что обычно, если у вас нет специальной настройки на локальном компьютере с динамическим DNS или чем-то еще, вам нужно будет фактически развернуть этот код на сервере, чтобы PayPal мог взаимодействовать с вашим приложением.Другими словами, если это работает
http://localhost:3000
, Это не будет работать.
Чтобы ответить на ваш второй вопрос, как восстановить @gift, чтобы зафиксировать факт его оплаты в вашей базе данных, я не совсем уверен, как это сделать с этим драгоценным камнем, но расскажу, как я это делаю с помощью ActiveMerchant. - Наверное, очень похоже.
В запросе платежа в PayPal вы можете указать номер счета.Я считаю, что это поле называется просто «счет-фактура».Здесь вы должны передать идентификатор подарка.
Когда PayPal уведомит ваше приложение через IPN о том, что заказ оплачен, он вернет вам номер счета.Получите @gift, используя этот номер счета, и затем вы сможете делать с ним все, что вам нужно.
Вот соответствующие части моего рабочего кода PayPal, использующего гем ActiveMerchant: https://gist.github.com/3198178
Удачи!