getAuthorizationUrl(scopes: ['beneficiaries', 'payment']); echo "1. Перейдите по ссылке для авторизации:\n$link\n\n"; // --- СЦЕНАРИЙ 2: Обмен кода на токен (в callback-скрипте) --- // $code приходит в GET-параметре: /callback?code=... $codeFromUrl = '...код из браузера...'; if ($codeFromUrl !== '...код из браузера...') { try { echo "2. Обмен кода на токены...\n"; // Saloon делает всё сам: $authenticator = $baas->getAccessToken($codeFromUrl); echo 'Access Token: ' . substr($authenticator->getAccessToken(), 0, 20) . "...\n"; echo 'Refresh Token: ' . $authenticator->getRefreshToken() . "\n"; echo 'Expires At: ' . $authenticator->getExpiresAt()->format('Y-m-d H:i:s') . "\n"; // TODO: Сохраните refresh_token в базу данных! } catch (\Exception $e) { echo 'Ошибка обмена кода: ' . $e->getMessage() . "\n"; } } // --- СЦЕНАРИЙ 3: Регулярное обновление токена (Cron / Middleware) --- $savedRefreshToken = '...saved_refresh_token...'; if ($savedRefreshToken !== '...saved_refresh_token...') { try { echo "3. Обновление токена...\n"; // Обновляем токен $newAuthenticator = $baas->refreshAccessToken($savedRefreshToken); // Автоматически применяем к коннектору (для текущего скрипта) $baas->authenticate($newAuthenticator); echo "Токен обновлен!\n"; // Если пришел новый refresh_token — обновляем его if ($newAuthenticator->getRefreshToken()) { // DB::update(...) echo "Новый Refresh Token получен.\n"; } } catch (\Exception $e) { echo 'Ошибка обновления токена: ' . $e->getMessage() . "\n"; } }