Ошибка при получении токена битрикс

Добрый день!
Нашел следующий код для получения токена от Битрикс24

public function getAccessToken() {
 
$access_token = false;

/* Авторизуемся на портале */
 $this->curl_b24("https://{$this->bitrix24domen}/crm/configs/import/lead.php?LOGIN=". urlencode($this->bitrix24login) . "&PASSWORD=" . urlencode($this->bitrix24password));
						
$auth_url = $this->curl_b24("https://{$this->bitrix24domen}/oauth/authorize/?client_id=" . $this->client_id . "&response_type=code&redirect_uri=" . $this->url . "/system/library/bitrix24.php", true);
				
		if (preg_match("/?(.*?)$/i", $auth_url, $arRes)) {
			parse_str($arRes[1]);
			if (isset($code) && $code != "") {
				$res = json_decode($this->curl_b24("https://oauth.bitrix.info/oauth/token/?grant_type=authorization_code&client_id={$this->client_id}&client_secret={$this->client_secret}&code={$code}"));
				if ($res->access_token != "") {
					$access_token = $res->access_token;
					
					return $access_token;
				} else {
					$this->getAccessToken();
				}
			} 
		}
}

Но при таком подключении создается пустой лид. Если закомментировать строку

$this->curl_b24("https://{$this->bitrix24domen}/crm/configs/import/lead.php?LOGIN=". urlencode($this->bitrix24login) . "&PASSWORD=" . urlencode($this->bitrix24password));

Тогда code не приходит.

Может кто сталкивался с подобной проблемой, как ее можно решить?

ВНИМАНИЕ!! Приведенный ниже код устарел, так как б24 обновил авторизацию. Но есть проект на github сделанный на основе моего кода. Работает с новой версией авторизации https://github.com/xUJYx/bitrix24_api_authorization

В документации bitrix24 api описано получение сессионного токена, но для тех кто первый раз создает приложение, получить его удается не сразу.

Данная заметка больше для себя, чтобы не забыть потом).

И так, поехали:

  1. Для начала необходимо получить первый код авторизации, для этого переходим по ссылке
    https://
    имя_портала.bitrix24.ru/oauth/authorize/?response_type=code&client_id=код_приложения . Где имя_портала — Ваш портал битрикс24, код_приложения — код приложения вида local.5592c31a77f7b0.32818786. Url который описан в документации можно не использовать. Если Вы не были авторизованы, то перебросит на страницу авторизации. В итоге будет адресной строке браузера ссылка вида https://apps-b1001609.bitrix24-cdn.com/b1001609/app_local/e38e9f7db4fa858f9e1b92e91e699811/index.html?code=6dm7bdbh6akpc9tax2lp3fih05m5gtf2&domain=имя_портала.bitrix24.ru&member_id=a3238bc7698db8257e62cf799e88b58e
  2. Теперь нам нужно получить access_token, берем полученый в п1. код (Внимание! время его жизни 30 сек!) и вставляем в ссылку https://имя_портала.bitrix24.ru/oauth/token/?grant_type=authorization_code&client_id=код_приложения&client_secret=секретный_код_приложения&scope=разрешения_для_приложения&code=код_из_п1 . Если вернуло {«error»:»expired_token»} значит не успели, повторяем заново. Если ответ вида {«access_token»:»x91c078f168ccz6vhuxzbkvonbe4z6x3″,»expires_in»:3600,»scope»:null, «user_id»:13,»refresh_token»:»ap1oopxpew4ieu2tw8d2hhoj2gu3smle», «domain»:»имя_портала.bitrix24.ru»,»member_id»:»a3238bc7698db8257e62cf799e88b58e»}, поздравляю, авторизация успешна.

Для автоматизации данного процесса я написал небольшой скрипт :

