@maxsharun

Как сделать правильный SIG в API OK.RU?

Приветствую,

Пишу PHP класс для работы с OK.RU. Сделал, вроде бы так, как написано здесь:

namespace App\Http\Controllers\Apps\Shop\Api;
	
	use Illuminate\Http\Request;
	use App\Http\Controllers\Controller;
	use App\Models\Userok;
	
	class ApiOKExportController extends Controller
	{
		//

		protected $params = array(
		'application_id' => 'ID приложения',
		'application_key' => 'Публичный ключ',
		'session_secret_key' => 'Секретный ключ'
		
		);
		
		public function getalbums( Request $request ) {
			
//access_token для каждого пользователя хранится в БД (и обновляется при необходимости нажатием кнопки в личном кабинете)
			$userok = Userok::where('useroks.user_id', '=', $request->user_id)->first();  //Это, собственно, Ларавел. Получили строку с access_token из БД

			$paramsArray = array(
				'application_key' => $this->params['application_key'],
				'method' => 'photos.getAlbums',
				'uid' => $userok->ok_id
			);
			ksort($paramsArray);
			
			foreach($paramsArray as $k=>$v) {
				$paramsStr .= $k . "=" . $v;
			}
			$sig = strtolower(
				md5(
					$paramsStr
					.$this->params['session_secret_key']
				)
			);

			$sURL = "https://api.ok.ru/fb.do?method=photos.getAlbums&uid={$uid}&application_key={$paramsArray['application_key']}&session_secret_key={$this->params['session_secret_key']}&format=json&access_token={$userok->access_token}&sig={$sig}";
			$oResponce = json_decode($this->get_curl($sURL));
			return file_get_contents($sURL);
			
		}
		
		
		
		function get_curl($url) {
			if(function_exists('curl_init')) {
				
				$ch = curl_init();
				curl_setopt($ch, CURLOPT_URL,$url);
				curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
				curl_setopt($ch, CURLOPT_HEADER, 0);
				curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
				curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
				$output = curl_exec($ch);
				echo curl_error($ch);
				curl_close($ch);
				return $output;
				
				} else {
				return file_get_contents($url);
			}
		}
		
	}


Пришел с сервера такой ответ:
{"error_code":104,"error_msg":"PARAM_SIGNATURE : Invalid signature 3ca9389b7c7c36o1a85f7df12681db62, calculated by string application_key=APPKEY=jsonmethod=photos.getAlbumssession_secret_key=SEKRETKEYuid=********SECRET KEY*******","error_data":null}


Я, как вы догадались, понял суть ошибки. Я неправильно сгенерировал SIG. Перепробовал несколько вариантов. Читал статьи на тостере и т.п. Но все одно и тоже. Даже класс готовый нашел. Мне он не совсем подходит, но что-то из него взял на вооружение для того, чтобы свой нормально построить.
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ответы на вопрос 1
@maxsharun Автор вопроса
Вопрос решил. Делюсь.
1) https://apiok.ru/dev/methods/ вам в помощь. Там есть конструктор запросов. Заполняете поля, добавляете параметры и т.п.

2) Ниже исправления в коде. Обратите внимание, я закомментировал всё лишнее (т.е. ошибочно используемое)

$paramsArray = array(
			'application_key' => $this->params['application_key'],
			'format' => 'json',
			'method' => 'photos.getAlbums',
			//'uid' => $userok->ok_id
			);
			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);
			
			/*
			$sig = strtolower(
			md5(
			$paramsStr
			. md5(
			$userok-access_token
			. $this->params['session_secret_key']
			)
			)
			);
			*/
			
			$paramsArray['sig'] = $sig;
			$paramsArray['access_token'] = $userok->access_token;
			
			
			return $this->sendRequest(
			$this->apiUrl,
			$paramsArray,
			'POST'
			);


3) Напишу нормальную функцию, выложу её сюда, а ещё, возможно и на Хабре!

Всем удачи))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы