Skip to content

Instantly share code, notes, and snippets.

@elentras
Created September 18, 2012 14:26
Show Gist options
  • Save elentras/7f059f98b0f52ccf934f to your computer and use it in GitHub Desktop.
Save elentras/7f059f98b0f52ccf934f to your computer and use it in GitHub Desktop.
Paybox fix for "Problème d'identification du commerce. Accès refusé !"
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