<?php
$config = require __DIR__.'/config.php';
$config = $config['production'];
$_url = 'https://'.$config['domain'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$res = curl_exec($ch);
$l = '';
if(preg_match('#Location: (.*)#', $res, $r)) {
    $l = trim($r[1]);
}
//echo $l.PHP_EOL;
curl_setopt($ch, CURLOPT_URL, $l);
$res = curl_exec($ch);
preg_match('#name="backurl" value="(.*)"#', $res, $math);
$post = http_build_query([
    'AUTH_FORM' => 'Y',
    'TYPE' => 'AUTH',
    'backurl' => $math[1],
    'USER_LOGIN' => $config['login'],
    'USER_PASSWORD' => $config['password'],
    'USER_REMEMBER' => 'Y'
]);
curl_setopt($ch, CURLOPT_URL, 'https://www.bitrix24.net/auth/');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$res = curl_exec($ch);
$l = '';
if(preg_match('#Location: (.*)#', $res, $r)) {
    $l = trim($r[1]);
}
//echo $l.PHP_EOL;
curl_setopt($ch, CURLOPT_URL, $l);
$res = curl_exec($ch);
$l = '';
if(preg_match('#Location: (.*)#', $res, $r)) {
    $l = trim($r[1]);
}
//echo $l.PHP_EOL;
curl_setopt($ch, CURLOPT_URL, $l);
$res = curl_exec($ch);
//end autorize
curl_setopt($ch, CURLOPT_URL, 'https://'.$config['domain'].'/oauth/authorize/?response_type=code&client_id='.$config['client_id']);
$res = curl_exec($ch);
$l = '';
if(preg_match('#Location: (.*)#', $res, $r)) {
    $l = trim($r[1]);
}
preg_match('/code=(.*)&do/', $l, $code);
$code = $code[1];
curl_setopt($ch, CURLOPT_URL, 'https://'.$config['domain'].'/oauth/token/?grant_type=authorization_code&client_id='.$config['client_id'].'&client_secret='.$config['client_secret'].'&code='.$code.'&scope=crm,user,telephony');
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
echo $res;

Для его использования нужен конфигурационный файл:

<?php
return [
    'dev' => [
        //идентификатор приложения
        'client_id' => 'local.55a6ca262e8482.19745138',
        //секретный код приложения
        'client_secret' => '3c04629083254f498ec482d73b14deb9',
        'scope' => 'crm,user,telephony',
        //домен третьего уровня клиентского проекта в Bitrix24
        'domain' => 'test.bitrix24.ru',
        //данные пользователя bitrix24
        'login' => 'test@test.tu',
        'password' => '123456',
    ],
    'production' => [
        //идентификатор приложения
        'client_id' => 'local.55acf267b7bbf0.23563438',
        //секретный код приложения
        'client_secret' => '2d75c95a9857f8d8e8108d543281d5a2',
        //доступ
        'scope' => 'crm,user',
        //домен третьего уровня клиентского проекта в Bitrix24
        'domain' => 'test2.bitrix24.ru',
        //данные пользователя для авторизации
        'login' => 'test@test.ru',
        'password' => '123456',
    ],
];

Нужный массив указываем в файле авторизации

$config = $config['production'];

После запуска скрипт выдаст сессионный токен.

[error] Fail REST response {«error»:»invalid_grant»}

[2022-05-20T15:51:32+03:00][error] Slow response. PHP time:2.9937169551849s, cURL time: 2.992341, url:https://oauth.bitrix.info/oauth/token/, Data:{«grant_type»:»refresh_token»,»client_id»:»app.5ea2ab337deab1.57263195″,»client_secret»:»XUMGJmFTgg2mjAnuZ0XykBODqToLT2f0HPDZagKP3HKtH6RT18″,»refresh_token»:»8cfaae6200549788005b10180000000100000745e86dd7a9a956fca42a6c67a148bfa9″}, Response: {«error»:»invalid_grant»}

[2022-05-20T15:51:32+03:00][error] Refresh token: {«error»:»invalid_grant»}

[2022-05-20T15:51:33+03:00][info] Bitrix24IntegrationAMI: inner numbers is empty. Wait 2 seconds…

[2022-05-20T15:51:33+03:00][error] Fail REST response {«error»:»expired_token»,»error_description»:»The access token provided has expired.»}

[2022-05-20T15:51:33+03:00][error] Slow response. PHP time:3.6083660125732s, cURL time: 0.109732, url:https://bitrix.euroexpo.ru/rest/user.get, Data:{«auth»:»9c7b876200549788005b1018000000010000072e22f30aae5ee0cd6959c448a344827e»,»start»:0}, Response: {«error»:»expired_token»,»error_description»:»The access token provided has expired.»}

[2022-05-20T15:51:35+03:00][info] Bitrix24IntegrationAMI: inner numbers is empty. Wait 2 seconds…

[2022-05-20T15:51:37+03:00][error] Fail REST response {«error»:»invalid_grant»}

[2022-05-20T15:51:37+03:00][error] Slow response. PHP time:2.8377289772034s, cURL time: 2.835962, url:https://oauth.bitrix.info/oauth/token/, Data:{«grant_type»:»refresh_token»,»client_id»:»app.5ea2ab337deab1.57263195″,»client_secret»:»XUMGJmFTgg2mjAnuZ0XykBODqToLT2f0HPDZagKP3HKtH6RT18″,»refresh_token»:»8cfaae6200549788005b10180000000100000745e86dd7a9a956fca42a6c67a148bfa9″}, Response: {«error»:»invalid_grant»}

[2022-05-20T15:51:37+03:00][error] Refresh token: {«error»:»invalid_grant»}

[2022-05-20T15:51:37+03:00][info] Bitrix24IntegrationAMI: inner numbers is empty. Wait 2 seconds…

[2022-05-20T15:51:37+03:00][error] Fail REST response {«error»:»expired_token»,»error_description»:»The access token provided has expired.»}

[2022-05-20T15:51:37+03:00][error] Slow response. PHP time:3.4487760066986s, cURL time: 0.107257, url:https://bitrix.euroexpo.ru/rest/batch, Data:{«auth»:»9c7b876200549788005b1018000000010000072e22f30aae5ee0cd6959c448a344827e»,»halt»:0,»cmd»:{«event.offline.get»:»event.offline.get?limit=100&auth=9c7b876200549788005b1018000000010000072e22f30aae5ee0cd6959c448a344827e»}}, Response: {«error»:»expired_token»,»error_description»:»The access token provided has expired.»}

[2022-05-20T15:51:39+03:00][info] Bitrix24IntegrationAMI: inner numbers is empty. Wait 2 seconds…

[2022-05-20T15:51:41+03:00][info] Bitrix24IntegrationAMI: inner numbers is empty. Wait 2 seconds…

[2022-05-20T15:51:42+03:00][error] Fail REST response {«error»:»invalid_grant»}

модуль .102

Я подготовил для вас список часто возникающих проблем с некоторыми приложениями.

Pipedrive

Q: При запуске импорта процесс завис и никуда не двигается? В чем проблема?

Импорт Pipedrive.png

A: Такая проблема возникает, если у вас в CRM есть поля, обязательные для заполнения.

Чтобы решить ее, нужно отключить опцию Проверять наличие обязательных пользовательских полей. Она находится по адресу CRM — Настройки — Другое — Прочие настройки — Приложения.

После этого переустановите приложение и запустите импорт повторно.

Q: Импортируются ли письма в Битрикс24 при миграции?

A: Нет. Письма в текущей версии не переносятся.

Commission Calculator

Q: Можно ли посчитать бонусы за время до установки приложения?

A: Бонусы рассчитываются, начиная с предыдущего дня до установки приложения. Поэтому произвести расчеты за более ранние периоды в текущей версии нельзя.

Quickbooks (QBO)

Q: Какой тип интеграции сейчас поддерживается, чем могут обмениваться Битрикс24 и Quickbooks?

A: Синхронизация реализована по клиентам и счетам.

Чтобы счета передавались в ваш Битрикс 24 нужно отключить опцию Проверять наличие обязательных пользовательских полей. Она находится по адресу CRM — Настройки — Другое — Прочие настройки — Приложения.

Q: При синхронизации данных с Битрикс24 возникает ошибка «The field … is required». Как это решить?

A: Скорее всего у вас заведено пользовательское поле, у которого включена настройка Required. Нужно убрать обязательность со всех пользовательских полей у счетов, удалить приложение и все импортированные из QuickBooks данные (включая контакты и компании) и установить приложение заново.

Если же пользовательское поле не заводилось, то проблема может быть в платежных системах контактов и счетов. Сначала удалите приложение и все синхронизированные данные, а после переустановите приложение. При этом в настройках QuickBooks обязательно укажите платежные системы как для контактов, так и для компаний. У контактов и компаний существуют отдельные платежные системы, поэтому систему для контакта нельзя назначать для компании и наоборот.

Еще одной причиной может быть использование налогов, привязанных к местоположению. В этом случае в ошибке будет указано поле Location, которое в других случаях не является обязательным. Для решения ситуации нужно выбрать иной тип налогов — при импорте из QuickBooks поле Location в настоящий момент не заполняется.

Q: После произведенного импорта переехали не все данные , а в логе выводится ошибка access denied. Как решить проблему?

A: Данная ошибка возникает, если интеграцию проводит пользователь, не являющийся администратором и не имеющий доступа к некоторым элементам. Необходимо удалить все данные и переустановить приложение заново под администратором.

Q: При синхронизации у меня долго крутится значок загрузки. Все зависло?

Загрузка quickbooks.png

A: Процесс может занять определенное время, но синхронизация не зависает. Как только она закончится — вы сразу получите уведомление.

Q: У меня в QuickBooks есть компании с такими же названиями, как в Битрикс24, при синхронизации они объединятся?

A: Нет. Компании синхронизируются по скрытому служебному полю ORIGIN_ID. Заполнить вручную его не получится, поэтому будет дубль.

Q: Горит уведомление Create invoice in QuickBooks. Что нужно сделать?

A: В настройках приложения необходимо указать, какую платежную систему использовать для компаний, а какую — для контактов. При этом важно выбирать платежную системуЮ соответствующую сущности. Т.е. компания — платежкна система для, контакт — для контактов.

PayPal

Q: Возникли проблемы с подключением, как добавить правильный Access Token?

Access Token PayPal.png

A: Для начала нужно перейти по ссылке для получения токена.

Вы увидите пункт The SDK credentials will be needed when you are ready to push Express Checkout live to your site (После того Учетные данные для пакета SDK понадобятся, когда вы будете готовы запустить функцию экспресс-платежей на вашем сайте.). Ниже вы можете получить сам токен.

Далее токен нужно полностью скопировать вместе с access_token$production$. Добавьте его в поле для Компаний. Если токен один, то во второе для Контактов (Contacts) его добавлять не нужно. Далее уже можете переходить к настройке платежной системы.

Q: Нужно ли подключать корпоративный счет, для интеграции PayPal?

A: Да, интеграцию можно осуществить только при наличии корпоративного счета.

Ring Central

Q: Когда я совершаю звонок из Битрикс24, RingCentral вызывает десктопное приложение пользователя RC, так и должно быть? Обе стороны должны принять вызов?

A: Да, данная ситуация нормальна. При звонке из Битрикс24, приложение передает RingCentral, какой внутренний номер соединить с каким внешним. А какое из устройств пользователя будет при этом использовано зависит от настроек личного аккаунта в RingCentral. Обычно, это софтфон, запущенный либо как десктопное приложение, либо как приложение на смартфоне, но может быть и SIP-коннектор. Технически это может выглядеть как вызов на два номера, а затем их соединение.

LOX24 SMS

Q: Откуда брать Sender ID и Service ID?

senderid serviceID.png

A: Service-ID вы можете видеть после авторизации в LOX24. Прямо на первом экране. Этот параметр указывает на тарифный план по которому будет считаться оплата клиента.

Service ID.png

Sender-ID фактически это номер телефона с которого отправляется сообщение. Это то, что увидит клиент, когда придёт СМС.

Zoho

Q: Есть ли способ отменить синхронизацию и запустить ее заново?

A: Нет, но можно вручную удалить все импортированные данные, переустановить приложение и сделать вторую попытку

SugarCRM migration

Q: Есть ли какие-то ограничения на миграцию?

A: Миграция возможна только со штатной установки без дополнительных модулей. Кроме того, есть некоторые данные, которые невозможно перенести в CRM Битрикс24. Например, ни к чему не привязанные звонки.

Приложения в коробочной версии

Q: Работают ли приложения в пробной версии коробочного Битрикс24?

A: Нет, не работают — только на коммерческих лицензиях. Для работы с Rest API нужен активный ключ. Если же активного ключа нет, то протестировать функционал можно в облачной версии Битрикс24.

Q: У меня не работает приложение в коробочной версии, в чем может быть проблема?

A: Проверьте, есть ли SSL сертификат — без него приложение работать не будет.

Jira

Q: Импортируется ли информация о контактах из Jira при интеграции в Битрикс24?

A: Нет, не импортируется.

Mind Map

Q: Возможно после импорта Mind Map изменить его название в приложении?

A: Можно, название карты берётся из корневого узла карты.

Q: Можно ли импортировать данные в приложение Mind Map не в формате .json?

A: Нет.

Expenses

Q: Можно ли в Expenses добавлять расходы в разной валюте?

A: Расходы можно добавлять только в базовой валюте вашего Битрикс24.

Q: Можно ли добавить расходы к уже существующему отчету?

A: Отчёты можно редактировать (в т.ч. добавлять новые расходы), если они ещё не отправлены на подтверждение.

Zendesk

Q: Где отображаются тикеты, созданные в Zendesk, при условии отстутствия клиента в базе CRM?

A: Клиента придется занести в CRM. Только тогда в его детальной карточке можно будет перейти в пункт Zendesk Tickets.

GDPR

Q: Может ли администратор удалить данные уволенного сотрудника? Или это может сделать только сам сотрудник?

A: Администратор может удалить. В приложении есть отдельная вкладка для уволенных сотрудников.

Q: Приложение анонимизирует данные безвозвратно или пользователи, у которых есть доступ, смогут просмотреть данные?

A: Безвозвратно.

Перенос данных в Битрикс24

Заполните форму, и наш партнёр поможет перенести данные из вашей системы в Битрикс24 в кратчайшие сроки!

Заполнить форму

Контроллеры — это часть MVC архитектуры, которая отвечает за обработку запроса и генерирование ответа. Сразу оговоримся, что дальше речь пойдет про компоненты-контроллеры в контексте Bitrix Framework.

Битрикс-контроллер принимает от клиента запрос и возвращает JSON с результатом или ошибкой. Классы-контроллеры содержат одно или несколько методов-действий и являются надстройкой над обычными компонентами, поэтому их нужно размещать в файле class.php компонента.

Бекенд

Тут все просто: в компоненте нужно реализовать интерфейс Controllerable, в ктором есть метод configureActions(). Этот метод возвращает массив с действиями которые можно вызвать. Например, для действия send нужно будет создать метод sendAction.

Метод-действие возвращает массив, который затем отдается клиенту в виде JSON.

Если требуется отдавать на сторону клиента ошибки, то нужно реализовать интерфейс Errorable, в котором есть методы getErrors() и getErrorByCode(). Также нужно будет реализовать коллекцию ошибок ErrorCollection, ее удобнее всего создать в методе onPrepareComponentParams().

В качестве простого примера создадим контроллер для формы обратной связи. Компонент пусть называется machaon:feedback, код контроллера разместится в файле /local/components/machaon/feedback/class.php.

<?php
//local/components/machaon/feedback/class.php

namespace MachaonComponents;

use BitrixMainError;
use BitrixMainErrorable;
use BitrixMainErrorCollection;
use BitrixMainEngineActionFilter;
use BitrixMainEngineContractControllerable;
use CBitrixComponent;

class FeedbackComponent extends CBitrixComponent implements Controllerable, Errorable
{
    protected ErrorCollection $errorCollection;

    public function onPrepareComponentParams($arParams)
    {
        $this->errorCollection = new ErrorCollection();
        return $arParams;
    }

    public function executeComponent()
    {
        // Метод не будет вызван при ajax запросе
    }

    public function getErrors(): array
    {
        return $this->errorCollection->toArray();
    }

    public function getErrorByCode($code): Error
    {
        return $this->errorCollection->getErrorByCode($code);
    }

    // Описываем действия
    public function configureActions(): array
    {
        return [
            'send' => [
                'prefilters' => [
                    // здесь указываются опциональные фильтры, например:
                    new ActionFilterAuthentication(), // проверяет авторизован ли пользователь
                ]
            ]
        ];
    }

    // Сюда передаются параметры из ajax запроса, навания точно такие же как и при отправке запроса.
    // $_REQUEST['username'] будет передан в $username, $_REQUEST['email'] будет передан в $email и т.д.
    public function sendAction(string $username = '', string $email = '', string $message = ''): array
    {
        try {
            $this->doSomeWork();
            return [
                "result" => "Ваше сообщение принято",
            ];
        } catch (ExceptionsEmptyEmail $e) {
            $this->errorCollection[] = new Error($e->getMessage());
            return [
                "result" => "Произошла ошибка",
            ];
        }
    }
}

Фронтенд

В js-библиотеке Битрикс уже есть функция для отправки запросов. Далее простой пример, где machaon:feedback это имя компонента, send — имя действия, а в data: {} передаются необходимые данные:

BX.ajax.runComponentAction("machaon:feedback", "send", {
    mode: "class",
    data: {
        "email": "vasya@email.tld",
        "username": "Василий",
        "message": "Где мой заказ? Жду уже целый час!"
    }
}).then(function (response) {
    // обработка ответа
});

Если все хорошо, с бэкенда нам вернется:

{
    "status": "success",
    "data": {
        "result": "Письмо отправлено"
    },
    "errors": []
}

Либо сообщение об ошибке:

{
    "status": "error",
    "data": {
        "result": "Произошла ошибка"
    },
    "errors": [{
        "message": "Не заполено поле Email",
        "code": 0,
        "customData": null
    }]
}

Отправка запроса напрямую

Если не хочется использовать BX.ajax.runComponentAction(), можно отправить запрос напрямую, например используя jQuery. Нужно отправить запрос на /bitrix/services/main/ajax.php, он будет выглядеть примерно так:

$.post(
    "/bitrix/services/main/ajax.php?mode=class&c=machaon:feedback&action=send",
    {
        "email": "vasya@email.tld",
        "username": "Василий",
        "message": "Где мой заказ? Жду уже целый час!"
    },
    function (response) {
        console.log(response);
    }
);

В параметре mode передается обязательное значение class, в c передается имя компонента в формате vendor:component, action это запускаемый метод.

Эти параметры обязательно должны передаваться в адресе запроса, иначе происходит ошибка.

email, username и message станут затем параметрами $email, $username и $message в методе sendAction().

Использование ЧПУ

Также можно в urlrewrite.php прописать красивый адрес, например /api/rest-component/<component_vendor>/<component_name>/<action>/.

Для этого добавим в urlrewrite.php следующий массив:

$arUrlRewrite = [
    // ...
    [
        "CONDITION" => "#^/api/rest-component/([a-zA-Z0-9]+)/([a-zA-Z0-9.]+)/([a-zA-Z0-9]+)/?.*#",
        "RULE" => "mode=class&c=$1:$2&action=$3",
        "PATH" => "/bitrix/services/main/ajax.php",
    ],
];

Тогда запрос будет выглядеть понятнее:

function sendFeedback(form) {
    const route = "/api/rest-component/machaon/feedback/send/";
    const data = $(form).serialize();
    $.post(route, data, function (response) {
        console.log(response);
    });
}

Нюансы

Если в configureActions() оставить пустой массив prefilters, то метод-действие будет работать без фильтров.

Но если не указывать ключ prefilters, то будут применены фильтры по умолчанию — ActionFilterAuthentication и ActionFilterCsrf.

public function configureActions(): array
{
    return [
        'send' => [
            'prefilters' => [] // метод sendAction() будет работать без фильтров
        ]
    ];
}
public function configureActions(): array
{
    return [
        'send' => []  // метод sendAction() будет работать у авторизованных пользователей, которые передали CSRF-токен
    ];
}

Пример ошибки когда пользователь не авторизован и не передал токен:

{
  "status": "error",
  "data": null,
  "errors": [
    {
      "message": "Необходимо авторизоваться на сайте",
      "code": "invalid_authentication",
      "customData": null
    },
    {
      "message": "Invalid csrf token",
      "code": "invalid_csrf",
      "customData": {
        "csrf": "dc8adda3ac983217623cf1196dfc5c61"
      }
    }
  ]
}

Если требуется CSRF-защита, то для фильтра BitrixMainEngineActionFilterCsrf нужно передать идентификатор сессии в параметре sessid.

На бэкенде его можно получить функцией bitrix_sessid(), на фронтенде — BX.bitrix_sessid().

При использовании BX.ajax.runComponentAction() сессия передается автоматически.

Другие фильтры можно посмотреть в документации

Долго разбирался с данной проблемой у себя
вот в этой строчке

$storage = new OAuth2StorageMemory(array('user_credentials' => $users));

используется класс Memory который, как оказалось работает с типом базы данных, который отличался от моего. Я использовал MySQL а для него вместо Memory нужно использовать PDO

$storage = new OAuth2StoragePDO(...);

Классы Memory и PDO отличаются друг от друга, даже во входных данных, я думаю вам нужно начать с изучения класса, который сопоставим с типом вашей базы данных.

$server->handleTokenRequest(OAuth2Request::createFromGlobals())->send();

вот эта строка должна вызывается при выполнении запроса GET, т.е вы должны сделать запрос на получение токена куда должны входить входные параметры: client_id, client_secret, username, userpass. Уберите его в отдельный файл как сказано в документации (token.php)

В вашем случае верхние строки как бы отрабатывается, но $server->handleTokenRequest ждет параметры и так как он не находит client_id в запросе он выдает ошибку

Хочу поделиться опытом использования Битрикс24 REST API для экспорта контактов из 1С УТ 11

Первым делом регистрирую свое приложение в Битрикс24. Это нужно для получения client_id и client_secret.  Эти коды используются при авторизации.

Необходимо дать приложению требуемые права и поставить отметку «Приложение использует только API»

Ссылка на приложение может быть любая, в дальнейшем это не нужно.

Теперь подключаемся к Битрикс24

Процедура ПодключитьсяКБитрикс()

Если НЕ (AccessToken = "" ИЛИ RefreshToken = "" ИЛИ RefreshTime = Дата(1, 1, 1)) Тогда

Возврат;

КонецЕсли;


ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(
СпособВыбораСертификатаWindows.Выбирать),
Новый СертификатыУдостоверяющихЦентровWindows());

