-
-
Save elentras/7f059f98b0f52ccf934f to your computer and use it in GitHub Desktop.
Paybox fix for "Problème d'identification du commerce. Accès refusé !"
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module MyPaybox | |
require "openssl" | |
def self.format_request(options = nil) | |
reference = options[:id] | |
montant = options[:amount] | |
porteur = options[:porteur] | |
pbx_hash = "sha512"; | |
# On récupère la date au format ISO-8601 | |
datetime = Time.now.utc.iso8601 | |
# On crée la chaîne à hacher sans URLencodage | |
msg = { | |
"PBX_SITE" => PBX_SITE, | |
"PBX_RANG" => PBX_RANK, | |
"PBX_IDENTIFIANT" => PBX_IDENTIFIANT, | |
"PBX_TOTAL" => montant, | |
"PBX_DEVISE" => 978, | |
"PBX_CMD" => reference, | |
"PBX_PORTEUR" => porteur, | |
"PBX_RETOUR" => "Mt:M;Ref:R;Auto:A;Erreur:E;sign:K", | |
"PBX_HASH" => pbx_hash.upcase, | |
"PBX_TIME" => datetime | |
} | |
pbx_code_hash = msg.to_a.map { |a| a.join("=") }.join("&") | |
# On récupère la clé secrète HMAC et que on renseigne dans la variable $keyTest; | |
# Si la clé est en ASCII, On la transforme en binaire | |
keyTest = PBX_KEY | |
binKey = [keyTest].pack("H*") | |
# On calcule l’empreinte (à renseigner dans le paramètre PBX_HMAC) grâce à la fonction hash_hmac et // la clé binaire | |
# On envoie via la variable PBX_HASH algorithme de hachage qui a été utilisé (SHA512 dans ce cas) | |
puts binKey | |
puts pbx_code_hash | |
hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new('sha512'), | |
binKey, pbx_code_hash).upcase | |
# hmac = OpenSSL::HMAC.hexdigest(digest, pbx_code_hash, binKey).upcase | |
# hmac = HMAC::SHA512.hexdigest(msg, binKeys) | |
# .upcase; | |
# La chaîne sera envoyée en majuscules, d où utilisation de strtoupper() | |
# On crée le formulaire à envoyer à PAYBOX System | |
# ATTENTION : ordre des champs est extrêmement important, il doit | |
# correspondre exactement à ordre des champs dans la chaîne hachée | |
pbx_hmac = hmac; | |
# echo $datetime; // pour verif | |
# echo $pbx_hmac; // pour verif | |
result = { | |
"PBX_SITE" => PBX_SITE, | |
"PBX_RANG" => PBX_RANK, | |
"PBX_IDENTIFIANT" => PBX_IDENTIFIANT, | |
"PBX_TOTAL" => montant, | |
"PBX_DEVISE" => 978, | |
"PBX_CMD" => reference, | |
"PBX_PORTEUR" => porteur, | |
"PBX_RETOUR" => "Mt:M;Ref:R;Auto:A;Erreur:E;sign:K", | |
"PBX_HASH" => pbx_hash.upcase, | |
"PBX_TIME" => datetime, | |
"PBX_HMAC" => hmac | |
} | |
result.to_a.map { |a| a.join("=") }.join("&") | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment