Интеграция Payfort Payment с приложением Ruby On Rails
Я пытаюсь реализовать платежный шлюз Payfort с приложением rails. Но я получаю следующее ответное сообщение:
"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)
2 ответа
Причин такой проблемы может быть много, одна из них - это параметры rails, а также алгоритм хэширования. Вот моя реализация.
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
Остальная часть кода кажется хорошей, но проблема, с которой я столкнулся, и я вижу здесь, заключается в том, что вы используете 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
Надеюсь, это поможет:)
Проверьте последовательность параметров при генерации подписи. и проверьте алгоритм, который вы настроили в учетной записи и используете тот же алгоритм при генерации подписи
Или попробуйте использовать их драгоценный камень