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 :

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

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

Je redirige vers la page paypal, et j'effectue le paiement sur paypal avec succès :D.

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.

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

Était-ce utile?

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 :

  1. Votre compte PayPal est-il configuré pour utiliser IPN ?Vous devez activer ce paramètre sur le compte pour que cela fonctionne.

  2. Avez-vous vérifié que lorsque vous transmettez ipn_notification_url lors du processus de paiement, cela correspond à votre itinéraire "/ipn_notification" ?

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

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top