Domanda

Sto usando questo gemma per i pagamenti in Paypal https://github.com/tc/paypal_adaptive

Sono molto confuso e disorientato con questa gemma. Ha un male documentato ed è difficile per me capire come ottenere i dati da PayPal sulla risposta IPN.

Spero che questa domanda aiuterà più persone ad avere lo stesso problema.

I miei passaggi sono:

Invio della richiesta a PayPal dal mio orders_controller.rb con il metodo 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
.

Questi sono i dati della mia richiesta nella mia console di registro dal 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"}
.

I Reindirizza alla pagina PayPal e faccio il pagamento su PayPal con successo: d.

Quando il pagamento è completato con successo, sono diretto a:

http://localhost:3000/en/u/maserranocaceres/orders/response_paypal

Ho un'azione response_paypal in orders_controller.rb. È un'azione e il mio codice per questa azione è:

def response_paypal
  respond_to do |format|
       format.html { redirect_to user_orders_url(current_user), :alert => "works fine return url"}
    end
 end
.

Fino a questo punto tutto funziona bene.

Ora ciò di cui ho bisogno è ottenere i dati che ho ricevuto da PayPal e salvare il mio database un nuovo ordine se il pagamento viene elaborato correttamente.

A tale scopo passo un file in lib/paypal_ipn.rb e aggiungo a questo file il contenuto da 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
.

nel mio routine.rb aggiungo:

match "/ipn_notification" => PaypalIpn
.

I miei 2 problemi sono:

A) Non vedo che dopo aver effettuato il pagamento questo file da licenziare e non riesco a vedere nei miei dati della console ottengo da Paypal.

B) Voglio inviare a PayPal nella mia richiesta, l'ID dell'oggetto @gift per essere in grado di recuperare più tardi in paypal_ipn.rb e per salvare il mio database.

Cosa sto facendo male e come posso risolvere questi problemi?

Grazie

È stato utile?

Soluzione

Non ho usato quella gemma, ma ho già usato PayPal IPN. Ecco alcune cose che dovresti controllare:

    .
  1. Hai il tuo account PayPal impostato per utilizzare IPN? È necessario abilitare questa impostazione sul conto per questo funzionare.

  2. Hai verificato che quando si passa IPN_Notification_url durante il processo di pagamento, che corrisponde alla tua rotta "/ IPN_Notification"?

  3. Per questo funzionare, PayPal deve essere in grado di comunicare direttamente con il server che esegue questa app. Ciò significa che in genere, a meno che non si dispone di un'impostazione personalizzata sulla macchina locale con DNS dinamico o qualcosa del genere, che è necessario distribuire effettivamente questo codice su un server in modo che PayPal sia in grado di comunicare con la tua app. In altre parole, se questo è in esecuzione su http://localhost:3000, questo non funzionerà.

  4. Per rispondere alla tua seconda domanda, come recuperare @gift Per registrare il fatto che è stato pagato nel tuo database, non sono del tutto sicuro come farlo con questa gemma, ma ti dirò come faccio Usando ActiveMerchantpant - probabilmente è abbastanza simile.

      .
    1. Nella tua richiesta di pagamento a PayPal, è possibile passare in un numero di fattura. Credo che il campo sia appena chiamato "fattura". Qui passerai l'id del regalo.

    2. Quando Paypal avvisa la tua app tramite IPN che l'ordine è stato pagato, passerà al numero della fattura a voi. Recupera il @Gift utilizzando questo numero di fattura e quindi puoi fare ciò di cui hai bisogno con esso.

    3. Ecco le parti pertinenti del mio codice PayPal funzionante, utilizzando il gemma attiviMermatore: https://gist.github. COM / 3198178

      Buona fortuna!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top