Api php не работает

У вас нет разрешения на доступ к API. OpenCart

Простой случай

Как правило проблема с доступом к API OpenCart возникает когда не настроен доступ по API.

IP адрес еще не добавлен в список разрешенных для доступа по API

Для решения этой проблемы нужно пройти в админке в Система-Пользователи-API , зайти в нужный объект списка и добавить свой IP адрес в список.

Добавляем свой IP адрес в список разрешенных для доступа по API

Либо на странице, с сообщением о проблеме с API просто нажать на кнопку Добавить IP-адрес и обновить страницу.

Но у нашего клиента на OpenCart 2.3 было не все так просто .

Случай клиента

Перед началом разработки модуля клиент сообщил мне, что в админке на странице редактирования заказа у него часто/рандомно не работает изменение заказа: У вас нет разрешения на доступ к API!

А как позже выяснилось, такая проблема у клиента на 2 сайтах, где используется одна и та же версия OpenCart 2.3, сайты размещены у одного и того же хостера.

Сообщение которое часто вылезало на странице редактирования заказа

Изначально я не придал этому значения, так как проблема у клиента была до меня, а сроки по разработке были крайне сжатые (как обычно), а значит ее решение это второстепенная задача, однако на этапе внедрения модуля в интернет-магазин клиента начались проблемы.

Дело в том, что интерфейс функциональности разработанного мной модуля располагался на странице редактирования заказа, во вкладке Товары , а из-за проблем доступа к API клиент не мог проверить работу модуля. Но это была первая часть проблемы. Как выяснилось позже мой модуль не мог корректно функционировать, так как использовал доступ к заказу основываясь на API.

Стоит уточнить, что интерфейс редактирования заказа во многом построен на Ajax API OpenCart, с использованием авторизации и получением токена для доступа к API.

Первым делом я перепроверил ajax запросы на корретность работы, как на клиенте так и на сервере. Токен на клиенте есть, проверка токена и авторизация по токену на сервере есть. Все также как и у API запросов, но не работает .

В чем проблема?

В другой статье мы уже вкратце разбирали Ajax API, а теперь копнем глубже.

Посмотрим контроллер catalog/controller/api/login.php (запрос получения токена для работы с API /index.php?route=api/login ), в случае валидного API key и наличия в этой группе IP адреса выполняющего (того кто делает запрос), данный запрос стартует новую сессию с именем api с единственным ключом api_id :

Затем посмотрим catalog/controller/startup/session.php (это первичный контроллер, который запускается при любом запросе в catalog , до основного контроллера), здесь при наличии токена полученного в предыдущем запросе происходит старт сессии с именем api :

А теперь пройдем в файл с классом сессии system/library/session.php и смотрим метод start :

На основании предыдущих файлов можно сказать: session_id может быть взят из куки api , а данные сессии можно получить по session_id .

Вспоминаем что API запросы OpenCart проверяют валидность доступа в catalog контекст по токену следующим образом:

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

Для того чтобы понять в чем проблема, можно попробовать записывать данные $_SESSION в файл в запросе получения токена (после его получения), и при первом API запросе в файле catalog/controller/startup/session.php прямо перед или после старта api сессии.

В итоге я увидел что:

Сессия с session_id создается на этапе авторизации и в нее записывается один единственный ключ api_key , но уже при следующем запросе к API, массив данных сессии с этим session_id пуст, но заполняется при отработке всех контроллеров указанных в массиве action_pre_action (в файле system/config/catalog.php ) и данные сессии сохраняются.

Однако при этом в нем отсутствует ключ api_id , без которого дальнейшая работа с API невозможна и поэтому мы видим сообщение: У вас нет разрешения на доступ к API!

Решение проблем

Почему возникает данная проблема мне не удалось выяснить. Развернув точную копию сайта клиента у себя на локальном сервере, воспроизвести проблему не получилось.

После обращения клиента в ТП хостинга, проблема исчезла на некоторое время (в это же время я пытался решить ее самостоятельно, но безуспешно, ибо не воспроизводилось), а потом благополучно, примерно через сутки, проблема вернулась.

