Tengo un problema cuando uso PHP para generar la firma del mensaje Hmac para usar con una página de pago alojada en Snappay.
Confirmé que mi cuenta provisional de Snappay funciona correctamente al crear la firma con la biblioteca JavaScript cryptojs y enviar varias transacciones de prueba.
Sin embargo, cada vez que intento usar PHP para generar la firma de mi mensaje, la API de Snappay devuelve un error de firma no válida.
Después de solucionar algunos problemas, parece que la variable de clave secreta codificada en base64 de PHP devuelve valores diferentes a los de la variable codificada en base64 de cryptojs.
Consulte los fragmentos de código a continuación. ¿Cómo puedo hacer que PHP coincida con la codificación cryptojs?
PHP:
$payloadRaw = sprintf( '%s%s%s%s%s%s%s%s%s', $accountid, $customerid, $merchantid, $transactionamount, $currencycode, $paymentmode, $email, $nonceid, $requestTimeStamp ); $secret_key = 'p2v9Im9+gr4RRts2MddoZm1DcOY+MK7/1LBqU7Ztpdc='; // Fake key $secretkeyBase64 = base64_encode($secret_key); // Does not match JavaScript $signatureHash = hash_hmac('sha256', $payloadRaw, $secretkeyBase64, true);JavaScript:
var secretkey = CryptoJS.enc.Base64.parse(secret_key); var txtnonce = "<?php echo "$nonceid"?>"; var txttimestamp = "<?php echo "$requestTimeStamp"?>"; var prehash = CryptoJS.enc.Utf8.parse(payloadRaw); var hash = CryptoJS.HmacSHA256(prehash, secretkey); var hashInBase64 = CryptoJS.enc.Base64.stringify(hash); var signatureData = hashInBase64 + ":" + txtnonce + ":" + txttimestamp; var prehash1 = CryptoJS.enc.Utf8.parse(signatureData); var HmacValueJS = prehash1.toString(CryptoJS.enc.Base64);Entrada - payloadRaw:
8373936484997002300349998556100.00USDCCsample@email.com6ad552829665012b695bbdf72ae2ab31de7e6eac7a94a6d4fa9412cda1961c7a1649797291
Salida: firmas de ejemplo y codificación de clave secreta:
Firma correcta JS Base64: ZUUvTjBxMG55NUlteUxvMWVJeUd3cUo3cXViakNOWkpkaytOQUd6U3lSaz06NmFkNTUyODI5NjY1MDEyYjY5NWJiZGY3MmFlMmFiMzFkZTdlNmVhYzdhOTRhNmQ0ZmE5NDEyY3WMJ5RhMTkTox2MjQRhMTk
SecretKey CryptoJS.enc.Base64.parse JS: a76bfd226f7e82be1146db3631d768666d4370e63e30aeffd4b06a53b66da5d7
Firma PHP Base64 incorrecta: SnhUMTBWRnZBS2txYThld2JhTlVnenJudzRzMVAvYUpldjlrYXRPS0xvST06NmFkNTUyODI5NjY1MDEyYjY5NWJiZGY3MmFlMmFiMzFkZTdlNmVhYzdhOTRhNmQ0ZmE5NDEyY3WMQ5RhMTkTox2
SecretKey base64_encode PHP: cDJ2OUltOStncjRSUnRzMk1kZG9abTFEY09ZK01LNy8xTEJxVTdadHBkYz0=