Соединение = Новый HTTPСоединение(
АдресБитрикс24, //"хххххх.bitrix24.ru",
, // порт
"user@mail.ru", // пользователь
"123456", // пароль
, // прокси
5, // таймаут в секундах
ssl // защищенное HTTPS соединение
);


Заголовки = Новый Соответствие;

Запрос = Новый HTTPЗапрос("oauth/authorize/?client_id=" + <strong>client_id</strong>, Заголовки);
Ответ = Соединение.Получить(Запрос);


// если нас переадрессовали
Если Ответ.КодСостояния = 302 Тогда

//в Location взять code

Параметры = ПолучитьПараметрыИзGetСтроки(Ответ.Заголовки.Получить("Location"));
Cookie = Ответ.Заголовки.Получить("Set-Cookie");
Код = Неопределено;


Если Параметры.Свойство("code", Код) Тогда

// используя Код получаем access_token и refresh_token

Соединение = Новый HTTPСоединение(
"oauth.bitrix.info",
, // порт
, // пользователь
, // пароль
, // прокси
5, // таймаут в секундах
ssl // защищенное HTTPS соединение
);

Запрос.АдресРесурса = "oauth/token" + ПараметрыАвторизацииВСтроке(Код);
Запрос.Заголовки.Вставить("Cookie", Cookie);


