Перейти к основному содержимому

Алгоритм формирования подписи в теле запроса callback уведомления


При обновление статусов транзакций на указанный вами эндпоинт придет запрос со следующим body. Пример:

{
"transaction_uid": "583de7f8-2ced-41d8-acc5-5f559e997748",
"amount": 100,
"status": "Created",
"currency_id": "TRY",
"external_id": "gat 14",
"comment": "invoice",
"recalculated": false,
"updated_at": "2023-07-07T06:07:03.098+00:00",
"type": "invoice",
"sign": "a5c58b3a2f9ece478c14f4d7596ba8482bf7923250b2cfea90e774cf0268c5f9"
}

Для того чтобы сформировать строку аналогичную значению поля Sign нужно сначала взять тело объекта запроса без поля sign. Пример:

{
"transaction_uid": "583de7f8-2ced-41d8-acc5-5f559e997748",
"amount": 100,
"status": "Created",
"currency_id": "TRY",
"external_id": "gat 14",
"comment": "invoice",
"recalculated": false,
"updated_at": "2023-07-07T06:07:03.098+00:00",
"type": "invoice"
}

Далее нужно отсортировать свойства объекта по алфавиту. Пример:

{
"amount": 100,
"comment": "invoice",
"currency_id": "TRY",
"external_id": "gat 14",
"recalculated": false,
"status": "Created",
"transaction_uid": "583de7f8-2ced-41d8-acc5-5f559e997748",
"type": "invoice",
"updated_at": "2023-07-07T06:07:03.098+00:00"
}

Следующим шагом нужно убрать все названия ключей и преобразовать объект в строку, разделяя значения свойств родительского объекта разделителем “ : ”. Пример:

100:invoice:TRY:gat 14:false:Created:583de7f8-2ced-41d8-acc5-5f559e997748:invoice:2023-07-07T06:07:03.098+00:00
warning

Если бы любое свойство объекта, например comment было равно null а не "invoice", то строка имела бы вид:

100::TRY:gat 14:false:Created:583de7f8-2ced-41d8-acc5-5f559e997748::2023-07-07T06:07:03.098+00:00

а не:

100:null:TRY:gat 14:false:Created:583de7f8-2ced-41d8-acc5-5f559e997748::2023-07-07T06:07:03.098+00:00

Далее получившуюся строку кодируем по алгоритму HMAC SHA 256 где используем secret_key уникальный для каждого мерчанта (Если вам его не выдали запросите у службы поддержки). В нашем случае secret_key=d2d39fbc327d53ade165047eb86f289b1f4b0b5a1bc644bd165592fa6e297c22. Пример кода формирования сигнатуры в javascript + node.js(input это входной объект из пункта 2 без sign):

import {createHmac} from 'crypto';

const signString = Object.entries(input).sort().map((v) => v[1]).join(':');
const signature = createHmac('sha256', secret_key).update(signString).digest('hex');

в нашем случае

signature = a5c58b3a2f9ece478c14f4d7596ba8482bf7923250b2cfea90e774cf0268c5f9

В итоге нужно сравнить полученную строку со значение sign из первоначального объекта, если она совпадает значит сигнатура посчитана верно. Для проверки можете использовать онлайн-инструмент, например hmac-sha256-online.