Amocrm unauthorized код ошибки 401

Справочник ошибок и ответов API

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

Ошибки при валидации данных

Если переданные данные не совпадают с теми, что доступны для сущности, запрос вернет HTTP-код 400 Bad Request и массив с параметрами, которые не подошли под условия.

Пример ошибки валидации данных


{
    "validation-errors": [
        {
            "request_id": "0",
            "errors": [
                {
                    "code": "NotSupportedChoice",
                    "path": "custom_fields_values.0.field_id",
                    "detail": "The value you selected is not a valid choice."
                }
            ]
        }
    ],
    "title": "Bad Request",
    "type": "https://httpstatus.es/400",
    "status": 400,
    "detail": "Request validation failed"
}

Ответы при авторизации

Подробнее об авторизации читайте здесь

Код HTTP код Описание
110 401 Unauthorized Общая ошибка авторизации. Неправильный логин или пароль.
111 401 Unauthorized Возникает после нескольких неудачных попыток авторизации. В этом случае нужно авторизоваться в аккаунте через браузер, введя код капчи.
112 401 Unauthorized Возникает, когда пользователь выключен в настройках аккаунта “Пользователи и права” или не состоит в аккаунте.
113 403 Forbidden Доступ к данному аккаунту запрещён с Вашего IP адреса. Возникает, когда в настройках безопасности аккаунта включена фильтрация доступа к API по “белому списку IP адресов”.
101 401 Unauthorized Возникает в случае запроса к несуществующему аккаунту (субдомену).

Ответы при работе с контактами

Подробнее о работе с контактами читайте здесь

Код Описание
202 Добавление контактов: нет прав
203 Добавление контактов: системная ошибка при работе с дополнительными полями
205 Добавление контактов: контакт не создан
212 Обновление контактов: контакт не обновлён
219 Список контактов: ошибка поиска, повторите запрос позднее
330 Добавление/Обновление контактов: количество привязанных сделок слишком большое

Ответы при работе со сделками

Подробнее о работе со сделками читайте здесь

Код Описание
330 Добавление/Обновление сделок: количество привязанных контактов слишком большое

Ответы при работе с событиями

Подробнее о работе с событиями читайте здесь

Код Описание
244 Добавление событий: недостаточно прав для добавления события
225 Обновление событий: события не найдены

Ответы при работе с задачами

Подробнее о работе с задачами читайте здесь

Код Описание
231 Обновление задач: задачи не найдены
233 Добавление событий: по данному ID элемента не найдены некоторые контакты
234 Добавление событий: по данному ID элемента не найдены некоторые сделки
235 Добавление задач: не указан тип элемента
236 Добавление задач: по данному ID элемента не найдены некоторые контакты
237 Добавление задач: по данному ID элемента не найдены некоторые сделки
244 Добавление сделок: нет прав.

Ответы при работе со списками

Подробнее о работе со списками читайте здесь

Код Описание
244 Добавление/Обновление/Удаление каталогов: нет прав.
281 Каталог не удален: внутренняя ошибка
282 Каталог не найден в аккаунте.

Ответы при работе с элементами каталога

Подробнее о работе с элементами каталога читайте здесь

Код Описание
203 Добавление/Обновление элементов каталога: системная ошибка при работе с дополнительными полями
204 Добавление/Обновление элементов каталога: дополнительное поле не найдено
244 Добавление/Обновление/Удаление элементов каталога: нет прав.
280 Добавление элементов каталога: элемент создан.
282 Элемент не найден в аккаунте.

Ответы при работе с покупателями

Подробнее о работе с покупателями читайте здесь

Код Описание
288 Недостаточно прав. Доступ запрещен.
402 Необходимо оплатить функционал
425 Функционал недоступен
426 Функционал выключен

Другие ответы

Ошибки и ответы, не относящиеся к какому-либо конкретному разделу

Код Описание Примечание
400 Неверная структура массива передаваемых данных, либо не верные идентификаторы кастомных полей  
422 Входящие данные не мог быть обработаны.  
405 Запрашиваемый HTTP-метод не поддерживается  
402 Подписка закончилась Вместе с этим ответом отдаётся HTTP код №402 “Payment Required”
403 Аккаунт заблокирован, за неоднократное превышение количества запросов в секунду Вместе с этим ответом отдаётся HTTP код №403
429 Превышено допустимое количество запросов в секунду Вместе с этим ответом отдаётся HTTP код №429
2002 По вашему запросу ничего не найдено Вместе с этим ответом отдаётся HTTP код №204 “No Content”

Появление сообщения об ошибке 401 Unauthorized Error («отказ в доступе») при открытии страницы сайта означает неверную авторизацию или аутентификацию пользователя на стороне сервера при обращении к определенному url-адресу. Чаще всего она возникает при ошибочном вводе имени и/или пароля посетителем ресурса при входе в свой аккаунт. Другой причиной являются неправильные настройки, допущенные при администрировании web-ресурса. Данная ошибка отображается в браузере в виде отдельной страницы с соответствующим описанием. Некоторые разработчики интернет-ресурсов, в особенности крупных порталов, вводят собственную дополнительную кодировку данного сбоя:

  • 401 Unauthorized;
  • Authorization Required;
  • HTTP Error 401 – Ошибка авторизации.

Попробуем разобраться с наиболее распространенными причинами возникновения данной ошибки кода HTTP-соединения и обсудим способы их решения.