Ответ = Соединение.Получить(Запрос);


Если Ответ.КодСостояния <> 200 Тогда

ВызватьИсключение "Ошибка при получении access_token";

Иначе

// разобрать полученный json
json = Ответ.ПолучитьТелоКакСтроку();


Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(json);
ОтветСтруктура = ПрочитатьJSON(Чтение);

// сохраняю параметры подключения
AccessToken  = ОтветСтруктура.access_token;
RefreshToken = ОтветСтруктура.refresh_token;
RefreshTime  = ТекущаяДата() + ОтветСтруктура.expires_in;


КонецЕсли;



Иначе

ВызватьИсключение "Ошибка при подключении, нет параметра code";

КонецЕсли;


КонецЕсли;

КонецПроцедуры

Функция ПараметрыАвторизацииВСтроке(Код)

// собрать параметры в строку Get запроса
Возврат "/?" + "grant_type=authorization_code" + "&" +
"client_id=" + client_id + "&" +
"client_secret=" + client_secret + "&" +
"code=" + Код;

КонецФункции

client_id и client_secret получили при регистрации приложения в Битрикс24.

Функция «ПолучитьПараметрыИзGetСтроки» из строки вида адрес?параметр1=значение1&параметр2=значение2 возвращает структуру, где ключ = параметр, а значение = значение

