Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » API ошибка авторизации. Что не так?

Страниц (1): [1]
 

1. Lipost - 23 Июня, 2018 - 09:31:20 - перейти к сообщению
Прошу помочь, подскажите что не так.
Если указать значение $key = 'Здесь ключ API'; и $secret = 'Здесь секретный ключ'; непосредственно в файле, то все работает.
Но я решил эти данные хранить в Mysql в зашифрованном виде. Все нормально шифруется, расшифровывается и выводится echo $strapi_key; echo $strapi_secret;
Но в таком вот виде в ответ получаю ошибку "api key not specified" или "invalid"
Заранее благодарю за помощь.

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $query = $db->query("SELECT * FROM test WHERE id='1'");
  3. $row = $query->fetch_assoc();
  4. function btce_query($method, array $req = array()) {
  5.  
  6. $codeapi_key = $row['api_key'];
  7. $strapi_key = __decode(hexToStr($codeapi_key),'$k');
  8. $codeapi_secret = $row['api_secret'];
  9. $strapi_secret = __decode(hexToStr($codeapi_secret),'$k');
  10.        
  11.        $key = $strapi_key;
  12.        $secret = $strapi_secret;
  13.  
  14.        $req['method'] = $method;
  15.        $mt = explode(' ', microtime());
  16.       $req['nonce'] = $mt[1];
  17.      // generate the POST data string
  18.       $post_data = http_build_query($req, '', '&');
  19.        $sign = hash_hmac('sha512', $post_data, $secret);
  20.        // generate the extra headers
  21.       $headers = array(
  22.                      'Sign: '.$sign,
  23.                      'Key: '.$key,
  24.       );
  25.      // our curl handle (initialize if required)
  26.        static $ch = null;
  27.       if (is_null($ch)) {
  28.             $ch = curl_init();
  29.             curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  30.              curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; WEX PHP client; '.php_uname('s').'; PHP/'.phpversion().')');
  31.      }
  32.       curl_setopt($ch, CURLOPT_URL, 'https://site.com/api/');
  33.       curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
  34.           curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  35.           curl_setopt($ch, CURLOPT_POST, true);
  36.       curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  37.       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  38.           curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
  39.       // run the query
  40.      $res = curl_exec($ch);
  41.       if ($res === false) throw new Exception('Could not get reply: '.curl_error($ch));
  42.      $dec = json_decode($res, true);
  43.       if (!$dec) throw new Exception('Invalid data received, please make sure connection is working and requested API exists');
  44.      return $dec;
  45. }
  46.  
2. Vladimir Kheifets - 23 Июня, 2018 - 20:51:07 - перейти к сообщению
Lipost пишет:
Прошу помочь, подскажите что не так.
Если указать значение $key = 'Здесь ключ API'; и $secret = 'Здесь секретный ключ'; непосредственно в файле, то все работает.
Но я решил эти данные хранить в Mysql в зашифрованном виде. Все нормально шифруется, расшифровывается и выводится echo $strapi_key; echo $strapi_secret;
Но в таком вот виде в ответ получаю ошибку "api key not specified" или "invalid"
Заранее благодарю за помощь.

Спойлер (Отобразить)

Добрый день!
Без вариантов, если получаете ошибку: "api key not specified" или "invalid", значит так оно и есть.
Попробуйте сравнить значения, 'Здесь ключ API и 'Здесь секретный ключ', с которыми работает, с теми, которые получены после запроса и расшифровки.
PHP:
скопировать код в буфер обмена
  1. echo strcmp($key, 'Здесь ключ API')."<br>";
  2. echo strcmp($secret, 'Здесь секретный ключ')."<br>";

Удачи!
3. Lipost - 23 Июня, 2018 - 22:51:40 - перейти к сообщению
Благодарю за ответ. Естественно, строки разные. Именно поэтому и выдает ошибку API. Проблема как раз в том, что не так, почему разные строки и как решить эту проблему.
Ведь после расшифровки
CODE (htmlphp):
скопировать код в буфер обмена
  1. echo $strapi_key;
  2. echo $strapi_secret;
выводит верно.

Затем присваиваем
CODE (htmlphp):
скопировать код в буфер обмена
  1. $key = $strapi_key;  
  2. $secret = $strapi_secret;

и дальше почему-то ошибка.

Почему? Где "собака зарыта"?
4. Vladimir Kheifets - 24 Июня, 2018 - 12:04:10 - перейти к сообщению
Lipost пишет:
Благодарю за ответ. Естественно, строки разные. Именно поэтому и выдает ошибку API. Проблема как раз в том, что не так, почему разные строки и как решить эту проблему.
Ведь после расшифровки
CODE (htmlphp):
скопировать код в буфер обмена
  1. echo $strapi_key;
  2. echo $strapi_secret;
выводит верно.

Затем присваиваем
CODE (htmlphp):
скопировать код в буфер обмена
  1. $key = $strapi_key;  
  2. $secret = $strapi_secret;

и дальше почему-то ошибка.
Почему? Где "собака зарыта"?

Добрый день!
Про собаку Вы очень кстати. "За время пути собака могла подрасти!"(Багаж, Маршак С.Я.)
Попробуйте воспользоваться моим советом:
CODE (php):
скопировать код в буфер обмена
  1. $key = $strapi_key;  
  2. $secret = $strapi_secret;
  3. echo strcmp($key, 'Здесь ключ API')."<br>";
  4. echo strcmp($secret, 'Здесь секретный ключ')."<br>";

