Files
confirms/worker/api_receiver.php
2025-12-23 15:54:20 +09:00

122 lines
3.7 KiB
PHP

<?php
/**
* [A 작업] 네이버 검증 요청 실시간 수신 리시버
* - 프레임워크를 로드하지 않아 매우 빠르고 안전함
* - 받은 데이터를 Redis 큐에 넣고 즉시 응답
*/
// 1. 응답 헤더 설정 (JSON)
header('Content-Type: application/json; charset=utf-8');
// 2. 보안 키 체크 (URL 파라미터 key=값)
$configKey = "7EE868F4B36D36B3D86736828F4729EAC4992083"; // 실제 사용할 키값으로 변경하세요
$api_info = [
'@type' => 'response',
'@service' => 'confirms',
'@version' => '1.0.0'
];
$receivedKey = $_GET['key'] ?? '';
$logDir = __DIR__ . '/logs/';
if ($receivedKey !== $configKey) {
http_response_code(403);
$api_info['error'] = [
'code' => '-1',
'message' => 'Unregistered key'
];
echo json_encode($api_info);
exit;
}
try {
// 3. 데이터 수신 (POST JSON 또는 GET 파라미터)
$rawData = file_get_contents('php://input');
$data = json_decode($rawData, true);
if (empty($data)) {
throw new Exception("Empty data received");
}
// 4. Redis 연결
$redis = new Redis();
// Docker 서비스 이름인 'redis' 사용
$success = $redis->connect('redis', 6379);
if (!$success) {
throw new Exception("Could not connect to Redis");
}
$redis->select(9); // 10번 DB 사용
// 5. 큐에 넣을 데이터 포맷팅
$payload = [
'request_data' => $data,
'received_at' => date('Y-m-d H:i:s'),
'client_ip' => $_SERVER['REMOTE_ADDR']
];
// 'naver:raw_queue'라는 이름의 리스트에 저장
$redis->lPush('naver:raw_queue', json_encode($payload));
// --- [여기서부터 로그 저장 코드 추가] ---
// 들어온 원본($rawData)을 그대로 기록합니다.
writeLog("RAW_RECEIVE | " . $rawData, 'INFO');
// --------------------------------------
// 6. 네이버측에 성공 응답 (202 Accepted)
// 처리가 완료된 것은 아니지만, 접수는 완료되었음을 의미
http_response_code(202);
echo json_encode(
$api_info['error'] = [
'code' => '1',
'message' => 'Request accepted and queued'
]
);
// echo json_encode([
// 'resultCode' => 'S000',
// 'resultMessage' => 'Request accepted and queued',
// 'articleNumber' => $data['articleNumber'] ?? 'N/A'
// ]);
} catch (Exception $e) {
// 7. 장애 발생 시 로그 기록 (시스템 로그)
$api_info['error'] = [
'code' => '-1',
'message' => $e->getMessage()
];
writeLog( json_encode($api_info) ." | Received: " . json_encode($data), 'ERROR');
http_response_code(500);
echo json_encode($api_info);
}
/**
* 날짜별 로그 기록 함수
* @param string $message 로그 내용
* @param string $level 로그 레벨 (INFO, ERROR, DEBUG 등)
*/
function writeLog($message, $level = 'ERROR') {
// 1. 로그 저장 경로 설정 (프로젝트 루트의 logs 폴더)
$logBaseDir = __DIR__ . '/logs';
$Dir = $logBaseDir . '/';
// 2. 폴더가 없으면 생성 (연/월 구조로 관리하면 파일이 너무 많아지는 것을 방지)
if (!is_dir($Dir)) {
@mkdir($Dir, 0777, true);
}
// 3. 파일명 결정 (예: logs/2025/12/2025-12-22.log)
$logFile = $Dir . date('Y-m-d') . '.log';
// 4. 로그 포맷팅 (시간 [레벨] 메시지)
$timestamp = date('Y-m-d H:i:s');
$singleLineMessage = str_replace(["\r", "\n", "\t"], " ", $message);
$formattedMessage = "[$timestamp] [$level] $singleLineMessage" . PHP_EOL;
// 5. 파일 기록 (FILE_APPEND로 기존 내용 뒤에 추가)
file_put_contents($logFile, $formattedMessage, FILE_APPEND);
}