Hola @gonzaloshop,
@mateoweb ha dado en el clavo. El problema es que tu código actual solo maneja la validación del token. Después de obtener el contenido de php://input, necesitas decodificarlo explícitamente y comprobar si la decodificación fue exitosa antes de intentar usar el $payload.
La función json_decode de PHP, cuando falla al parsear una cadena JSON inválida, devuelve null y establece un error que puedes consultar con json_last_error() y json_last_error_msg(). Tu !is_array($payload) es útil, pero debe ir acompañado de una verificación de los errores de json_decode.
Aquí te muestro cómo podrías modificar tu función initContent para manejar esto de manera robusta:
if (!GpsrApiKey::isValid($token)) {
$this->respondJson(['success' => false, 'error' => 'unauthorized'], 401);
}
$rawPayload = file_get_contents('php://input');
$payload = json_decode($rawPayload, true);
if (json_last_error() !== JSON_ERROR_NONE || !is_array($payload)) {
$this->respondJson(['success' => false, 'error' => 'invalid_json_payload'], 400);
}
Explicación de los cambios:
- He añadido el cierre de la llave
} para el if del token, que faltaba en tu snippet original.
$rawPayload = file_get_contents('php://input');: Aquí obtienes la cadena cruda del cuerpo de la solicitud.
$payload = json_decode($rawPayload, true);: Decodificamos la cadena. El true asegura que el resultado sea un array asociativo.
if (json_last_error() !== JSON_ERROR_NONE || !is_array($payload)): Esta es la clave. Primero, comprobamos si hubo algún error durante la última operación JSON (es decir, json_decode). Si json_last_error() no es JSON_ERROR_NONE, significa que el JSON estaba malformado. Además, seguimos verificando que $payload sea un array, lo cual cubriría otros casos donde la decodificación podría no dar el formato esperado (aunque json_last_error() es más específico para la validez del JSON).
$this->respondJson(['success' => false, 'error' => 'invalid_json_payload'], 400);: Si alguna de estas condiciones se cumple, respondemos con un error 400 y un mensaje claro para el cliente de la API.
Con esto, tus peticiones POST recibirán una respuesta explícita si el cuerpo JSON no es válido.