正在做railscast #143。代码如下。当我添加安全内容时,我在开发中得到"我们无法解密证书id"。当我把安全装置拿出来的时候,它又能正常工作了。我已经用新证书等重新完成了整个过程几次。没有运气。
知道下一步该怎么做吗?
我遇到了和这篇文章完全相同的问题,在生产中经历了它,它神奇地开始工作:
不能't让PayPal加密网站支付在Rails中工作
在"buy these"页面:
<%= 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
我又重复了几次整个过程,它开始工作了。还以类似于下一个答案的过程检查每个值。不幸的是,每次切换部署平台时,我似乎都会遇到同样的问题。最后,它又开始工作了。
我遇到了同样的问题,但问题与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.pem
和paypal_cert_sandbox.pem
,每个环境一个。
由于我们在paypal_encrypted方法中加密了许多值,因此在同一过程中发生某些加密错误时可能会出现此错误。
确保问题不是由于加密错误,最好的方法是尝试从上述给定值哈希中逐个删除键值对,并发出支付请求。