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

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

问题描述

我在使PayPal加密网站付款在Rails站点上无法正常工作遇到问题.

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

然后,我在购物车模型中使用以下代码对数据进行加密:

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("\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

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

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.

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

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