environment('production')) { $integrationCode = 'telepagos_homo'; } $this->integrationCode = $integrationCode; } /** * Get the headers for Telepagos integration. * * @return array * @throws Exception */ public function getHeaders(): array { return [ 'Authorization' => 'Bearer ' . $this->getToken(), 'Content-Type' => 'application/json', 'Accept' => 'application/json', ]; } /** * Get a valid token, either from cache or by performing a login. * * @return string * @throws Exception */ public function getToken(): string { if (!$this->tenantIntegration) { throw new Exception("Tenant integration is not loaded. Call forTenant() first."); } $cacheKey = "integration_token:{$this->tenantCode}:{$this->integrationCode}"; $token = Cache::get($cacheKey); if ($token) { return $token; } return $this->login(); } /** * Authenticate with Telepagos and cache the returned token. * * @return string * @throws Exception */ public function login(): string { $username = $this->getIntegrationSetting('username'); $password = $this->getIntegrationSetting('password'); if (empty($username) || empty($password)) { throw new Exception("Missing username or password in Telepagos integration settings."); } $url = $this->getUrl('/v2/auth/token'); $response = Http::post($url, [ 'username' => $username, 'password' => $password, ]); if ($response->failed() || $response->json('status') !== 'ok') { throw new Exception("Telepagos authentication failed: " . ($response->json('message') ?? $response->body())); } $token = $response->json('token'); $expiresAtStr = $response->json('expires_at'); if (!$token || !$expiresAtStr) { throw new Exception("Telepagos authentication response is missing token or expires_at."); } $expiresAt = Carbon::parse($expiresAtStr); // Calculate TTL and subtract a buffer of 60 seconds $ttlSeconds = max(1, $expiresAt->diffInSeconds(now()) - 60); $cacheKey = "integration_token:{$this->tenantCode}:{$this->integrationCode}"; Cache::put($cacheKey, $token, $ttlSeconds); return $token; } /** * Clear the cached token. * * @return void */ public function clearToken(): void { $cacheKey = "integration_token:{$this->tenantCode}:{$this->integrationCode}"; Cache::forget($cacheKey); } }