Railscast 143(Paypal安全)导致“我们无法解密证书ID”。

时间:2011-10-23 03:55:56

标签: ruby-on-rails paypal railscasts

执行railscast#143。代码如下。当我添加安全性内容时,我得到“我们无法解密证书ID”。开发中。当我拿出安全的东西时,它再次起作用。我用新证书等重复了整个过程几次。没运气。

关于下一步尝试的任何想法?

我遇到的问题和这篇文章中的问题完全相同,它在制作过程中遇到过这种问题,它神奇地开始工作:

Can't get PayPal Encrypted Website Payments to work in Rails

在“购买这些”页面中:

<%= form_tag "https://www.sandbox.paypal.com/cgi-bin/webscr" do %>
<%= hidden_field_tag :cmd, "_s-xclick" %>
<%= hidden_field_tag :encrypted, @cart.paypal_encrypted("#{@url}/buy_these", payment_notifications_url) %>
<p><%= submit_tag "Buy these for #{number_to_currency(@cart.total_price)}" %></p>

在cart.rb中:

PAYPAL_CERT_PEM = File.read("#{Rails.root}/certs/paypal_cert.pem")
APP_CERT_PEM = File.read("#{Rails.root}/certs/app_cert.pem")
APP_KEY_PEM = File.read("#{Rails.root}/certs/app_key.pem")

def encrypt_for_paypal(values)
    signed = OpenSSL::PKCS7::sign(OpenSSL::X509::Certificate.new(APP_CERT_PEM), OpenSSL::PKey::RSA.new(APP_KEY_PEM, ''), values.map { |k, v| "#{k}=#{v}" }.join("\n"), [], OpenSSL::PKCS7::BINARY)
    OpenSSL::PKCS7::encrypt([OpenSSL::X509::Certificate.new(PAYPAL_CERT_PEM)], signed.to_der, OpenSSL::Cipher::Cipher::new("DES3"), OpenSSL::PKCS7::BINARY).to_s.gsub("\n", "")
end

def paypal_encrypted(return_url, notify_url)
  values = {
    :business => 'seller_1316654707_biz@myurl.com',
    :cmd => '_cart',
    :upload => 1,
    :return => return_url,
    :invoice => id,
    :notify_url => notify_url,
    :cert_id => 'DVFY6JS476MR8'
  }
things.each_with_index do |item, index|
    values.merge!({
      "amount_#{index+1}" => item.price,
      "item_name_#{index+1}" => item.id,
      "item_number_#{index+1}" => item.id,
      "quantity_#{index+1}" => 1
    })
  end
  encrypt_for_paypal(values)
end

3 个答案:

答案 0 :(得分:2)

我重复了整个过程几次,然后就开始工作了。还会在与下一个答案类似的过程中审核每个值。不幸的是,每当我切换部署平台时,我似乎遇到了同样的问题。最终,它又开始工作了。

答案 1 :(得分:1)

我遇到了同样的问题,但问题与paypal_cert.pem文件有关,即Paypal的证书文件。

Paypal使用不同的证书进行登台和实时环境。请检查paypal_cert.pem文件,您会看到第一行提及应该使用的环境。

我使用以下代码

paypal_cert_file_name = ENV["paypal_cert_file_name"] || "paypal_cert_prod";

PAYPAL_CERT_PEM = File.read("#{Rails.root}/certs/#{paypal_cert_file_name}.pem")

每个环境有两个文件paypal_cert_prod.pempaypal_cert_sandbox.pem

答案 2 :(得分:0)

由于我们在paypal_encrypted方法中加密了许多值,因此在同一进程中发生某些加密错误时会出现此错误。

确保问题不是因为加密错误的最佳方法,请尝试从上面给定的值哈希中逐个删除键值对并进行付款请求。