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:

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

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"}

Ich leite zur PayPal-Seite weiter und führe die Zahlung erfolgreich über PayPal durch :D.

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.

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

War es hilfreich?

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:

  1. 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.

  2. Haben Sie bei der Übergabe von ipn_notification_url während des Zahlungsvorgangs überprüft, ob diese mit Ihrer „/ipn_notification“-Route übereinstimmt?

  3. 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.

  1. 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.

  2. 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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top