我在法国农业信贷银行(法国银行)的电子交易系统中使用Paybox付款时出现问题。
我通过表单发送的变量没有问题,如下所示:
<form method="POST" action="<%= ENV['CREDIT_AGRICOLE_URL'] %>" id="paiement-form">
<input type="hidden" name="PBX_SITE" value="<%= ENV['PBX_SITE'] %>">
<input type="hidden" name="PBX_RANG" value="<%= ENV['PBX_RANG'] %>">
<input type="hidden" name="PBX_IDENTIFIANT" value="<%= ENV['PBX_IDENTIFIANT'] %>">
<input type="hidden" name="PBX_TOTAL" value="<%= @commande.total_price_centimes %>">
<input type="hidden" name="PBX_DEVISE" value="978">
<input type="hidden" name="PBX_CMD" value="<%= @commande.code %>">
<input type="hidden" name="PBX_PORTEUR" value="<%= ENV['PBX_PORTEUR'] %>">
<input type="hidden" name="PBX_REPONDRE_A" value="<%= ENV['PBX_REPONDRE_A'] %>">
<input type="hidden" name="PBX_RETOUR" value="<%= ENV['PBX_RETOUR'] %>">
<input type="hidden" name="PBX_EFFECTUE" value="<%= @confirmation_url %>">
<input type="hidden" name="PBX_ANNULE" value="<%= @annulation_url %>">
<input type="hidden" name="PBX_REFUSE" value="<%= @refus_url %>">
<input type="hidden" name="PBX_HASH" value="SHA512">
<input type="hidden" name="PBX_TIME" value="<%= @current_time %>">
<input type="hidden" name="PBX_HMAC" value="<%= @signature %>">
<input type="submit" value="Envoyer">
</form>
我已经这样设置了HMAC:
def paiement
@commande = Commande.find_by(code: params[:id])
@confirmation_url = ENV['PBX_EFFECTUE'].gsub('CODE_COMMANDE', @commande.code)
@annulation_url = ENV['PBX_ANNULE'].gsub('CODE_COMMANDE', @commande.code)
@refus_url = ENV['PBX_REFUSE'].gsub('CODE_COMMANDE', @commande.code)
@current_time = Time.now.strftime('%FT%T%:z')
msg = [
"PBX_SITE=#{ENV['PBX_SITE']}",
"PBX_RANG=#{ENV['PBX_RANG']}",
"PBX_IDENTIFIANT=#{ENV['PBX_IDENTIFIANT']}",
"PBX_TOTAL=#{@commande.total_price_centimes}",
"PBX_DEVISE=978",
"PBX_CMD=#{@commande.code}",
"PBX_PORTEUR=#{current_user.email}",
"PBX_REPONDRE_A=#{ENV['PBX_REPONDRE_A']}",
"PBX_RETOUR=#{ENV['PBX_RETOUR']}",
"PBX_EFFECTUE=#{@confirmation_url}",
"PBX_ANNULE=#{@annulation_url}",
"PBX_REFUSE=#{@refus_url}",
"PBX_HASH=SHA512",
"PBX_TIME=#{@current_time}"
]
key = ENV["CLE_HMAC"]
binKey = [key].pack("B*")
digest = OpenSSL::Digest.new('sha512')
@signature = OpenSSL::HMAC.hexdigest(digest, binKey, msg.join('&')).upcase
binding.pry
end
以下是PHP中的示例脚本:
// On récupère la date au format ISO-8601
$dateTime = date("c");
// On crée la chaîne à hacher sans URLencodage
$msg = "PBX_SITE=".$pbx_site.
"&PBX_RANG=".$pbx_rang.
"&PBX_IDENTIFIANT=".$pbx_identifiant.
"&PBX_TOTAL=".$pbx_total.
"&PBX_DEVISE=978".
"&PBX_CMD=".$pbx_cmd.
"&PBX_PORTEUR=".$pbx_porteur.
"&PBX_REPONDRE_A=".$pbx_repondre_a.
"&PBX_RETOUR=".$pbx_retour.
"&PBX_EFFECTUE=".$pbx_effectue.
"&PBX_ANNULE=".$pbx_annule.
"&PBX_REFUSE=".$pbx_refuse.
"&PBX_HASH=SHA512".
"&PBX_TIME=".$dateTime;
// echo $msg;
// Si la clé est en ASCII, On la transforme en binaire
$binKey = pack("H*", $keyTest);
// On calcule l’empreinte (à renseigner dans le paramètre PBX_HMAC) grâce à la fonction hash_hmac et //
// la clé binaire
// On envoi via la variable PBX_HASH l'algorithme de hachage qui a été utilisé (SHA512 dans ce cas)
// Pour afficher la liste des algorithmes disponibles sur votre environnement, décommentez la ligne //
// suivante
// print_r(hash_algos());
$hmac = strtoupper(hash_hmac('sha512', $msg, $binKey));
和PHP形式:
<!------------------ ENVOI DES INFORMATIONS A PAYBOX (Formulaire) ------------------>
<form method="POST" action="<?php echo $serveurOK; ?>">
<input type="hidden" name="PBX_SITE" value="<?php echo $pbx_site; ?>">
<input type="hidden" name="PBX_RANG" value="<?php echo $pbx_rang; ?>">
<input type="hidden" name="PBX_IDENTIFIANT" value="<?php echo $pbx_identifiant; ?>">
<input type="hidden" name="PBX_TOTAL" value="<?php echo $pbx_total; ?>">
<input type="hidden" name="PBX_DEVISE" value="978">
<input type="hidden" name="PBX_CMD" value="<?php echo $pbx_cmd; ?>">
<input type="hidden" name="PBX_PORTEUR" value="<?php echo $pbx_porteur; ?>">
<input type="hidden" name="PBX_REPONDRE_A" value="<?php echo $pbx_repondre_a; ?>">
<input type="hidden" name="PBX_RETOUR" value="<?php echo $pbx_retour; ?>">
<input type="hidden" name="PBX_EFFECTUE" value="<?php echo $pbx_effectue; ?>">
<input type="hidden" name="PBX_ANNULE" value="<?php echo $pbx_annule; ?>">
<input type="hidden" name="PBX_REFUSE" value="<?php echo $pbx_refuse; ?>">
<input type="hidden" name="PBX_HASH" value="SHA512">
<input type="hidden" name="PBX_TIME" value="<?php echo $dateTime; ?>">
<input type="hidden" name="PBX_HMAC" value="<?php echo $hmac; ?>">
<input type="submit" value="Envoyer">
</form>
有一些我想念的东西,但是我已经尝试了一千次来找到问题的来源,但我已经没有想法(和时间)。
有人可以帮忙吗?