Вопрос

Я использую этот драгоценный камень для платежей в PayPal https://github.com/tc/paypal_adaptive

Я очень смущен и дезориентирован этим драгоценным камнем.Он плохо документирован, и мне трудно понять, как получить данные от PayPal по ответу ipn.

Я надеюсь, что этот вопрос поможет большему количеству людей, столкнувшихся с той же проблемой.

Мои шаги:

Я отправляю запрос на 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

Это данные моего запроса в моей консоли журнала из команды 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"}

Я перенаправляюсь на страницу PayPal и успешно совершаю платеж через PayPal :D.

После успешного завершения оплаты меня перенаправляют на:

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, и сохранить в моей базе данных новый заказ, если платеж будет успешно обработан.

Для этого я создаю файл в 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.Вот некоторые вещи, которые вы должны проверить:

  1. Настроена ли ваша учетная запись PayPal для использования IPN?Чтобы это работало, вы должны включить этот параметр в учетной записи.

  2. Проверили ли вы, что когда вы передаете ipn_notification_url во время процесса оплаты, он соответствует вашему маршруту «/ipn_notification»?

  3. Чтобы это работало, PayPal должен иметь возможность напрямую взаимодействовать с сервером, на котором работает это приложение.Это означает, что обычно, если у вас нет специальной настройки на локальном компьютере с динамическим DNS или чем-то еще, вам нужно будет фактически развернуть этот код на сервере, чтобы PayPal мог взаимодействовать с вашим приложением.Другими словами, если это работает http://localhost:3000, Это не будет работать.

Чтобы ответить на ваш второй вопрос, как восстановить @gift, чтобы зафиксировать факт его оплаты в вашей базе данных, я не совсем уверен, как это сделать с этим драгоценным камнем, но расскажу, как я это делаю с помощью ActiveMerchant. - Наверное, очень похоже.

  1. В запросе платежа в PayPal вы можете указать номер счета.Я считаю, что это поле называется просто «счет-фактура».Здесь вы должны передать идентификатор подарка.

  2. Когда PayPal уведомит ваше приложение через IPN о том, что заказ оплачен, он вернет вам номер счета.Получите @gift, используя этот номер счета, и затем вы сможете делать с ним все, что вам нужно.

Вот соответствующие части моего рабочего кода PayPal, использующего гем ActiveMerchant: https://gist.github.com/3198178

Удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top