对贝宝 ipn 感到困惑和迷失方向
Posted
技术标签:
【中文标题】对贝宝 ipn 感到困惑和迷失方向【英文标题】:confused and disoriented with paypal ipn 【发布时间】:2012-07-27 09:07:58 【问题描述】:我正在使用这个 gem 在 paypal 中付款https://github.com/tc/paypal_adaptive
我对这颗宝石感到非常困惑和迷失方向。它的文档记录很差,我很难理解如何从贝宝获取有关 ipn 响应的数据。
我希望这个问题能帮助更多有同样问题的人。
我的步骤是:
1º我使用方法 preaproval_payment 从我的orders_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
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
我在orders_controller.rb
中有response_paypal
操作。这是 GET 操作,我的操作代码是:
def response_paypal
respond_to do |format|
format.html redirect_to user_orders_url(current_user), :alert => "works fine return url"
end
end
到目前为止一切正常。
现在我需要获取我从贝宝收到的数据,并在付款成功处理后为我的数据库保存一个新订单。
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
在我的 routes.rb 中添加:
match "/ipn_notification" => PaypalIpn
我的两个问题是:
a)我没有看到付款后这个文件被触发,我在控制台数据中看不到我从贝宝获得的数据。
b)我想在我的请求中将对象 ID @gift
发送到贝宝,以便稍后在 paypal_ipn.rb
中恢复并保存我的数据库。
我做错了什么以及如何解决这些问题?
谢谢
【问题讨论】:
【参考方案1】:我没有用过那个 gem,但我以前用过 PayPal IPN。以下是您应该检查的一些事项:
您的 PayPal 帐户是否设置为使用 IPN?您必须在帐户上启用此设置才能使其生效。
您是否验证过,当您在付款过程中传递 ipn_notification_url 时,它与您的“/ipn_notification”路由匹配?
为此,PayPal 必须能够直接与运行此应用程序的服务器通信。这意味着通常,除非您在本地计算机上使用动态 DNS 或其他东西进行自定义设置,否则您需要实际将此代码部署到服务器,以便 PayPal 能够与您的应用程序通信。换句话说,如果它在http://localhost:3000
上运行,这将不起作用。
要回答您的第二个问题,如何恢复 @gift 以记录它在您的数据库中支付的事实,我不完全确定如何使用这个 gem,但我会告诉你我是怎么做的它使用 ActiveMerchant - 它可能非常相似。
在您向 PayPal 的付款请求中,您可以传入发票编号。我相信该领域只是称为“发票”。在这里您将传递礼物的 ID。
当 PayPal 通过 IPN 通知您的应用程序已付款时,它会将发票编号传回给您。使用此发票编号检索@gift,然后您就可以使用它来做您需要的事情了。
以下是我使用 ActiveMerchant gem 的工作 PayPal 代码的相关部分:https://gist.github.com/3198178
祝你好运!
【讨论】:
非常感谢。我现在去检查这些提示:D,我会注意到结果。我无法发送"invoiceId" => @gift.id
,因为我正在使用 Preapproval API 操作 cms.paypal.com/us/cgi-bin/… 此字段无法与 Preapproval Payments 一起发送。发送我礼物的对象 ID 的其他选项?非常感谢
为什么不让ipn_notification URL成为@gift的成员,然后你可以使用.find(params[:id])
从ipn_notification方法中得到@gift
呢? IE。而不是ipn_notification_url
,您将向PayPal发送notification_gift_path(@gift)
之类的东西。
问题已解决。我在 paypal 中禁用了 ipn url,并为 ipnNotificationUrl 发送了一个自定义 url。我已删除 lib/paypal_ipn.rb
并在我的控制器中创建了一个新操作。现在我可以在这个动作中接收参数。非常感谢@Adriandz
对于那些需要可以与 paypal 通信的测试环境的人,请查看 localtunnel gem (progrium.com/localtunnel)以上是关于对贝宝 ipn 感到困惑和迷失方向的主要内容,如果未能解决你的问题,请参考以下文章