无法在 Rails 中使用 PayPal 加密网站付款 [英] Can't get PayPal Encrypted Website Payments to work in Rails

查看:20
本文介绍了无法在 Rails 中使用 PayPal 加密网站付款的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法在 Rails 网站上使用 PayPal 加密网站付款.

I am having problems getting PayPal Encrypted Website payments to work on a Rails site.

我在向 PayPal URL 发帖时收到两条不同的错误消息 - 在我使用沙箱的临时站点上,我收到:

I am getting two different error messages when posting to the PayPal URL - on my staging site, which uses the sandbox, I am getting:

证书已被删除.请使用有效的证书.

The certificate has been removed. Please use a valid certificate.

而在生产现场,我得到:

Whereas on the production site, I get:

我们无法解密证书 ID.

We were unable to decrypt the certificate id.

据我所知,它们的设置完全相同,除了一个使用 PayPal Sandbox 公钥,另一个使用普通的 PayPal 公钥.我一定是忽略了一些细节,但我已经为此纠结了几天.

As far as I can tell they are set up identically, except that one uses the PayPal Sandbox public key, and the other uses the normal PayPal public key. I must be overlooking some detail but I have banging my head against this for a couple of days now.

我使用以下命令生成公钥和私钥:

I used the following commands to generate public and private keys:

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 放入这样的文件中:

Then I uploaded app_cert.pem to PayPal and put my cert ID into a file like this:

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

然后我在 Cart 模型中使用以下代码来加密数据:

Then I use the following code in my Cart model to encrypt the data:

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("
"), [], 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("
", '')
  end
end

然后我在视图中使用以下代码:

Then I use the following code in the view:

- 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'

输出中似乎没有任何换行符或其他字符,我知道这些字符会阻塞进程.

There don't seem to be any newlines or other characters in the output which I am aware can stuff up the process.

我已经检查并再次检查我使用的所有证书和证书 ID 是否正确,并且上传到 PayPal 的内容与我的 certs 目录中的内容相匹配.

I have checked and double-checked that I am using all the right certificates and certificate ids, and that what has been uploaded to PayPal matches what is in my certs directory.

我已经完全没有想法可以尝试了.任何帮助或想法将不胜感激.

I have completely run out of ideas to try. Any help or ideas would be greatly appreciated.

推荐答案

现在一切都在筹备和制作中.

Everything is working in staging and production now.

我唯一能想到的是 PayPal 和他们这边的证书存在某种问题或延迟.

The only thing I can think of is that there was some sort of problem or delay with PayPal and the certificates on their side.

这篇关于无法在 Rails 中使用 PayPal 加密网站付款的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