Повторный дебаг $_SESSION не дал результатов, все также: при запросе авторизации создавалась новая сессия с ключом api_id , а при следующем обращении к API эта новая сессия была пуста.

Понимая что данные сессии не могут сохранится в $_SESSION при запросе авторизации снова смотрим catalog/controller/startup/session.php и видим запрос к БД:

Если этот запрос возвращает не пустой массив, значит можно считать что авторизация прошла успешно, а среди выбранных из БД данных есть api_id .

В catalog/controller/startup/session.php сразу после старта сессии пишем:

И проблема У вас нет разрешения на доступ к API! решена!

Для решения проблемы У вас нет разрешения на доступ к API! в данном случае достаточно после старта сессии в catalog/controller/startup/session.php вставить в массив сессии ключ api_id : $this->session->data[«api_id»] = $query->row[«api_id»];

Для убедительности я провел тест: получил ошибку У вас нет разрешения на доступ к API!, а затем применил описанное выше решение и не перезагружая страницы (где была ошибка) провел несколько ajax запросов к API OpenCart, которые прошли успешно.

Клиент доволен, оба сайта работают, проблема решена. Однако, источник проблемы не выявлен, есть несколько предположений, возможно как-нибудь проверю.

Источник

Почему не работает PHP?

Самый частый вопрос, который мне приходилось видеть и слышать — это «почему не работает PHP«. Более того, я когда-то сам задавался этим же вопросом. Что я делал (и так поступают 99% новичков)? Я делал следующее.

Сначала открывал html файл (либо php файл) в блокноте и вставлял туда PHP-код. Затем я пытался открыть данный файл в браузере. И что я видел? Разумеется, лабуду и никакого выполнения PHP-скрипта. А если это был PHP-файл, то мне предлагалось его сохранить на компьютер. Знакома ситуация? Если да, то сейчас Вы узнаете, почему так происходило и что надо сделать, чтобы PHP стал работать.

Дело в следующем: HTML, CSS и JavaScript обрабатываются браузером, поэтому мы легко могли создать простой HTML-файл и добавить туда код всех трёх языков. Однако, PHP обрабатывается не браузером (это ключевой момент), а интерпретатором PHP. Следовательно, нужен именно он. Также нужен файл настроек PHP, библиотеки и прочее. И вот только тогда всё заработает. Теперь вопрос: как это всё найти? Есть два способа: либо собирать всё вручную (это реально и не так сложно), либо пойти более простым путём и установить уже готовый пакет.

Я Вам советую двигаться именно по второму пути, то есть установить готовый пакет, в который входят: сервер Apache, SMTP сервер, MySQL, Perl и, разумеется, PHP. Такой пакет существует и называется он Denwer. Скачать его можно здесь: http://denwer.ru.

Установить его очень просто. Просто следуйте инструкциям.

Теперь запустите сервер (если он по каким-либо причинам не запустился), и, наконец, можете открыть, например, этот файл: «home/test1.ru/www/index.php«. И вставить туда Ваш PHP-код. И когда Вы введёте в браузере следующий адрес: «http://test1.ru«, то увидите результат выполнения Вашего PHP-скрипта.

Всё, PHP работает!

Кстати, если сервер не запускается, то в 99% случаях виноват антивирус и/или firewall. Проблема в том, что иногда они блокируют изменения файла hosts в Windows, поэтому постарайтесь отключить контроль за этим файлом в настройках антивируса. А если не получается, то на момент запуска сервера отключите антивирус.

