PayPal IPN に混乱して混乱している
-
13-12-2019 - |
質問
PayPal での支払いにこの宝石を使用しています https://github.com/tc/paypal_adaptive
私はこの宝石に非常に混乱し、混乱しています。文書化が不十分で、IPN 応答で PayPal からデータを取得する方法を理解するのが困難です。
この質問が同じ問題を抱えているより多くの人に役立つことを願っています。
私の手順は次のとおりです。
1º 私は自分から 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
2º これらは、コマンドからのログコンソールにあるリクエストのデータです。 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º PayPal ページにリダイレクトし、PayPal での支払いに成功しました :D。
4º 支払いが正常に完了すると、次のように指示されます。
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 から受け取ったデータを取得し、支払いが正常に処理された場合に新しい注文をデータベースに保存することです。
5º この目的のために、次のファイルを作成します 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 を以前に使用したことがあります。以下の点を確認してください。
PayPal アカウントは IPN を使用するように設定されていますか?これを機能させるには、アカウントでこの設定を有効にする必要があります。
支払いプロセス中に ipn_notification_url を渡すときに、それが「/ipn_notification」ルートと一致することを確認しましたか?
これが機能するには、PayPal がこのアプリを実行しているサーバーと直接通信できる必要があります。これは、通常、ダイナミック DNS などを使用してローカル マシンにカスタム セットアップがない限り、PayPal がアプリと通信できるようにするために、このコードを実際にサーバーにデプロイする必要があることを意味します。つまり、これが実行されている場合、
http://localhost:3000
, 、これは機能しません。
2 番目の質問である、@gift が支払われたという事実をデータベースに記録するために @gift を回復する方法について答えるには、この gem を使用してそれを行う方法が完全にはわかりませんが、ActiveMerchant を使用してそれを行う方法を説明します。 -おそらくかなり似ています。
PayPal への支払いリクエストでは、請求書番号を渡すことができます。このフィールドは単に「請求書」と呼ばれていると思います。ここでギフトの ID を渡します。
PayPal が IPN 経由で注文の支払いが完了したことをアプリに通知すると、請求書番号が返されます。この請求書番号を使用して @gift を取得すると、それを使用して必要な操作を行うことができます。
ActiveMerchant gem を使用した、作業中の PayPal コードの関連部分は次のとおりです。 https://gist.github.com/3198178
幸運を!