<?php date_default_timezone_set('America/Sao_Paulo'); /** * VoguePay Webhook Handler * POST -> processa eventos do gateway * GET -> retorna status básico do handler */ $logDir = __DIR__ . '/logs'; if (!is_dir($logDir)) { mkdir($logDir, 0755, true); } if ($_SERVER['REQUEST_METHOD'] === 'GET') { header('Content-Type: application/json; charset=utf-8'); echo json_encode([ 'ok' => true, 'service' => 'voguepay-webhook', 'time' => date('Y-m-d H:i:s') ], JSON_UNESCAPED_UNICODE); exit; } header('Content-Type: application/json; charset=utf-8'); if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); echo json_encode(['success' => false, 'error' => 'Método não permitido'], JSON_UNESCAPED_UNICODE); exit; } $logFile = $logDir . '/webhook-voguepay.log'; $rawBody = file_get_contents('php://input'); $eventHeader = $_SERVER['HTTP_X_WEBHOOK_EVENT'] ?? 'unknown'; $source = $_SERVER['HTTP_X_WEBHOOK_SOURCE'] ?? 'unknown'; $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown'; $logEntry = date('Y-m-d H:i:s') . " | IP={$ip} | Event={$eventHeader} | Source={$source} | Body={$rawBody}\n"; file_put_contents($logFile, $logEntry, FILE_APPEND | LOCK_EX); $data = json_decode($rawBody, true); if (!$data) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'JSON inválido'], JSON_UNESCAPED_UNICODE); exit; } $eventType = $data['event'] ?? ''; $transactionId = $data['transactionId'] ?? ''; $status = $data['status'] ?? ''; $amount = $data['amount'] ?? 0; $netAmount = $data['netAmount'] ?? 0; $fees = $data['fees'] ?? 0; $externalRef = $data['externalReference'] ?? $data['externalRef'] ?? ''; $paidAt = $data['paidAt'] ?? ''; $timestamp = $data['timestamp'] ?? ''; $payMethod = $data['paymentMethod'] ?? ''; $acquirer = $data['acquirer'] ?? ''; $acquirerTxnId = $data['acquirerTransactionId'] ?? ''; $endToEndId = $data['endToEndId'] ?? ''; $reason = $data['reason'] ?? ''; $customerName = $data['customer']['name'] ?? ''; $customerEmail = $data['customer']['email'] ?? ''; $statusFile = $logDir . '/transactions.json'; $transactions = []; if (file_exists($statusFile)) { $transactions = json_decode(file_get_contents($statusFile), true) ?: []; } $transactions[$transactionId] = [ 'event' => $eventType, 'status' => $status, 'amount' => $amount, 'netAmount' => $netAmount, 'fees' => $fees, 'externalRef' => $externalRef, 'paymentMethod' => $payMethod, 'acquirer' => $acquirer, 'acquirerTxnId' => $acquirerTxnId, 'endToEndId' => $endToEndId, 'customerName' => $customerName, 'customerEmail' => $customerEmail, 'paidAt' => $paidAt, 'reason' => $reason, 'timestamp' => $timestamp, 'updatedAt' => date('Y-m-d H:i:s'), ]; file_put_contents($statusFile, json_encode($transactions, JSON_PRETTY_PRINT), LOCK_EX); if ($eventType === 'transaction.paid') { $paidLog = date('Y-m-d H:i:s') . " | PAGO | TXN={$transactionId} | Ref={$externalRef} | Valor=" . ($amount / 100) . " | Net=" . ($netAmount / 100) . " | Taxa=" . ($fees / 100) . " | Cliente={$customerName} | E2E={$endToEndId}\n"; file_put_contents($logDir . '/pagamentos.log', $paidLog, FILE_APPEND | LOCK_EX); $leadsFile = $logDir . '/../data/leads.json'; if (file_exists($leadsFile)) { $allLeads = json_decode(file_get_contents($leadsFile), true) ?: []; foreach ($allLeads as &$lead) { if (($lead['transactionId'] ?? '') === $transactionId) { $lead['paid'] = true; $lead['paid_at'] = date('Y-m-d H:i:s'); $lead['status'] = 'pago'; break; } } unset($lead); file_put_contents($leadsFile, json_encode($allLeads, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), LOCK_EX); } } http_response_code(200); echo json_encode(['success' => true, 'received' => true], JSON_UNESCAPED_UNICODE);