При доступе к некоторым сайтам (или отдельным страницам этих сайтов), посетитель должен пройти определенные этапы получения прав:

  1. Идентификация – получение вашей учетной записи («identity») по username/login или email.
  2. Аутентификация («authentic») – проверка того, что вы знаете пароль от этой учетной записи.
  3. Авторизация – проверка вашей роли (статуса) в системе и решение о предоставлении доступа к запрошенной странице или ресурсу на определенных условиях.

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

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

  1. Проверьте в адресной строке правильность написания URL. Особенно это касается перехода на подстраницы сайта, требующие авторизации. Введите правильный адрес. Если переход на страницу осуществлялся после входа в аккаунт, разлогинитесь, вернитесь на главную страницу и произведите повторный вход с правильными учетными данными.
  2. При осуществлении входа с сохраненными данными пользователя и появлении ошибки сервера 401 проверьте их корректность в соответствующих настройках данного браузера. Возможно, авторизационные данные были вами изменены в другом браузере. Также можно очистить кэш, удалить cookies и повторить попытку входа. При удалении истории браузера или очистке кэша потребуется ручное введение логина и пароля для получения доступа. Если вы не помните пароль, пройдите процедуру восстановления, следуя инструкциям.
  3. Если вы считаете, что вводите правильные регистрационные данные, но не можете получить доступ к сайту, обратитесь к администратору ресурса. В этом случае лучше всего сделать скриншот проблемной страницы.
  4. Иногда блокировка происходит на стороне провайдера, что тоже приводит к отказу в доступе и появлению сообщения с кодировкой 401. Для проверки можно попробовать авторизоваться на том же ресурсе с альтернативного ip-адреса (например, используя VPN). При подтверждении блокировки трафика свяжитесь с провайдером и следуйте его инструкциям.

Некоторые крупные интернет-ресурсы с большим количеством подписчиков используют дополнительные настройки для обеспечения безопасности доступа. К примеру, ваш аккаунт может быть заблокирован при многократных попытках неудачной авторизации. Слишком частые попытки законнектиться могут быть восприняты как действия бота. В этом случае вы увидите соответствующее сообщение, но можете быть просто переадресованы на страницу с кодом 401. Свяжитесь с администратором сайта и решите проблему.

Иногда простая перезагрузка проблемной страницы, выход из текущей сессии или использование другого веб-браузера полностью решают проблему с 401 ошибкой авторизации.

Ошибка 401 - отказ в доступе

Устранение ошибки 401 администратором веб-ресурса 

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

  • Обращение в службу поддержки хостинга сайта. Как и в случае возникновения проблем с провайдером, лучше всего подробно описать последовательность действий, приведших к появлению ошибки 401, приложить скриншот.
  • При отсутствии проблем на стороне хостинг-провайдера можно внести следующие изменения в настройки сайта с помощью строки Disallow:/адрес проблемной страницы. Запретить индексацию страницам с ошибкой в «rоbоts.txt», после чего добавить в файл «.htассеss» строку такого типа:
Redirect 301 /oldpage.html http://site.com/newpage.html.

Где в поле /oldpage.html прописывается адрес проблемной страницы, а в http://site.com/newpage.html адрес страницы авторизации.

Таким образом вы перенаправите пользователей со всех страниц, которые выдают ошибку 401, на страницу начальной авторизации.

  • Если после выполнения предыдущих рекомендаций пользователи при попытках авторизации все равно видят ошибку 401, то найдите на сервере файл «php.ini» и увеличьте время жизни сессии, изменив значения следующих параметров: «session.gc_maxlifetime» и «session.cookie_lifetime» на 1440 и 0 соответственно.
  • Разработчики веб-ресурсов могут использовать более сложные методы авторизации и аутентификации доступа для создания дополнительной защиты по протоколу HTTP. Если устранить сбой простыми методами администрирования не удается, следует обратиться к специалистам, создававшим сайт, для внесения соответствующих изменений в код.

Хотя ошибка 401 и является проблемой на стороне клиента, ошибка пользователя на стороне сервера может привести к ложному требованию входа в систему. К примеру, сетевой администратор разрешит аутентификацию входа в систему всем пользователям, даже если это не требуется. В таком случае сообщение о несанкционированном доступе будет отображаться для всех, кто посещает сайт. Баг устраняется внесением соответствующих изменений в настройки.

Дополнительная информация об ошибке с кодом 401

Веб-серверы под управлением Microsoft IIS могут предоставить дополнительные данные об ошибке 401 Unauthorized в виде второго ряда цифр:

  • 401, 1 – войти не удалось;
  • 401, 2 – ошибка входа в систему из-за конфигурации сервера;
  • 401, 3 – несанкционированный доступ из-за ACL на ресурс;
  • 401, 501 – доступ запрещен: слишком много запросов с одного и того же клиентского IP; ограничение динамического IP-адреса – достигнут предел одновременных запросов и т.д.

Более подробную информацию об ошибке сервера 401 при использовании обычной проверки подлинности для подключения к веб-узлу, который размещен в службе MS IIS, смотрите здесь. 

Следующие сообщения также являются ошибками на стороне клиента и относятся к 401 ошибке:

  • 400 Bad Request; 
  • 403 Forbidden; 
  • 404 Not Found;
  • 408 Request Timeout.

Как видим, появление ошибки авторизации 401 Unauthorized не является критичным для рядового посетителя сайта и чаще всего устраняется самыми простыми способами. В более сложной ситуации оказываются администраторы и владельцы интернет-ресурсов, но и они в 100% случаев разберутся с данным багом путем изменения настроек или корректировки html-кода с привлечением разработчика сайта. 

Всем привет сегодня я вам покажу готовые скрипты которые я использую для передачи значений из формы обратной связи в amoCRM через API данного сервиса. Мы рассмотрим скрипт для создания сделок с прязкой контактов.

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

Для того чтобы подключить ваш проект к amoCRM нужно сделать следующие действия:

