Управление денежными средствами на расчетных счетах клиентов
Перевод денежных средств клиентов в Федеральное Казначейство
Аутентификация

Общая информация

Для инициализиции виджета Moneta SBP/FPS маркетплейсу необходимо передать одноразовый токен безопасности, в котором надежно зашифрована вся необходимая информация для проведения перевода. Токен безопасности должен формироваться на стороне маркетплейса, по указанным ниже правилам.

Формирование токена и подписи

Предварительные условия:
  1. 1.
    Необходимо пройти процедуру регистрации маркетплейса и получить ApiKey и ApiSecret.
  2. 2.
    Необходимо установить доверительные отношения с сервисом Moneta SBP/FPS.
Для реализации алгоритма формирования единовременного токена использованы следующие стандарты:
  1. 1.
    RFC 3986 Uniform Resource Identifier (URI): Generic Syntax.
  2. 2.
    RFC 2104 HMAC: Keyed-Hashing for Message Authentication.
  3. 3.
    RFC 4648 The Base16, Base32, and Base64 Data Encodings.
Токен состоит из 2-х частей:
  1. 1.
    Информационное сообщение, содержащее ключевую информацию о маркетплейсе и Пользователе ЭСП МОНЕТА.РУ, служебную информацию по переводу.
  2. 2.
    Подпись/Хеш от информационного сообщения из п.1, и использованием заранее полученного общего секрета - ApiSecret.

Формирование информационного сообщения

Информационное сообщение состоит из набора ключ-значение, которые закодированы в соответствии с правилами URL-кодирования строк по RFC 3986. Пример:
1
key1=someKey&key2=Some%20Key2&extraKey=100500
Copied!
Ниже приведен набор обязательных параметров, которые необходимо указать при формировании информационного сообщения (ключи должны следовать в отсортированном порядке, как в таблице ниже):
Ключ
Описание
Тип
Пример
cid
Идентификатор операции на стороне маркетплейса
String
i-17-203112
cidExpireAt
Дата/время до которой можно провести оплату (в EpohMills)
Число
1610464610097
key
ApiKey полученный при регистрации в MonetaId
Url Encoded String
site-x
nonce
Число, использующееся для невозможности повторного использования одного и того же токена (см. ниже)
Число
10201010
unitId
Номер профиля/юнита пользователя ЭСП МОНЕТА.РУ
Число
987654321
accountId
Номер ЭСП МОНЕТА.РУ для списания средств
Число
1230567
callbackUrl
Опциональный параметр для demo окружения: Возможность задать тестовый callback url, отличный от того, что задан партнеру при регистрации.
Url Encoded String
http%3A%2F%2Fya.ru
При формировании nonce удобно использовать текущее время в секундах на момент формирования токена. Каждый новый nonce в новом токене, формирующийся для данного unitId должен быть строго больше предыдущего для данного юнита (т.е. nonce должен строго монотонно возрастать), иначе он будет отброшен как некорректный.
Пример итогового информационного сообщения:
1
cid=i103020&cidExpireAt=1601375568244&key=partner123&nonce=1601375468244&unitId=987654321&accountId=1230567
Copied!

Формирование подписи

После того, как информационное сообщение сформировано, необходимо вычислить подпись/хеш с использованием общего секрета - ApiSecret.
Алгоритм формирования:
  1. 1.
    Вычислить HMAC-SHA512 хеш используя пару (информационное сообщение, секрет).
  2. 2.
    Полученный массив байт перевести в строку в шестнадцатеричном представлении.
1
// message - инф. сообщение
2
// secret - секрет/apiSecret
3
4
signatureBytes = hmac_sha512(message, secret)
5
signatureString = bytesToHex(signatureBytes)
Copied!
После того, как подпись в виде hex-строки сформирована, необходимо добавить ее к информационному сообщению с ключом signature:
cid=i103020cidExpireAt=1601375568244&key=partner123&nonce=1601375468244&unitId=987654321&accountId=1230567&signature=7d7b968768f664bcdbd67bbd4e3f59347b300226734ade68bed660ab7794522fe0e3e66ecdb211f746dae1c44681a306ee221f8706c63195607e525e979360
Финальным шагом необходимо полученную строку (информационное сообщение + подпись) закодировать при помощи base64, использовать при перенаправлении на виджет Moneta SBP/FPS.
1
// СЕРВЕР
2
// на стороне сервера формируем итоговый токен
3
message = "cid=i103020cidExpireAt=1601375568244&key=partner123&nonce=1601375468244&unitId=987654321&accountId=1230567&signature=7d7b968768f664bcdbd67bbd4e3f59347b300226734ade68bed660ab7794522fe0e3e66ecdb211f746dae1c44681a306ee221f8706c63195607e525e979360"
4
token = base64(message)
5
6
// БРАУЗЕР КЛИЕНТА
7
// делаем редирект в браузере клиента на указанный адрес с этим токеном
8
9
// DEV окружение
10
https://wallet-payments-ui.dev.mnxsc.tech/?token={{token}}
11
12
// PROD окружение
13
https://wallet-payments-ui.prod.mnxsc.tech/?token={{token}}
14
15
Copied!

Примеры кода для формирования токена

php
1
$secretKey = "secretKey";
2
$cid = "i103020";
3
$cidExpireAt = 1601375568244;
4
$key = "partner123";
5
$nonce = time();
6
$unitId = 987654321;
7
$accountId = 1230567;
8
9
$infoMessage = "cid=" . $cid . "&cidExpireAt=" . $cidExpireAt . "&key=" . $key . "&nonce=" . $nonce . "&unitId=" . $unitId . "&accountId" . $accountId;
10
$signatureString = hash_hmac("sha512", $infoMessage, $secretKey);
11
12
$token = base64_encode($infoMessage . "&signature=" . $signatureString);
Copied!
js
1
const SECRET_KEY = 'secretKey';
2
const cid = "i103020";
3
const cidExpireAt = 1601375568244;
4
const key = 'partner123';
5
const nonce = Date.now();
6
const unitId = 987654321;
7
const accountId = 1230567;
8
9
const urlEncodedParams =
10
'cid='+encodeURIComponent(cid)
11
+'&cidExpireAt='+encodeURIComponent(cidExpireAt)
12
+'&key='+encodeURIComponent(key)
13
+'&nonce='+encodeURIComponent(nonce)
14
+'&unitId='+encodeURIComponent(unitId)
15
+'&accountId='+encodeURIComponent(accountId);
16
const signature = CryptoJS.HmacSHA512(urlEncodedParams, SECRET_KEY);
17
const signatureHex = CryptoJS.enc.Hex.stringify(signature);
18
const finalParams = urlEncodedParams + '&signature='+encodeURIComponent(signatureHex);
19
20
const token = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(finalParams));
Copied!
Last modified 2mo ago