headers->get('X-Shopify-Topic')[0] ?? null; $shopDomain = $request->headers->get('X-Shopify-Shop-Domain')[0] ?? null; $hmac = $request->headers->get('X-Shopify-Hmac-Sha256')[0] ?? null; // Validiere den HMAC, um sicherzustellen, dass der Request von Shopify kommt $rawData = $request->body; if (! $this->validateWebhookHmac($hmac, $rawData)) { $result = new JsonResult(['error' => 'Ungültiger HMAC']); $result->status = Status::UNAUTHORIZED; return $result; } // Daten verarbeiten $data = json_decode($rawData, true); // Je nach Topic unterschiedlich verarbeiten switch ($topic) { case 'orders/create': $this->processOrderCreated($data); break; case 'products/create': case 'products/update': $this->processProductUpdate($data); break; case 'customers/create': $this->processCustomerCreated($data); break; // Weitere Webhook-Themen... default: // Unbekanntes Thema, loggen oder ignorieren break; } // Shopify erwartet eine erfolgreiche Antwort (2xx) return new JsonResult(['success' => true]); } /** * Validiert den HMAC-Header */ private function validateWebhookHmac(?string $hmac, string $data): bool { if (! $hmac) { return false; } $secret = $this->externalApiConfig->shopify->webhookSecret; $calculatedHmac = base64_encode(hash_hmac('sha256', $data, $secret, true)); return hash_equals($calculatedHmac, $hmac); } /** * Verarbeitet eine neu erstellte Bestellung */ private function processOrderCreated(array $orderData): void { // Hier die Logik für neue Bestellungen implementieren // z.B. in eigenes System übertragen, E-Mails versenden, etc. } /** * Verarbeitet Produkt-Updates */ private function processProductUpdate(array $productData): void { // Hier die Logik für Produkt-Updates implementieren // z.B. Lagerbestand in eigenem System aktualisieren } /** * Verarbeitet einen neu erstellten Kunden */ private function processCustomerCreated(array $customerData): void { // Hier die Logik für neue Kunden implementieren // z.B. in CRM-System übertragen, Newsletter-Anmeldung } }