confus et désorienté avec l'IPN de Paypal
-
13-12-2019 - |
Question
J'utilise ce joyau pour les paiements via Paypal https://github.com/tc/paypal_adaptive
Je suis très confus et désorienté avec ce joyau.Il est mal documenté et il m'est difficile de comprendre comment obtenir les données de Paypal sur la réponse IPN.
J'espère que cette question aidera davantage de personnes ayant le même problème.
Mes étapes sont :
1º J'envoie une demande à Paypal depuis mon orders_controller.rb
avec la méthode 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º Ce sont les données de ma demande dans ma console de journal depuis la commande 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º Je redirige vers la page paypal, et j'effectue le paiement sur paypal avec succès :D.
4º Une fois le paiement effectué avec succès, je suis dirigé vers :
http://localhost:3000/en/u/maserranocaceres/orders/response_paypal
J'ai response_paypal
action dans orders_controller.rb
.C'est l'action GET et mon code pour cette action est :
def response_paypal
respond_to do |format|
format.html { redirect_to user_orders_url(current_user), :alert => "works fine return url"}
end
end
Jusqu'à présent, tout fonctionne bien.
Maintenant, ce dont j'ai besoin, c'est d'obtenir les données que j'ai reçues de Paypal et de sauvegarder dans ma base de données une nouvelle commande si le paiement est traité avec succès.
5º Pour cela je crée un fichier dans lib/paypal_ipn.rb
et j'ajoute à ce fichier le contenu 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
Dans mon routes.rb J'ajoute:
match "/ipn_notification" => PaypalIpn
Mes 2 problèmes sont :
un) Je ne vois pas qu'après avoir effectué le paiement, ce fichier soit renvoyé et je ne vois pas dans ma console les données que je reçois de Paypal.
b) Je souhaite envoyer à Paypal dans ma demande, l'identifiant de l'objet @gift
pour avoir pu récupérer plus tard paypal_ipn.rb
et pour sauvegarder ma base de données.
Qu’est-ce que je fais de mal et comment puis-je résoudre ces problèmes ?
Merci
La solution
Je n'ai pas utilisé cette gemme, mais j'ai déjà utilisé PayPal IPN.Voici quelques éléments que vous devriez vérifier :
Votre compte PayPal est-il configuré pour utiliser IPN ?Vous devez activer ce paramètre sur le compte pour que cela fonctionne.
Avez-vous vérifié que lorsque vous transmettez ipn_notification_url lors du processus de paiement, cela correspond à votre itinéraire "/ipn_notification" ?
Pour que cela fonctionne, PayPal doit pouvoir communiquer directement avec le serveur qui exécute cette application.Cela signifie qu'en général, à moins que vous n'ayez une configuration personnalisée sur votre ordinateur local avec un DNS dynamique ou quelque chose du genre, vous devrez déployer ce code sur un serveur pour que PayPal puisse communiquer avec votre application.En d'autres termes, si cela fonctionne sur
http://localhost:3000
, cela ne fonctionnera pas.
Pour répondre à votre deuxième question, comment récupérer @gift afin d'enregistrer le fait qu'il a été payé dans votre base de données, je ne sais pas trop comment le faire avec cette gemme, mais je vais vous expliquer comment je le fais en utilisant ActiveMerchant - c'est probablement assez similaire.
Dans votre demande de paiement à PayPal, vous pouvez transmettre un numéro de facture.Je crois que le champ s'appelle simplement "facture".Ici, vous transmettrez l'identifiant du cadeau.
Lorsque PayPal informe votre application via IPN que la commande a été payée, il vous renvoie le numéro de facture.Récupérez le @gift en utilisant ce numéro de facture et vous pourrez ensuite en faire ce dont vous avez besoin.
Voici les parties pertinentes de mon code PayPal fonctionnel, utilisant la gemme ActiveMerchant : https://gist.github.com/3198178
Bonne chance!