Не так давно я столкнулся с трудностью. У меня не получалось при запросе по API в OK.RU (одноклассники) создать правильную SIG (ошибка 104). Как оказалось, я не единственный такой был, предлагаемые в сети рецепты не очень работали (проверил многие методом тыка). На самом деле работали, просто я не понимал, как правильно построить нужный запрос, чтобы ещё и SIG был правильным.
Конкретно, этот пост посвящен именно 104 ошибке API OK.RU.
PARAM_SIGNATURE 104 Неверная подпись
Ниже простенький код для получения списка альбомов. Код немного костыльный (для себя я написал нужный класс, но он специфический и мало кому пригодится), но описывает суть, а многие начинающие программисты могут на основе примера создать свой собственный класс.
protected $params = array(
'application_id' => '5*******6',
'application_key' => 'C***********A',
'session_secret_key' => '*************0'
);
protected $apiUrl = 'https://api.ok.ru/fb.do?';
public function getalbums( Request $request ) {
//access_token я записываю в БД и вытаскиваю его оттуда.
$userok = Userok::where('useroks.user_id', '=', $request->user_id)->first();
$paramsArray = array(
'application_key' => $this->params['application_key'],
'format' => 'json',
'method' => 'photos.getAlbums',
);
ksort($paramsArray);
foreach($paramsArray as $k=>$v) {
$paramsStr .= $k . "=" . $v;
}
/*** Отредактировано уже в статье. Это кусок кода, как делать не надо (в первой редакции забыл закоментировать).
$sig = strtolower(
md5(
$paramsStr)
. md5(
$userok->access_token
.$this->params['session_secret_key']
)
);
**/
$sectret_key = md5($userok->access_token.$this->params['session_secret_key']);
$sig = md5($paramsStr.$sectret_key);
$paramsArray['sig'] = $sig;
$paramsArray['access_token'] = $userok->access_token;
return $this->sendRequest(
$this->apiUrl,
$paramsArray,
'POST'
);
}
protected function sendRequest($url = '', $params = array(), $method = 'POST') {
if(is_array($params)) {
$params = http_build_query($params);
}
$ch = curl_init();
if($method == 'GET') {
$url .= $params;
} else if($method == 'POST') {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, true);
}
Но чтобы это работало, нужен правильный $paramsArray, иначе Вы решите 104-ю ошибку, но получите другую. Многие начинающие программисты, наверняка, игнорируют старания OK.RU помочь разработчикам.
Итак, переходим по ссылке https://apiok.ru/dev/methods/.
Находим вот такую форму:
Заполняем нужными данными и получаем по сути готовую инструкцию, а вдобавок тестируем свой запрос.
Надеюсь, статья была полезной.
Автор: maxsharun