Lo que su tienda muestra públicamente
Módulo 2: Instalar y configurar · Tiempo de lectura: 10 minutos
Objetivo de aprendizaje: Después de esta lección podrá explicar qué son la Store API y la API REST de WooCommerce, qué datos deben ser públicos y cuáles no, y cómo usar claves de API y webhooks de forma segura.
Conceptos clave: API, API REST de WordPress, Store API (wc/store/v1), API REST de WooCommerce (wc/v3), JSON, público y protegido, clave de API, permisos de lectura y escritura, mínimos permisos, webhook, clave secreta de un webhook, X-WP-Total
Una tienda con dos puertas
Un visitante ve su tienda como páginas web. Pero su tienda también tiene "puertas" para programas: direcciones en las que un programa puede consultar o enviar datos, sin el diseño de una página. Una puerta así se llama API (application programming interface). WordPress tiene una en /wp-json/, la API REST. El curso de WordPress mostró en la lección 7.3 que allí se pueden consultar, por ejemplo, nombres de usuario si no protege nada.
WooCommerce añade dos API propias, con un objetivo muy distinto:
| Store API | API REST de WooCommerce | |
|---|---|---|
| Dirección | /wp-json/wc/store/v1/... | /wp-json/wc/v3/... |
| Para quién | El navegador de un visitante (los bloques de carrito y finalizar compra, lección 2.2) | Otros programas: contabilidad, inventario, una app, una conexión con un marketplace |
| ¿Necesita clave? | No, es pública | Sí, una clave de API de un administrador (o un usuario conectado con permisos) |
| Qué contiene | Productos, precios, estado del inventario, categorías, valoraciones; el carrito y el pedido del propio visitante | Todo: pedidos de todos, clientes, cupones, ajustes, informes |
La Store API es, por tanto, la entrada del escaparate: lo que aparece en una página de producto de su tienda también está ahí, solo que como datos. La API REST de WooCommerce es la puerta trasera del almacén: debe estar cerrada con llave.
La Store API: lo que un visitante (y cualquiera) puede consultar
Abra en su navegador:
https://shop.example.com/wp-json/wc/store/v1/productsObtendrá una lista en JSON, un formato de texto para datos. Para cada producto verá, entre otras cosas, el nombre, el slug, el tipo (simple, variable), la dirección de la página del producto (permalink), el SKU, los precios, las imágenes, las categorías, si hay existencias y si se puede comprar. En las cabeceras de la respuesta aparece X-WP-Total: el número de productos que la tienda muestra a los visitantes.
Algunas cosas que conviene saber:
- Los precios están en céntimos. Una tetera de € 34,95 aparece como
"price": "3495"con"currency_minor_unit": 2. Hay que dividir entre 100. Que sea el precio con o sin IVA depende de su ajuste en "Mostrar precios en la tienda" (lección 4.1). Usamos esta propiedad en el ejercicio de la lección 4.1. - Solo lo que es visible. La Store API no cuenta los productos que están en borrador, son privados u ocultos en el catálogo. Por eso
X-WP-Totalpuede ser menor que el número que ve en su panel de administración. - Leer puede cualquiera; escribir, no así como así. Añadir algo al carrito o finalizar la compra a través de la Store API solo es posible con un código de un solo uso (nonce) de la página, y únicamente para el propio carrito de ese visitante.
¿Es grave que esto sea público? No: son los mismos datos que aparecen en sus páginas de producto. Un competidor que quiera seguir sus precios también puede hacerlo con las páginas normales. Pero conviene tenerlo presente: todo lo que ponga en un campo de producto puede acabar en la Store API. No ponga nunca precios de compra, nombres de proveedores ni notas internas en la descripción corta o larga "porque el tema no muestra ese campo de todos modos".
Tampoco cierre la Store API. Los bloques de carrito y finalizar compra la necesitan (lección 2.2). Por eso, los plugins de seguridad que "desactivan la API REST para los visitantes" a veces rompen el proceso de pago. Si quiere limitar la API REST, excluya la Store API.
Sí existe el abuso de la Store API, pero en el lado de la escritura: atacantes que, con números de tarjeta robados, intentan miles de pedidos pequeños. Esto se llama card testing; de ello trata la lección 6.3.
La API REST de WooCommerce: siempre tras una clave
Ahora abra, sin haber iniciado sesión:
https://shop.example.com/wp-json/wc/v3/ordersLa respuesta correcta es un mensaje de error con estado 401 (no ha iniciado sesión) y un código como woocommerce_rest_cannot_view. Su tienda dice: "usted no puede ver esto". Así debe ser. Si aquí obtiene una lista de pedidos, hay un problema grave: un plugin que abre permisos, código personalizado en el tema o una clave que figura en una dirección pública. En ese caso tiene una posible brecha de datos (curso de WordPress, lección 7.5, y base de conocimiento 6749).
Los programas que necesitan acceder a sus pedidos reciben una clave de API. La crea en WooCommerce > Ajustes > Avanzado > API REST (Advanced > REST API). Una clave consta de dos partes (una consumer key y una consumer secret) y pertenece a un usuario de WordPress. Usted elige los permisos:
- Lectura: el programa puede consultar datos;
- Escritura: el programa puede crear y modificar datos;
- Lectura/Escritura: ambas cosas.
Normas que debe seguir siempre:
- Mínimos permisos. Una conexión de contabilidad que solo recoge pedidos recibe únicamente lectura. Una conexión de inventario que actualiza existencias necesita escritura, pero una herramienta de informes no.
- Una clave por conexión, con una descripción clara ("Contabilidad, solo lectura, 2026"). Si una conexión deja de usarse, revoca solo esa clave.
- Vincule la clave a un usuario con los permisos adecuados. Una clave de un administrador puede hacer todo lo que puede hacer un administrador. Es mejor crear un usuario aparte con el perfil Gestor de la tienda (lección 6.2).
- Guarde la mitad secreta de forma segura. Solo la verá una vez, al crearla. Debe estar en los ajustes del programa o en un gestor de contraseñas, no en un correo, un documento compartido ni un repositorio de código público.
- Haga limpieza. En API REST ve, para cada clave, cuándo se usó por última vez. Revoque las claves que llevan meses sin usarse.
Webhooks: su tienda llama a otro programa
Una API espera a que alguien pregunte. Un webhook funciona al revés: ante un evento en su tienda (un pedido nuevo, un producto modificado), WooCommerce envía por sí mismo un mensaje a una dirección que usted indica. Así su programa de envíos se entera al momento de que hay un pedido, sin tener que preguntar cada minuto. Los configura en WooCommerce > Ajustes > Avanzado > Webhooks.
Tres aspectos a tener en cuenta:
- El mensaje contiene datos personales. Un webhook de pedido nuevo envía el nombre, la dirección y los productos pedidos. Envíelo solo a una dirección con https y a una parte que figure en su política de privacidad y en su registro de actividades de tratamiento (lección 5.5).
- La clave secreta. En un webhook se introduce una clave secreta. Con ella, el programa receptor puede comprobar que el mensaje procede realmente de su tienda y no de alguien que ha adivinado la dirección. No la deje vacía y compártala solo con el receptor.
- Entrega fallida. Si la dirección receptora no está disponible durante un tiempo, WooCommerce puede desactivar el webhook tras errores repetidos. Después de una incidencia, compruebe en Webhooks si siguen activos.
No lo confunda con el webhook de su proveedor de pagos (lección 4.4). Ese funciona al revés: el proveedor comunica a su tienda que un pago se ha realizado correctamente.
En la práctica: así se ve en WooCommerce
Con otros proveedores de alojamiento funciona igual; son partes del propio WooCommerce.
- Abra en una ventana privada
/wp-json/wc/store/v1/productsen su tienda (de prueba). Busque un producto y convierta el precio. - Abra en la misma ventana privada
/wp-json/wc/v3/orders. Debería ver el estado 401. - Vaya a WooCommerce > Ajustes > Avanzado > API REST. Revise qué claves hay, de qué usuario y con qué permisos. Revoque las claves que no reconozca (o ya no use).
- Revise en Webhooks qué webhooks hay y a qué dirección se envían.
- Si tiene un plugin de seguridad que limita la API REST, compruebe que la Store API está excluida.
Resumen
- La Store API (
wc/store/v1) es pública y contiene lo mismo que aparece en sus páginas de producto; los bloques de carrito y finalizar compra la necesitan. - No ponga datos internos en los campos de producto: pueden quedar visibles a través de la Store API.
- La API REST de WooCommerce (
wc/v3) debe devolver un 401 sin clave; una lista de pedidos sin clave es una posible brecha de datos. - Claves de API: mínimos permisos, una por conexión, vinculada a un usuario adecuado, guardada en secreto y revocada si no se usa.
- Los webhooks envían datos personales a otro programa: solo con https, con una clave secreta y a una parte de su registro de actividades de tratamiento.
Cuestionario
Ejercicio
Ejercicio A2.4: ¿Qué muestra públicamente su tienda? Introduzca la dirección de su tienda (de prueba) y el número de productos visibles en su tienda. El programa realiza tres consultas, sin cookies y sin clave, solo de lectura:
/wp-json/wc/store/v1/products?per_page=1(la Store API, a través de la dirección REST que indica su propio sitio);/wp-json/wc/v3/orders?per_page=1;/wp-json/wc/v3/customers?per_page=1.
Correcto es: la Store API responde con estado 200 y una lista JSON; la cabecera X-WP-Total coincide con el número que ha introducido; orders y customers devuelven 401, 403 o 404.
Naranja: X-WP-Total no coincide (los productos en borrador, privados u ocultos no cuentan); la Store API devuelve 401 o 403, normalmente por un plugin de seguridad, con lo que los bloques de pago no funcionan.
Rojo: la Store API no está accesible aunque su sitio usa WooCommerce; o bien orders o customers devuelven una lista. Esto último es grave: ciérrelo de inmediato, revise sus claves de API y plugins, y valore si debe notificar una brecha de datos. En ese caso, el programa solo guarda el código de estado, nunca el contenido.
Después, revise usted mismo API REST y Webhooks: ¿qué claves y webhooks hay, y sabe para qué sirve cada uno?
Para saber más
- Curso gratuito de WordPress 7.3: Inicio de sesión: contraseñas, verificación en dos pasos y fuerza bruta
- Curso gratuito de WordPress 7.5: Hackeado: reconocer, reparar y prevenir
- WordPress: no funciona el acceso a xmlrpc.php
- ¿Se trata de una filtración de datos y debo notificarla?
- La Store API (developer.woocommerce.com, en inglés): https://developer.woocommerce.com/docs/apis/store-api/
- Limitación de solicitudes (rate limiting) para la Store API (developer.woocommerce.com, en inglés): https://developer.woocommerce.com/docs/apis/store-api/rate-limiting/
