无法在 Rails 中使用 PayPal 加密网站付款
Posted
技术标签:
【中文标题】无法在 Rails 中使用 PayPal 加密网站付款【英文标题】:Can't get PayPal Encrypted Website Payments to work in Rails 【发布时间】:2011-04-18 14:53:11 【问题描述】:我无法在 Rails 网站上使用 PayPal 加密网站付款。
我在发布到 PayPal URL 时收到两条不同的错误消息 - 在我使用沙盒的暂存站点上,我收到:
证书已被删除。请使用有效的证书。
而在生产现场,我得到:
我们无法解密证书 ID。
据我所知,它们的设置相同,除了一个使用 PayPal Sandbox 公钥,另一个使用普通的 PayPal 公钥。我一定是忽略了一些细节,但我已经为此苦恼了几天。
我使用以下命令生成公钥和私钥:
openssl genrsa -out app_key.pem 1024
openssl req -new -key app_key.pem -x509 -days 365 -out app_cert.pem
然后我将app_cert.pem
上传到 PayPal 并将我的证书 ID 放入如下文件中:
development:
user: seller_1259814545_biz@somedomain.com
action_url: https://www.sandbox.paypal.com/cgi-bin/webscr
paypal_cert_file: certs/paypal_sandbox_cert.pem
app_cert_file: certs/app_cert.pem
app_key_file: certs/app_key.pem
cert_id: CBDFN7JXBM2ZQ
secret: dfasdkjh3453
test:
user: seller_1259814545_biz@somedomain.com
action_url: https://www.sandbox.paypal.com/cgi-bin/webscr
paypal_cert_file: certs/paypal_sandbox_cert.pem
app_cert_file: certs/app_cert.pem
app_key_file: certs/app_key.pem
cert_id: CBDFN7JXBM2ZQ
secret: dfasdkjh3453
staging:
user: seller_1259814545_biz@somedomain.com
action_url: https://www.sandbox.paypal.com/cgi-bin/webscr
paypal_cert_file: certs/paypal_sandbox_cert.pem
app_cert_file: certs/app_cert.pem
app_key_file: certs/app_key.pem
cert_id: CBDFN7JXBM2ZQ
secret: dfasdkjh3453
production:
user: business@somedomain.com
action_url: https://www.paypal.com/cgi-bin/webscr
paypal_cert_file: certs/paypal_cert.pem
app_cert_file: certs/app_cert.pem
app_key_file: certs/app_key.pem
cert_id: QG2TTZZM9DUH6
secret: dfasdkjh3453
然后我在我的购物车模型中使用以下代码来加密数据:
class Cart < ActiveRecord::Base
has_many :line_items, :dependent => :destroy
PAYPAL_CERT_PEM = File.read("#Rails.root/#PAYPAL_CONFIG[:paypal_cert_file]")
APP_CERT_PEM = File.read("#Rails.root/#PAYPAL_CONFIG[:app_cert_file]")
APP_KEY_PEM = File.read("#Rails.root/#PAYPAL_CONFIG[:app_key_file]")
...
def paypal_data(return_url, notify_url)
values =
:business => PAYPAL_CONFIG[:user],
:cert_id => PAYPAL_CONFIG[:cert_id],
:custom => PAYPAL_CONFIG[:secret],
:cmd => '_cart',
:upload => 1,
:return => return_url,
:notify_url => notify_url,
:invoice => id,
:currency_code => 'AUD'
line_items.each_with_index do |item, i|
values.merge!(
"amount_#i+1" => "%.2f" % item.unit_price_ex_gst,
"tax_#i+1" => "%.2f" % item.unit_gst,
"item_name_#i+1" => item.product.full_name,
"item_number_#i+1" => item.id,
"quantity_#i+1" => item.quantity
)
end
encrypt_for_paypal(values)
end
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 |key, value| "#key=#value" .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
end
然后我在视图中使用如下代码:
- form_tag PAYPAL_CONFIG[:action_url] do
%div
= hidden_field_tag :cmd, '_s-xclick'
= hidden_field_tag :encrypted, cart.paypal_data(thanks_payments_url, payments_url)
= image_submit_tag 'paypal-checkout.gif', :alt => 'Check out with PayPal: The safer, easier way to pay'
我知道输出中似乎没有任何换行符或其他字符可以填满整个过程。
我已经检查并再次检查了我使用了所有正确的证书和证书 ID,并且上传到 PayPal 的内容与我的 certs
目录中的内容相匹配。
我已经完全没有尝试的想法了。任何帮助或想法将不胜感激。
【问题讨论】:
您确定您从 PayPal 复制的原始 html 完全 原样吗?确保没有多余的新行。 我没有从 PayPal 复制任何 HTML。这是自定义集成。 它在我的开发机器上工作,但不在服务器上。部署的代码库是相同的版本。证书被检入源代码控制并与代码库一起部署。 【参考方案1】:现在一切都在暂存和生产中。
我唯一能想到的是,PayPal 和他们的证书存在某种问题或延迟。
【讨论】:
PayPal 目前到处都是,我认为他们正在部署新版本的结帐页面。他们似乎在新旧版本之间来回切换了几次。以上是关于无法在 Rails 中使用 PayPal 加密网站付款的主要内容,如果未能解决你的问题,请参考以下文章