В следующей статье я расскажу о том, как создавать домены и поддомены в Denwer. Также обязательно расскажу о файле hosts в ОС Windows, так как об этом очень важно знать любому, кто занимается созданием сайтов, используя пакет Denwer (да и другие пакеты тоже).

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 73 ):

    А скоко примерно МБ занимает этот Denwer при скачивании? Просто у меня с инетом напряг! И еще: когда создаешь сайт в Denwer, то в это время комп должен быть подключён к интернету или нет.

    Denwer весит 6.1 МБ. Для создания сайта на Denwer Интернет не нужен.

    Меня очень интересует следующий вопрос. Все лучшие сайты и коды уже написаны. Чтобы добится таких-же результатов как конкуренты, нужно очень много времени и не только. А какие шансы у простого смертного, который изучил php, MySQL и т.д. (на среднем уровне), устроиться на работу в уже расскрученные сервисы или порталы? И на какие должности? И возможно ли такое? Какие шансы??

    Если там вообще нужны программисты, то попробуйте, а для начала лучше поработайте фрилансером, наберитесь опыта, а потом будет и что показать потенциальным работодателям.

    Да. Сайт действительно хорош. Михаил! У меня вопрос: Делаю сайт со страницами формата .php но на них присудствуют теги html и обычный текст. Вопрос. Нужно ли ставить на такую страницу следующую строчьку, перед тегом .

    Михаил, я создал на компе статический сайт, но страницы расширения .php Как поисковики будут к нему относится?

    Здравствуйте! Я начал изучать Ваши уроки, присланные Вами, по phр. Я все повторяю за Вами, а весь текст на сайте получается таким: . ?? . Что мне делать?

    Михаил, и меня такая проблема: написал код для вытаскивания статьи из БД по примеру как у вас в уроке по PHP, после чего проверил все ли совпадает. Все было правильно, но когда я зашел на страницу в браузере, поле, где статьи должни были отабражаться, осталось пустым! Подскажите в чем проблема! P.S. если будет нужно я могу предоставить участки кода. с ув. Алекс

    Очень Вам благодарен. У меня была вторая ошибка. Вы оказываете величайшую помощь всем «чайникам» и достойны всяких похвал!

    Денвер стоит! Антивируса — нет как такового! firewall — не устанавливала! А файлы с расширением php в один день просто перестали отображаться в браузере (любом), показывает либо просто код, либо html страницу и php код. Все работало! И . больше не. Подскажите пожалуйста,а то у меня даже печеньки закончились (.

    Источник

    Пишем свой API для сайта с использованием Apache, PHP и MySQL

    С чего все началось

    Разрабатывая проект, я столкнулся с необходимостью организации клиент-серверного взаимодействия приложений на платформах iOS и Android с моим сайтом на котором хранилась вся информация — собственно БД на mysql, картинки, файлы и другой контент.
    Задачи которые нужно было решать — достаточно простые:
    регистрация/авторизация пользователя;
    отправка/получение неких данных (например список товаров).

    И тут-то мне захотелось написать свой API для взаимодействия с серверной стороной — большей своей частью для практического интереса.

    Входные данные

    В своем распоряжении я имел:
    Сервер — Apache, PHP 5.0, MySQL 5.0
    Клиент — Android, iOS устройства, любой браузер

    Я решил, что для запросов к серверу и ответов от него буду использовать JSON формат данных — за его простоту и нативную поддержку в PHP и Android. Здесь меня огорчила iOS — у нее нет нативной поддержки JSON (тут пришлось использовать стороннюю разработку).

    Так же было принято решение, что запросы можно будет отсылать как через GET так и через POST запросы (здесь помог $_REQUEST в PHP). Такое решение позволило проводить тестирование API через GET запросы в любом доступном браузере.

    Внешний вид запросов решено было сделать таким:
    http://[адрес сервера]/[путь к папке api]/?[название_api].[название_метода]=[JSON вида <«Hello»:«Hello world»>]

    Путь к папке api — каталог на который нужно делать запросы, в корне которого лежит файл index.php — он и отвечает за вызов функций и обработку ошибок
    Название api — для удобства я решил разделить API группы — пользователь, база данных, конент и тд. В таком случае каждый api получил свое название
    Название метода — имя метода который нужно вызвать в указанном api
    JSON — строковое представление JSON объекта для параметров метода

    Скелет API

    Скелет API на серверной стороне состоит из нескольких базовых классов:
    index.php — индексный файл каталога в Apache на него приходятся все вызовы API, он осуществляет парсинг параметров и вызов API методов
    MySQLiWorker — класс-одиночка для работы с базой MySQL через MySQLi
    apiBaseCalss.php — родительский класс для всех API в системе — каждый API должен быть наследован от этого класса для корректной работы
    apiEngine.php — основной класс системы — осуществляет разбор переданных параметров (после их предварительного парсинга в index.php) подключение нужного класса api (через require_once метод), вызов в нем нужного метода и возврат результата в JSON формате
    apiConstants.php — класс с константами для api вызовов и передачи ошибок
    apitest.php — тестовый api для тестирования новых методов перед их включением в продакшн версию

    Весь механизм выглядит следующим образом:
    Мы делаем запрос на сервер — к примеру www.example.com/api/?apitest.helloWorld=<>
    На серверной стороне файл index.php — производит парсинг переданных параметров. Index.php берет всегда только первый элемент из списка переданных параметров $_REQUEST — это значит что конструкция вида www.example.com/api/?apitest.helloWorld=<>&apitest.helloWorld2 — произведет вызов только метода helloWorld в apitest. Вызова же метода helloWorld2 непроизойдет

    Теперь подробней о каждом

    Я попробовал достаточно документировать файлы, чтобы не занимать много место под текст. Однако в тех файлах где нет комментариев, я все ж приведу описание.

    Index.php

    Как уже говорил раньше это входной индексный файл для Apache а значит все вызовы вида www.example.com/api будет принимать он.

    Первым делом устанавливаем тип контента — text/html (потом можно сменить в самих методах) и кодировку — UTF-8.
    Дальше проверяем, что у нас что-то запрашивают. Если нет то выводим JSON c ошибкой.
    Если есть параметры запроса, то подключаем файл движка API — apiEngine.php и создаем класс движка с переданными параметрами и делаем вызов api метода.
    Выходим из цикла так как мы решили что будем обрабатывать только один вызов.

    apiEngine.php

    Вторым по важности является класс apiEngine — он представляет собой движок для вызова api и их методов.

    apiConstants.php

    Данный класс используется только для хранения констант.

    MySQLiWorker.php

    Класс-одиночка для работы с базой. В прочем это обычный одиночка — таких примеров в сети очень много.

    apiBaseClass.php

    Ну вот мы подошли к одному из самых важных классов системы — базовый класс для всех API в системе.

    Как видно данный класс содержит в себе несколько «утилитных» методов, таких как:
    конструктор в котором осуществляется соединение с базой, если текущее API собирается работать с базой;
    деструктор — следит за освобождением ресурсов — разрыв установленного соединения с базой
    createDefaultJson — создает дефолтный JSON для ответа метода
    fillJSON — если подразумевается что запрос вернет только одну запись, то данный метод заполнит JSON для ответа данными из первой строки ответа от БД

    Создадим свой API

    Вот собственно и весь костяк этого API. Теперь рассмотрим как же это все использовать на примере создания первого API под названием apitest. И напишем в нем пару простых функций:
    одну без параметров
    одну с параметрами и их же она нам и вернет, чтобы было видно, что она их прочитала
    одну которая вернет нам бинарные данные

    И так создаем класс apitest.php следующего содержания

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

    И так у нас три метода

    helloAPI

    Это простой метод без параметров. Его адрес для GET вызова www.example.com/api/?apitest.helloAPI=<>

    Результатом выполнения будет вот такая страница (в браузере)

    helloAPIWithParams

    Этот метод принимает в параметры. Обязательным является TestParamOne, для него и сделаем проверку. Его его не передать, то будет выдан JSON с ошибкой

    helloAPIResponseBinary

    И последний метод helloAPIResponseBinary — вернет бинарные данные — картинку хабра о несуществующей странице (в качестве примера)

    Как видно — здесь есть подмена заголовка для вывода графического контента.
    Результат будет такой

    Есть над чем работать

    Для дальнейшего развития необходимо сделать авторизация пользователей, чтобы ввести разграничение прав на вызов запросов — какие-то оставить свободными, а какие-то только при авторизации пользователя.

    Ссылки

    Для тестирования выложил все файлы на github — simpleAPI

    Источник

    Читайте также:  Почему взрослый мужчина не хочет работать
    Оцените статью