, если вы преобразуете пример base64 с этого сайта в строку
console.log(atob('NmUzMTNmYWU0YjExM2UxMmM0NjllZGI1NThjY2M5MmUzMzE3NTFlZmQ1NDQxYzAzMTgwMmIwNDQ0MWVmYTdhMw=='))
Вы получаете
6e313fae4b113e12c469edb558ccc92e331751efd5441c031802b04441efa7a3
Это шестнадцатеричная строка из 64 символов (256 бит)
Так что я думаю, что они получаютшестнадцатеричная строка HMAC и base64 кодируют это - что кажется ужасно глупым, шестнадцатеричный код безопасен для отправки как есть, зачем увеличивать его на 4 / 3rds !!
, если они просто использовали base64 HMAC, это будет всего 45 символов! !!
Вместо этого они получают шестнадцатеричную строку из 64 символов и base64 кодируют ее, чтобы получить 88 символов !!странное дизайнерское решение !!
Итак, ваш код должен делать то же самое
как
Data = Buffer.from(sha256.hex_hmac(apiSecret, data), 'utf-8').toString('base64');
, но не уверен, что в узле есть лучший способ конвертировать гексзакодированная строка в base64, но это работает
И, наконец, (на самом деле этот бит просто "соответствует" тому, как рассчитывается авторизация на странице примера, на которую ссылается OP https://developer.payeezy.com/payeezy-api/apis/post/transactions-3
). Итак, этонет необходимости увеличивать полезную нагрузку без причины)
Еще один момент, который вам нужно знать, JSON полезной нагрузки должен быть в определенном формате, кажется ... 2 пробела с отступом ... опять же,это чертовски глупая трата пропускной способности .. {"key":1234}
занимает 12 символов
{
"key": 1234
}
занимает 17
Так что, в любом случае, вам нужно сделать следующее:
JSON.stringify(payload,null, 2)
Эта последняя часть головоломки должна сделать ваш код следующим образом
const data = apikey + nonce + timestamp + token + JSON.stringify(payload,null, 2)
const sha256 = new Hashes.SHA256()
const shaData = Buffer.from(sha256.hex_hmac(secret, data), 'utf-8').toString('base64');