Модул 2 · 2.4
Какво показва публично Вашият онлайн магазин
Модул 2: Инсталиране и настройка · Време за четене: 10 минути
Учебна цел: След този урок ще можете да обясните какво са Store API и REST API на WooCommerce, кои данни трябва да бъдат публични и кои не, и как да използвате безопасно API ключове и webhooks.
Основни понятия: API, REST API на WordPress, Store API (wc/store/v1), REST API на WooCommerce (wc/v3), JSON, публично и защитено, API ключ, права за четене и писане, минимални права, webhook, таен ключ на webhook, X-WP-Total
Магазин с две врати
Посетителят вижда Вашия магазин като уеб страници. Но магазинът Ви има и „врати“ за програми: адреси, на които дадена програма може да изисква или изпраща данни, без оформлението на страницата. Такава врата се нарича API (application programming interface). WordPress има такава под /wp-json/, това е REST API. В курса за WordPress, в урок 7.3, видяхте, че там например могат да се изискат потребителски имена, ако нищо не е защитено.
WooCommerce добавя два собствени API с много различно предназначение:
| Store API | REST API на WooCommerce | |
|---|---|---|
| Адрес | /wp-json/wc/store/v1/... | /wp-json/wc/v3/... |
| За кого | Браузърът на посетителя (блоковете за количка и плащане, урок 2.2) | Други програми: счетоводство, наличности, приложение, връзка с онлайн пазар |
| Нужен ли е ключ | Не, публичен е | Да, API ключ на администратор (или влязъл потребител с права) |
| Какво съдържа | Продукти, цени, статус на наличност, категории, отзиви; количката и поръчката на самия посетител | Всичко: поръчките на всички, клиенти, купони, настройки, отчети |
Store API е значи входът към витрината: каквото стои в магазина Ви на продуктова страница, стои и там, само че като данни. REST API на WooCommerce е задната врата на склада: тя трябва да е заключена.
Store API: какво може да изиска посетителят (и всеки друг)
Отворете в браузъра си:
https://shop.example.com/wp-json/wc/store/v1/productsПолучавате списък в JSON, текстов формат за данни. За всеки продукт виждате, наред с другото, името, slug, типа (прост, променлив), адреса на продуктовата страница (permalink), SKU, цените, изображенията, категориите, дали е в наличност и дали може да се купи. В заглавните редове на отговора стои X-WP-Total: броят продукти, които магазинът показва на посетителите.
Няколко неща, които е добре да знаете:
- Цените са в центове. Чайник за € 34,95 е записан като
"price": "3495"с"currency_minor_unit": 2. Разделяте на 100. Дали това е цената с или без ДДС, зависи от настройката „Показване на цените в магазина“ (урок 4.1). Това свойство използваме в задачата от урок 4.1. - Само видимото. Продуктите, които са чернова, лични или скрити в каталога, Store API не ги брои. Затова
X-WP-Totalможе да е по-малко от броя в администрацията Ви. - Всеки може да чете, но не и да пише просто така. Добавянето на нещо в количката или плащането чрез Store API е възможно само с еднократен код (nonce) от страницата и само за собствената количка на този посетител.
Лошо ли е, че това е публично? Не: това са същите данни, които са на продуктовите Ви страници. Конкурент, който иска да следи цените Ви, може да го направи и чрез обикновените страници. Все пак е добре да имате предвид: всичко, което поставите в поле на продукт, може да се озове в Store API. Никога не поставяйте доставни цени, имена на доставчици или вътрешни бележки в краткото или дългото описание, „защото темата така или иначе не показва това поле“.
Не затваряйте и Store API. Блоковете за количка и плащане се нуждаят от него (урок 2.2). Плъгини за сигурност, които „изключват REST API за посетителите“, затова понякога развалят плащането. Ако искате да ограничите REST API, изключете Store API от ограничението.
Злоупотреба със Store API все пак съществува, но откъм страната на писането: нападатели, които с откраднати номера на карти опитват хиляди малки поръчки. Това се нарича card testing; за него става дума в урок 6.3.
REST API на WooCommerce: винаги зад ключ
Сега отворете, без да сте влезли в профила си:
https://shop.example.com/wp-json/wc/v3/ordersПравилният отговор е съобщение за грешка със статус 401 (не сте влезли) и код като woocommerce_rest_cannot_view. Магазинът Ви казва: „Нямате право да виждате това“. Така трябва да бъде. Ако тук получите списък с поръчки, нещо сериозно не е наред: плъгин, който отваря права, персонализиран код в темата или ключ, поставен в публичен адрес. Тогава имате възможно изтичане на данни (курс за WordPress, урок 7.5, и база знания 6749).
Програмите, които трябва да имат достъп до поръчките Ви, получават API ключ. Създавате го в WooCommerce > Настройки > Разширени > REST API (Advanced > REST API). Ключът се състои от две части (consumer key и consumer secret) и принадлежи на потребител на WordPress. Избирате правата:
- Четене: програмата може да изисква данни;
- Писане: програмата може да създава и променя данни;
- Четене/Писане: и двете.
Правила, които спазвате винаги:
- Минимални права. Връзка със счетоводство, която само изтегля поръчки, получава само четене. Връзка за наличности, която обновява наличността, има нужда от писане, но инструмент за отчети не.
- Един ключ за всяка връзка, с ясно описание („Счетоводство, само четене, 2026“). Ако някоя връзка спре, отнемате само този ключ.
- Свържете ключа с потребител с подходящи права. Ключ на администратор може всичко, което може администраторът. По-добре създайте отделен потребител с ролята Мениджър на магазина (урок 6.2).
- Пазете тайната част на сигурно място. Виждате я само веднъж при създаването. Мястото ѝ е в настройките на програмата или в мениджър на пароли, а не в имейл, споделен документ или публично хранилище за код.
- Почиствайте. В REST API виждате за всеки ключ кога е използван за последен път. Ключ, който не е използван от месеци, отнемете.
Webhooks: магазинът Ви се обажда на друга програма
API чака някой да попита. Webhook работи обратно: при събитие в магазина Ви (нова поръчка, променен продукт) WooCommerce сам изпраща съобщение до адрес, който Вие посочите. Така програмата Ви за доставки веднага научава, че има поръчка, без да пита всяка минута. Настройвате ги в WooCommerce > Настройки > Разширени > Webhooks.
Три неща, на които да обърнете внимание:
- Съобщението съдържа лични данни. Webhook при нова поръчка изпраща име, адрес и поръчани продукти. Изпращайте ги само до адрес през https и до страна, която е посочена в политиката Ви за поверителност и в регистъра Ви на дейностите по обработване (урок 5.5).
- Тайният ключ. При webhook въвеждате таен ключ. С него получаващата програма може да провери, че съобщението наистина идва от Вашия магазин, а не от някой, който е налучкал адреса. Не го оставяйте празен и го споделяйте само с получателя.
- Неуспешна доставка. Ако получаващият адрес е недостъпен известно време, WooCommerce може да изключи webhook след многократни грешки. След прекъсване проверете в Webhooks дали те все още са активни.
Не бъркайте това с webhook на доставчика Ви на плащания (урок 4.4). Той работи обратно: доставчикът съобщава на Вашия магазин, че плащането е успешно.
На практика: ето как изглежда това в WooCommerce
При други хостинг доставчици работи по същия начин; това са части на самия WooCommerce.
- Отворете в частен прозорец
/wp-json/wc/store/v1/productsна Вашия (тестов) магазин. Намерете продукт и преизчислете цената. - Отворете в същия частен прозорец
/wp-json/wc/v3/orders. Трябва да видите статус 401. - Отидете в WooCommerce > Настройки > Разширени > REST API. Вижте какви ключове има, към кой потребител и с какви права. Отнемете ключовете, които не познавате (вече).
- Вижте в Webhooks какви webhooks има и към кой адрес отиват.
- Ако имате плъгин за сигурност, който ограничава REST API, проверете дали Store API е изключен от ограничението.
Обобщение
- Store API (
wc/store/v1) е публичен и съдържа това, което стои и на продуктовите Ви страници; блоковете за количка и плащане се нуждаят от него. - Не поставяйте вътрешни данни в полетата на продуктите: те могат да станат видими чрез Store API.
- REST API на WooCommerce (
wc/v3) трябва без ключ да връща 401; списък с поръчки без ключ е възможно изтичане на данни. - API ключове: минимални права, един за всяка връзка, към подходящ потребител, пазени в тайна, неизползваните се отнемат.
- Webhooks изпращат лични данни до друга програма: само през https, с таен ключ, до страна от регистъра Ви на дейностите по обработване.
Тест (quiz)
Задача
Задача A2.4: Какво показва публично Вашият онлайн магазин? Въведете адреса на Вашия (тестов) магазин и броя продукти, които са видими в магазина Ви. Програмата прави три заявки, без бисквитки и без ключ, само за четене:
/wp-json/wc/store/v1/products?per_page=1(Store API, чрез REST адреса, който сайтът Ви сам посочва);/wp-json/wc/v3/orders?per_page=1;/wp-json/wc/v3/customers?per_page=1.
Добре е: Store API отговаря със статус 200 и JSON списък; заглавният ред X-WP-Total е равен на броя, който въведохте; orders и customers връщат 401, 403 или 404.
Оранжева: X-WP-Total се различава (продуктите, които са чернова, лични или скрити, не се броят); Store API връща 401 или 403, обикновено заради плъгин за сигурност, поради което блоковете за плащане не работят.
Червена: Store API не е достъпен, въпреки че сайтът Ви работи с WooCommerce; или orders или customers връщат списък. Последното е сериозно: затворете го веднага, проверете API ключовете и плъгините си и преценете дали трябва да подадете уведомление за изтичане на данни. В такъв случай програмата запазва само кода на статуса, никога съдържанието.
След това проверете сами в REST API и Webhooks: какви ключове и webhooks има и знаете ли за всеки от тях за какво служи?
Прочетете още
- Безплатен курс по WordPress 7.3: Вход в системата: пароли, двуфакторно удостоверяване и brute force
- Безплатен курс по WordPress 7.5: Хакнати сте: разпознаване, възстановяване и предотвратяване
- Няма достъп до xmlrpc.php в WordPress
- Това изтичане на данни ли е и трябва ли да го съобщя?
- Store API (developer.woocommerce.com, на английски): https://developer.woocommerce.com/docs/apis/store-api/
- Rate limiting за Store API (developer.woocommerce.com, на английски): https://developer.woocommerce.com/docs/apis/store-api/rate-limiting/