Теперь пробуем добавить контакт

СтрПараметров =  "fields[NAME]=" + Имя + "&fields[SECOND_NAME]=" + Отчество + "&fields[LAST_NAME]=" + Фамилия +
"&fields[ADDRESS_CITY]=" + СтруктураПараметров.Город +
"&fields[COMMENTS]=" + СтруктураПараметров.Вашвиддеятельности +
"&fields[EMAIL][0][VALUE_TYPE]=WORK&fields[EMAIL][0][VALUE]=" + СтруктураПараметров.Email +
"&fields[ASSIGNED_BY_ID]=" +  ОтветственныйИД + "&fields[TYPE_ID]=CLIENT" +
"&fields[PHONE][0][VALUE_TYPE]=WORK&fields[PHONE][0][VALUE]=" + СтруктураПараметров.Телефон;


Рез = ОтправитьRESTЗапрос("crm.contact.add", СтрПараметров, "");

// смотрим что получилось

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Рез);

РезСтр = ПрочитатьJSON(Чтение);

Если РезСтр.Свойство("result", ИдНовогоКонтакта)  Тогда

Сообщить("Контакт добавлен!");

Иначе

ВызватьИсключение "Ошибка при добавлении нового контакта!";

КонецЕсли;

Что делает ОтправитьRESTЗапрос:

Функция ОтправитьRESTЗапрос(RESTЗапрос, Параметры, Тело)

ПроверитьТокен();


ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(
СпособВыбораСертификатаWindows.Выбирать),
Новый СертификатыУдостоверяющихЦентровWindows());

Соединение = Новый HTTPСоединение(
АдресБитрикс24,
, // порт
, // пользователь
, // пароль
, // прокси
5, // таймаут в секундах
ssl // защищенное HTTPS соединение
);

Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", Cookie);



