Генерация подписи для 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 шт):

Автор решения: nörbörnën

В документации к сервису написано:

<?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.

На

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'); является правильным подходом к вычислению сигнатуры.

Ищите проблему в подходе к генерации базовой строки.

→ Ссылка