define('TOKEN_FILE', DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . 'token_info.json'); use AmoCRM\OAuth2\Client\Provider\AmoCRM; include_once __DIR__ . '/amo/vendor/autoload.php'; include_once __DIR__ . '/amo/src/AmoCRM.php'; session_start(); /** * Создаем провайдера */ $provider = new AmoCRM([ 'clientId' => '4e63ac41-66a8-4db3-a061-067aa0babe25', 'clientSecret' => 'gZVtuioDYBHvUoS0uiRV6x5RP6B5ge1VQX8sQpEO0ZEKrbSV0QIwDwdpFaPfxHwU', 'redirectUri' => 'https://nirax-cargo.ru/amo', ]); if (isset($_GET['referer'])) { $provider->setBaseDomain($_GET['referer']); } if (!isset($_GET['request'])) { if (!isset($_GET['code'])) { /** * Просто отображаем кнопку авторизации или получаем ссылку для авторизации * По-умолчанию - отображаем кнопку */ $_SESSION['oauth2state'] = bin2hex(random_bytes(16)); if (true) { echo '
'; echo ''; die; } else { $authorizationUrl = $provider->getAuthorizationUrl(['state' => $_SESSION['oauth2state']]); header('Location: ' . $authorizationUrl); } } elseif (empty($_GET['state']) || empty($_SESSION['oauth2state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) { unset($_SESSION['oauth2state']); exit('Invalid state'); } /** * Ловим обратный код */ try { /** @var \League\OAuth2\Client\Token\AccessToken $access_token */ $accessToken = $provider->getAccessToken(new League\OAuth2\Client\Grant\AuthorizationCode(), [ 'code' => $_GET['code'], ]); if (!$accessToken->hasExpired()) { saveToken([ 'accessToken' => $accessToken->getToken(), 'refreshToken' => $accessToken->getRefreshToken(), 'expires' => $accessToken->getExpires(), 'baseDomain' => $provider->getBaseDomain(), ]); } } catch (Exception $e) { die((string)$e); } /** @var \AmoCRM\OAuth2\Client\Provider\AmoCRMResourceOwner $ownerDetails */ $ownerDetails = $provider->getResourceOwner($accessToken); printf('Hello, %s!', $ownerDetails->getName()); } else { $accessToken = getToken(); $provider->setBaseDomain($accessToken->getValues()['baseDomain']); /** * Проверяем активен ли токен и делаем запрос или обновляем токен */ if ($accessToken->hasExpired()) { /** * Получаем токен по рефрешу */ try { $accessToken = $provider->getAccessToken(new League\OAuth2\Client\Grant\RefreshToken(), [ 'refresh_token' => $accessToken->getRefreshToken(), ]); saveToken([ 'accessToken' => $accessToken->getToken(), 'refreshToken' => $accessToken->getRefreshToken(), 'expires' => $accessToken->getExpires(), 'baseDomain' => $provider->getBaseDomain(), ]); } catch (Exception $e) { die((string)$e); } } $token = $accessToken->getToken(); try { /** * Делаем запрос к АПИ */ $data = $provider->getHttpClient() ->request('GET', $provider->urlAccount() . 'api/v2/account', [ 'headers' => $provider->getHeaders($accessToken) ]); $parsedBody = json_decode($data->getBody()->getContents(), true); printf('ID аккаунта - %s, название - %s', $parsedBody['id'], $parsedBody['name']); } catch (GuzzleHttp\Exception\GuzzleException $e) { var_dump((string)$e); } } function saveToken($accessToken) { if ( isset($accessToken) && isset($accessToken['accessToken']) && isset($accessToken['refreshToken']) && isset($accessToken['expires']) && isset($accessToken['baseDomain']) ) { $data = [ 'accessToken' => $accessToken['accessToken'], 'expires' => $accessToken['expires'], 'refreshToken' => $accessToken['refreshToken'], 'baseDomain' => $accessToken['baseDomain'], ]; file_put_contents(TOKEN_FILE, json_encode($data)); } else { exit('Invalid access token ' . var_export($accessToken, true)); } } /** * @return \League\OAuth2\Client\Token\AccessToken */ function getToken() { $accessToken = json_decode(file_get_contents(TOKEN_FILE), true); if ( isset($accessToken) && isset($accessToken['accessToken']) && isset($accessToken['refreshToken']) && isset($accessToken['expires']) && isset($accessToken['baseDomain']) ) { return new \League\OAuth2\Client\Token\AccessToken([ 'access_token' => $accessToken['accessToken'], 'refresh_token' => $accessToken['refreshToken'], 'expires' => $accessToken['expires'], 'baseDomain' => $accessToken['baseDomain'], ]); } else { exit('Invalid access token ' . var_export($accessToken, true)); } }