import requests from typing import Tuple from .base import MarketplaceService class WooCommerceService(MarketplaceService): """Сервис для работы с WooCommerce API""" def _get_api_url(self) -> str: """Получить базовый URL для WooCommerce REST API""" base = self.config.store_url.rstrip('/') # WooCommerce REST API v3 endpoint return f"{base}/wp-json/wc/v3/" def _get_auth(self) -> tuple: """Получить кортеж для Basic Auth (consumer_key, consumer_secret)""" return (self.config.consumer_key or '', self.config.consumer_secret or '') def test_connection(self) -> Tuple[bool, str]: """ Проверить соединение с WooCommerce API. Использует endpoint /wp-json/wc/v3/ для проверки. Аутентификация через HTTP Basic Auth. """ if not self.config.store_url: return False, 'Не указан URL магазина' if not self.config.consumer_key or not self.config.consumer_secret: return False, 'Не указаны ключи API' url = self._get_api_url() try: # Пытаемся получить список товаров (limit=1) для проверки авторизации # Это более надёжный способ проверки, чем просто обращение к корню API response = requests.get( f"{url}products", params={'per_page': 1}, auth=self._get_auth(), timeout=15 ) if response.status_code == 200: return True, 'Соединение установлено успешно' elif response.status_code == 401: return False, 'Неверные ключи API (Consumer Key/Secret)' elif response.status_code == 403: return False, 'Доступ запрещён. Проверьте права API ключа' elif response.status_code == 404: return False, 'WooCommerce REST API не найден. Проверьте, что WooCommerce установлен и активирован' else: return False, f'Ошибка соединения: HTTP {response.status_code}' except requests.exceptions.Timeout: return False, 'Таймаут соединения (15 сек)' except requests.exceptions.ConnectionError: return False, 'Не удалось подключиться к серверу. Проверьте URL магазина' except Exception as e: return False, f'Ошибка: {str(e)}' def sync(self) -> Tuple[bool, str]: """Выполнить синхронизацию с WooCommerce""" # TODO: реализовать синхронизацию return True, 'Синхронизация запущена (заглушка)' def fetch_orders(self, limit: int = 50): """Получить заказы с WooCommerce""" # TODO: реализовать pass def push_products(self, products): """Отправить товары на WooCommerce""" # TODO: реализовать pass