Коннектор Shopify
Коннектор Shopify для AACsearch — OAuth-установка, дельта-синхронизация через вебхуки и маппинг товаров. Early preview.
Статус: Early preview. Исходный код коннектора Shopify лежит в packages/shopify-connector/. Публичный листинг в Shopify App Store пока не опубликован — установка выполняется вручную через custom app или development store.
Коннектор Shopify реализован по шаблону B (TypeScript серверный коннектор) из wiki/tasks/cms-platform-expansion.md. Использует OAuth Shopify для получения per-shop access token, шифрует его at-rest, и слушает product-вебхуки, чтобы пушить дельта-синхронизации в AACsearch.
Что поддерживается
- Онлайн-магазины Shopify на тарифах Basic, Shopify, Advanced.
- Товары, варианты, коллекции, остатки.
- Мультивалютные каталоги через Shopify Markets — альтернативные цены попадают в
attributes.price_by_currency. - Локали из Shopify Markets — каждый локалью отдельный документ.
Headless Shopify (Hydrogen / Storefront API) поддерживается, но требует ручной синхронизации со стороны вашего storefront-сервера по гайду Custom Connector.
Архитектура
Коннектор работает как Node.js-сервис рядом с монорепозиторием AACsearch. Роутер монтируется в /api/connectors/shopify:
Магазин Shopify
│ (admin install + webhooks)
▼
packages/shopify-connector/src/router.ts
├── /oauth/install ← старт OAuth
├── /oauth/callback ← приём auth code, шифрование токена
├── /webhooks/products/* ← create/update/delete товара
├── /webhooks/inventory/* ← изменение остатков
└── /sync/full ← ручной триггер полной синхронизации
│
▼
Connector API AACsearchФайлы:
packages/shopify-connector/src/oauth.ts— поток OAuth 2.0 Shopifypackages/shopify-connector/src/crypto.ts— шифрование токенов AES-256-GCMpackages/shopify-connector/src/product-mapper.ts— сущность Shopify →SyncProductInputpackages/shopify-connector/src/webhooks.ts— HMAC-верификация + дебаунсpackages/shopify-connector/src/sync.ts— драйверы полной и дельта-синхронизации
Установка (текущее preview)
Публичный листинг в Shopify App Store запланирован на v0.7. До этого — установка через custom app:
- В админке Shopify откройте Settings → Apps and sales channels → Develop apps → Create an app.
- Настройте scope Admin API:
read_products,read_inventory,read_collections,read_locations. - Установите приложение и скопируйте Admin API access token.
- В панели AACsearch создайте токен коннектора (Connectors → New Connector Token), привязанный к нужному индексу.
- На сервере AACsearch добавьте в
.envпараметры коннектора:
SHOPIFY_SHOP_DOMAIN=mystore.myshopify.com
SHOPIFY_ADMIN_ACCESS_TOKEN=shpat_xxxxxxxx
AACSEARCH_CONNECTOR_TOKEN=ss_connector_xxxxxxxx
AACSEARCH_PROJECT_ID=org_xxxxxxxx- Зарегистрируйте вебхуки из админки Shopify или через API:
| Topic | Address |
|---|---|
products/create | https://your-aacsearch.example.com/api/connectors/shopify/webhooks/products/create |
products/update | https://your-aacsearch.example.com/api/connectors/shopify/webhooks/products/update |
products/delete | https://your-aacsearch.example.com/api/connectors/shopify/webhooks/products/delete |
inventory_levels/update | https://your-aacsearch.example.com/api/connectors/shopify/webhooks/inventory/update |
- Запустите первичную полную синхронизацию из панели AACsearch или вручную:
curl -X POST https://your-aacsearch.example.com/api/connectors/shopify/sync/full \
-H "Authorization: Bearer $AACSEARCH_CONNECTOR_TOKEN"Маппинг полей
Маппинг товара Shopify → документ AACsearch — в packages/shopify-connector/src/product-mapper.ts. Ключевые правила:
| Поле Shopify | Поле AACsearch | Примечание |
|---|---|---|
id | external_id | Числовой product ID — стабильный |
title | title | Локализованное название под настроенную локаль рынка |
body_html | description | HTML вычищается перед отправкой |
vendor | brand | Пустая строка отбрасывается |
product_type + теги | categories | Плюс коллекции, в которых состоит товар |
tags | tags | Сплит по запятой, trim |
sku варианта | sku | SKU первого варианта |
price варианта | price | Минимальная цена варианта |
compare_at_price | sale_price | Максимальная «list price» среди вариантов, если есть |
Сумма inventory_quantity | stock_quantity | По всем локациям |
| Inventory > 0 | availability | in_stock / out_of_stock / preorder по policy варианта |
images[0].src | image_url | Первая картинка; полный список — в attributes.images |
| Options вариантов | attributes.option_* | Цвет, размер, материал как фасетные поля |
| Локаль (Shopify Markets) | locale | Один документ на локаль, суффикс в external_id |
По умолчанию документы на уровне вариантов не экспортируются — товар уходит одним документом с данными вариантов в attributes. Если магазину нужен поиск по вариантам, собирайте custom connector, который шлёт по документу на вариант.
Надёжность вебхуков
Shopify ретраит вебхуки до 19 раз в течение 48 часов при не-2xx ответе. Коннектор отвечает 200 сразу после успешной HMAC-верификации и постановки в очередь — собственно вызов Connector API идёт асинхронно. Если очередь ингеста AACsearch недоступна, обработчик вебхука логирует ошибку, а периодический job сверки пересылает дельту в следующем плановом запуске.
Провал HMAC — ответ 401 немедленно. Shopify пометит вебхук как failed и сделает backoff. Это правильное поведение — провал верификации значит подменённый payload или ротация secret без обновления коннектора.
Поиск проблем
| Симптом | Причина | Решение |
|---|---|---|
| Вебхуки не приходят | Неверный webhook URL или сломанный HTTPS | Перерегистрировать вебхуки; проверить TLS-сертификат хоста AACsearch |
401 webhook_signature_mismatch в логах | Webhook secret Shopify рассинхронизировался | Ротировать webhook secret в админке Shopify и обновить SHOPIFY_WEBHOOK_SECRET |
| Полная синхронизация виснет на 1000 товаров | Уперлось в батч; цикл повторов залип | Проверить rate-limit-заголовки Admin API; снизить размер батча до 250 |
| Товар виден в Shopify, но нет в поиске | Товар не опубликован в канал "Online Store" | Опубликовать в канал продаж, который читает коннектор |
| Inventory в поиске 0, а на складе есть | Локация склада не в whitelist коннектора | Включить локацию в конфиге или дать scope read_locations |
403 invalid_or_revoked_key | Токен AACsearch отозван или указывает на другую организацию | Создать новый токен в панели AACsearch и обновить AACSEARCH_CONNECTOR_TOKEN |
Roadmap
Текущее preview покрывает OAuth, вебхуки products/inventory, full и delta sync. Запланировано к публичному релизу:
- Установка в один клик из Shopify App Store
- UI для per-market локалей и валют во встроенной админке
- Документы на уровне вариантов как опциональный mapper
- Bulk operations API для каталогов >100k SKU вместо REST-цикла
План реализации — wiki/tasks/cms-platform-expansion.md § A12.
Связанные страницы
- Обзор коннекторов
- Жизненный цикл Connector API
- Custom Connector — для headless Shopify (Hydrogen)
- Диагностика