confuso e desorientado com paypal ipn
-
13-12-2019 - |
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:
1º 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
2º 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"}
3º Redireciono para a página do paypal e efetuo o pagamento no paypal com sucesso :D.
4º 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.
5º 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
Solução
Não usei essa joia, mas já usei o PayPal IPN antes.Aqui estão algumas coisas que você deve verificar:
Você tem sua conta PayPal configurada para usar IPN?Você deve habilitar esta configuração na conta para que isso funcione.
Você verificou que ao passar ipn_notification_url durante o processo de pagamento, ele corresponde à sua rota "/ipn_notification"?
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.
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.
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!