1) Создать аккаунт на amoCRM

2) После этого переходим в Настройки и создаем новую интеграцию. Во время создания интеграции вам нужно указать адрес вашего сайта, предоставить все доступы для данной интеграции после чего сохранить.

3) После создания интеграции, переходим во вкладку «Ключи и доступы» — эти данные нам понадобятся для авторизации нашей интеграции. Мы не будем их использовать при каждом запросе, но переодически они нам будут нужны.

Внимание!!! Код авторизации обновляется каждые 20 мин, а значит если вы его скопируете за пару минут до обновления, вы можете не успеть сделать запрос и у вас выведется ошибка. Если у вас появилась ошибка связанная с авторизацией, то просто попробуйте заново копировать данные.

Теперь вам нужно создать PHP файл и в нем мы будем создавать подключение к нашей CRM системе.

Все примеры запросов есть в официальной документации CRM — https://www.amocrm.ru/developers/content/crm_platform/api-reference

Авторизация интеграции

Первый запрос нам нужно сделать на авторизацию созданной интеграции. Для своей задачи я использовал «Упрощённую систему авторизации» — https://www.amocrm.ru/developers/content/oauth/step-by-step#easy_auth

Для начала нам нужно выполнить запрос на авторизацию, код написан ниже. Для запроса я буду использовать библиотеку CURL.


$subdomain = 'test'; //Поддомен нужного аккаунта
$link = 'https://' . $subdomain . '.amocrm.ru/oauth2/access_token'; //Формируем URL для запроса

/* Соберем данные для запроса */
$data = [
	'client_id' => 'xxxx', // id нашей интеграции
	'client_secret' => 'xxxxxx', // секретный ключ нашей интеграции
	'grant_type' => 'authorization_code',
	'code' => 'xxxxxxx', // код авторизации нашей интеграции
	'redirect_uri' => 'https://domain.ru/test.php',// домен сайта нашей интеграции
];

/**
 * Нам необходимо инициировать запрос к серверу.
 * Воспользуемся библиотекой cURL (поставляется в составе PHP).
 * Вы также можете использовать и кроссплатформенную программу cURL, если вы не программируете на PHP.
 */
$curl = curl_init(); //Сохраняем дескриптор сеанса cURL
/** Устанавливаем необходимые опции для сеанса cURL  */
curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
curl_setopt($curl,CURLOPT_URL, $link);
curl_setopt($curl,CURLOPT_HTTPHEADER,['Content-Type:application/json']);
curl_setopt($curl,CURLOPT_HEADER, false);
curl_setopt($curl,CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl,CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);
$out = curl_exec($curl); //Инициируем запрос к API и сохраняем ответ в переменную
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
/** Теперь мы можем обработать ответ, полученный от сервера. Это пример. Вы можете обработать данные своим способом. */
$code = (int)$code;

// коды возможных ошибок
$errors = [
	400 => 'Bad request',
	401 => 'Unauthorized',
	403 => 'Forbidden',
	404 => 'Not found',
	500 => 'Internal server error',
	502 => 'Bad gateway',
	503 => 'Service unavailable',
];

try
{
	/** Если код ответа не успешный - возвращаем сообщение об ошибке  */
	if ($code < 200 || $code > 204) {
		throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undefined error', $code);
	}
}
catch(Exception $e)
{
	die('Ошибка: ' . $e->getMessage() . PHP_EOL . 'Код ошибки: ' . $e->getCode());
}

/**
 * Данные получаем в формате JSON, поэтому, для получения читаемых данных,
 * нам придётся перевести ответ в формат, понятный PHP
 */
$response = json_decode($out, true);

/* массив со всеми необходимыми данными, его вам нужно будет сохранить в файле или в БД, чтобы при каждом запросе получать токен */
$arrParamsAmo = [
	"access_token" => $response['access_token'],
	"refresh_token" => $response['refresh_token'],
	"token_type" => $response['token_type'],
	"expires_in" => $response['expires_in'],
	"endTokenTime" => $response['expires_in'] + time(),
];

$arrParamsAmo = json_encode($arrParamsAmo);

// выведем наши токены. Скопируйте их для дальнейшего использования
// access_token будет использоваться для каждого запроса как идентификатор интеграции
var_dump($arrParamsAmo);


Следующим запросом мы уже можем создавать наши контакты и сделки используя для авторизации наш токен.

Входные параметры

Для начала нужно подготовить массив с параметрами с удобным представлением. Для своей задачи я сделал следующий массив. Здесь перечислены основные переменные для запроса, у вас возможно будут свои данные, в дальнейшем вам просто нужно будет переделать функцию под себя.

Ключ CONTACT перечисляет данные для создания контакта. На последним этапе я делаю проверку, что если массив CONTACT пустой, то пользователь не создается, это сделано для форм в которых не указывается имя пользователя.

$arrContactParams = [
	// поля для сделки 
	"PRODUCT" => [
		"nameForm"	=> "Название формы",

		"nameProduct" 	=> "Название товара",
		"price"		=> "Цена",
		"descProduct"	=> "Описание заказа",

		"namePerson"	=> "Имя пользователя",
		"phonePerson"	=> "Телефон",
		"emailPerson"	=> "Email пользователя",
		"messagePerson"	=> "Сообщение от пользователя",
	],
	// поля для контакта 
	"CONTACT" => [
		"namePerson"	=> "Имя пользователя",
		"phonePerson"	=> "Телефон",
		"emailPerson"	=> "Email пользователя",
		"messagePerson"	=> "Сообщение от пользователя",
	]
];

Создание контакта

