$value) { if (\strncmp($key, 'HTTP_', 5) === 0) { $name = \strtolower(\str_replace('_', '-', \substr($key, 5))); $headers[$name] = (string) $value; } } // Signatur verifizieren – sonst sofort ablehnen try { if (!(new Webhook())->verify($headers, $rawBody)) { \http_response_code(400); echo 'invalid signature'; exit; } } catch (\Throwable $e) { \error_log('PayPal v2 webhook verify: ' . $e->getMessage()); \http_response_code(500); exit; } $event = \json_decode($rawBody, true); $type = \is_array($event) ? (string) ($event['event_type'] ?? '') : ''; try { if ($type === 'PAYMENT.CAPTURE.COMPLETED') { $resource = $event['resource'] ?? []; if (\is_array($resource)) { (new Gateway($base_object))->confirmFromWebhookCapture($resource); } } // Weitere Event-Typen (Refund/Denied) koennen hier ergaenzt werden. } catch (\Throwable $e) { \error_log('PayPal v2 webhook handle (' . $type . '): ' . $e->getMessage()); \http_response_code(500); exit; } // PayPal erwartet 2xx, sonst wird das Event erneut zugestellt. \http_response_code(200); echo 'ok';