confuso e disorientato con PayPal IPN
-
13-12-2019 - |
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:
1º 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
.
2º 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"}
.
3º I Reindirizza alla pagina PayPal e faccio il pagamento su PayPal con successo: d.
4º 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.
5º 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
Soluzione
Non ho usato quella gemma, ma ho già usato PayPal IPN. Ecco alcune cose che dovresti controllare:
- .
-
Hai il tuo account PayPal impostato per utilizzare IPN? È necessario abilitare questa impostazione sul conto per questo funzionare.
-
Hai verificato che quando si passa IPN_Notification_url durante il processo di pagamento, che corrisponde alla tua rotta "/ IPN_Notification"?
-
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à. -
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.
-
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.
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.
- .
Ecco le parti pertinenti del mio codice PayPal funzionante, utilizzando il gemma attiviMermatore: https://gist.github. COM / 3198178
Buona fortuna!