Типичная ошибка при создание контакта, это нарушение структуры массива для запроса, поэтому внимательно создавайте массив для запроса. Ранее созданный массив с данными полей, мы передаем в функцию amoAddContact, где создается специальный массив для запроса.

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

Каждое поле в запросе оборачивается в отдельный массив где id — это идентификатор поля, который вы можете получить следующим образом.


function amoAddContact($access_token, $arrContactParams) {


  $contacts['request']['contacts']['add'] = array(
  [
	'name' => $arrContactParams["CONTACT"]["namePerson"],
	'tags' => 'авто отправка',
	'custom_fields'	=> [
		// ИМЯ ПОЛЬЗОВАТЕЛЯ 
		[
			'id'	=> 518661,
			"values" => [
				[
					"value" => $arrContactParams["CONTACT"]["namePerson"],
				]
			]
		],
		// ТЕЛЕФОН
		[
			'id'	=> 518139,
			"values" => [
				[
					"value" => $arrContactParams["CONTACT"]["phonePerson"],
				]
					]
		],
		// EMAIL 
		[
			'id'	=> 518595,
			"values" => [
				[
					"value" => $arrContactParams["CONTACT"]["emailPerson"],
				]
			]
		],
		// СООБЩЕНИЕ
		[
			'id'	=> 532695,
			"values" => [
				[
					"value" => $arrContactParams["CONTACT"]["messagePerson"],
				]
			]
		]
	]
]
);


	/* Формируем заголовки */
	$headers = [
		"Accept: application/json",
		'Authorization: Bearer ' . $access_token
	];
	
	$link='https://test.amocrm.ru/private/api/v2/json/contacts/set';

	$curl = curl_init(); //Сохраняем дескриптор сеанса cURL
	/** Устанавливаем необходимые опции для сеанса cURL  */
	curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
	curl_setopt($curl,CURLOPT_URL, $link);
	curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'POST');
	curl_setopt($curl,CURLOPT_POSTFIELDS,json_encode($contacts));
	curl_setopt($curl,CURLOPT_HTTPHEADER, $headers);
	curl_setopt($curl,CURLOPT_HEADER, false);
	curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1);
	curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);
	$out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную
	$code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
	curl_close($curl);
	$Response=json_decode($out,true);
	$account=$Response['response']['account'];
	echo '<b>Данные о пользователе:</b>'; echo '<pre>'; print_r($Response); echo '</pre>';

	return $Response["response"]["contacts"]["add"]["0"]["id"];

}

Функция amoAddContact возвращает id созданного контакта, которого мы будем привязывать к новой сделки.

Добавляем сделку

Сделка добавляется аналогично, в функцию передается токен и массив с параметрами + передается третий параметр contactId в котором указывается id контакта для привязки.


function amoAddTask($access_token, $arrContactParams, $contactId = false) {


$arrTaskParams = [  
'add' => [
	0 => [
		'name'  => $arrContactParams["PRODUCT"]["nameForm"],
			'price'         => $arrContactParams["PRODUCT"]["price"],
			'pipeline_id'   => '9168',
			'tags'          => [
				'авто отправка',
				$arrContactParams["PRODUCT"]["nameForm"]
			],
			'status_id'     => '10937736',
			'custom_fields'	=> [
				/* ОПИСАНИЕ ЗАКАЗА */
				[
					'id'	=> 531865,
					"values" => [
						[
							"value" => $arrContactParams["PRODUCT"]["descProduct"],
						]
					]
				],
				/* ИМЯ ПОЛЬЗОВАТЕЛЯ */
				[
					'id'	=> 525741,
					"values" => [
						[
							"value" => $arrContactParams["PRODUCT"]["namePerson"],
						]
					]
				],
				/* ТЕЛЕФОН */
				[
					'id'	=> 525687,
					"values" => [
						[
							"value" => $arrContactParams["PRODUCT"]["phonePerson"],
						]
					]
				],
				/* EMAIL */
				[
					'id'	=> 525739,
					"values" => [
						[
							"value" => $arrContactParams["PRODUCT"]["emailPerson"],
						]
					]
				],
				/* СООБЩЕНИЕ */
				[
					'id'	=> 528257,
					"values" => [
						[
							"value" => $arrContactParams["PRODUCT"]["messagePerson"],
						]
					]
				],
			],

			'contacts_id' => [
				0 => $contactId,
			],
		],
	],
];


	$link = "https://test.amocrm.ru/api/v2/leads";

	$headers = [
        "Accept: application/json",
        'Authorization: Bearer ' . $access_token
	];

	$curl = curl_init();
	curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
	curl_setopt($curl, CURLOPT_USERAGENT, "amoCRM-API-client-
	undefined/2.0");
	curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
	curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($arrTaskParams));
	curl_setopt($curl, CURLOPT_URL, $link);
	curl_setopt($curl, CURLOPT_HEADER,false);
	curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__)."/cookie.txt");
	curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__)."/cookie.txt");
	$out = curl_exec($curl);
	curl_close($curl);
	$result = json_decode($out,TRUE);

}

Сложность работы с amoCRM в том что у них access_token действует только сутки, по истечению времени он становится не рабочим и для того чтобы получить новый токен access_token вам нужно сделать запрос, передав refresh_token и вы получите новый access_token и refresh_token.

Нужно эти данные где то записать, чтобы можно было их использовать вновь на следующий день.

Для этого я сделал специальную функцию которая будет проверять актуальность токена и делать новый запрос если это необходимо.

Значения токенов будут сохраняться в файле в JSON формате.

