Перейти к содержанию

Подпись запроса

Каждый запрос к Content API должен содержать параметр sign. По нему MEGOGO определяет ваш ключ и проверяет, что запрос никто не изменил. Ниже описано, как вычислить подпись, а также приведены разобранный пример и готовый код.

В Billing API подписи не используются: запросы к нему MEGOGO определяет по IP-адресу вашего сервера. Подробнее — в разделе Учетные данные.

Алгоритм

  1. Выпишите параметры запроса в том же порядке, что и в URL, без sign.
  2. Соедините имя и значение каждого параметра знаком =, а сами пары запишите подряд, без разделителя.
  3. Допишите в конец строки приватный ключ.
  4. Вычислите MD5-хеш строки (UTF-8) и запишите его в шестнадцатеричном виде строчными буквами (32 символа).
  5. Допишите в конец хеша публичный ключ.
  6. Добавьте sign в URL последним параметром.
sign = md5("name1=value1name2=value2" + private_key) + public_key

ПРИМЕЧАНИЕ

Параметры в подписи должны идти в том же порядке, что и в URL: MEGOGO их не сортирует.

Значения параметров

  • В подписи используйте декодированные значения: например, текст Гарри Поттер, а не %D0%93….
  • Кодируйте значения (percent-encoding) только в URL. Пробел можно передать как %20 или +.
  • Включайте в подпись все параметры, в том числе lang, access_token и page.

Разобранный пример

В примере используются вымышленные ключи:

Значение Пример
Приватный ключ 0123456789
Публичный ключ _example1_xx
Запрос GET /v1/stream?video_id=12345&lang=en
  1. Соедините параметры в порядке URL:

    video_id=12345lang=en
    
  2. Допишите приватный ключ:

    video_id=12345lang=en0123456789
    
  3. Вычислите MD5-хеш:

    a2330689677230e571d9266512049f63
    
  4. Допишите публичный ключ:

    a2330689677230e571d9266512049f63_example1_xx
    
  5. Добавьте sign в URL:

    https://api.megogo.net/v1/stream?video_id=12345&lang=en&sign=a2330689677230e571d9266512049f63_example1_xx
    

Еще несколько примеров с теми же ключами:

Параметры запроса Строка перед вычислением MD5-хеша sign
(нет) 0123456789 781e5e245d69b566979b86e28d23f2c7_example1_xx
text=Гарри Поттер, lang=en text=Гарри Поттерlang=en0123456789 2064e00bc2f05342a0b4317617052a82_example1_xx
paging_strategy=token, page=PjIw, category_id=16 paging_strategy=tokenpage=PjIwcategory_id=160123456789 df30340661b66a578f6b355a7beeaf0e_example1_xx

По этим примерам удобно проверять свой код.

Код

Функции принимают параметры в виде списка пар «имя–значение» в порядке URL.

from hashlib import md5
from urllib.parse import urlencode

def sign(params, private_key, public_key):
    data = "".join(f"{name}={value}" for name, value in params) + private_key
    return md5(data.encode("utf-8")).hexdigest() + public_key

def signed_url(base, path, params, private_key, public_key):
    query = list(params) + [("sign", sign(params, private_key, public_key))]
    return f"{base}/{path}?{urlencode(query)}"

print(signed_url("https://api.megogo.net/v1", "stream",
                 [("video_id", "12345"), ("lang", "en")],
                 "0123456789", "_example1_xx"))
const crypto = require("crypto");

function sign(params, privateKey, publicKey) {
  const data = params.map(([name, value]) => `${name}=${value}`).join("") + privateKey;
  return crypto.createHash("md5").update(data, "utf8").digest("hex") + publicKey;
}

function signedUrl(base, path, params, privateKey, publicKey) {
  const query = new URLSearchParams([...params, ["sign", sign(params, privateKey, publicKey)]]);
  return `${base}/${path}?${query}`;
}

console.log(signedUrl("https://api.megogo.net/v1", "stream",
  [["video_id", "12345"], ["lang", "en"]], "0123456789", "_example1_xx"));
<?php
function megogo_sign(array $params, string $privateKey, string $publicKey): string {
    $data = '';
    foreach ($params as [$name, $value]) {
        $data .= $name . '=' . $value;
    }
    return md5($data . $privateKey) . $publicKey;
}

function megogo_signed_url(string $base, string $path, array $params,
                           string $privateKey, string $publicKey): string {
    $query = [];
    foreach ($params as [$name, $value]) {
        $query[] = rawurlencode($name) . '=' . rawurlencode($value);
    }
    $query[] = 'sign=' . rawurlencode(megogo_sign($params, $privateKey, $publicKey));
    return $base . '/' . $path . '?' . implode('&', $query);
}

echo megogo_signed_url('https://api.megogo.net/v1', 'stream',
    [['video_id', '12345'], ['lang', 'en']], '0123456789', '_example1_xx');

Все три примера возвращают URL из шага 5 разобранного примера.

ОСТОРОЖНО

Не храните параметры в словаре или ассоциативном массиве (map), если он может изменить их порядок: в некоторых языках ключи сортируются, и подпись получается неправильной.

Ошибки

Ответ Причина Что делать
HTTP 400, "message": "You entered wrong sign key" Неправильная подпись, в запросе нет sign или публичный ключ неизвестен Проверьте, что параметры в подписи идут в том же порядке, что и в URL, а их значения декодированы
HTTP 400, "message": "You entered wrong sign key", но только в запросах от имени пользователя access_token не включен в подпись Включите access_token в подпись
HTTP 200, "result": "error", "code": 400 Подпись правильная, но какой-то параметр неправильный или отсутствует См. справочник Content API

Версия руководства 1.4.1, 2026-10-31 · Сообщить о проблеме на этой странице