amocrm / amocrm-api-php

Библиотека на PHP для работы с API amoCRM
MIT License
152 stars 109 forks source link

Обновление токена на работает #388

Open igor-ost opened 3 years ago

igor-ost commented 3 years ago

У меня токен держится только 24 часа (Примерно), и его приходиться обновлять. На сколько я знаю должен создаться Токен на 3 месяца и записывать его в файл. но файл не идёт вот мои boostrap и action token

<?php

use League\OAuth2\Client\Token\AccessToken;

define('TOKEN_FILE', DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . 'token_info.json');

/**
 * @param array $accessToken
 */
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 AccessToken
 */
function getToken()
{
    if (!file_exists(TOKEN_FILE)) {
        exit('Access token file not found');
    }

    $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 AccessToken([
            'access_token' => $accessToken['accessToken'],
            'refresh_token' => $accessToken['refreshToken'],
            'expires' => $accessToken['expires'],
            'baseDomain' => $accessToken['baseDomain'],
        ]);
    } else {
        exit('Invalid access token ' . var_export($accessToken, true));
    }
}
<?php

use AmoCRM\Client\AmoCRMApiClient;
use Symfony\Component\Dotenv\Dotenv;

include_once __DIR__ . '/../vendor/autoload.php';

$dotenv = new Dotenv();
$dotenv->load(__DIR__ . '/env.dist', __DIR__ . '/env1.env');

$clientId = $_ENV['CLIENT_ID'];
$clientSecret = $_ENV['CLIENT_SECRET'];
$redirectUri = $_ENV['CLIENT_REDIRECT_URI'];

$apiClient = new AmoCRMApiClient($clientId, $clientSecret, $redirectUri);

include_once __DIR__ . '/token_actions.php';
include_once __DIR__ . '/error_printer.php';

Что не так почему файл с токеном не создаётся. И не сохраняет его на 30 дней?

makeroi commented 3 years ago

access токен живет 24 часа, refresh токен живет 3 месяца.

Что это значит? При установке вы получили от амо связку access и refresh токены. С помощь. access токена вы можете делать запросы в апи в течении суток. Далее токен устареет и запросы проходить перестанут.

Refresh токен служит для обновления связки access токен-refresh токен. То есть после получения связки у вас есть три месяца на то, что бы с помощью refresh токена получить новую связку refresh токен - access токен. При этом старый refresh устаревает.

Примитивная механика такая - при авторизации получили от амо код, обменяли его на связку access токен и refresh токен. Сохраняем их в файл. Когда нам нужно сделать запрос берем токены из файла. Если access не истек делаем запрос, если истек - то с помощью refresh получаем новую связку и сохраняем ее в файл.

Если у вас проблема записи в файл - это не та проблема, которую хочется обсуждать в рамках библиотеки.

tatarrr95 commented 3 years ago

У меня та же проблема, не могу понять, где токен должен хранится. Как я понял, должен в корне домена в папке tmp. Но там его нет( И ошибок главное никаких, просто через определенный период интеграция перестает работать и все

eugene-borovov commented 3 years ago

Попробуйте прописать абсолютный путь для сохранения токена https://github.com/amocrm/amocrm-api-php/issues/289#issuecomment-830672149

tkachev-o commented 2 years ago

У меня та же проблема, не могу понять, где токен должен хранится. Как я понял, должен в корне домена в папке tmp. Но там его нет( И ошибок главное никаких, просто через определенный период интеграция перестает работать и все

define('TOKEN_FILE', DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . 'token_info.json');

Указал абсолютный путь по рекомендации @eugene-borovov в директорию tmp к которой у пользователя есть доступ. token_info.json создался.