/* в эту функцию мы передаём текущий refresh_token */
function returnNewToken($token) {

	$link = 'https://test.amocrm.ru/oauth2/access_token'; //Формируем URL для запроса

	/** Соберем данные для запроса */
	$data = [
		'client_id' => 'xxxxx',
		'client_secret' => 'xxxxx',
		'grant_type' => 'refresh_token',
		'refresh_token' => $token,
		'redirect_uri' => 'https://test.ru/',
	];

	/**
	 * Нам необходимо инициировать запрос к серверу.
	 * Воспользуемся библиотекой cURL (поставляется в составе PHP).
	 * Вы также можете использовать и кроссплатформенную программу cURL, если вы не программируете на PHP.
	 */
	$curl = curl_init(); //Сохраняем дескриптор сеанса cURL
	/** Устанавливаем необходимые опции для сеанса cURL  */
	curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
	curl_setopt($curl,CURLOPT_URL, $link);
	curl_setopt($curl,CURLOPT_HTTPHEADER,['Content-Type:application/json']);
	curl_setopt($curl,CURLOPT_HEADER, false);
	curl_setopt($curl,CURLOPT_CUSTOMREQUEST, 'POST');
	curl_setopt($curl,CURLOPT_POSTFIELDS, json_encode($data));
	curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1);
	curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);
	$out = curl_exec($curl); //Инициируем запрос к API и сохраняем ответ в переменную
	$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
	curl_close($curl);
	/** Теперь мы можем обработать ответ, полученный от сервера. Это пример. Вы можете обработать данные своим способом. */
	$code = (int)$code;
	$errors = [
		400 => 'Bad request',
		401 => 'Unauthorized',
		403 => 'Forbidden',
		404 => 'Not found',
		500 => 'Internal server error',
		502 => 'Bad gateway',
		503 => 'Service unavailable',
	];

	try
	{
		/** Если код ответа не успешный - возвращаем сообщение об ошибке  */
		if ($code < 200 || $code > 204) {
			throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undefined error', $code);
		}
	}
	catch(Exception $e)
	{
		die('Ошибка: ' . $e->getMessage() . PHP_EOL . 'Код ошибки: ' . $e->getCode());
	}

	/**
	 * Данные получаем в формате JSON, поэтому, для получения читаемых данных,
	 * нам придётся перевести ответ в формат, понятный PHP
	 */

	$response = json_decode($out, true);

	if($response) {

		/* записываем конечное время жизни токена */
		$response["endTokenTime"] = time() + $response["expires_in"];

		$responseJSON = json_encode($response);

		/* передаём значения наших токенов в файл */
		$filename = "путь до файла с токеном";
		$f = fopen($filename,'w');
		fwrite($f, $responseJSON);
		fclose($f);

		$response = json_decode($responseJSON, true);

		return $response;
	}
	else {
		return false;
	}

}

Полный запрос на создание сделки

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

function amoCRMScript($paramsTask) {

	/* получаем значения токенов из файла */
	$dataToken = file_get_contents("путь до файла с токеном");
	$dataToken = json_decode($dataToken, true);

	/* проверяем, истёкло ли время действия токена Access */
	if($dataToken["endTokenTime"] < time()) {
		/* запрашиваем новый токен */
		$dataToken = returnNewToken($dataToken["refresh_token"]);
		$newAccess_token = $dataToken["access_token"];
	}
	else {
		$newAccess_token = $dataToken["access_token"];
	}

	if($paramsTask["CONTACT"]) {
		$idContact = amoAddContact($newAccess_token, $paramsTask);
	}

	amoAddTask($newAccess_token, $paramsTask, $idContact);

}

Вспомогательные функции

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

Узнать допустимые поля для «Сделки»

function returnFieldsContact() {

	$access_token = 'xxxxxx';

	$headers = [
		"Accept: application/json",
		'Authorization: Bearer ' . $access_token
	];

	$link='https://test.amocrm.ru/api/v4/leads/custom_fields';

	$curl = curl_init(); //Сохраняем дескриптор сеанса cURL
	curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
	curl_setopt($curl,CURLOPT_URL, $link);
	curl_setopt($curl,CURLOPT_HTTPHEADER, $headers);
	curl_setopt($curl,CURLOPT_HEADER, false);
	curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1);
	curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);
	$out=curl_exec($curl); 
	$code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
	curl_close($curl);
	$Response=json_decode($out,true);
	$account=$Response['response']['account'];
}

Узнать допустимые поля для «Контакты»

function returnFieldsContact() {

	$access_token = 'xxxxxx';

	$headers = [
		"Accept: application/json",
		'Authorization: Bearer ' . $access_token
	];

	$link='https://test.amocrm.ru/api/v4/contacts/custom_fields';

	$curl = curl_init(); //Сохраняем дескриптор сеанса cURL
	curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
	curl_setopt($curl,CURLOPT_URL, $link);
	curl_setopt($curl,CURLOPT_HTTPHEADER, $headers);
	curl_setopt($curl,CURLOPT_HEADER, false);
	curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1);
	curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);
	$out=curl_exec($curl); 
	$code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
	curl_close($curl);
	$Response=json_decode($out,true);
	$account=$Response['response']['account'];
}

