21

有几种语言的官方代码示例,但找不到适用于 Rails 的代码示例。

4

7 回答 7

31

我在这里发布了 Rails 控制器的工作代码示例。它进行验证。我希望它会有用。

class PaymentNotificationsController < ApplicationController
  protect_from_forgery :except => [:create] #Otherwise the request from PayPal wouldn't make it to the controller
  def create
    response = validate_IPN_notification(request.raw_post)
    case response
    when "VERIFIED"
      # check that paymentStatus=Completed
      # check that txnId has not been previously processed
      # check that receiverEmail is your Primary PayPal email
      # check that paymentAmount/paymentCurrency are correct
      # process payment
    when "INVALID"
      # log for investigation
    else
      # error
    end
    render :nothing => true
  end 
  protected 
  def validate_IPN_notification(raw)
    live = 'https://ipnpb.paypal.com/cgi-bin'
    sandbox = 'https://ipnpb.sandbox.paypal.com/cgi-bin'
    uri = URI.parse(sandbox + '/webscr?cmd=_notify-validate')
    http = Net::HTTP.new(uri.host, uri.port)
    http.open_timeout = 60
    http.read_timeout = 60
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER
    http.use_ssl = true
    response = http.post(uri.request_uri, raw,
                         'Content-Length' => "#{raw.size}",
                         'User-Agent' => "My custom user agent"
                       ).body
  end
end

代码的灵感来自Railscast 142Tanel Suurhans的这篇文章

于 2013-01-14T10:09:46.600 回答
3

PayPal 的 Ruby Merchant SDK 提供了一种ipn_valid?布尔方法,让您可以轻松完成这项工作。

def notify
  @api = PayPal::SDK::Merchant.new
  if @api.ipn_valid?(request.raw_post)  # return true or false
    # params contains the data
  end
end

https://github.com/paypal/merchant-sdk-ruby/blob/master/samples/IPN-README.md

于 2014-01-16T23:13:22.567 回答
2

IPN 宝石

DWilke 的 Paypal IPN gem 可以在这里找到:

https://github.com/dwilkie/paypal

查看 IPN 模块。这是很好的代码:

https://github.com/dwilkie/paypal/blob/master/lib/paypal/ipn/ipn.rb

针对模拟器进行测试

您可以在此处针对 IPN 模拟器对其进行测试:

https://developer.paypal.com/webapps/developer/applications/ipn_simulator

我使用 ngrok 在公共 URL 上公开 localhost:3000,然后将模拟器指向它。

于 2014-05-16T14:30:30.983 回答
0

我在我的一个项目中实现了 IPN,您的代码看起来不错。那么你面临的问题是什么?

于 2013-01-14T10:18:24.490 回答
0

查看ActiveMerchant gem,其中包括多个网关实现,其中包括Paypal 的 IPN

高温高压

于 2013-01-14T12:25:39.880 回答
0

您可以这样做以获取 ipn 详细信息。结果将显示您是否已验证。您可以从 body 获取所有详细信息

post '/english/ipn' 做

url = " https://sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate {@query}"

正文 = request.body.string

结果 = RestClient.post 网址,正文

结尾

于 2014-03-13T12:03:33.707 回答
0

有一些 PayPal gem,其中至少一个(paypal-sdk-rest)包含该PayPal::SDK::Core::API::IPN.valid?方法。

以下是如何使用它:

class YourController < ApplicationController

  skip_before_action :verify_authenticity_token, only: :your_action

  def your_action
    verified = PayPal::SDK::Core::API::IPN.valid?(request.raw_post)

    if verified
      # Verification passed, do something useful here.
      render nothing: true, status: :ok
    else
      # Verification failed!
      render nothing: true, status: :unprocessable_entity
    end
  end

end
于 2019-05-20T15:07:42.400 回答