質問

PayPal での支払いにこの宝石を使用しています https://github.com/tc/paypal_adaptive

私はこの宝石に非常に混乱し、混乱しています。文書化が不十分で、IPN 応答で PayPal からデータを取得する方法を理解するのが困難です。

この質問が同じ問題を抱えているより多くの人に役立つことを願っています。

私の手順は次のとおりです。

私は自分から PayPal にリクエストを送信します orders_controller.rb 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

これらは、コマンドからのログコンソールにあるリクエストのデータです。 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"}

PayPal ページにリダイレクトし、PayPal での支払いに成功しました :D。

支払いが正常に完了すると、次のように指示されます。

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

私は持っている response_paypal でのアクション orders_controller.rb. 。これは GET アクションであり、このアクションのコードは次のとおりです。

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

この時点まではすべて正常に動作します。

ここで必要なのは、PayPal から受け取ったデータを取得し、支払いが正常に処理された場合に新しい注文をデータベースに保存することです。

この目的のために、次のファイルを作成します lib/paypal_ipn.rb そして、このファイルにコンテンツを追加します 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

私の中で ルート.rb 私は追加します:

match "/ipn_notification" => PaypalIpn

私の2つの問題は次のとおりです。

a) 支払いを行った後にこのファイルが起動されることがわかりません。また、PayPal から取得したデータがコンソールに表示されません。

b) リクエストでオブジェクトのIDをPayPalに送信したいです @gift 後で挽回できるから paypal_ipn.rb そしてデータベースを保存します。

私の何が間違っているのでしょうか?どうすればこれらの問題を解決できるでしょうか?

ありがとう

役に立ちましたか?

解決

私はその gem を使用したことはありませんが、PayPal IPN を以前に使用したことがあります。以下の点を確認してください。

  1. PayPal アカウントは IPN を使用するように設定されていますか?これを機能させるには、アカウントでこの設定を有効にする必要があります。

  2. 支払いプロセス中に ipn_notification_url を渡すときに、それが「/ipn_notification」ルートと一致することを確認しましたか?

  3. これが機能するには、PayPal がこのアプリを実行しているサーバーと直接通信できる必要があります。これは、通常、ダイナミック DNS などを使用してローカル マシンにカスタム セットアップがない限り、PayPal がアプリと通信できるようにするために、このコードを実際にサーバーにデプロイする必要があることを意味します。つまり、これが実行されている場合、 http://localhost:3000, 、これは機能しません。

2 番目の質問である、@gift が支払われたという事実をデータベースに記録するために @gift を回復する方法について答えるには、この gem を使用してそれを行う方法が完全にはわかりませんが、ActiveMerchant を使用してそれを行う方法を説明します。 -おそらくかなり似ています。

  1. PayPal への支払いリクエストでは、請求書番号を渡すことができます。このフィールドは単に「請求書」と呼ばれていると思います。ここでギフトの ID を渡します。

  2. PayPal が IPN 経由で注文の支払いが完了したことをアプリに通知すると、請求書番号が返されます。この請求書番号を使用して @gift を取得すると、それを使用して必要な操作を行うことができます。

ActiveMerchant gem を使用した、作業中の PayPal コードの関連部分は次のとおりです。 https://gist.github.com/3198178

幸運を!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top