1

我将 SagePay 的表单集成方法与 Ruby on Rails/EmberJS 应用程序一起使用。我正在处理 Rails 中所有复杂的支付结构。

简而言之,SagePay 需要一个加密、编码的“crypt”字符串,其中包含用户的账单地址、金额、支付后重定向和其他交易数据等数据。

SagePay在测试环境中给出一个加密密码。表单集成指南说将 crypt 构建为字符串,然后使用 AES-256 和加密密码对其进行加密,然后 Base64 对字符串进行编码以 POST 到 Sage 测试支付服务器。

以下是我实现它的方式(使用 Encryptor gem):

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 字符串。

问题

加密器拒绝使用给定的密钥。它说钥匙太短了。

我在这里想念什么?

4

3 回答 3

1

我也在为此苦苦挣扎,并收到相同的错误消息。

我最终决定直接尝试 Encryptor gem 中的每一行,并且不再收到该错误消息。因此,我从我的 Gemfile 中删除了那个 gem。

顺便说一句,您的示例中有一些错误:

  • 您需要使用 128 位加密,而不是默认的 256::algorithm => 'aes-128-cbc'
  • 初始化向量需要与密钥相同::iv => secret_key
  • 你不能用盐
  • 结果需要进行十六进制编码而不是 Base64

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

于 2014-04-10T17:02:16.110 回答
1

我正在努力在 ASP.NET 中做同样的事情。我不知道为什么他们在网站上为您提供的示例“集成套件”如此复杂。它们本身可能代表优雅的代码片段,但它们通过使用 web.config 文件中的设置让函数调用函数调用方法来混淆事物的工作方式。对于不熟悉此 API 的开发人员来说,一个将所有代码放在一个地方的简单示例会很有帮助。

无论如何,我仍然没有让它工作,但我已经设法克服了你遇到的问题,尽管我的方法可能对你没有帮助,因为我在 ASP.NET 中工作。我在我的项目中添加了对 SagePay.IntegrationKit.DotNet.dll 的引用,之后我就可以调用该函数

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

我现在似乎得到了一个有效的加密字符串发送到 SagePay,我的问题是他们的网站说加密是错误的,所以这仍在进行中。

于 2013-11-11T12:13:09.800 回答
0

测试和实时加密密码不同,还要检查您的加密密码长度是否为 16 个字符。

贤者支付支持

于 2013-11-28T11:43:34.597 回答