проблема с получение заказа через API

Тема в разделе "Ошибки и их решения", создана пользователем infockbox, 13 окт 2024.

  1. infockbox

    infockbox Новичок

    Сообщения:
    4
    Симпатии:
    0
    Нужна помощь в доработки функционала передача заказа из Opencart в гугл таблицы через api

    сделал такой скрипт

    function authorizeAndFetchOrders() {

    const username = 'api'; // Имя пользователя

    const apiKey = 'w6IpMcLOQydrbsiL4T6l0CZvvPQr2LNcrDY1QiQQmMqrOfNLG4PCYd0IR5dQmslETfdElIl6K3LSIUMQ18YOowshz7izHrUz06KqJnHBYDatfyN3vvsKHvGcKXoljqvshldn0wKDSVP5rOzbnnfzCCscsmWdgdaSEFkAZ0hDPzZJo3Lc45MWSGzw8Wd4Njll0V3O3xcWUDymjYKSmOMiWoEVDUvhkaVxfkGUzLy54PLlTl58vMSFWrOvmqeqJlo4'; // Ваш API ключ

    const apiUrl = 'https://shopmag.pp.ua/' + 'index.php?route=api/';

    const loginUrl = apiUrl + 'account/login&language=en-gb&store_id=0';

    const requestData = { 'username': username, 'key': apiKey };

    const options = {'method': 'post', 'contentType': 'application/x-www-form-urlencoded', 'payload': requestData, 'muteHttpExceptions': true};

    const loginResponse = UrlFetchApp.fetch(loginUrl, options);

    const loginStatus = loginResponse.getResponseCode();

    if (loginStatus === 200) {

    const loginData = JSON.parse(loginResponse.getContentText());

    Logger.log(JSON.stringify(loginData, null, 2)); // полный ответ в логи, для просмотра раскоментить

    if (loginData.api_token) {

    const sessionId = loginData.api_token; // Токен для сессии

    // URL для получения заказов

    const ordersUrl = apiUrl + 'sale/order.load&language=en-gb&store_id=0&order_id=1';

    // Настройки для запроса получения заказов

    const ordersOptions = { method: 'post', contentType: 'application/json', headers: { 'Cookie': 'OCSESSID=' + sessionId }, muteHttpExceptions: true };

    // Выполнение запроса получения заказов

    const ordersResponse = UrlFetchApp.fetch(ordersUrl, ordersOptions);

    const ordersStatus = ordersResponse.getResponseCode();

    if (ordersStatus === 200) {

    const ordersData = JSON.parse(ordersResponse.getContentText());

    Logger.log(JSON.stringify(ordersData, null, 2)); // полный ответ в логи, для просмотра раскоментить

    Logger.log('Заказы:', ordersData); // Выводим заказы в лог

    } else {

    Logger.log('Ошибка при получении заказов:', ordersResponse.getContentText());

    }

    } else {

    Logger.log('Не удалось получить API токен:', loginData);

    }

    } else {

    Logger.log('Ошибка авторизации:', loginResponse.getContentText());

    }

    }





    получаю такие ответы

    14:15:27Информация{ "success": "Сеанс API успешно запущен!", "api_token": "727d4ef9a7ab1877725f3b57ed"}
    14:15:28Информация{ "success": "Заказ успешно изменен!"}
    14:15:28ИнформацияЗаказы:


    пробовал менять все вариации ссылки sale/order.info, sale/orders и тд, но выдает ошибку

    Информация

    Ошибка при получении заказов: и пустой ответ.



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



    Для теста сделал 2 заказа

    если запрос

    const ordersUrl = apiUrl + 'sale/order.load&language=en-gb&store_id=0&order_id=1';

    const ordersUrl = apiUrl + 'sale/order.load&language=en-gb&store_id=0&order_id=2';

    то ответ Информация{ "success": "Заказ успешно изменен!"}

    если запрос с номером заказа которого нет

    const ordersUrl = apiUrl + 'sale/order.load&language=en-gb&store_id=0&order_id=3';

    то ответ

    Информация

    { "error": "Внимание: Заказ не найден!"}

    значит с авторизацией и сесией все норм.
     
  2. Blast

    Blast Продвинутый пользователь

    Сообщения:
    226
    Симпатии:
    80
    если вы используете стандартный api опенкарта, то роут api/order/info&order_id=1
     
  3. infockbox

    infockbox Новичок

    Сообщения:
    4
    Симпатии:
    0
    использую стандартный api
    в файле login сразу после установки на сервер голого опенкарта была такая подсказка
    залогинеться получить, токен и создать сессию получилось но на сервере еще есть папка sale где храниться файл order
    любые комбинации ссылкой пиводят к Ошибка при получении заказов: и пустой ответ. тольк оработает такой вариант ссылки
    api/sale/order.load&order_id=1
    /*

    * Opencart\Catalog\Controller\Api\Account\Login.Index

    *

    * @example

    *

    * $url = 'https://www.yourdomain.com/index.php?route=api/account/login&language=en-gb&store_id=0';

    *

    * $request_data = [

    * 'username' => 'Default',

    * 'key' => ''

    * ];

    *

    * $curl = curl_init();

    *

    * curl_setopt($curl, CURLOPT_URL, $url);

    * curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    * curl_setopt($curl, CURLOPT_HEADER, false);

    * curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);

    * curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);

    * curl_setopt($curl, CURLOPT_TIMEOUT, 30);

    * curl_setopt($curl, CURLOPT_POST, 1);

    * curl_setopt($curl, CURLOPT_POSTFIELDS, $request_data);

    *

    * $response = curl_exec($curl);

    *

    * $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

    *

    * curl_close($curl);

    *

    * if ($status == 200) {

    * $api_token = json_decode($response, true);

    *

    * if (isset($api_token['api_token'])) {

    *

    * // You can now store the session cookie as a var in the your current session or some of persistent storage

    * $session_id = $api_token['api_token'];

    * }

    * }

    *

    * $url = 'http://www.yourdomain.com/opencart-...r.load&language=en-gb&store_id=0&order_id=1';

    *

    * $curl = curl_init();

    *

    * curl_setopt($curl, CURLOPT_URL, $url);

    * curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    * curl_setopt($curl, CURLOPT_HEADER, false);

    * curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);

    * curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);

    * curl_setopt($curl, CURLOPT_TIMEOUT, 30);

    * curl_setopt($curl, CURLOPT_POST, 1);

    * curl_setopt($curl, CURLOPT_POSTFIELDS, $request_data);

    *

    * // Add the session cookie so we don't have to login again.

    * curl_setopt($curl, CURLOPT_COOKIE, 'OCSESSID=' . $session_id);

    *

    * $response = curl_exec($curl);

    *

    * curl_close($curl);

    *

    */
     
  4. Ravilr

    Ravilr Специалист

    Сообщения:
    3.984
    Симпатии:
    1.087
    Кто сделал? GPT ?? Не думаю что gpt может Вам подсказать верное решение для OpenCart 4

    И на всякий случай, для размещения кода на форуме есть кнопочка Вставить ...
     
  5. infockbox

    infockbox Новичок

    Сообщения:
    4
    Симпатии:
    0
    Вообщем нашел проблему в своей невнимательности установил 4 опенкарт и там плохо работает АПИ.
    Мне нужно под 3, переустановил на 3 опенкарт - все отлично и все работает.
    Код:
    function getOpenCartOrders() {
      var username = 'Default';
      var key = 'F1EOKXqy6OUCFRCKVPjIAcKV7gxdsc10Un69a7ilOCFTYdgjsULZEkuzYQaAMLbTk2i2ek97DGw8ryavmMgIUFd34X6sEmsqnaWYxi4ViguDKcOpmqKqZsdKq4ycSapVO1lRlqossI0BA5jyP2AohOcJ7WEn7AXthpVziwuT3qvVZjz86FXvlZgQAAhSWu03uAhOFw1HjVK42fNAZ76ozyRl0BWV2n0Mn6FB2e4sTeJsjDL4wyq1NWdie5ADSSif';
      var url = 'https://shopmag.pp.ua/index.php?route=api/login';
      var authPayload = {'method': 'post', 'payload': {'username': username, 'key': key}, 'muteHttpExceptions': true};
      const accessToken = JSON.parse(UrlFetchApp.fetch(url, authPayload).getContentText());
      Logger.log('Login Response: ' + JSON.stringify(accessToken, null, 2)); // Логируем полный ответ для диагностики
      if (accessToken.success) {
        var token = accessToken.api_token; // Извлекаем токен из правильного поля
        var ordersUrl = 'https://shopmag.pp.ua/index.php?route=api/order/info&order_id=2';
        var ordersOptions = {'method': 'post', 'headers': { 'Cookie': 'OCSESSID=' + token }, 'muteHttpExceptions': true}; 
        var ordersResponse = UrlFetchApp.fetch(ordersUrl, ordersOptions);
        const ordersData = JSON.parse(ordersResponse.getContentText());
        Logger.log(JSON.stringify(ordersData, null, 2)); // Логируем полученные заказы
        return ordersData; // Возвращаем заказы
      } else {
        Logger.log('Ошибка при получении токена: ' + JSON.stringify(accessToken));
        return null; // Возвращаем null в случае ошибки
      }
    }
    сейчас проблема как получить заказы по статусу заказа.
    или получить все заказы и потом отфильтровать по нужному статусу
     
  6. infockbox

    infockbox Новичок

    Сообщения:
    4
    Симпатии:
    0
    можно получить инфу по номеру заказа ?
    получить заказы с нужным статусом не возможно?
    И получить все заказы и потом отсортировать с нужным статусом тоже походу невозможно ?)

    буду копать в сторону указать в скрипте актуальный номер заказа, и при вносе в таблицу записывать номер заказа, тогда скрипт будет знать какой был предыдущий заказ и будет добавлять +1 пока не будет заказов, потом опять зная какой был последний заказ проверяет есть ли +1 заказ или нет.
    Пока вижу такую логику может есть боле проще и лучше вариант )
     
  7. Blast

    Blast Продвинутый пользователь

    Сообщения:
    226
    Симпатии:
    80
    api/order/info - инфа о заказе по его id
    заказы со статусом нет, все заказы нет, по какому-то фильтру - нет. а вообще открываете файл catalog/controller/api/order.php и смотрите что там есть, документация у опенкарта в этом плане откровенно слабая. При необходимости легко дописываете свои методы для получения/записи нужной инфы.