Moduuli 2 · 2.4
Mitä verkkokauppasi näyttää julkisesti
Moduuli 2: Asennus ja käyttöönotto · Lukuaika: 10 minuuttia
Oppimistavoite: Tämän oppitunnin jälkeen osaat selittää, mitä WooCommercen Store API ja REST-rajapinta ovat, mitkä tiedot kuuluu olla julkisia ja mitkä eivät, ja miten käytät API-avaimia ja webhookeja turvallisesti.
Keskeiset käsitteet: API, WordPressin REST-rajapinta, Store API (wc/store/v1), WooCommercen REST-rajapinta (wc/v3), JSON, julkinen ja suojattu, API-avain, luku- ja kirjoitusoikeudet, vähimmät oikeudet, webhook, webhookin salainen avain, X-WP-Total
Kauppa, jossa on kaksi ovea
Kävijä näkee verkkokauppasi verkkosivuina. Kaupallasi on kuitenkin myös "ovia" ohjelmille: osoitteita, joista ohjelma voi hakea tai joihin se voi lähettää tietoja ilman sivun ulkoasua. Tällaista ovea kutsutaan nimellä API (application programming interface, ohjelmointirajapinta). WordPressillä on oma rajapintansa osoitteessa /wp-json/, REST-rajapinta. WordPress-kurssin oppitunti 7.3 näytti, että sieltä voi esimerkiksi hakea käyttäjänimiä, jos mitään ei ole suojattu.
WooCommerce lisää kaksi omaa rajapintaa, joilla on hyvin erilainen tarkoitus:
| Store API | WooCommercen REST-rajapinta | |
|---|---|---|
| Osoite | /wp-json/wc/store/v1/... | /wp-json/wc/v3/... |
| Kenelle | Kävijän selaimelle (ostoskorin ja kassan lohkot, oppitunti 2.2) | Muille ohjelmille: kirjanpito, varastonhallinta, sovellus, liitäntä markkinapaikkaan |
| Tarvitaanko avain | Ei, julkinen | Kyllä, ylläpitäjän API-avain (tai kirjautunut käyttäjä, jolla on oikeudet) |
| Mitä se sisältää | Tuotteet, hinnat, varastotilanne, kategoriat, arvostelut; kävijän oma ostoskori ja tilaus | Kaiken: kaikkien tilaukset, asiakkaat, kupongit, asetukset, raportit |
Store API on siis näyteikkunan sisäänkäynti: se, mikä kaupassasi näkyy tuotesivulla, löytyy myös sieltä, vain tietoina. WooCommercen REST-rajapinta on varaston takaovi: sen kuuluu olla lukossa.
Store API: mitä kävijä (ja kuka tahansa) voi hakea
Avaa selaimessasi:
https://shop.example.com/wp-json/wc/store/v1/productsSaat luettelon JSON-muodossa, joka on tietojen tekstimuoto. Jokaisesta tuotteesta näet muun muassa nimen, slugin, tyypin (yksinkertainen, muunnelmallinen), tuotesivun osoitteen (permalink), SKU:n, hinnat, kuvat, kategoriat sekä sen, onko tuote varastossa ja myynnissä. Vastauksen otsakkeissa on X-WP-Total: tuotteiden määrä, jonka kauppa näyttää kävijöille.
Muutama asia on hyvä tietää:
- Hinnat ovat sentteinä. 34,95 euron teekannu näkyy muodossa
"price": "3495"ja"currency_minor_unit": 2. Jaa luku sadalla. Onko hinta arvonlisäverollinen vai veroton, riippuu asetuksestasi kohdassa "Näytä hinnat kaupassa" (oppitunti 4.1). Tätä ominaisuutta käytämme oppitunnin 4.1 tehtävässä. - Vain näkyvät tuotteet. Store API ei laske mukaan luonnoksina, yksityisinä tai luettelosta piilotettuina olevia tuotteita. Siksi
X-WP-Totalvoi olla pienempi kuin hallintapaneelisi määrä. - Lukea saa kuka tahansa, kirjoittaa ei noin vain. Tuotteen lisääminen ostoskoriin tai kassalle siirtyminen Store API:n kautta onnistuu vain sivulta saatavalla kertakäyttöisellä koodilla (nonce), ja silloinkin vain kävijän omaan ostoskoriin.
Haittaako, että tämä on julkista? Ei: tiedot ovat samoja kuin tuotesivuillasi. Kilpailija, joka haluaa seurata hintojasi, voi tehdä sen myös tavallisten sivujen kautta. Kannattaa kuitenkin muistaa: kaikki, mitä laitat tuotekenttään, voi päätyä Store API:in. Älä koskaan laita ostohintoja, toimittajien nimiä tai sisäisiä muistiinpanoja lyhyeen tai pitkään kuvaukseen "koska teema ei kuitenkaan näytä sitä kenttää".
Älä myöskään sulje Store API:a. Ostoskorin ja kassan lohkot tarvitsevat sitä (oppitunti 2.2). Tietoturvalisäosat, jotka "poistavat REST-rajapinnan käytöstä kävijöiltä", rikkovat siksi joskus kassan. Jos haluat rajoittaa REST-rajapintaa, jätä Store API rajoituksen ulkopuolelle.
Store API:n väärinkäyttöä kyllä esiintyy, mutta kirjoituspuolella: hyökkääjät yrittävät varastetuilla korttinumeroilla tuhansia pieniä tilauksia. Tätä kutsutaan nimellä card testing; siitä kerrotaan oppitunnilla 6.3.
WooCommercen REST-rajapinta: aina avaimen takana
Avaa nyt kirjautumatta:
https://shop.example.com/wp-json/wc/v3/ordersOikea vastaus on virheilmoitus, jonka tila on 401 (ei kirjautunut), ja koodi kuten woocommerce_rest_cannot_view. Kauppasi sanoo: "tätä et saa nähdä". Juuri niin kuuluu olla. Jos saat tästä luettelon tilauksista, jokin on vakavasti vialla: lisäosa, joka avaa oikeuksia, teeman muokattu koodi tai avain, joka on julkisessa osoitteessa. Silloin kyseessä voi olla tietoturvaloukkaus (WordPress-kurssi, oppitunti 7.5, ja tietopankin artikkeli 6749).
Ohjelmat, joiden pitää päästä tilauksiisi, saavat API-avaimen. Luot sen kohdassa WooCommerce > Asetukset > Edistyneet > REST-rajapinta (Advanced > REST API). Avain koostuu kahdesta osasta (consumer key ja consumer secret) ja kuuluu WordPress-käyttäjälle. Valitset oikeudet:
- Lue: ohjelma saa hakea tietoja;
- Kirjoita: ohjelma saa luoda ja muuttaa tietoja;
- Lue/kirjoita: molemmat.
Säännöt, joita noudatat aina:
- Vähimmät oikeudet. Kirjanpitoliitäntä, joka vain hakee tilauksia, saa vain lukuoikeuden. Varastoliitäntä, joka päivittää varastosaldoja, tarvitsee kirjoitusoikeuden, mutta raportointityökalu ei.
- Yksi avain liitäntää kohden, selkeällä kuvauksella ("Kirjanpito, vain luku, 2026"). Kun liitäntä lopetetaan, perut vain sen avaimen.
- Liitä avain käyttäjään, jolla on sopivat oikeudet. Ylläpitäjän avain voi tehdä kaiken, mitä ylläpitäjä voi. Luo mieluummin erillinen käyttäjä, jolla on rooli Kauppias (oppitunti 6.2).
- Säilytä salainen osa turvallisesti. Näet sen vain kerran luontihetkellä. Sen paikka on ohjelman asetuksissa tai salasanojen hallintaohjelmassa, ei sähköpostissa, jaetussa asiakirjassa tai julkisessa koodivarastossa.
- Siivoa. Kohdassa REST-rajapinta näet jokaisen avaimen kohdalla, milloin sitä on viimeksi käytetty. Peru avain, jota ei ole käytetty kuukausiin.
Webhookit: kauppasi soittaa toiselle ohjelmalle
API odottaa, että joku kysyy. Webhook toimii toisin päin: kun kaupassasi tapahtuu jotain (uusi tilaus, muutettu tuote), WooCommerce lähettää itse viestin antamaasi osoitteeseen. Näin lähetysohjelmasi kuulee heti uudesta tilauksesta ilman, että sen pitää kysyä joka minuutti. Määrität webhookit kohdassa WooCommerce > Asetukset > Edistyneet > Verkkotoimintokutsut.
Kolme huomioitavaa asiaa:
- Viesti sisältää henkilötietoja. Uuden tilauksen webhook lähettää mukana nimen, osoitteen ja tilatut tuotteet. Lähetä ne vain https-osoitteeseen ja taholle, joka mainitaan tietosuojaselosteessasi ja käsittelytoimien selosteessa (oppitunti 5.5).
- Salainen avain. Webhookille annetaan salainen avain. Sen avulla vastaanottava ohjelma voi tarkistaa, että viesti tulee todella sinun kaupastasi eikä joltakulta, joka on arvannut osoitteen. Älä jätä sitä tyhjäksi ja jaa se vain vastaanottajan kanssa.
- Epäonnistunut toimitus. Jos vastaanottava osoite on pitkään tavoittamattomissa, WooCommerce voi poistaa webhookin käytöstä toistuvien virheiden jälkeen. Tarkista häiriön jälkeen kohdassa Verkkotoimintokutsut, ovatko ne yhä aktiivisia.
Älä sekoita tätä maksupalvelusi webhookiin (oppitunti 4.4). Se toimii toisin päin: palveluntarjoaja ilmoittaa kaupallesi, että maksu onnistui.
Käytännössä: näin se näkyy WooCommercessa
Muilla palveluntarjoajilla tämä toimii samoin; nämä ovat WooCommercen omia osia.
- Avaa yksityisessä ikkunassa
/wp-json/wc/store/v1/products(testi)kaupassasi. Etsi tuote ja muunna sen hinta euroiksi. - Avaa samassa yksityisessä ikkunassa
/wp-json/wc/v3/orders. Sinun pitäisi nähdä tila 401. - Siirry kohtaan WooCommerce > Asetukset > Edistyneet > REST-rajapinta. Katso, mitä avaimia on, mille käyttäjälle ja millä oikeuksilla. Peru avaimet, joita et tunnista (tai joita ei enää tarvita).
- Katso kohdassa Verkkotoimintokutsut, mitä webhookeja on ja mihin osoitteeseen ne menevät.
- Jos sinulla on tietoturvalisäosa, joka rajoittaa REST-rajapintaa, tarkista, että Store API on jätetty rajoituksen ulkopuolelle.
Yhteenveto
- Store API (
wc/store/v1) on julkinen ja sisältää samat tiedot kuin tuotesivusi; ostoskorin ja kassan lohkot tarvitsevat sitä. - Älä laita sisäisiä tietoja tuotekenttiin: ne voivat tulla näkyviin Store API:n kautta.
- WooCommercen REST-rajapinnan (
wc/v3) kuuluu antaa ilman avainta tila 401; tilausluettelo ilman avainta voi olla tietoturvaloukkaus. - API-avaimet: vähimmät oikeudet, yksi liitäntää kohden, sopivalle käyttäjälle, salassa säilytettynä, käyttämättömät peruttuina.
- Webhookit lähettävät henkilötietoja toiselle ohjelmalle: vain https-yhteydellä, salaisella avaimella ja taholle, joka on käsittelytoimien selosteessasi.
Tietovisa (quiz)
Tehtävä
Tehtävä A2.4: Mitä verkkokauppasi näyttää julkisesti? Anna (testi)kauppasi osoite ja kaupassasi näkyvien tuotteiden määrä. Ohjelma tekee kolme hakua ilman evästeitä ja ilman avainta, vain lukien:
/wp-json/wc/store/v1/products?per_page=1(Store API sivustosi itse ilmoittaman REST-osoitteen kautta);/wp-json/wc/v3/orders?per_page=1;/wp-json/wc/v3/customers?per_page=1.
Hyvä on: Store API vastaa tilalla 200 ja JSON-luettelolla; otsake X-WP-Total on sama kuin antamasi määrä; orders ja customers antavat tilan 401, 403 tai 404.
Oranssi: X-WP-Total poikkeaa (luonnoksina, yksityisinä tai piilotettuina olevia tuotteita ei lasketa); Store API antaa tilan 401 tai 403, yleensä tietoturvalisäosan takia, jolloin kassan lohkot eivät toimi.
Punainen: Store API ei vastaa, vaikka sivustollasi on WooCommerce käytössä; tai orders tai customers palauttavat luettelon. Jälkimmäinen on vakavaa: sulje se heti, tarkista API-avaimesi ja lisäosasi ja selvitä, pitääkö tietoturvaloukkauksesta tehdä ilmoitus. Ohjelma tallentaa siinä tapauksessa vain tilakoodin, ei koskaan sisältöä.
Tarkista sen jälkeen itse kohdat REST-rajapinta ja Verkkotoimintokutsut: mitä avaimia ja webhookeja siellä on, ja tiedätkö jokaisen kohdalla, mihin sitä käytetään?
Lue lisää
- Ilmainen WordPress-kurssi 7.3: Kirjautuminen: salasanat, kaksivaiheinen tunnistautuminen ja brute force
- Ilmainen WordPress-kurssi 7.5: Hakkeroitu: tunnistaminen, korjaaminen ja ehkäiseminen
- WordPressin xmlrpc.php-tiedostoon ei pääse
- Onko tämä tietovuoto, ja pitääkö minun ilmoittaa siitä?
- Store API (developer.woocommerce.com, englanniksi): https://developer.woocommerce.com/docs/apis/store-api/
- Store API:n pyyntörajoitukset (rate limiting) (developer.woocommerce.com, englanniksi): https://developer.woocommerce.com/docs/apis/store-api/rate-limiting/
