Полный мануал по подписи (signature)Добрый день!
С часик занимался поиском ошибки в коде формирующем подпись. В итоге проблема крылась в более правильной реализации данной функции у себя в коде. Всем кто будет реализовывать функцию формирования подписи (сигнатуры) самостоятельно обратите внимание на следующее:
1. Думаю у всех будет какая-то коллекция/массив строк содержащий связку: ключ=значение.
2. исходя из примера COMTUBE будет функция формирующая на основании коллекции (п.1)
СОРТИРОВАННЫЙ по КЛЮЧу список параметров в виде URLа (
параметр password приведен для массовки, быть его в параметрах не должно).
Например исходный массив:
- Код: Выделить всё
{username='logn', password='mypassword',action='send'}
Будет привен к виду:
- Код: Выделить всё
action=send&password=mypassword&username=login&
Особо обратите внимание на конечный амперсанд. Именно на нем я и прокололся... Обычно подобные строки я формирую так:
- Код: Выделить всё
$res .= ($res == '' ? '' : '&') . $value;
в итоге получаем строку без конечного амперсанда, что более красиво с моей точки зрения.
Каждый параметр должен быть обработан аналогом функции urlencode из php. Для поиска подходящего варианта привожу пример рабочих вариантов:
- Код: Выделить всё
строка "Тестовый" => "%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D0%B9"
"english123456" => "english123456"
Ищите аналоги в своей среде.
3. В предыдущих шагах мы получили параметры которые надо подписать. Не весь URL а только параметры, которые мы будем ставить после знака "?" (так называемый QUERY_STRING). Вычисляем сигнатуру. Для этого вычисляем md5 хэш для строки вида: "params . '&password=mypassword'". Вот
ОНО. Мы получаем криворукую строку для вычисления подписи вида:
- Код: Выделить всё
action=send&password=mypassword&username=login&&password=mypassword
Видим 2 подряд идущих амперсанда. В моем коде был один, соответственно отлаживая код я был уверен что делаю все верно.
Далее рассмотрим реальные значения для отладки вашего кода:
1. Отсортированные параметры ввиде параметров:
- Код: Выделить всё
action=send&message=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D0%B9&number=791701234567&senderid=tasktest&username=DEMOLOGIN&
2. Сигнатура с паролем: "demoPASS" (не забудьте, что пароль тоже на
отurlencoдить ):
- Код: Выделить всё
99b38a7d2b5c9497222ebb0f5bf0e48c
3. Общая строка для отправки серверу:
- Код: Выделить всё
http://api.comtube.ru/scripts/api/sms.php?action=send&message=%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D0%B9&number=79871234567&senderid=tasktest&username=DEMOLOGIN&signature=99b38a7d2b5c9497222ebb0f5bf0e48c
Подводя итог можно сделать вывод: разрабочики сильно торопились/поленились/не придали значения, а когда увидели (увидят после поста
) то - поздно - поезд ушел: тысячи клиентов формируют подписи по корявым строкам.
Надеюсь пост поможет вам сохранить свое время.