Для начала необходимо понять, "подросла ли собака".
Если подрасла, то возможно проблема с кодировкой.
echo $strapi_key; может выводить тоже самое, но содеожимое может отличаться.
Удачи!
5. Lipost - 24 Июня, 2018 - 13:23:54 - перейти к сообщению
Я воспользовался Вашим советом и, как результат - строки разные, т.е. '0' не выводит. Вы же это имели ввиду? Кодировку файла менял, БД тоже, не помогло.

Попробую без шифрования и расшифровки из базы вывести и отправить.
6. Lipost - 25 Июня, 2018 - 12:03:35 - перейти к сообщению
Если без шифрования данные API добавляются в базу, то все-равно на выходе ошибка Огорчение
Прошу помочь советом. Что еще может быть?
7. Vladimir Kheifets - 25 Июня, 2018 - 13:29:41 - перейти к сообщению
Lipost пишет:
Если без шифрования данные API добавляются в базу, то все-равно на выходе ошибка Огорчение
Прошу помочь советом. Что еще может быть?

Добрый день!
Один из вебсервисов, с которым я работаю, даёт каждому клиенту на скачивание дневные пароли. Например,
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `B2Cpasswords` (`datum`, `password`) VALUES
  2. ('2008-08-07', '11G48J09B69V27L14F42');
Приходится их сохранять в базе данных (varchar(20) и запрашивать для каждого API-запроса.
Всё работает без проблем. НО, в этом случе, в паролях допускаются, только латинские символы и цифры. Если у Вас иначе, то тип varchar и техт использовать нежелательно.
Удачи!
8. Lipost - 26 Июня, 2018 - 21:51:53 - перейти к сообщению
Вопрос не решился пока.
Попробовал вывести после присваивания значения
CODE (htmlphp):
скопировать код в буфер обмена
  1. $key = $strapi_key;
  2. echo $key;

не хочет.
Хотя, если вывести за функцию,
CODE (htmlphp):
скопировать код в буфер обмена
  1. $query = $db->query("SELECT * FROM test WHERE id='1'");
  2. $row = $query->fetch_assoc();
  3. $codeapi_key = $row['api_key'];
  4. $strapi_key = __decode(hexToStr($codeapi_key),'$k');
  5. $codeapi_secret = $row['api_secret'];
  6. $strapi_secret = __decode(hexToStr($codeapi_secret),'$k');
  7. function btce_query($method, array $req = array()) {
  8.  

то $strapi_key выводится.
Может что-то с функцией btce_query не так? Точнее она рабочая, но только без этого кода
CODE (htmlphp):
скопировать код в буфер обмена
  1. $codeapi_key = $row['api_key'];
  2. $strapi_key = __decode(hexToStr($codeapi_key),'$k');
  3. $codeapi_secret = $row['api_secret'];
  4. $strapi_secret = __decode(hexToStr($codeapi_secret),'$k');

ну и, естественно, тогда необходимо прописывать в файле данные API
CODE (htmlphp):
скопировать код в буфер обмена
  1. $key = 'ключ';
  2. $secret = 'секрет';
9. Мелкий - 26 Июня, 2018 - 22:41:53 - перейти к сообщению
Функция? Однако Без выравнивания отступов её в исходном фрагменте и не видно.
Про области видимости переменных когда-нибудь слышали?

Ну и поставьте error_reporting в адекватный E_ALL.
10. Vladimir Kheifets - 27 Июня, 2018 - 07:53:10 - перейти к сообщению
Lipost пишет:
Вопрос не решился пока.
Попробовал вывести после присваивания значения
CODE (htmlphp):
скопировать код в буфер обмена
  1. $key = $strapi_key;
  2. echo $key;

не хочет.
Хотя, если вывести за функцию,
CODE (htmlphp):
скопировать код в буфер обмена
  1. $query = $db->query("SELECT * FROM test WHERE id='1'");
  2. $row = $query->fetch_assoc();
  3. $codeapi_key = $row['api_key'];
  4. $strapi_key = __decode(hexToStr($codeapi_key),'$k');
  5. $codeapi_secret = $row['api_secret'];
  6. $strapi_secret = __decode(hexToStr($codeapi_secret),'$k');
  7. function btce_query($method, array $req = array()) {
  8.  

то $strapi_key выводится.
Может что-то с функцией btce_query не так? Точнее она рабочая, но только без этого кода
CODE (htmlphp):
скопировать код в буфер обмена
  1. $codeapi_key = $row['api_key'];
  2. $strapi_key = __decode(hexToStr($codeapi_key),'$k');
  3. $codeapi_secret = $row['api_secret'];
  4. $strapi_secret = __decode(hexToStr($codeapi_secret),'$k');

ну и, естественно, тогда необходимо прописывать в файле данные API
CODE (htmlphp):
скопировать код в буфер обмена
  1. $key = 'ключ';
  2. $secret = 'секрет';

Мелкий пишет:
Про области видимости переменных когда-нибудь слышали?

Добрый день!
У Вас $row не передаётся в функцию btce_query
Удачи!
11. Lipost - 27 Июня, 2018 - 11:45:02 - перейти к сообщению
Vladimir Kheifets пишет:

У Вас $row не передаётся в функцию btce_query
Удачи!


Спасибо за помощь. Все заработало.

P.S. Не могу поставить спасибо. При клике выдает "Пожалуйста, только корректным способом входите в скрипт"

 

Powered by ExBB FM 1.0 RC1