Не удается заставить PayPal зашифрованные платежи через веб-сайт работать в Rails - PullRequest
5 голосов
/ 29 сентября 2010

У меня проблемы с получением платежей через зашифрованный сайт PayPal для работы на сайте Rails.

Я получаю два разных сообщения об ошибках при публикации на URL PayPal - на моем промежуточном сайте, который использует песочницу, я получаю:

Сертификат был удален. Пожалуйста, используйте действующий сертификат.

Тогда как на производственной площадке я получаю:

Нам не удалось расшифровать идентификатор сертификата.

Насколько я могу судить, они настроены одинаково, за исключением того, что один использует открытый ключ 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 и поместил свой удостоверение личности в файл, подобный этому:

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'

Кажется, что в выводе нет новых строк или других символов, которые, как я знаю, могут запутать процесс.

Я проверил и дважды проверил, что я использую все правильные сертификаты и идентификаторы сертификатов и что то, что было загружено в PayPal, совпадает с тем, что находится в моем каталоге certs.

У меня полностью закончились идеи, чтобы попробовать. Буду признателен за любую помощь или идеи.

1 Ответ

0 голосов
/ 29 сентября 2010

Теперь все работает в стадии подготовки и производства.

Единственное, о чем я могу думать, это то, что возникла какая-то проблема или задержка с PayPal и сертификатами на их стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...