Мне нужно создать строку запроса со следующей структурой:
https://api.company.com/api/hello.json?app_id=имя $&хэш = $ хэш
Переменная $ hash должна соответствовать SHA1 текущей строки запроса, связанной с моим клиентским секретом.
Я проверил свои учетные данные API в консоли, запустив следующий скрипт bash (который дает мне правильный ответ)
$ challenge=$(curl -s "http://www.company.com/api/hello.json?app_id=$name" | head -1 | sed 's/.*"challenge": *"\([0-9]*\)".*/\1/')
$ hash=$(printf $challenge$key | openssl dgst -sha1 | sed 's/^.*\([a-f0-9]\{40\}\).*$/\1/')
$ curl "http://www.company.com/api/hello.json?app_id=$name&hash=$hash"
Однако, когда я пытаюсь воссоздать переменную $ hash программно с PHP, аутентификация завершается неудачно из-за неверного параметра hash.
Для создания параметра $ hash я использую:
$hash = sha1($challenge . $key);
Но, очевидно, я что-то здесь упускаю. Я предполагаю выражение в скрипте bash:
a-f0-9]\{40\}\).*$/\1/
проверяет, является ли строка шестнадцатеричной строкой из 40 символов, но я не уверен, как интегрировать это в мой код PHP.
Если я проверю значение переменной $ challenge в консоли, я получу 9-значное числовое значение, например: 244971205, тогда как та же переменная в моем PHP-скрипте имеет строковое значение. Может ли это быть причиной того, что мой параметр $ hash неправильно отформатирован?
Стоит отметить, что если я использую значение переменной $ hash, то получаю, запустив
echo "$hash"
в консоли прямо в моей строке запроса вызов API успешно завершен, но я хочу получить то же значение программно.
Был бы очень признателен, если бы кто-то мог указать мне в правильном направлении.
Оказалось, я слишком усложнял вещи. Что мне действительно нужно было сделать, чтобы получить правильное значение для $challenge
переменная должна была проанализировать данные JSON с json_decode
и после этого просто получить доступ к свойству, которое содержит числовое значение, как это $challenge = $obj['object']['property']
Других решений пока нет …