Pergunta

Estou usando esta joia para pagamentos no paypal https://github.com/tc/paypal_adaptive

Estou muito confuso e desorientado com esta joia.Está mal documentado e é difícil para mim entender como obter os dados do paypal na resposta do ipn.

Espero que esta pergunta ajude mais pessoas com o mesmo problema.

Meus passos são:

Eu envio solicitação para paypal do meu orders_controller.rb com método preaproval_payment.

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

Estes são os dados da minha solicitação no meu console de log do comando 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"}

Redireciono para a página do paypal e efetuo o pagamento no paypal com sucesso :D.

Quando o pagamento for concluído com sucesso, sou direcionado para:

http://localhost:3000/en/u/maserranocaceres/orders/response_paypal

Eu tenho response_paypal ação em orders_controller.rb.É uma ação GET e meu código para esta ação é:

def response_paypal
  respond_to do |format|
       format.html { redirect_to user_orders_url(current_user), :alert => "works fine return url"}
    end
 end

Até este ponto tudo funciona bem.

Agora o que preciso é obter os dados que recebi do paypal e salvar em meu banco de dados um novo pedido caso o pagamento seja processado com sucesso.

Para isso faço um arquivo em lib/paypal_ipn.rb e adiciono a este arquivo o conteúdo de 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

No meu rotas.rb Eu adiciono:

match "/ipn_notification" => PaypalIpn

Meus 2 problemas são:

a) Não vejo que depois de efetuar o pagamento esse arquivo seja disparado e não consigo ver no meu console os dados que recebo do paypal.

b) Quero enviar para o paypal na minha solicitação, o id do objeto @gift por poder se recuperar mais tarde paypal_ipn.rb e para salvar meu banco de dados.

O que estou fazendo de errado e como posso resolver esses problemas?

Obrigado

Foi útil?

Solução

Não usei essa joia, mas já usei o PayPal IPN antes.Aqui estão algumas coisas que você deve verificar:

  1. Você tem sua conta PayPal configurada para usar IPN?Você deve habilitar esta configuração na conta para que isso funcione.

  2. Você verificou que ao passar ipn_notification_url durante o processo de pagamento, ele corresponde à sua rota "/ipn_notification"?

  3. Para que isso funcione, o PayPal deve ser capaz de se comunicar diretamente com o servidor que executa este aplicativo.Isso significa que normalmente, a menos que você tenha uma configuração personalizada em sua máquina local com DNS dinâmico ou algo assim, você precisará implantar esse código em um servidor para que o PayPal possa se comunicar com seu aplicativo.Em outras palavras, se isso estiver sendo executado em http://localhost:3000, isso não funcionará.

Para responder sua segunda pergunta, como recuperar @gift para registrar o fato de ter sido pago em seu banco de dados, não tenho muita certeza de como fazer isso com esta joia, mas vou te contar como faço isso usando ActiveMerchant - provavelmente é bastante semelhante.

  1. Na sua solicitação de pagamento ao PayPal, você pode passar um número de fatura.Acredito que o campo se chama apenas "fatura".Aqui você passaria o ID do presente.

  2. Quando o PayPal notificar seu aplicativo via IPN de que o pedido foi pago, ele retornará o número da fatura para você.Recupere o @gift usando este número de fatura e então você poderá fazer o que precisar com ele.

Aqui estão as partes relevantes do meu código funcional do PayPal, usando a gema ActiveMerchant: https://gist.github.com/3198178

Boa sorte!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top