0

私はこの宝石をペイパルでの支払いに使用していますhttps://github.com/tc/paypal_adaptive

私はこの宝石に非常に混乱し、混乱しています。それは十分に文書化されておらず、ipn応答でpaypalからデータを取得する方法を理解するのは難しいです。

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

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

1ºpreaproval_paymentorders_controller.rbメソッドを使用してペイパルにリクエストを送信します。

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

ペイパルページにリダイレクトし、ペイパルでの支払いに成功しました: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

この時点まで、すべてが正常に機能します。

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

この目的のために、ファイルを作成し、このファイルにhttps://github.com/tc/paypal_adaptive/blob/master/templates/paypal_ipn.rblib/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

私のroutes.rbに追加します:

match "/ipn_notification" => PaypalIpn

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

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

b)リクエストでpaypalに送信したいのですが、@gift後でリカバリしpaypal_ipn.rbてデータベースを保存できるようにするためのオブジェクトのIDです。

私は何を間違っているのですか、そしてどのようにこれらの問題を解決することができますか?

ありがとうございました

4

1 に答える 1

0

私はその宝石を使用したことがありませんが、以前にPayPalIPNを使用しました。ここにあなたがチェックしなければならないいくつかの事柄があります:

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

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

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

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

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

  2. PayPalがIPNを介してアプリに注文の支払いが行われたことを通知すると、請求書番号が返されます。この請求書番号を使用して@giftを取得すると、必要な処理を実行できます。

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

幸運を!

于 2012-07-29T12:00:10.643 に答える