Сделал реализацию Интерфейса с использованием фабрики. Ошибки остались те же
`public function getAccount()
{
$oAuthConfig = new OAuthConfig();
$oAuthService = new OAuthService();
$apiClientFactory = new AmoCRMClientAmoCRMApiClientFactory($oAuthConfig, $oAuthService);
$apiClient = $apiClientFactory->make();

    $accessToken = $this->getTokens();
    $apiClient->setAccessToken($accessToken)
        ->setAccountBaseDomain($accessToken->getValues()['baseDomain']);

    try {
        //работает
        //$ownerDetails = $apiClient->getOAuthClient()->getResourceOwner($accessToken);
        // не работает
        $ownerDetails = $apiClient->account()->getCurrent(AccountModel::getAvailableWith());
    } catch (AmoCRMMissedTokenException $e) {
        echo 'AmoCRMMissedTokenException <hr>';
        $this->printError($e);
        die;
    } catch (AmoCRMoAuthApiException $e) {
        echo 'AmoCRMoAuthApiException <hr>';
        $this->printError($e);
        die;
    } catch (AmoCRMApiException $e) {
        echo 'AmoCRMApiException <hr>';
        $this->printError($e);
        die;
    }

    return $ownerDetails;
}`

$ownerDetails = $apiClient->getOAuthClient()->getResourceOwner($accessToken); работает
$ownerDetails = $apiClient->account()->getCurrent(AccountModel::getAvailableWith()); не работает

Вот вывод дебага

`AmoCRMoAuthApiException 
Error: Unauthorized
Code: 401
Debug: array (
  'last_http_method' => 'GET',
  'last_method' => 'https://XXX.amocrm.ru/api/v4/account',
  'last_body' => 
  array (
  ),
  'last_query_params' => 
  array (
    'with' => 'amojo_id,uuid,amojo_rights,users_groups,task_types,version,datetime_settings,invoices_settings',
  ),
  'last_response' => '{"title":"Unauthorized","type":"https://httpstatus.es/401","status":401,"detail":"Неверный логин или пароль"}',
  'last_response_code' => 401,
  'last_request_id' => 'f791061cc0d6c18a8e599ec1d026ea38',
  'jquery_call' => '
$.ajax({
    url: "https://XXX.amocrm.ru/api/v4/account?with=amojo_id%2Cuuid%2Camojo_rights%2Cusers_groups%2Ctask_types%2Cversion%2Cdatetime_settings%2Cinvoices_settings",
    data: JSON.stringify([]),
    type: "GET",
    contentType: "application/json"
});',
  'curl_call' => 'curl "https://XXX.amocrm.ru/api/v4/account?with=amojo_id%2Cuuid%2Camojo_rights%2Cusers_groups%2Ctask_types%2Cversion%2Cdatetime_settings%2Cinvoices_settings" -X "GET" -d""',
  'timestamp' => 1622666253,
)`

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

Ответы при авторизации

Подробнее об авторизации читайте здесь

CODE HTTP CODE ERROR DESCRIPTION
110 401 Unauthorized Неправильный логин или пароль Общая ошибка авторизации.
111 401 Unauthorized Неправильный код капчи Возникает после нескольких неудачных попыток авторизации. В этом случае нужно авторизоваться в аккаунте
через браузер, введя код капчи.
112 401 Unauthorized Пользователь не состоит в данном аккаунте Возникает, когда пользователь выключен в настройках аккаунта «Пользователи и права» или не состоит в
аккаунте.
113 403 Forbidden Доступ к данному аккаунту запрещён с Вашего IP адреса Возникает, когда в настройках безопасности аккаунта включена фильтрация доступа к API по «белому списку
IP адресов».
101 401 Unauthorized Account not found Возникает в случае запроса к несуществующему аккаунту (субдомену).
401 401 Not Authorized 401 Unauthorized На сервере нет данных аккаунта. Нужно сделать запрос на другой сервер по переданному IP.

Ответы при работе с аккаунтом

Подробнее о работе с аккаунтом читайте здесь

CODE DESCRIPTION
101 Аккаунт не найден
102 POST-параметры должны передаваться в формате JSON
103 Параметры не переданы
104 Запрашиваемый метод API не найден

Ответы при работе с контактами

Подробнее о работе с контактами читайте здесь

CODE DESCRIPTION
201 Добавление контактов: пустой массив
202 Добавление контактов: нет прав
203 Добавление контактов: системная ошибка при работе с дополнительными полями
204 Добавление контактов: дополнительное поле не найдено
205 Добавление контактов: контакт не создан
206 Добавление/Обновление контактов: пустой запрос
207 Добавление/Обновление контактов: неверный запрашиваемый метод
208 Обновление контактов: пустой массив
209 Обновление контактов: требуются параметры «id» и «last_modified»
210 Обновление контактов: системная ошибка при работе с дополнительными полями
211 Обновление контактов: дополнительное поле не найдено
212 Обновление контактов: контакт не обновлён
219 Список контактов: ошибка поиска, повторите запрос позднее

Ответы при работе со сделками

Подробнее о работе со сделками читайте здесь

CODE DESCRIPTION
213 Добавление сделок: пустой массив
214 Добавление/Обновление сделок: пустой запрос
215 Добавление/Обновление сделок: неверный запрашиваемый метод
216 Обновление сделок: пустой массив
217 Обновление сделок: требуются параметры «id», «last_modified», «status_id», «name»
240 Добавление/Обновление сделок: неверный параметр «id» дополнительного поля

Ответы при работе с событиями

Подробнее о работе с событиями читайте здесь

CODE DESCRIPTION
218 Добавление событий: пустой массив
221 Список событий: требуется тип
222 Добавление/Обновление событий: пустой запрос
223 Добавление/Обновление событий: неверный запрашиваемый метод (GET вместо POST)
224 Обновление событий: пустой массив
225 Обновление событий: события не найдены

Ответы при работе с задачами

Подробнее о работе с задачами читайте здесь

