Railscast 143 (безопасность Paypal), в результате чего «мы не смогли расшифровать идентификатор сертификата». - PullRequest
1 голос
/ 23 октября 2011

Doing railscast # 143. Код ниже. Когда я добавляю элементы безопасности, я получаю «Мы не смогли расшифровать идентификатор сертификата». в развитии. Когда я убираю вещи, связанные с безопасностью, они снова работают замечательно. Я переделал весь процесс пару раз с новыми сертификатами и тому подобным. Неудачно.

Есть идеи, что попробовать дальше?

У меня точно такая же проблема, как и в этой публикации, которая возникла на производстве, и она волшебным образом заработала:

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

На странице "Купить эти":

<%= 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>

В корзине.рб:

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

Ответы [ 3 ]

2 голосов
/ 07 декабря 2011

Я повторил весь процесс еще несколько раз, и он начал работать.Также рассматривается каждое значение в процессе, аналогичном следующему ответу.К сожалению, каждый раз, когда я переключаю платформы развертывания, я сталкиваюсь с той же проблемой.И в конце концов, он снова начинает работать.

1 голос
/ 06 октября 2014

Я столкнулся с той же проблемой, но проблема была связана с файлом 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 по одному для каждой среды.

0 голосов
/ 23 октября 2011

Поскольку мы шифруем несколько значений в методе paypal_encrypted, эта ошибка может возникать, когда во время того же процесса возникает какая-то ошибка шифрования.

Лучший способ убедиться, что проблема связана не с ошибкой шифрования, попробуйте удалить пару ключ-значение по одному из вышеуказанного хэша значений и сделать запрос на оплату.

...