Modulul 2 · 2.4
Ce afișează public magazinul dumneavoastră
Modulul 2: Instalare și configurare · Timp de citire: 10 minute
Obiectiv de învățare: După această lecție puteți explica ce sunt Store API și REST API din WooCommerce, ce date trebuie să fie publice și care nu, precum și cum folosiți în siguranță cheile API și cârligele web (webhooks).
Noțiuni cheie: API, REST API din WordPress, Store API (wc/store/v1), REST API din WooCommerce (wc/v3), JSON, public și protejat, cheie API, drepturi de citire și de scriere, drepturi minime, webhook, cheia secretă a unui webhook, X-WP-Total
Un magazin cu două uși
Un vizitator vede magazinul dumneavoastră ca pagini web. Dar magazinul are și „uși” pentru programe: adrese la care un program poate cere sau trimite date, fără aspectul vizual al unei pagini. O astfel de ușă se numește API (application programming interface). WordPress are una sub /wp-json/, REST API. Cursul WordPress a arătat în lecția 7.3 că acolo puteți obține, de exemplu, numele de utilizator dacă nu protejați nimic.
WooCommerce adaugă două API-uri proprii, cu scopuri foarte diferite:
| Store API | REST API din WooCommerce | |
|---|---|---|
| Adresă | /wp-json/wc/store/v1/... | /wp-json/wc/v3/... |
| Pentru cine | Browserul unui vizitator (blocurile pentru coș și finalizarea comenzii, lecția 2.2) | Alte programe: contabilitate, stocuri, o aplicație, o conexiune cu o platformă de tip marketplace |
| Este necesară o cheie | Nu, este public | Da, o cheie API a unui administrator (sau un utilizator autentificat, cu drepturi) |
| Ce conține | Produse, prețuri, starea stocului, categorii, recenzii; coșul și comanda vizitatorului însuși | Tot: comenzile tuturor, clienți, cupoane, setări, rapoarte |
Store API este deci intrarea prin vitrină: ce apare în magazinul dumneavoastră pe o pagină de produs apare și acolo, doar sub formă de date. REST API din WooCommerce este ușa din spate a depozitului: aceasta trebuie să fie încuiată.
Store API: ce poate cere un vizitator (și oricine)
Deschideți în browser:
https://shop.example.com/wp-json/wc/store/v1/productsPrimiți o listă în JSON, un format text pentru date. Pentru fiecare produs vedeți, printre altele, numele, slugul, tipul (simplu, variabil), adresa paginii de produs (permalink), SKU-ul, prețurile, imaginile, categoriile, dacă este în stoc și dacă poate fi cumpărat. În antetele răspunsului apare X-WP-Total: numărul de produse pe care magazinul le arată vizitatorilor.
Câteva lucruri de știut:
- Prețurile sunt în cenți. Un ceainic de € 34,95 (≈ 186,89 lei) apare ca
"price": "3495"cu"currency_minor_unit": 2. Împărțiți la 100. Dacă este prețul cu sau fără TVA depinde de setarea dumneavoastră la „Afișează prețurile în magazin” (lecția 4.1). Folosim această proprietate în exercițiul din lecția 4.1. - Doar ce este vizibil. Produsele care sunt în stadiul de ciornă, private sau ascunse în catalog nu sunt numărate de Store API. De aceea
X-WP-Totalpoate fi mai mic decât numărul din panoul de administrare. - Oricine poate citi, dar nu oricine poate scrie. Adăugarea unui produs în coș sau finalizarea comenzii prin Store API se poate face doar cu un cod unic (nonce) din pagină și doar pentru coșul propriu al acelui vizitator.
Este o problemă că aceste date sunt publice? Nu: sunt aceleași date care apar pe paginile dumneavoastră de produs. Un concurent care vrea să vă urmărească prețurile poate face asta și cu paginile obișnuite. Este însă bine să știți: tot ce introduceți într-un câmp de produs poate ajunge în Store API. Nu puneți niciodată prețuri de achiziție, nume de furnizori sau note interne în descrierea scurtă sau lungă „pentru că tema oricum nu afișează acel câmp”.
Nu închideți nici Store API. Blocurile pentru coș și finalizarea comenzii au nevoie de el (lecția 2.2). Pluginurile de securitate care „dezactivează REST API pentru vizitatori” strică astfel uneori finalizarea comenzii. Dacă doriți să restricționați REST API, faceți o excepție pentru Store API.
Abuzul asupra Store API există totuși, dar pe partea de scriere: atacatori care încearcă mii de comenzi mici cu numere de card furate. Acest lucru se numește card testing; despre el este vorba în lecția 6.3.
REST API din WooCommerce: întotdeauna în spatele unei chei
Deschideți acum, fără să fiți autentificat:
https://shop.example.com/wp-json/wc/v3/ordersRăspunsul corect este un mesaj de eroare cu starea 401 (neautentificat) și un cod precum woocommerce_rest_cannot_view. Magazinul dumneavoastră spune: „nu aveți voie să vedeți asta”. Așa trebuie. Dacă primiți aici o listă cu comenzi, ceva este grav în neregulă: un plugin care deschide drepturile, un cod personalizat în temă sau o cheie care apare într-o adresă publică. Atunci aveți o posibilă încălcare a securității datelor (cursul WordPress, lecția 7.5, și baza de cunoștințe 6749).
Programele care trebuie să acceseze comenzile dumneavoastră primesc o cheie API. O creați la WooCommerce > Setări > Avansate > REST API (Advanced > REST API). O cheie are două părți (un consumer key și un consumer secret) și aparține unui utilizator WordPress. Alegeți drepturile:
- Citește: programul poate cere date;
- Scrie: programul poate crea și modifica date;
- Citește/scrie: ambele.
Reguli pe care le respectați întotdeauna:
- Drepturi minime. O conexiune de contabilitate care doar preia comenzi primește doar citire. O conexiune de stocuri care actualizează stocul are nevoie de scriere, dar un instrument de raportare nu.
- O cheie pentru fiecare conexiune, cu o descriere clară („Contabilitate, doar citire, 2026”). Dacă o conexiune încetează, revocați doar acea cheie.
- Asociați cheia cu un utilizator cu drepturi potrivite. O cheie a unui administrator poate face tot ce poate face un administrator. Creați mai bine un utilizator separat cu rolul Manager magazin (lecția 6.2).
- Păstrați în siguranță partea secretă. O vedeți o singură dată, la creare. Locul ei este în setările programului sau într-un manager de parole, nu într-un e-mail, un document partajat sau un depozit public de cod.
- Faceți curățenie. La REST API vedeți pentru fiecare cheie când a fost folosită ultima dată. O cheie care nu a fost folosită de luni de zile o revocați.
Cârlige web: magazinul dumneavoastră anunță un alt program
Un API așteaptă până când cineva întreabă. Un webhook funcționează invers: la un eveniment în magazinul dumneavoastră (o comandă nouă, un produs modificat) WooCommerce trimite singur un mesaj către o adresă pe care o indicați. Astfel, programul dumneavoastră de expediere află imediat că există o comandă, fără să întrebe în fiecare minut. Le configurați la WooCommerce > Setări > Avansate > Cârlige web.
Trei lucruri la care trebuie să fiți atenți:
- Mesajul conține date cu caracter personal. Un webhook pentru o comandă nouă trimite numele, adresa și produsele comandate. Trimiteți aceste date doar către o adresă prin https și către o parte care apare în politica de confidențialitate și în registrul dumneavoastră de prelucrări (lecția 5.5).
- Cheia secretă. La un webhook completați o cheie secretă. Cu ea, programul care primește poate verifica faptul că mesajul vine cu adevărat de la magazinul dumneavoastră și nu de la cineva care a ghicit adresa. Nu o lăsați goală și împărtășiți-o doar cu destinatarul.
- Livrare eșuată. Dacă adresa destinatarului este o vreme indisponibilă, WooCommerce poate dezactiva webhookul după erori repetate. După o întrerupere, verificați la Cârlige web dacă sunt încă active.
Nu confundați acest lucru cu webhookul furnizorului dumneavoastră de plăți (lecția 4.4). Acela funcționează invers: furnizorul anunță magazinul dumneavoastră că o plată a reușit.
În practică: așa arată în WooCommerce
La alți furnizori de găzduire funcționează la fel; acestea sunt componente ale WooCommerce însuși.
- Deschideți într-o fereastră privată
/wp-json/wc/store/v1/productspe magazinul dumneavoastră (de test). Căutați un produs și convertiți prețul. - Deschideți în aceeași fereastră privată
/wp-json/wc/v3/orders. Ar trebui să vedeți starea 401. - Mergeți la WooCommerce > Setări > Avansate > REST API. Verificați ce chei există, la ce utilizator și cu ce drepturi. Revocați cheile pe care nu le (mai) recunoașteți.
- Verificați la Cârlige web ce webhookuri există și către ce adresă merg.
- Dacă aveți un plugin de securitate care restricționează REST API, verificați că Store API este exceptat.
Rezumat
- Store API (
wc/store/v1) este public și conține ce apare și pe paginile dumneavoastră de produs; blocurile pentru coș și finalizarea comenzii au nevoie de el. - Nu puneți date interne în câmpurile de produs: ele pot deveni vizibile prin Store API.
- REST API din WooCommerce (
wc/v3) trebuie să răspundă fără cheie cu 401; o listă cu comenzi fără cheie este o posibilă încălcare a securității datelor. - Chei API: drepturi minime, una pentru fiecare conexiune, asociată unui utilizator potrivit, păstrată secret, cele nefolosite revocate.
- Webhookurile trimit date cu caracter personal către alt program: doar prin https, cu o cheie secretă, către o parte din registrul dumneavoastră de prelucrări.
Test (quiz)
Exercițiu
Exercițiul A2.4: Ce afișează public magazinul dumneavoastră? Introduceți adresa magazinului dumneavoastră (de test) și numărul de produse vizibile în magazin. Programul face trei interogări, fără cookie-uri și fără cheie, doar citire:
/wp-json/wc/store/v1/products?per_page=1(Store API, prin adresa REST pe care o indică site-ul dumneavoastră);/wp-json/wc/v3/orders?per_page=1;/wp-json/wc/v3/customers?per_page=1.
Bine înseamnă: Store API răspunde cu starea 200 și o listă JSON; antetul X-WP-Total este egal cu numărul introdus de dumneavoastră; orders și customers răspund cu 401, 403 sau 404.
Portocaliu: X-WP-Total diferă (produsele în stadiul de ciornă, private sau ascunse nu sunt numărate); Store API răspunde cu 401 sau 403, de obicei din cauza unui plugin de securitate, iar blocurile de finalizare a comenzii nu funcționează.
Roșu: Store API nu este accesibil, deși site-ul dumneavoastră rulează WooCommerce; sau orders ori customers returnează o listă. Acest ultim caz este grav: închideți imediat accesul, verificați cheile API și pluginurile și evaluați dacă trebuie să notificați o încălcare a securității datelor. În acest caz, programul păstrează doar codul de stare, niciodată conținutul.
Verificați apoi singur la REST API și Cârlige web: ce chei și webhookuri există și știți pentru fiecare la ce servește?
Lecturi suplimentare
- Curs gratuit WordPress 7.3: Autentificare: parole, autentificare în doi pași și brute force
- Curs gratuit WordPress 7.5: Site piratată: recunoaștere, remediere și prevenire
- Accesul la xmlrpc.php în WordPress nu funcționează
- Este aceasta o breșă de date și trebuie să o raportez?
- Store API (developer.woocommerce.com, în engleză): https://developer.woocommerce.com/docs/apis/store-api/
- Limitarea ratei (rate limiting) pentru Store API (developer.woocommerce.com, în engleză): https://developer.woocommerce.com/docs/apis/store-api/rate-limiting/
