$token = htmlspecialchars(isset($_POST['token']));
$message = htmlspecialchars(isset($_POST['message']));
$subtopic_id = intval(isset($_POST['subtopic_id']));
превращают переданные значения в string/int "1" или "0" так как результат isset() - bool
корректный вариант скорее всего такой
<?php
$token = htmlspecialchars($_POST['token'] ?? '');
$message = htmlspecialchars($_POST['message'] ?? '');
$subtopic_id = intval($_POST['subtopic_id'] ?? 0);
чтобы понять где ошибка достаточно было посмотреть значение $token которое попадает в JWT::decode и там бы увидели "1" вместо переданного токена.