$expected_signature, 'provided' => $provided_signature, 'payload_length' => strlen($payload_json) ]); } return $is_valid; } /** * Extract and validate webhook headers * * @return array */ public static function get_webhook_headers() { $headers = []; // Get signature from header $signature = null; if (function_exists('getallheaders')) { $all_headers = getallheaders(); $signature = $all_headers['x-me-signature'] ?? $all_headers['X-Me-Signature'] ?? null; } // Fallback to $_SERVER if (!$signature) { $signature = $_SERVER['HTTP_X_ME_SIGNATURE'] ?? null; } $headers['signature'] = $signature; $headers['content_type'] = $_SERVER['CONTENT_TYPE'] ?? ''; $headers['user_agent'] = $_SERVER['HTTP_USER_AGENT'] ?? ''; return $headers; } /** * Validate webhook payload structure * * @param array $payload * @return bool */ public static function validate_payload_structure($payload) { if (!is_array($payload)) { Logger::log('SuperFrete', 'Invalid webhook payload: Not an array'); return false; } // Check required fields $required_fields = ['event', 'data']; foreach ($required_fields as $field) { if (!isset($payload[$field])) { Logger::log('SuperFrete', "Invalid webhook payload: Missing field '$field'"); return false; } } // Validate event type $supported_events = ['order.posted', 'order.delivered']; if (!in_array($payload['event'], $supported_events)) { Logger::log('SuperFrete', 'Unsupported webhook event: ' . $payload['event']); return false; } // Validate data structure if (!isset($payload['data']['id'])) { Logger::log('SuperFrete', 'Invalid webhook payload: Missing data.id'); return false; } return true; } /** * Generate webhook secret * * @param int $length * @return string */ public static function generate_webhook_secret($length = 32) { return wp_generate_password($length, false); } }