Подпись запросов к OT API

Описание

По умолчанию у ключей OTAPI отсутствует секретная часть и подписи запросов с её помощью. В этом случае параметры signature и timestamp передавать не нужно.
Если вы хотите дополнительно защитить свой ключ, нужно реализовать алгоритм подписи, который описан далее. Затем обратиться в саппорт или ваш чат с просьбой выдать вам секретную часть ключа. После этого любые запросы к ключу без подписи перестанут работать.

Для подписи запроса нужно к его параметрам добавить новые два параметра signature и timestamp.
Например signature=305330c8b160062a90c9449cd146f4fb79a458d0fe3f04b55908edab5c65f1a5&timestamp=20210212114345
Значение для параметра signature это SHA256 хэш от строки "{имяМетода}{конкатенацияЗначенийВсехПередаваемыхПараметров}{секретДляПодписи}"
Конкатенация значений должна быть получена до URL-кодирования от отсортированных по именам параметров.
Значение для timestamp это дата и время вызова по UTC+0 в формате "yyyyMMddHHmmss" ( "yyyy" год, "MM" месяц, "dd" день,"HH" часы, "mm" минуты, "ss" секунды ).
Для значений параметра timestamp допускается разница между клиентским и серверным временем не более чем в час.

Пример

Рассмотрим на примере метода GetCategoryInfo. У метода 3 основных параметра: instanceKey, language и categoryId.
После добавления параметров подписи запрос будет выглядеть следующим образом:
http://otapi.net/service/GetCategoryInfo?instanceKey=INSTANCEKEY&language=ru&categoryId=0&signature=305330c8b160062a90c9449cd146f4fb79a458d0fe3f04b55908edab5c65f1a5&timestamp=20210212114345

Отсортировав параметры по имени получим следующий порядок:
categoryId=0
instanceKey=INSTANCEKEY
language=ru
timestamp=20210212114345

Сложив их значения в отсортированном порядке получим строку "0INSTANCEKEYru20210212114345". Теперь добавим в начало строки имя метода, а в конец строки свой секрет ( допустим "123123" ) и получим: "GetCategoryInfo0INSTANCEKEYru20210212114345123123". Затем хэшируем строку с помощью SHA256 и получаем "305330c8b160062a90c9449cd146f4fb79a458d0fe3f04b55908edab5c65f1a5". Этот хэш передаем в параметр signature.

Ошибки

AccessDenied / MissingTimestamp: Отсутствует метка времени
AccessDenied / MissingSignature: Отсутствует подпись
AccessDenied / InvalidTimestamp: Неверная метка времени
AccessDenied / InvalidSignature: Неверная подпись