confuso y desorientado, con paypal ipn
-
13-12-2019 - |
Pregunta
Yo estoy usando esta joya para los pagos en paypal https://github.com/tc/paypal_adaptive
Estoy muy confundido y desorientado con esta joya.Tiene un poco documentada y es difícil para mí entender cómo obtener los datos de paypal en el ipn respuesta.
Espero que esta pregunta ayudará a que más personas con el mismo problema.
Mis pasos son:
1º Puedo enviar la solicitud a paypal desde mi orders_controller.rb
con el 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º Estos son los datos de mi pedido en mi log de la consola de comandos 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º Yo redirigir a la página de paypal, y puedo hacer el pago en paypal con éxito :D.
4º Cuando el pago se ha realizado correctamente, estoy dirigido a:
http://localhost:3000/en/u/maserranocaceres/orders/response_paypal
Tengo response_paypal
acción en orders_controller.rb
.Es CONSEGUIR la acción y mi código para que esta acción es:
def response_paypal
respond_to do |format|
format.html { redirect_to user_orders_url(current_user), :alert => "works fine return url"}
end
end
Hasta este momento todo funciona bien.
Ahora lo que necesito es obtener los datos que he recibido de paypal y guardar en mi base de datos de un nuevo orden, si el pago se ha procesado correctamente.
5º Para este fin puedo hacer un archivo en lib/paypal_ipn.rb
y puedo agregar a este archivo el contenido 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
En mi las rutas.rb Añado:
match "/ipn_notification" => PaypalIpn
Mis 2 problemas:
a) No veo que después de hacer el pago de este archivo a ser despedido y no puedo ver en mi consola los datos que recibo de paypal.
b) Quiero enviar a paypal en mi solicitud, el identificador de objeto @gift
para ser capaz de recuperar más tarde en paypal_ipn.rb
y para salvar mi base de datos.
¿Qué estoy haciendo mal y cómo puedo resolver estos problemas?
Gracias
Solución
No he utilizado esa joya, pero he utilizado PayPal IPN antes.Aquí están algunas cosas que usted debe comprobar:
¿Tienes tu cuenta de PayPal configurado para utilizar en el IPN?Usted debe habilitar esta opción en la cuenta para que esto funcione.
¿Has comprobado que cuando se pasa ipn_notification_url durante el proceso de pago, que coincide con el "/ipn_notification" ruta?
Para que esto funcione, PayPal debe ser capaz de comunicarse directamente con el servidor que está ejecutando esta aplicación.Esto significa que, normalmente, a menos que usted tiene una instalación personalizada en su máquina local con la dinámica de DNS o algo, que usted necesitará para implementar este código en un servidor con el fin de PayPal para poder comunicarse con su aplicación.En otras palabras, si este se está ejecutando en
http://localhost:3000
, esto no va a funcionar.
Para responder a su segunda pregunta, cómo recuperar @don con el fin de registrar el hecho de que se pagó en su base de datos, no estoy del todo seguro de cómo hacer esto con esta joya, pero yo voy a contar cómo hago usando ActiveMerchant - es probablemente muy similar.
En la solicitud de pago de PayPal, usted puede pasar en un número de factura.Creo que el campo es llamado simplemente "factura".Aquí se pasa el ID de la donación.
Cuando PayPal notifica a su aplicación a través IPN que el pedido ha sido pagado para que, va a pasar el número de la factura de nuevo a usted.Recuperar la @don usando este número de la factura y, a continuación, usted puede hacer lo que usted necesita con ella.
Aquí están las partes relevantes de mi trabajo PayPal código, mediante la ActiveMerchant joya: https://gist.github.com/3198178
Buena suerte!