Генерация подписи для WayForPay на Node.js
Подключаю онлайн-оплату WayForPay. Для подключения нужно сгенерировать подпись. Вот пример из документации (https://wiki.wayforpay.com/view/852102):
<?php
$string = "test_merchant;www.market.ua;DH783023;1415379863;1547.36;UAH;Процессор Intel Core i5-4670 3.4GHz;Память Kingston DDR3-1600 4096MB PC3-12800;1;1;1000;547.36";
$key = "dhkq3vUi94{Z!5frxs(02ML";
$hash = hash_hmac("md5",$string,$key);
?>
У меня back-end на Node.js. Попробовал переписать на:
const crypto = require('crypto');
let str = "site_com;www.site.com;ID4;1415379863;19.99;USD;Тариф Бесплатный;1;19.99";
let key = "bf3211a2e7359d3323a84ef9a1fc12c855bf21ba";
let hmac = crypto.createHmac('md5', key);
hmac.update(new Buffer(str, 'utf8'));
return hmac.digest('hex');
Тут некторые данные в str и key немного изменил, чтобы не выкладывать в общий доступ секретные данные вроде ключа. Синтаксис остался тот же, суть не изменилась. Виджет онлайн-оплаты возвращает ошибку "Не удалось осуществить оплату (1113) Invalid signature". Тех. поддержка делает попытки решить проблему, но пока безуспешно.
Предлагали такой вариант:
let hmac = crypto.createHmac('md5', key);
let buffer = new Buffer(str, 'utf8');
hmac.update(buffer.toString('utf8'));
return hmac.digest('hex');
Это не помогло.
Ответы (1 шт):
В документации к сервису написано:
<?php
$string = "test_merchant;www.market.ua;DH783023;1415379863;1547.36;UAH;Процессор Intel Core i5-4670 3.4GHz;Память Kingston DDR3-1600 4096MB PC3-12800;1;1;1000;547.36";
$key = "dhkq3vUi94{Z!5frxs(02ML";
$hash = hash_hmac("md5",$string,$key);
?>
Результат HMAC_MD5 и значение параметра merchantSignature будет строка 3f787303ac524389b4a76383f9508251.
На node.js
const crypto = require('crypto');
const string = 'test_merchant;www.market.ua;DH783023;1415379863;1547.36;UAH;Процессор Intel Core i5-4670 3.4GHz;Память Kingston DDR3-1600 4096MB PC3-12800;1;1;1000;547.36';
const key = 'dhkq3vUi94{Z!5frxs(02ML';
const hash = crypto.createHmac('md5', key).update(string).digest('hex');
console.log(hash);
[Running] node "/md5-1.js"
3f787303ac524389b4a76383f9508251
Вычисленные хеши совпадают, т.е. crypto.createHmac('md5', key).update(string).digest('hex'); является правильным подходом к вычислению сигнатуры.
Ищите проблему в подходе к генерации базовой строки.