我尝试集成Paybox信用卡交易解决方案。
我已经尝试了至少 100 种不同的解决方案(不是在开玩笑),但没有一个有效,每次我得到“Problème d'identification du commerce。Accès refusé !” 消息(法语)。
这是我拥有的最“稳定”的代码:
<?php
function gen_hmac($site, $rang, $identifiant, $devise, $cmd, $porteur, $hash, $time, $total, $retour, $key) {
$msg = "PBX_SITE=". $site
."&PBX_RANG=". $rang
."&PBX_IDENTIFIANT=". $identifiant
."&PBC_TOTAL=". $total
."&PBX_DEVISE=". $devise
."&PBC_CMD=". $cmd
."&PBC_PORTEUR=". $porteur
."&PBC_RETOUR=". $retour
."&PBC_HASH=". $hash
."&PBC_TIME=" . $time ;
$binkey = pack("H*", $key);
echo "<!-- " . $msg . " -->";
$hmac = strtoupper(hash_hmac('sha512', $msg, $binkey));
echo "<!-- " . $hmac . " -->";
return $hmac;
}
// static
$site = 1999888;
$rang = 32;
//$identifiant = 110647233;
$identifiant = 107904482;
$devise = 978;
$hash = "SHA512";
$key = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
$cmd = "TEST Paybox";
$porteur = "test@paybox.com";
$time = date("c");
//$time = "2011-02-28T11:01:50+01:00";
// variable
$total = 1000;
//$retour = "ref:R;trans:T;auto:A;tarif:M;abonnement:B;pays:Y;erreur:E";
$retour = "Mt:M;Ref:R;Auto:A;Erreur:E";
$hmac = gen_hmac($site, $rang, $identifiant, $devise, $cmd, $porteur, $hash, $time, $total, $retour, $key);
?>
<html>
<head>
<title>Paybox TEST</title>
</head>
<body>
<?php
//print_r(hash_algos());
?>
<form method="POST" action="https://preprod-tpeweb.paybox.com/cgi/MYchoix_pagepaiement.cgi">
<!--<form method="POST" action="https://preprod-tpeweb.paybox.com/cgi/MYframepagepaiement_ip.cgi">-->
<!--<form method="POST" action="https://preprod-tpeweb.paybox.com/cgi/ChoixPaiementMobile.cgi">-->
<input type="hidden" name="PBX_SITE" value="<?php echo $site; ?>" />
<input type="hidden" name="PBX_RANG" value="<?php echo $rang; ?>" />
<input type="hidden" name="PBX_IDENTIFIANT" value="<?php echo $identifiant; ?>" />
<input type="hidden" name="PBX_TOTAL" value="<?php echo $total; ?>" />
<input type="hidden" name="PBX_DEVISE" value="<?php echo $devise; ?>" />
<input type="hidden" name="PBX_CMD" value="<?php echo $cmd; ?>" />
<input type="hidden" name="PBX_PORTEUR" value="<?php echo $porteur; ?>" />
<input type="hidden" name="PBX_RETOUR" value="<?php echo $retour; ?>" />
<input type="hidden" name="PBX_HASH" value="<?php echo $hash; ?>" />
<input type="hidden" name="PBX_TIME" value="<?php echo $time; ?>" />
<input type="hidden" name="PBX_HMAC" value="<?php echo $hmac; ?>" />
<!--<input type="hidden" name="PBX_REFUSE" value="http://test.fr/" />
<input type="hidden" name="PBX_ANNULE" value="http://test.fr/" />
<input type="hidden" name="PBX_EFFECTUE" value="http://test.fr/" />-->
<input type="submit" value="envoyer" />
</form>
</body>
</html>
大多数静态值来自 paybox 测试文档。
那么您知道我的代码有什么问题吗,或者您知道如何详细了解发送到 paybox 服务器的内容有什么问题吗?
真挚地
编辑: 关于我的目标的更多细节。我真正需要的是用 java 编写代码,但我在 php 中有一些代码示例最终有所帮助。
现在我尝试找出如何在 java 中生成一个干净的 hmac/sha512。
<?php
$key = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
$binkey = pack("H*", $key);
echo strtoupper(hash_hmac('sha512', "ABC", $binkey));
?>
输出:100A6A016A4B21AE120851D51C93B293D95B7D8A44B16ACBEFC2D1C9DF02B6F54FA3C2D6802E52FED5DF8652DDD244788A204682D2D1CE861FDA4E67F2792643
那么我怎样才能在 java 中重新创建相同的 hmac 算法呢?
我尝试了很多东西,但没有人达到我的目标,但这是我目前所拥有的:
private String generateHMAC( String datas )
{
// final Charset asciiCs = Charset.forName( "utf-8" );
Mac mac;
String result = "";
try
{
byte[] bytesKey = PayboxConstants.KEY.getBytes( );
final SecretKeySpec secretKey = new SecretKeySpec( bytesKey, "HmacSHA512" );
mac = Mac.getInstance( "HmacSHA512" );
mac.init( secretKey );
final byte[] macData = mac.doFinal( datas.getBytes( ) );
byte[] hex = new Hex( ).encode( macData );
result = new String( hex, "ISO-8859-1" );
}
catch ( final NoSuchAlgorithmException e )
{
AppLogService.error( e );
}
catch ( final InvalidKeyException e )
{
AppLogService.error( e );
}
catch ( UnsupportedEncodingException e )
{
AppLogService.error( e );
}
return result.toUpperCase( );
}
但它的输出是:AA6492987D7A7AC81109E877315414806F1973CC47B897ECE713171A25A11B279329B1BFF39EA72A5EFB7EDCD71D1F34D5AAC49999A780BD13F019ED99685B80
这绝对不等同于“克隆”的 php hmac 算法。
那么我可以在我的 java 代码中添加什么以使其符合其 php 等价?
编辑: 实际上我设法让所有东西一起工作,我在这里可用:http: //dev.lutece.paris.fr/plugins/plugin-paybox/index.html