Если Параметры = "" Тогда
Запрос = Новый HTTPЗапрос("rest/" + RESTЗапрос + "?auth=" + AccessToken, Заголовки);
Иначе
Запрос = Новый HTTPЗапрос("rest/" + RESTЗапрос + "?auth=" + AccessToken + "&" + Параметры, Заголовки);
КонецЕсли;

Запрос.УстановитьТелоИзСтроки(тело);



Ответ = Соединение.Получить(Запрос);

Возврат Ответ.ПолучитьТелоКакСтроку();

КонецФункции

Ну и соответственно  процедура ПроверитьТокен:

Процедура ПроверитьТокен()

// проверяю токен на валидность

Если RefreshTime = Дата(1, 1, 1) Тогда

ПодключитьсяКБитрикс();
Возврат;

КонецЕсли;

Если  RefreshTime - 5 < ТекущаяДата() Тогда

ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(
СпособВыбораСертификатаWindows.Выбирать),
Новый СертификатыУдостоверяющихЦентровWindows());
// обновить токен
Соединение = Новый HTTPСоединение(
"oauth.bitrix.info",
, // порт
, // пользователь
, // пароль
, // прокси
5, // таймаут в секундах
ssl // защищенное HTTPS соединение
);


Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", Cookie);

Запрос = Новый HTTPЗапрос("oauth/token" + ПараметрыОбновленияВСтроке(), Заголовки);




Ответ = Соединение.Получить(Запрос);


Если Ответ.КодСостояния <> 200 Тогда

ВызватьИсключение "Ошибка при получении access_token";

Иначе

// разобрать полученный json
json = Ответ.ПолучитьТелоКакСтроку();

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(json);
ОтветСтруктура = ПрочитатьJSON(Чтение);


// сохраняю параметры подключения
AccessToken  = ОтветСтруктура.access_token;
RefreshToken = ОтветСтруктура.refresh_token;
RefreshTime  = ТекущаяДата() + ОтветСтруктура.expires_in;

КонецЕсли;


КонецЕсли;

КонецПроцедуры


Функция ПараметрыОбновленияВСтроке()

Возврат "/?" + "grant_type=refresh_token" + "&" +
"client_id=" + client_id + "&" +
"client_secret=" + client_secret + "&" +
"refresh_token=" + RefreshToken;

КонецФункции

Что пока не удалось сделать. Пока не удалось передавать пользовательские поля. И при создании контакта ответственным ставится пользователь, под которым залогинились. А не тот, которого указываю в fields[ASSIGNED_BY_ID].

Вопросы и ответы

Перейти на Tilda.cc
Перейти в Справочный центр

RU

Русский

English
Deutch
French
Italian
Japanese
Polish
Portuguese
Spanish

Вопросы и ответы
Ошибки

Ошибка в заявках: «Bitrix24 error — expired_token» или «Re-authorized application, please (invalid_request)». Почему?

Данная проблема возникает, если 30 дней Битрикс24 не принимал никаких заявок.

Перейдите в «Настройки сайта» → «Формы» → «Bitrix24» → нажмите «Настройки» → нажмите «Подключить».

Похожие вопросы

  • Ошибка в заявках: «Error: sberbank: Доступ запрещён». Что делать?
  • Ошибка: «ERROR:The Tilda is configured for another domain»
  • Появляется ошибка: «Temporary CDN error. Please try again later.» Почему?
  • При передаче проекта ошибка: «У пользователя, которому вы хотите передать проект, бесплатный план или пробный период тарифа Personal. Он не может принять ваш запрос. Ему необходимо оплатить подписку»
  • Функция «Google безопасный просмотр» обнаружила попытка фишинга

Этот ответ был вам полезен?

Да

0

Нет

0

Просмотры: 7304

← К списку вопросов

Добрый день!
Нашел следующий код для получения токена от Битрикс24

public function getAccessToken() {
 
$access_token = false;

/* Авторизуемся на портале */
 $this->curl_b24("https://{$this->bitrix24domen}/crm/configs/import/lead.php?LOGIN=". urlencode($this->bitrix24login) . "&PASSWORD=" . urlencode($this->bitrix24password));
						
$auth_url = $this->curl_b24("https://{$this->bitrix24domen}/oauth/authorize/?client_id=" . $this->client_id . "&response_type=code&redirect_uri=" . $this->url . "/system/library/bitrix24.php", true);
				
		if (preg_match("/?(.*?)$/i", $auth_url, $arRes)) {
			parse_str($arRes[1]);
			if (isset($code) && $code != "") {
				$res = json_decode($this->curl_b24("https://oauth.bitrix.info/oauth/token/?grant_type=authorization_code&client_id={$this->client_id}&client_secret={$this->client_secret}&code={$code}"));
				if ($res->access_token != "") {
					$access_token = $res->access_token;
					
					return $access_token;
				} else {
					$this->getAccessToken();
				}
			} 
		}
}

Но при таком подключении создается пустой лид. Если закомментировать строку

$this->curl_b24("https://{$this->bitrix24domen}/crm/configs/import/lead.php?LOGIN=". urlencode($this->bitrix24login) . "&PASSWORD=" . urlencode($this->bitrix24password));

Тогда code не приходит.

Может кто сталкивался с подобной проблемой, как ее можно решить?

После заполнения настроек необходимо создать настройку подключения к Битрикс24. Для каждого портала может быть только одна настройка подключения в разделе Битрикс24 > Настройки подключения.

подключение1

По кнопке Создать подключение к Битрикс24 открывается окно создания новой настройки.

подключение_2.png

В поле «Название настройки» вводится имя настройки, которое отображается в списке настроек подключения, и так называется блок настройки подключения в разделе Битрикс24 «1С + CRM Битрикс24».

Авторизация на портале происходит через токен. Токен можно получить у приложения Битрикс24, находящегося в разделе Автоматизация — 1С + CRM Битрикс24.

01.jpg

Требуемый блок «Коннектор к 1С». Если такого блока нет, то можно установить приложение Битрикс24 из маркета. Оно называется «Коннектор к 1С».

После установки приложения у блока меняется цвет.

При нажатии на блок выводится страница с кратким руководством. В пункте 3 показан ключ авторизации к Битрикс24, скопируйте его.

подключение5

Этот ключ необходимо указать в настройке подключения 1С. При указании токена происходит обращение к Битрикс24, автоматически получая адрес до портала и купленный тарифный план.

