verwirrt und desorientiert mit PayPal-IPN
-
13-12-2019 - |
Frage
Ich verwende dieses Juwel für Zahlungen mit Paypal https://github.com/tc/paypal_adaptive
Ich bin sehr verwirrt und desorientiert mit diesem Juwel.Es ist schlecht dokumentiert und es ist für mich schwer zu verstehen, wie ich die Daten von Paypal über die IPN-Antwort erhalten kann.
Ich hoffe, dass diese Frage mehr Menschen hilft, die das gleiche Problem haben.
Meine Schritte sind:
1º Ich sende eine Anfrage an PayPal von meinem orders_controller.rb
mit der Methode preaproval_paid.
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º Dies sind die Daten meiner Anfrage in meiner Protokollkonsole vom Befehl 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º Ich leite zur PayPal-Seite weiter und führe die Zahlung erfolgreich über PayPal durch :D.
4º Nach erfolgreicher Zahlung werde ich weitergeleitet an:
http://localhost:3000/en/u/maserranocaceres/orders/response_paypal
Ich habe response_paypal
Aktion in orders_controller.rb
.Es handelt sich um eine GET-Aktion und mein Code für diese Aktion lautet:
def response_paypal
respond_to do |format|
format.html { redirect_to user_orders_url(current_user), :alert => "works fine return url"}
end
end
Bis hierhin funktioniert alles einwandfrei.
Jetzt muss ich die Daten, die ich von Paypal erhalten habe, abrufen und in meiner Datenbank eine neue Bestellung speichern, wenn die Zahlung erfolgreich verarbeitet wurde.
5º Zu diesem Zweck erstelle ich eine Datei in lib/paypal_ipn.rb
und ich füge dieser Datei den Inhalt von hinzu 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
In meinem Routen.rb Ich füge hinzu:
match "/ipn_notification" => PaypalIpn
Meine 2 Probleme sind:
A) Ich sehe nicht, dass nach der Zahlung diese Datei abgefeuert wird und ich kann in meiner Konsole auch nicht die Daten sehen, die ich von Paypal erhalte.
B) Ich möchte in meiner Anfrage die ID des Objekts an PayPal senden @gift
um sich später erholen zu können paypal_ipn.rb
und um meine Datenbank zu speichern.
Was mache ich falsch und wie kann ich diese Probleme lösen?
Danke
Lösung
Ich habe dieses Juwel nicht verwendet, aber ich habe PayPal IPN schon einmal verwendet.Hier sind einige Dinge, die Sie überprüfen sollten:
Haben Sie Ihr PayPal-Konto für die Verwendung von IPN eingerichtet?Damit dies funktioniert, müssen Sie diese Einstellung für das Konto aktivieren.
Haben Sie bei der Übergabe von ipn_notification_url während des Zahlungsvorgangs überprüft, ob diese mit Ihrer „/ipn_notification“-Route übereinstimmt?
Damit dies funktioniert, muss PayPal direkt mit dem Server kommunizieren können, auf dem diese App ausgeführt wird.Dies bedeutet, dass Sie diesen Code normalerweise tatsächlich auf einem Server bereitstellen müssen, damit PayPal mit Ihrer App kommunizieren kann, es sei denn, Sie haben auf Ihrem lokalen Computer ein benutzerdefiniertes Setup mit dynamischem DNS oder etwas Ähnlichem.Mit anderen Worten, wenn dies weiterläuft
http://localhost:3000
, das wird nicht funktionieren.
Um Ihre zweite Frage zu beantworten, wie Sie @gift wiederherstellen können, um die Tatsache, dass es bezahlt wurde, in Ihrer Datenbank aufzuzeichnen: Ich bin mir nicht ganz sicher, wie ich das mit diesem Juwel machen soll, aber ich werde Ihnen sagen, wie ich es mit ActiveMerchant mache - Es ist wahrscheinlich ziemlich ähnlich.
In Ihrer Zahlungsanfrage an PayPal können Sie eine Rechnungsnummer angeben.Ich glaube, das Feld heißt einfach „Rechnung“.Hier geben Sie die ID des Geschenks ein.
Wenn PayPal Ihrer App über IPN mitteilt, dass die Bestellung bezahlt wurde, gibt es die Rechnungsnummer an Sie zurück.Rufen Sie das @gift mit dieser Rechnungsnummer ab und dann können Sie damit machen, was Sie wollen.
Hier sind die relevanten Teile meines funktionierenden PayPal-Codes unter Verwendung des ActiveMerchant-Gems: https://gist.github.com/3198178
Viel Glück!