getBody(); if ($rawBody === '') { $rawBody = (string)file_get_contents('php://input'); } $record = [ 'received_at' => (new \DateTimeImmutable('now', new \DateTimeZone('UTC')))->format(DATE_ATOM), 'headers' => $this->normalizeHeaders($request->getHeaders()), 'raw_body' => $rawBody, ]; $fileName = sprintf( 'woovi_webhook_%s_%s.txt', (new \DateTimeImmutable('now'))->format('Ymd_His'), bin2hex(random_bytes(4)) ); $filePath = dirname(__DIR__) . '/bin/' . $fileName; try { $encoded = json_encode($record, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); if ($encoded === false) { $encoded = $rawBody; } file_put_contents($filePath, $encoded, LOCK_EX); } catch (\Throwable $e) { return ResponseLib::sendFail('Falha ao salvar webhook: ' . $e->getMessage(), [], 'E_INTERNAL')->withStatus(500); } return ResponseLib::sendOk([ 'stored_file' => basename($filePath), ], 'S_WEBHOOK_SAVED'); } /** * @param array> $headers * @return array */ private function normalizeHeaders(array $headers): array { $normalized = []; foreach ($headers as $name => $values) { $normalized[$name] = implode(', ', $values); } return $normalized; } }