CODE DESCRIPTION
227 Добавление задач: пустой массив
228 Добавление/Обновление задач: пустой запрос
229 Добавление/Обновление задач: неверный запрашиваемый метод
230 Обновление задач: пустой массив
231 Обновление задач: задачи не найдены
232 Добавление событий: ID элемента или тип элемента пустые либо неккоректные
233 Добавление событий: по данному ID элемента не найдены некоторые контакты
234 Добавление событий: по данному ID элемента не найдены некоторые сделки
235 Добавление задач: не указан тип элемента
236 Добавление задач: по данному ID элемента не найдены некоторые контакты
237 Добавление задач: по данному ID элемента не найдены некоторые сделки
238 Добавление контактов: отсутствует значение для дополнительного поля
244 Добавление сделок: нет прав.

Другие ответы

Ошибки и ответы, не относящиеся к какому-либо конкретному разделу

CODE DESCRIPTION NOTE
400 Неверная структура массива передаваемых данных, либо не верные идентификаторы кастомных полей
403 Аккаунт заблокирован, за неоднократное превышение количества запросов в секунду Вместе с этим ответом отдаётся HTTP код №403
429 Превышено допустимое количество запросов в секунду Вместе с этим ответом отдаётся HTTP код №429
2002 По вашему запросу ничего не найдено Вместе с этим ответом отдаётся HTTP код №204 «No Content»

Авторизовался через Oauth2.0 пытаюсь взять данные со сделки, но пишет 401 [detail] => Неверный логин или пароль )

вот пытаюсь взять данные

$queryUrl = 'https://xxxxx.amocrm.ru/api/v4/leads';
$access_token = $accessToken;
    $curl = curl_init();
    
    curl_setopt_array($curl, array(
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_POST => 1,
        CURLOPT_HEADER => 0,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => $queryUrl,
        CURLOPT_POSTFIELDS => $queryData,
    ));
    
    $result = curl_exec($curl);
    curl_close($curl);
    $result = json_decode($result, 1);

    print_r($result);

