Как генерировать правильную подпись (SIG) в API OK.RU. Работаем с ошибкой 104

в 12:03, , рубрики: Api ok ошибка 104, php, как строить запросы в ОК

Не так давно я столкнулся с трудностью. У меня не получалось при запросе по 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/.

Находим вот такую форму:

Как генерировать правильную подпись (SIG) в API OK.RU. Работаем с ошибкой 104 - 1

Заполняем нужными данными и получаем по сути готовую инструкцию, а вдобавок тестируем свой запрос.

Надеюсь, статья была полезной.

Автор: maxsharun

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js