将Payfort支付与Ruby On Rails应用程序集成

我正在尝试使用rails app实现Payfort支付网关。 但我收到以下回复消息:

"response_message":"Signature mismatch" 

以下是我的尝试:

 params = {command: "AUTHORIZATION", currency: "USD", access_code: "z7TfXF2xxxxxxxxxxxx", merchant_identifier: "xoNbjDoq", merchant_reference: "405", language: "en", amount: 250, token_name: "token_is_here", expiry_date: "07/2023", card_number: "5200421234563432", card_security_code: "417", card_holder_name: "Abc Xyz", remember_me: "YES", return_url: "http://lvh.me:3000/payments/test"} params = params.except(:card_security_code, :card_number, :expiry_date, :card_holder_name, :remember_me) params = params.sort.to_h string = params.to_query(nil) string = string.gsub! '&', '' string = @@sha_request + string + @@sha_request string = Digest::SHA256.hexdigest string uri = URI.parse("https://sbpaymentservices.payfort.com/FortAPI/paymentApi") header = {'Content-Type': 'application/json'} http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true request = Net::HTTP::Post.new(uri.request_uri, header) request.body = params.to_json response = http.request(request) 

生成签名时检查参数序列。 并检查您在帐户中设置的算法,并在生成签名时使用相同的算法

或者尝试使用他们的gem

https://github.com/payfort/start-ruby

这个问题可能有很多原因,其中一个是rails form params和散列算法,这是我的实现

 def sign_with_key(params, key) string_to_digest = params.sort { |a, b| a[0].upcase <=> b[0].upcase }.map { |k, v| "#{k}=#{v}" }.join() string_to_digest.prepend(key) string_to_digest << key "Digest::#{@options[:sha].upcase}".constantize.hexdigest(string_to_digest) end 
Interesting Posts