Rails监听器Paypal IPN总是返回INVALID

时间:2016-01-20 18:27:13

标签: ruby-on-rails ruby paypal paypal-ipn paypal-sandbox

我为我的IPN构建了一个监听器。我可以通过IPN Simulator接收请求并且所有参数都是正确的,但是当我将其发送回link for sending my request to make validations时,它将始终返回INVALID。

我尝试将PayPal帐户的编码更改为UTF-8,但它没有用。

我没有使用任何宝石,我并不期待这一点。

 class PaymentNotificationController  [: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"
      P 'worked'

    when "INVALID"
        p 'did not work'
    else
    end
    render :nothing => true, :status => 200, :content_type => 'text/html'
  end


  protected 



  def validate_IPN_notification(raw)

    uri = URI.parse('https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate')
    #uri = URI.parse('https://www.paypal.com/cgi-bin/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_NONE
    http.use_ssl = true
    response = http.post(uri.request_uri, raw,
                         'Content-Length' => "#{raw.size}",
                         'User-Agent' => "My custom user agent"
                       ).body
  end
end

请帮助我,我整个下午一直坚持下去并且无法弄明白。

2 个答案:

答案 0 :(得分:0)

我认为您的问题是documet.ready

来自Paypal document

  

您的侦听器HTTP将完整的,未经更改的消息发送回PayPal。

     

注意此消息必须包含与PayPal中原始IPN相同的字段,所有字段都以cmd = _notify-validate开头。此外,此消息必须使用与原始编码相同的编码。

所以你not follow exactly what papal requires会是:

validate function

请注意,def validate_IPN_notification(ipn_url) validate_url = "#{ipn_url}?cmd=_notify-validate" # Post validate_url ... end 与IPN的网址相同

答案 1 :(得分:0)

原来是Windows问题,我不知道如何解决。

我在Ubuntu 15上尝试过相同的功能,但效果非常好。