diff --git a/app/setup/settings/urls.php b/app/setup/settings/urls.php index b634238..5b908c0 100644 --- a/app/setup/settings/urls.php +++ b/app/setup/settings/urls.php @@ -45,7 +45,8 @@ return [ '/api/external' => [ '/toku/success' => [ 'validator' => Incoviba\Service\Venta\MediosPago\Toku::class, - 'token' => $container->get('TOKU_TOKEN') + 'token' => $container->get('TOKU_TOKEN'), + 'secret' => $container->get('TOKU_WEBHOOK_SECRET'), ] ], ] diff --git a/app/src/Service/HMAC.php b/app/src/Service/HMAC.php new file mode 100644 index 0000000..e523c0d --- /dev/null +++ b/app/src/Service/HMAC.php @@ -0,0 +1,17 @@ +getHeaderLine('Tracestate'), strlen('dd='))); - $ptid = substr(array_find($tracestate, fn($item) => str_starts_with($item, 't.tid:')), strlen('t.tid:')); - $datadogTags = explode(',', $request->getHeaderLine('X-Datadog-Tags')); - $tid = array_find($datadogTags, fn($item) => str_contains($item, 'p.tid=')); - $tid = substr($tid, strpos($tid, 'p.tid=') + strlen('p.tid=')); - - return $tid === $ptid; + $tokuSignature = $request->getHeaderLine('Toku-Signature'); + try { + list($timestamp, $signature) = array_map(function($elem) { + return explode('=', $elem)[1]; + }, explode(',', $tokuSignature)); + $body = $request->getBody()->getContents(); + $json = json_decode($body, true); + if (!is_array($json)) { + return false; + } + if (!array_key_exists('id', $json)) { + return false; + } + $eventId = $json['id']; + return HMAC::validate($timestamp, $signature, $eventId, $tokenConfig['secret']); + } catch (Throwable $throwable) { + return false; + } } }