2013-10-31 46 views
1

我在Ruby on Rails/EmberJS應用程序中使用SagePay的表單集成方法。我正在處理Rails中所有複雜的付款構造。使用Ruby on Rails實現SagePay表單集成

總之,SagePay需要一個加密的編碼'crypt'字符串,其中包含用戶的帳單地址,金額,付款後重定向和其他交易數據等數據。

SagePay在測試環境中給出加密密碼。表單集成指南表示將crypt作爲字符串構建,然後使用AES-256和加密密碼對其進行加密,然後Base64對字符串進行編碼以發送到Sage測試支付服務器。

下面是我實現這個(使用加密器寶石):

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是包含的交易數據沒有被編碼的​​,未加密的地穴字符串。

問題

加密器拒絕使用給定的密鑰。它說鑰匙太短。

我在這裏錯過了什麼?

回答

1

我努力在ASP.NET中做同樣的事情。我不知道爲什麼他們在網站上給你的例子'集成套件'太複雜了。它們本身可能代表優雅的代碼段,但它們通過使用web.config文件中的設置調用函數調用方法來混淆事情的工作方式。對於新開發此API的開發人員來說,將所有代碼放在一個地方的簡單示例會很有幫助。

ANYWAY,我還沒有得到它的工作,但我已經設法克服你遇到的問題,雖然我的方法可能無法幫助你,因爲我在ASP.NET工作。我添加了一個參考SagePay.IntegrationKit.DotNet.dll到我的項目,在這之後我就能夠調用的函數

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

我現在似乎得到有效的加密字符串發送給SagePay,我問題是他們的網站說加密是錯誤的,所以這仍然是一項正在進行中的工作。

+0

我有同樣的事情 - 加密方法不適合V3.00。最後,我設法說服客戶切換到Stripe。他們的文檔不僅全面易用(大量的代碼示例),而且還提供了很好的預測和概述功能。這不是一個硬銷售 - 要麼增加0.7%的佣金,但沒有商業銀行手續費。贏家的方式。 – sjmog

0

測試和實時加密密碼不同也檢查您的加密密碼是16個字符的長度。

賢者支付撫養費

+0

開發人員文檔非常糟糕...兩年後,他們並沒有更好。 – simonmorley

1

我這個掙扎過,並收到同樣的錯誤消息。

我終於決定直接從Encryptor gem嘗試每一行,不再收到該錯誤消息。所以我從我的Gemfile中放棄了這個寶石。

順便說一句,你有幾件事錯在你的例子:

  • 你需要使用128位加密,而不是默認256::algorithm => 'aes-128-cbc'
  • 初始化向量需要是一樣的鑰匙::iv => secret_key
  • 你不能使用鹽
  • 結果有待十六進制不是base64編碼

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