El diseñador de productos ya comprueba por sí mismo la resolución, el contraste, el margen de seguridad, el solapamiento y el número de colores de impresión. Si tu producción tiene otras reglas, por ejemplo «un logotipo debe medir al menos 15 mm de ancho» o «nada de texto por debajo de 6 mm en estampación en caliente», añades tus propias comprobaciones: en el navegador con JavaScript o en tu servidor mediante un webhook.
| Vía | Para qué | Límite |
|---|---|---|
En el navegador (registerDesignCheck) |
Un aviso inmediato junto al campo mientras tu cliente diseña | Se puede eludir con una solicitud manipulada |
| En el servidor (webhook) | Reglas obligatorias que ningún pedido puede saltarse | Solo funciona si el plugin de tu tienda aplica la comprobación de precio |
Para una regla que debe cumplirse, usa el webhook. Lo ideal es combinar ambos: el navegador muestra el aviso al instante y el servidor lo garantiza.
Comprobación en el navegador
Registras una comprobación mediante la interfaz JavaScript:
Configento.registerDesignCheck('logo-ancho-minimo', (ctx) =>
ctx.placement && ctx.placement.widthMm < 15
? { level: 'block', message: 'El logotipo debe medir al menos 15 mm de ancho.' }
: null,
{ appliesTo: ['logo'] });
- El nombre consta de minúsculas, dígitos y guiones.
appliesToindica los Nombres internos (ID) de las características a las que se aplica. SinappliesTo, se ejecuta para cada texto propio y cada imagen propia.registerDesignCheckdevuelve una función que vuelve a dar de baja la comprobación.
Si tu script se ejecuta antes de que se cargue configento.js, define las comprobaciones de antemano:
window.ConfigentoDesignChecks = {
'logo-ancho-minimo': [check, { appliesTo: ['logo'] }],
};
Qué recibe la comprobación
La comprobación se ejecuta con cada cambio y recibe un objeto ctx:
| Campo | Contenido |
|---|---|
characteristic |
id, key (nombre interno), type (customtext o customimage), title |
locale |
Idioma del configurador, p. ej. es_ES |
zone |
widthMm, heightMm y, si están definidos, background y safeMm |
box |
La superficie que ocupan realmente el texto o la imagen, en mm desde arriba a la izquierda; null si no se ve nada |
values |
Las demás características por nombre interno, tal como las ven las fórmulas: una selección da su valor, los números siguen siendo números |
text, lines |
En un texto propio: el texto y sus líneas |
design |
En un texto propio: font, sizeMm, drawnSizeMm, color, colorName, align, valign y finish si se aplica un acabado |
image |
En una imagen propia: file, type, width, height en píxeles, vector para un SVG |
placement |
En una imagen propia: widthMm, heightMm, dpi, rotation, flipX, centerXMm, centerYMm |
Qué responde la comprobación
null: todo está bien.{ level: 'warn', message: '…' }: el aviso aparece junto al campo, pero se puede pedir igualmente.{ level: 'block', message: '…' }: el aviso aparece junto al campo y el configurador retiene el carrito.- Una lista de estos resultados si hay varias cosas que no encajan.
Das estilo al aviso con la clase .cfg-design__check; data-configento-level indica si es una advertencia o un bloqueo, y data-configento-check da el nombre de tu comprobación. Consulta Personalizar el diseño. Si una comprobación lanza un error, el configurador la ignora y escribe el error en la consola del navegador.
Comprobación en tu servidor
Con un webhook, tu servidor comprueba cada diseño antes de que llegue al carrito. Así la regla se cumple aunque alguien eluda el navegador.
Configuración
- En el admin, abre Ajustes → API y allí Webhook de comprobación de archivos de impresión.
- Introduce la URL del webhook. Solo se permite
httpsa una dirección pública. - configento.app genera una Clave de firma (
dcw_…). Guárdala en tu servidor. Nueva clave la sustituye. - Haz clic en Enviar llamada de prueba. Si tu servidor responde, aparece «El webhook ha respondido.».
- Decide si debe aplicarse Rechazar el carrito si el webhook no responde (véase más abajo).
La solicitud
Al añadir al carrito, configento.app vuelve a calcular el precio y envía a tu URL, por POST, todos los textos e imágenes propios visibles y rellenados:
{
"event": "design_check",
"component_id": "10000021",
"locale": "es_ES",
"fields": [ { "characteristic": { "key": "logo", "type": "customimage" }, "placement": { "widthMm": 12.4, "dpi": 310 } } ]
}
Cada elemento de fields tiene la misma estructura que ctx en el navegador (mostrado de forma abreviada). Solo box es siempre null en el servidor.
Las cabeceras:
| Cabecera | Contenido |
|---|---|
X-Configento-Event |
design_check; en la llamada de prueba, test (entonces fields está vacío) |
X-Configento-Timestamp |
Momento en segundos Unix |
X-Configento-Signature |
sha256= y el valor hexadecimal de HMAC-SHA256 con tu clave sobre momento + . + cuerpo bruto de la solicitud |
Comprueba la firma antes de confiar en la solicitud, p. ej. en Node.js:
const crypto = require('crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', process.env.CONFIGENTO_DCW_SECRET)
.update(req.headers['x-configento-timestamp'] + '.' + rawBody).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-configento-signature'] || ''));
Descarta también las solicitudes cuyo momento tenga más de unos minutos de antigüedad.
La respuesta
Tu servidor responde con un estado 2xx y:
{ "findings": [ { "field": "logo", "level": "block", "message": "El logotipo debe medir al menos 15 mm de ancho." } ] }
field es el nombre interno de la característica. Una lista vacía significa que todo está bien.
| Resultado | Efecto |
|---|---|
Un resultado con block |
La comprobación de precio rechaza (error design_check_failed con tu mensaje). La configuración no llega al carrito. |
Solo resultados con warn |
El precio vale; los avisos se transmiten como design_checks. |
| Ninguna respuesta utilizable | El carrito pasa. Con Rechazar el carrito si el webhook no responde, la comprobación de precio rechaza en su lugar (design_check_unavailable). |
Tu servidor tiene 2 segundos; configento.app no sigue redirecciones. El resultado vale 5 minutos junto con el precio, y una configuración idéntica no vuelve a preguntar durante ese tiempo.
Requisito en la tienda
El webhook se ejecuta en la comprobación de precio. Si bloquea, la configuración no entra en el carrito y tu cliente ve allí tu mensaje, a partir de estas versiones del plugin:
| Tienda | Plugin desde | El bloqueo se aplica |
|---|---|---|
| Shopware | 5.3.9 | siempre; el plugin comprueba siempre de forma vinculante las configuraciones con el diseñador de productos |
| Magento | 5.1.14 | con la comprobación de precio en Enforce; con Shadow la configuración pasa y el bloqueo solo queda en el registro |
| PrestaShop | 0.6.10 | siempre |
| WooCommerce/WordPress | 0.6.5 | siempre |
Con versiones anteriores del plugin el bloqueo también se aplica, pero tu cliente solo ve el mensaje general de que la configuración ya no es válida o de que no se pudo confirmar el precio.
Muestra por tanto tu mensaje también mediante una comprobación en el navegador; así tu cliente lo ve ya mientras diseña.
Solución de problemas
- La comprobación en el navegador no tiene efecto: ¿es correcto el nombre interno en
appliesTo? ¿Se carga el script después deconfigento.js, o usaswindow.ConfigentoDesignChecks? Los errores de la comprobación aparecen en la consola del navegador. - «El webhook no dio una respuesta utilizable»: tu servidor no responde en 2 segundos, redirige, responde sin 2xx o sin JSON válido.
- El bloqueo no tiene efecto en la tienda: en Magento la comprobación de precio no está en Enforce. Tu cliente solo ve un mensaje general: el plugin es anterior a las versiones de arriba.
- La firma no coincide: calcúlala sobre el cuerpo bruto sin modificar de la solicitud, no sobre un JSON recodificado, y comprueba que guardaste la nueva clave tras Nueva clave.