<?php
$rawBody = file_get_contents('php://input');
$header = $_SERVER['HTTP_MERCYPAY_SIGNATURE'] ?? '';
$secret = getenv('MERCYPAY_WEBHOOK_SECRET');
$timestamp = null;
$signatures = [];
foreach (explode(',', $header) as $part) {
[$key, $value] = array_pad(explode('=', trim($part), 2), 2, '');
if ($key === 't') {
$timestamp = (int) $value;
} elseif ($key === 'v1') {
$signatures[] = $value;
}
}
$expected = hash_hmac('sha256', $timestamp.'.'.$rawBody, $secret);
$valid = $timestamp && abs(time() - $timestamp) <= 300
&& array_filter($signatures, fn ($signature) => hash_equals($expected, $signature)) !== [];
if (! $valid) {
http_response_code(401);
exit;
}
$event = json_decode($rawBody, true);