Идентификатор подключения – это специальный идентификатор, в разрезе которого хранятся настройки в Битрикс24.

Если необходима возможность звонить из 1С, используя Битрикс24 – необходимо установить соответствующий флаг в настройках. Если необходима возможность экспортировать отчеты и печатные формы в живую ленту битрикс24 — необходимо установить соответствующий флаг в настройках.

Когда данные синхронизируются, то по умолчанию всегда обновляется дело Битрикс24, которое связывает данные обоих систем. Обновление дела происходит через rest запрос из 1С в Битрикс24. Это немного замедляет работу 1С и Битрикс24. Если не критично обновление дел, то флаг лучше установить.

Также есть возможность оповещать пользователей Битрикс24 об ошибках взаимодействия между системами. Если происходит ошибка – в мессенджере Битркис24 будет создан чат с информацией об ошибке. Чтобы включить эту возможность, необходимо установить флаг «Оповещать пользователей Битркис24» и указать, каким пользователям будет приходить информация. Если список пользователей пуст, то необходимо подгрузить пользователей Битркис24.

Если настройка подключения создана и в ней указан корректный токен, то при сохранении настройки подключения в Битрикс24 в разделе «1С + CRM Битрикс24» появляется блок настройки 1С. Имя блока такое же, как название подключения в 1С.

подключение6

У блока настроек может быть как желтый фон, так и белый. Если желтый, значит соединение для взаимодействия в режиме реального времени установлено. Если белый, то нет.

При нажатии на блок настроек отображается слайдер с информацией о базе 1С.

подключение7

Спасибо, помогло!

Спасибо :)


Это не то, что я ищу


Написано очень сложно и непонятно


Есть устаревшая информация


Слишком коротко, мне не хватает информации


Мне не нравится, как это работает

ГлавнаяФорумОшибка с обновлением токена по пользователю в Битрикс24 в установленном приложении Пинол

Важно! На нашем форуме собраны тысячи вопросов и ответов (с 2015 года). Но часть из них может оказаться не актуальными с позиции сегодняшнего дня. Если у вас нет времени искать нужный ответ и проверять его актуальность, то просто оставьте ваши координаты, мы с вами свяжемся и поможем в решении вопроса.


[ Закрыто ] Ошибка с обновлением токена по пользователю в Битрикс24 в установленном приложении Пинол, Не открывается приложение в Битрикс24

 

При попытке открыть приложение в Битрикс24 выходит вот такая ошибка:

Вопросы и ответы

Перейти на Tilda.cc
Перейти в Справочный центр

RU

Русский

English
Deutch
French
Italian
Japanese
Polish
Portuguese
Spanish

Вопросы и ответы
Ошибки

Ошибка в заявках: «Bitrix24 error — expired_token» или «Re-authorized application, please (invalid_request)». Почему?

Данная проблема возникает, если 30 дней Битрикс24 не принимал никаких заявок.

Перейдите в «Настройки сайта» → «Формы» → «Bitrix24» → нажмите «Настройки» → нажмите «Подключить».

Похожие вопросы

  • Ошибка в заявках: «Error: sberbank: Доступ запрещён». Что делать?
  • Ошибка: «ERROR:The Tilda is configured for another domain»
  • Появляется ошибка: «Temporary CDN error. Please try again later.» Почему?
  • При передаче проекта ошибка: «У пользователя, которому вы хотите передать проект, бесплатный план или пробный период тарифа Personal. Он не может принять ваш запрос. Ему необходимо оплатить подписку»
  • Функция «Google безопасный просмотр» обнаружила попытка фишинга

Этот ответ был вам полезен?

Да

0

Нет

0

Просмотры: 7304

← К списку вопросов

Добрый день!
Нашел следующий код для получения токена от Битрикс24

public function getAccessToken() {
 
$access_token = false;

/* Авторизуемся на портале */
 $this->curl_b24("https://{$this->bitrix24domen}/crm/configs/import/lead.php?LOGIN=". urlencode($this->bitrix24login) . "&PASSWORD=" . urlencode($this->bitrix24password));
						
$auth_url = $this->curl_b24("https://{$this->bitrix24domen}/oauth/authorize/?client_id=" . $this->client_id . "&response_type=code&redirect_uri=" . $this->url . "/system/library/bitrix24.php", true);
				
		if (preg_match("/?(.*?)$/i", $auth_url, $arRes)) {
			parse_str($arRes[1]);
			if (isset($code) && $code != "") {
				$res = json_decode($this->curl_b24("https://oauth.bitrix.info/oauth/token/?grant_type=authorization_code&client_id={$this->client_id}&client_secret={$this->client_secret}&code={$code}"));
				if ($res->access_token != "") {
					$access_token = $res->access_token;
					
					return $access_token;
				} else {
					$this->getAccessToken();
				}
			} 
		}
}

Но при таком подключении создается пустой лид. Если закомментировать строку

$this->curl_b24("https://{$this->bitrix24domen}/crm/configs/import/lead.php?LOGIN=". urlencode($this->bitrix24login) . "&PASSWORD=" . urlencode($this->bitrix24password));

Тогда code не приходит.

Может кто сталкивался с подобной проблемой, как ее можно решить?

После заполнения настроек необходимо создать настройку подключения к Битрикс24. Для каждого портала может быть только одна настройка подключения в разделе Битрикс24 > Настройки подключения.

подключение1

По кнопке Создать подключение к Битрикс24 открывается окно создания новой настройки.

подключение_2.png

В поле «Название настройки» вводится имя настройки, которое отображается в списке настроек подключения, и так называется блок настройки подключения в разделе Битрикс24 «1С + CRM Битрикс24».

Авторизация на портале происходит через токен. Токен можно получить у приложения Битрикс24, находящегося в разделе Автоматизация — 1С + CRM Битрикс24.

01.jpg

Требуемый блок «Коннектор к 1С». Если такого блока нет, то можно установить приложение Битрикс24 из маркета. Оно называется «Коннектор к 1С».

После установки приложения у блока меняется цвет.

При нажатии на блок выводится страница с кратким руководством. В пункте 3 показан ключ авторизации к Битрикс24, скопируйте его.

подключение5

Этот ключ необходимо указать в настройке подключения 1С. При указании токена происходит обращение к Битрикс24, автоматически получая адрес до портала и купленный тарифный план.

