【问题标题】:Integrating Payfort Payment with Ruby On Rails App将 Payfort 付款与 Ruby On Rails 应用程序集成
【发布时间】:2017-07-15 03:42:55
【问题描述】:

我正在尝试使用 rails 应用程序实现 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)

【问题讨论】:

  • 你找到解决办法了吗?

标签: ruby-on-rails signature mismatch payfort


【解决方案1】:

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

或者尝试使用他们的 gem

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

【讨论】:

  • 感谢您的回复。但是你能给我任何参数的例子吗?谢谢:)
【解决方案2】:

这个问题可能有很多原因,其中之一是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

【讨论】:

    【解决方案3】:

    其余代码看起来不错,但我遇到的问题是我在这里看到的问题是您使用的是 string = params.to_query(nil),它将使用转义字符 %20 而不是 card_holder_name 中的空格

    所以我使用CGI.unescape 并解决了这个问题 -

    def signature(string)
      Digest::SHA256.hexdigest(CGI.unescape("#{SHA_REQUEST_PHRASE}#{string.gsub(/&/, "")}#{SHA_REQUEST_PHRASE}"))
    end
    

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 2017-07-14
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多