Net::HTTP.post_form 抛出 EOFError?

Posted

技术标签:

【中文标题】Net::HTTP.post_form 抛出 EOFError?【英文标题】:Net::HTTP.post_form throws EOFError? 【发布时间】:2011-10-02 13:23:33 【问题描述】:

所以我试图从贝宝获取交易详细信息,而无需创建表单,只需向 url 发送包含必要信息的帖子。这是我的代码的 sn-p,我尝试过通过表单做同样的事情,它可以工作。

<form method=post action="https://www.sandbox.paypal.com/cgi-bin/webscr">
      <input type="hidden" name="cmd" value="_notify-synch">
      <input type="hidden" name="tx" value="<%= subscription.tx %>">
      <input type="hidden" name="at" value="<%= @identity_token %>">
      <input type="submit" value="View Details">
    </form>

Ruby 对应项抛出 EOFError,我不知道它为什么这样做

paypal_uri = URI.parse('https://www.sandbox.paypal.com/cgi-bin/webscr')
@post_request = Net::HTTP.post_form(paypal_uri , :tx => @subscription.tx, :at => IDENTITY_TOKEN, :cmd => "_notify-sync")

【问题讨论】:

【参考方案1】:

URL 是 https,因此您需要在 Net::HTTP 上启用 SSL。

require 'openssl'

paypal_uri = URI.parse('https://www.sandbox.paypal.com/cgi-bin/webscr')
req = Net::HTTP::Post.new(paypal_uri.path)
req.set_form_data(:tx => @subscription.tx, :at => IDENTITY_TOKEN, :cmd => "_notify-sync")
sock = Net::HTTP.new(paypal_uri.host, 443)
sock.use_ssl = true
store = OpenSSL::X509::Store.new
store.add_cert OpenSSL::X509::Certificate.new(File.new('paypal.pem'))
store.add_cert OpenSSL::X509::Certificate.new(File.new('paypal2.pem'))
sock.cert_store = store
sock.start do |http|
  response = http.request(req)
end

要获得 CA 证书 paypal.pem 和 paypal2.pem,只需手动浏览到 PayPal URL,我将针对 FireFox 进行描述。单击地址栏左侧的绿色图标,打开对话框,查看证书、详细信息,然后将两个 VeriSign 证书导出为 paypal.pem 和 paypal2.pem。将它们放入与您的脚本相同的文件夹中。那应该可以解决您的问题!

【讨论】:

emboss:很抱歉回复晚了,但我真的看到了其中 3 个?? @denniss:没关系。您会看到 PayPal 使用的证书,这是链中的最后一个。但是你感兴趣的是另外两个,上面的 PayPal 的证书。你需要下载的是那两个 VeriSign 证书。

以上是关于Net::HTTP.post_form 抛出 EOFError?的主要内容,如果未能解决你的问题,请参考以下文章

您如何将来自 PayPal 的 PDT 响应转换为哈希?

oracle in 改为exists形式

电子技术基础里的GS、EO、EI是啥意思

均衡优化器(EO)解决单目标优化问题

均衡优化器(EO)解决单目标优化问题

EO-88遥测信号接收教程