Идентификатор подключения – это специальный идентификатор, в разрезе которого хранятся настройки в Битрикс24.

Если необходима возможность звонить из 1С, используя Битрикс24 – необходимо установить соответствующий флаг в настройках. Если необходима возможность экспортировать отчеты и печатные формы в живую ленту битрикс24 — необходимо установить соответствующий флаг в настройках.

Когда данные синхронизируются, то по умолчанию всегда обновляется дело Битрикс24, которое связывает данные обоих систем. Обновление дела происходит через rest запрос из 1С в Битрикс24. Это немного замедляет работу 1С и Битрикс24. Если не критично обновление дел, то флаг лучше установить.

Также есть возможность оповещать пользователей Битрикс24 об ошибках взаимодействия между системами. Если происходит ошибка – в мессенджере Битркис24 будет создан чат с информацией об ошибке. Чтобы включить эту возможность, необходимо установить флаг «Оповещать пользователей Битркис24» и указать, каким пользователям будет приходить информация. Если список пользователей пуст, то необходимо подгрузить пользователей Битркис24.

Если настройка подключения создана и в ней указан корректный токен, то при сохранении настройки подключения в Битрикс24 в разделе «1С + CRM Битрикс24» появляется блок настройки 1С. Имя блока такое же, как название подключения в 1С.

подключение6

У блока настроек может быть как желтый фон, так и белый. Если желтый, значит соединение для взаимодействия в режиме реального времени установлено. Если белый, то нет.

При нажатии на блок настроек отображается слайдер с информацией о базе 1С.

подключение7

Спасибо, помогло!

Спасибо :)


Это не то, что я ищу


Написано очень сложно и непонятно


Есть устаревшая информация


Слишком коротко, мне не хватает информации


Мне не нравится, как это работает

ГлавнаяФорумОшибка с обновлением токена по пользователю в Битрикс24 в установленном приложении Пинол

Важно! На нашем форуме собраны тысячи вопросов и ответов (с 2015 года). Но часть из них может оказаться не актуальными с позиции сегодняшнего дня. Если у вас нет времени искать нужный ответ и проверять его актуальность, то просто оставьте ваши координаты, мы с вами свяжемся и поможем в решении вопроса.


[ Закрыто ] Ошибка с обновлением токена по пользователю в Битрикс24 в установленном приложении Пинол, Не открывается приложение в Битрикс24

 

При попытке открыть приложение в Битрикс24 выходит вот такая ошибка:

 

Алексей Окара

Администратор

Сообщений: 7349
Баллов: 9349
Регистрация: 22.06.2015

Учредитель Пинол

 

Алексей, добрый день!

ID нашего портала —

https://smartum.bitrix24.ru/

 

Алексей Окара

Администратор

Сообщений: 7349
Баллов: 9349
Регистрация: 22.06.2015

Учредитель Пинол

#4

0

08.06.2018 12:28:26

Сергей Калинин, так я не про портал. его то я знаю.

Я про учетку пользователя у которого токен прокис и учетка висит с ошибкой в приложении.

Цитата
Алексей Окара написал:
На каких ID у Вас идет ошибка? Пример ID вот так https://spartant.bitrix24.ru/company/personal/user/1/

Мне так нужно уточнить.  

Пинкит-сервис обмена данными:
https://pinkit.io/#block2011
Получите бесплатную консультацию онлайн:
https://pinall.ru/lp/pinall-10-let-na-rynke-avtomatizatsiya-biznesa/#block3750
Наш YouTube канал:
https://www.youtube.com/pinall

Получить бесплатную консультацию
 

 

Алексей Окара

Администратор

Сообщений: 7349
Баллов: 9349
Регистрация: 22.06.2015

Учредитель Пинол

Сергей Калинин, принято, смотрим токены по ней.

 

Алексей Окара

Администратор

Сообщений: 7349
Баллов: 9349
Регистрация: 22.06.2015

Учредитель Пинол

Сергей Калинин, здравствуйте.

Прошу проверить — поправили ситуацию по токенам. Если критическая будет оставаться, то прошу переустановить решение.

 

Добрый день!

Приложение загрузилось, но вот сервис не коннектится к Юнисендеру, скрин ниже

 

Алексей Окара

Администратор

Сообщений: 7349
Баллов: 9349
Регистрация: 22.06.2015

Учредитель Пинол

#9

0

14.06.2018 14:50:42

Цитата
Сергей Калинин написал:
но вот сервис не коннектится к Юнисендеру, скрин ниже

Сергей Калинин, здравствуйте.

Утверждение, что на основе этого скрина у Вас приложение не коннектится к Юнисендер неправильное, потому что вывод тарифа из ЛК Юнисендер это один из примерно 50 методов которыми наше приложение обменивается между Битриксом и Юнисендер.

У меня например погрузился тариф

http://joxi.ru/EA41PK9twwLG3r

Можете и сами тоже проверить, зайти в Хром и обновить еще раз страницу.

Попробуйте сделать тестовую рассылку под нашим

системным

шаблоном, что мы передали в интеграцию для тестирования всеми клиентами.

Полный плейлист как делать рассылки у нас выложен на канале.

Пинкит-сервис обмена данными:
https://pinkit.io/#block2011
Получите бесплатную консультацию онлайн:
https://pinall.ru/lp/pinall-10-let-na-rynke-avtomatizatsiya-biznesa/#block3750
Наш YouTube канал:
https://www.youtube.com/pinall

Получить бесплатную консультацию
 

 

Сергей Калинин

Пользователь

Сообщений: 6
Регистрация: 06.06.2018

#10

1

14.06.2018 15:15:24

Тариф не подгружается, после обновления страницы, приложение опять просит ввести API ключ, т.е. открывается страница с регистрацией. После ввода ключа, тариф снова не подгружается. Написал в юнисендер, что бы сгенерировали новый API ключ, может быть в этом проблема. Если нужно, могу выложить API ключ сюда, проверите сами.

Получить бесплатную консультацию
 

Поможем с поиском решения

Понравилась статья? Поделить с друзьями:
  • Ошибка при получении токена oauth
  • Ошибка при получении токена error request timeout error
  • Ошибка при получении субъектов отчетности
  • Ошибка при получении ссылки на точку навигации
  • Ошибка при получении сертификата эцп