Hola @pablo_bici y @silviaadmin,
El problema que describes con hash_equals y el token de cleanupcron.php en PrestaShop 1.7.8.8 es más común de lo que parece y casi siempre se reduce a una diferencia mínima e invisible entre las dos cadenas. hash_equals es muy estricta y exige una coincidencia byte a byte.
Es muy probable que haya espacios en blanco (al principio o al final) o algún carácter de control invisible en el token almacenado en la base de datos o en el token que se pasa a través de la URL del cron. Aunque el token parezca idéntico al ojo humano, para hash_equals no lo es.
La solución más sencilla y robusta es asegurarte de que ambos tokens se 'normalicen' antes de la comparación, eliminando cualquier espacio en blanco superfluo. Puedes modificar el fragmento de código que compartiste de esta manera:
function initContent()
{
parent::initContent();
$provided = (string) trim(Tools::getValue('token'));
$expected = (string) trim(Configuration::get(omnipro::CFG_CLEANUP_TOKEN));
if ($provided === '' || $expected === '' || !hash_equals($expected, $provided)) {
header('Content-Type: application/json');
die(json_encode(array('ok' => false, 'message' => 'invalid token')));
He añadido trim() tanto a $provided como a $expected. Esto eliminará cualquier espacio en blanco al principio o al final de las cadenas antes de la comparación. Asegúrate también de que tu comando cron (si es HTTP) no esté añadiendo accidentalmente espacios extra al token en la URL.