Реализация интеграции формы SagePay с Ruby on Rails

Я использую метод интеграции формы SagePay с приложением Ruby on Rails/EmberJS. Я занимаюсь всей сложной платежной конструкцией в Rails.

Короче говоря, SagePay нужна зашифрованная, закодированная строка «crypt», которая содержит такие данные, как платежный адрес пользователя, сумма, перенаправления после оплаты и другие данные транзакции.

SagePay предоставляет пароль шифрования в тестовой среде. В руководстве по интеграции формы говорится, что нужно построить крипту в виде строки, затем зашифровать ее с помощью AES-256 и пароля шифрования, а затем закодировать строку в Base64 для отправки на сервер тестовых платежей Sage.

Вот как я это реализовал (используя гем Encryptor):

def encryptandencode(string)
    salt = Time.now.to_i.to_s
    secret_key = 'test-server-secret-key-from-sage'
    iv = OpenSSL::Cipher::Cipher.new('aes-256-cbc').random_iv
    encrypted_value = Encryptor.encrypt(string, :key => secret_key, :iv => iv, :salt => salt)

    encoded = Base64.encode64(encrypted_value).encode('utf-8')
    return encoded
end

где string — это незашифрованная, незашифрованная строка Crypt, содержащая данные транзакции.

Проблема

Шифровальщик отказывается использовать данный секретный ключ. Пишет, что ключ слишком короткий.

Что мне здесь не хватает?


person sjmog    schedule 31.10.2013    source источник


Ответы (3)


Я изо всех сил пытаюсь сделать то же самое в ASP.NET. Я не знаю, почему пример «Integration Kits», который они дают вам на веб-сайте, такой сложный. Они могут представлять собой элегантные фрагменты кода сами по себе, но они запутывают то, как все работает, поскольку функции вызывают методы вызова функций, используя настройки в файле web.config. Для разработчиков, плохо знакомых с этим API, будет полезен простой пример со всем кодом в одном месте.

В ЛЮБОМ СЛУЧАЕ, у меня все еще не работает, но мне удалось решить проблему, с которой вы столкнулись, хотя мой метод может вам не помочь, так как я работаю в ASP.NET. Я добавил в свой проект ссылку на SagePay.IntegrationKit.DotNet.dll, после чего смог вызвать функцию

SagePay.IntegrationKit.Cryptography.EncryptAndEncode(<name=value collection>, <Encryption Password>)

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

person Philip Stratford    schedule 11.11.2013
comment
У меня было то же самое - метод шифрования не подходит для V3.00. В итоге мне удалось убедить клиента перейти на Stripe. Мало того, что их документы являются исчерпывающими и простыми для понимания (множество примеров кода), они также предоставляют удобные функции прогнозирования и обзора. Это также не было навязчивой продажей — увеличение комиссии на 0,7%, но никаких комиссий торгового банка. Победитель во всех смыслах. - person sjmog; 15.11.2013

Я тоже боролся с этим и получил то же сообщение об ошибке.

Наконец, я решил попробовать каждую строку из драгоценного камня Encryptor напрямую и больше не получал это сообщение об ошибке. Поэтому я выбросил этот драгоценный камень из своего Gemfile.

Кстати, у вас есть несколько неправильных вещей в вашем примере:

  • вам нужно использовать 128-битное шифрование, а не стандартное 256: :algorithm => 'aes-128-cbc'
  • вектор инициализации должен совпадать с ключом: :iv => secret_key
  • Вы не должны использовать соль
  • результат должен быть закодирован в шестнадцатеричном формате, а не в Base64

result = encrypted_value.split('').map { |c| "%02X" % c.ord }.join

person Eden Townsend    schedule 10.04.2014

Пароль Test и Live Encryption различаются, также убедитесь, что ваш пароль шифрования имеет длину 16 символов.

Платная поддержка Sage

person Sage Pay Support    schedule 28.11.2013
comment
Документы разработчиков ужасны... Два года спустя они не лучше. - person simonmorley; 22.10.2015