Выводит только Array ( [title] => Unauthorized [type] => https://httpstatus.es/401 [status] => 401 [detail] => Неверный логин или пароль )

Хотел чтобы выводила вот так >

"leads": [
    {
        "id": 1184303,
        "name": "Новый тест 2",
        "price": 0,
        "responsible_user_id": 6726247,
        "group_id": 0,
        "status_id": 40736470,
        "pipeline_id": 4379983,
        "loss_reason_id": null,
        "created_by": 0,
        "updated_by": 0,
        "created_at": 1623860529,
        "updated_at": 1623860529,
        "closed_at": null,
        "closest_task_at": null,
        "is_deleted": false,
        "custom_fields_values": null,
        "score": null,
        "account_id": 29544991,

Добрый вечер, нужна помощь, приходит пустая заявка в amo.

#Параметры для авторизации
        $user = array(
            'USER_LOGIN' => '#',
            'USER_HASH' => '#',
        );
        $subdomain = '#';
        $link = 'https://' . $subdomain . '.amocrm.ru/private/api/auth.php?type=json';
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-API-client/1.0');
        curl_setopt($curl, CURLOPT_URL, $link);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($user));
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_COOKIEFILE, dirname (__FILE__) . '/cookie.txt');
        curl_setopt($curl, CURLOPT_COOKIEJAR, dirname (__FILE__) . '/cookie.txt');
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
        $out = curl_exec($curl); 
        $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        curl_close($curl); 
        $code = (int) $code;
        $errors = array(
            301 => 'Moved permanently',
            400 => 'Bad request',
            401 => 'Unauthorized',
            403 => 'Forbidden',
            404 => 'Not found',
            500 => 'Internal server error',
            502 => 'Bad gateway',
            503 => 'Service unavailable',
        );
        try
        {
            if ($code != 200 && $code != 204) {
                throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undescribed error', $code);
            }
        } catch (Exception $E) {
            die('Ошибка: ' . $E->getMessage() . PHP_EOL . 'Код ошибки: ' . $E->getCode());
        }
        # Добавление сделки
        $leads['add'] = array(
            array(
                'name' => $form,
                'cont_name' => $name,
                'custom_fields'=> [
                  [
                    'id' => 352382, 
                    'values' => [
                      [
                        'value'=> $phone,
                        'enum'=>'MOB'
                      ]
                    ]
                  ],

                  [
                    'id' => 391663, 
                    'values' => [
                      [
                        'value'=> $utm_source,
                      ]
                    ]
                  ],

                  [
                    'id' => 391665, 
                    'values' => [
                      [
                        'value'=> $utm_medium,
                      ]
                    ]
                  ],

                  [
                    'id' => 391667, 
                    'values' => [
                      [
                        'value'=> $utm_campaign,
                      ]
                    ]
                  ],

                  [
                    'id' => 391669, 
                    'values' => [
                      [
                        'value'=> $utm_content,
                      ]
                    ]
                  ],

                  [
                    'id' => 391671, 
                    'values' => [
                      [
                        'value'=> $utm_term,
                      ]
                    ]
                  ]
              ]

            ),
        );
        $link = 'https://' . $subdomain . '.amocrm.ru/api/v2/leads';
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-API-client/1.0');
        curl_setopt($curl, CURLOPT_URL, $link);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($leads));
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt');
        curl_setopt($curl, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt'); 
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
        $out = curl_exec($curl); 
        $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        $code = (int) $code;
        $errors = array(
            301 => 'Moved permanently',
            400 => 'Bad request',
            401 => 'Unauthorized',
            403 => 'Forbidden',
            404 => 'Not found',
            500 => 'Internal server error',
            502 => 'Bad gateway',
            503 => 'Service unavailable',
        );
        try
        {
            if ($code != 200 && $code != 204) {
                throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undescribed error', $code);
            }
        } catch (Exception $E) {
            die('Ошибка: ' . $E->getMessage() . PHP_EOL . 'Код ошибки: ' . $E->getCode());
        }

Print_r выдает

Array ( [0] => Array ( [cont_name] => 312312 [custom_fields] => Array ( [0] => Array ( [id] => 352382 [values] => Array ( [0] => Array ( [value] => 6546465 [enum] => MOB ) ) ) [1] => Array ( [id] => 391663 [values] => Array ( [0] => Array ( [value] => ) ) ) [2] => Array ( [id] => 391665 [values] => Array ( [0] => Array ( [value] => ) ) ) [3] => Array ( [id] => 391667 [values] => Array ( [0] => Array ( [value] => ) ) ) [4] => Array ( [id] => 391669 [values] => Array ( [0] => Array ( [value] => ) ) ) [5] => Array ( [id] => 391671 [values] => Array ( [0] => Array ( [value] => ) ) ) ) ) )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
$subdomain = 'test'; //Поддомен нужного аккаунта
$link = 'https://' . $subdomain . '.amocrm.ru/oauth2/access_token'; //Формируем URL для запроса
 
/** Соберем данные для запроса */
$data = [
    'client_id' => 'xxxx',
    'client_secret' => 'xxxx',
    'grant_type' => 'authorization_code',
    'code' => 'xxxxxx',
    'redirect_uri' => 'https://test.ru/',
];
 
/**
 * Нам необходимо инициировать запрос к серверу.
 * Воспользуемся библиотекой cURL (поставляется в составе PHP).
 * Вы также можете использовать и кроссплатформенную программу cURL, если вы не программируете на PHP.
 */
$curl = curl_init(); //Сохраняем дескриптор сеанса cURL
/** Устанавливаем необходимые опции для сеанса cURL  */
curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
curl_setopt($curl,CURLOPT_URL, $link);
curl_setopt($curl,CURLOPT_HTTPHEADER,['Content-Type:application/json']);
curl_setopt($curl,CURLOPT_HEADER, false);
curl_setopt($curl,CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl,CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);
$out = curl_exec($curl); //Инициируем запрос к API и сохраняем ответ в переменную
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
/** Теперь мы можем обработать ответ, полученный от сервера. Это пример. Вы можете обработать данные своим способом. */
$code = (int)$code;
$errors = [
    400 => 'Bad request',
    401 => 'Unauthorized',
    403 => 'Forbidden',
    404 => 'Not found',
    500 => 'Internal server error',
    502 => 'Bad gateway',
    503 => 'Service unavailable',
];
 
try
{
    /** Если код ответа не успешный - возвращаем сообщение об ошибке  */
    if ($code < 200 || $code > 204) {
        throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undefined error', $code);
    }
}
catch(Exception $e)
{
    die('Ошибка: ' . $e->getMessage() . PHP_EOL . 'Код ошибки: ' . $e->getCode());
}
 
/**
 * Данные получаем в формате JSON, поэтому, для получения читаемых данных,
 * нам придётся перевести ответ в формат, понятный PHP
 */
$response = json_decode($out, true);
 
$access_token = $response['access_token']; //Access токен
$refresh_token = $response['refresh_token']; //Refresh токен
$token_type = $response['token_type']; //Тип токена
$expires_in = $response['expires_in']; //Через сколько действие токена истекает

работал, создавал и заявки и сделки. Примерно неделю назад внезапно отпал (как раз после их обновления, возможно). Лог следующий (частично, чтоб не засорять чат):

[0] => [AmoCrm] Ошибка запроса
[1] => Unauthorized Код ошибки: 401
[2] => https://user.amocrm.ru/oauth2/access_token
[3] => Array
(
[client_id] => ee869cab-e1e3-407d-8772-0e21e98c111f
[client_secret] => zZ2SJNTxb7Ep6vISlP…
[code] => def50200a14d2acc1…
[grant_type] => refresh_token
[refresh_token] => def502000dd3f40442a5586…
[redirect_uri] => http://testsite.ru/
)

[4] => Array
(
[hint] => Token is not linked to client
[title] => Некорректный запрос
[type] => https://developers.amocrm.ru/v3/errors/OAuthProblemJson
[status] => 401
[detail] => В запросе отсутствует ряд параметров или параметры невалидны
)

)

[2023-05-23 07:51:22] (ERROR @ /var/www/modx/bravo.5bro-rd.ru/core/components/amocrm/model/amocrm/amocrmtools.class.php : 487) Array
(
[0] => [AmoCrm] Ошибка запроса
[1] => Unauthorized Код ошибки: 401
[2] => https://user.amocrm.ru/api/v4/account
[3] => Array
(
)

[4] => Array
(
[title] => Unauthorized
[type] => https://httpstatus.es/401
[status] => 401
[detail] => Неверный логин или пароль
)

)

russian

programming

software

modx


4

ответов

«Неверный логин или пароль» скорее всего где тут проблема

Возможно на стороне амо забанили. У них бывает такой прикол


Николай Савин

Возможно на стороне амо забанили. У них бывает та…

Спасибо за наводку! Попробую им написать наводящий вопрос про бан. но боюсь ответ будет очевидным. У них всегда все ровно..

Бан, как понимаю, по аккаунту может идти. Тк интеграции уже несколько раз пересоздавал


Al Benedict

Спасибо за наводку! Попробую им написать наводящий…

Если есть бан — должно висеть уведомление от поддержки.

Понравилась статья? Поделить с друзьями:
  • Ami uefi bios коды ошибок
  • Ami legal bios post коды ошибок
  • Ami bios нет сигнала ошибок
  • Ami bios коды ошибок в пост карте
  • American truck simulator ошибка при установке