Справочник ошибок и ответов 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-соединения и обсудим способы их решения.
При доступе к некоторым сайтам (или отдельным страницам этих сайтов), посетитель должен пройти определенные этапы получения прав:
- Идентификация – получение вашей учетной записи («identity») по username/login или email.
- Аутентификация («authentic») – проверка того, что вы знаете пароль от этой учетной записи.
- Авторизация – проверка вашей роли (статуса) в системе и решение о предоставлении доступа к запрошенной странице или ресурсу на определенных условиях.
Большинство пользователей сохраняют свои данные по умолчанию в истории браузеров, что позволяет быстро идентифицироваться на наиболее часто посещаемых страницах и синхронизировать настройки между устройствами. Данный способ удобен для серфинга в интернете, но может привести к проблемам с безопасностью доступа к конфиденциальной информации. При наличии большого количества авторизованных регистрационных данных к различным сайтам используйте надежный мастер-пароль, который закрывает доступ к сохраненной в браузере информации.
Наиболее распространенной причиной появления ошибки с кодом 401 для рядового пользователя является ввод неверных данных при посещении определенного ресурса. В этом и других случаях нужно попробовать сделать следующее:
- Проверьте в адресной строке правильность написания URL. Особенно это касается перехода на подстраницы сайта, требующие авторизации. Введите правильный адрес. Если переход на страницу осуществлялся после входа в аккаунт, разлогинитесь, вернитесь на главную страницу и произведите повторный вход с правильными учетными данными.
- При осуществлении входа с сохраненными данными пользователя и появлении ошибки сервера 401 проверьте их корректность в соответствующих настройках данного браузера. Возможно, авторизационные данные были вами изменены в другом браузере. Также можно очистить кэш, удалить cookies и повторить попытку входа. При удалении истории браузера или очистке кэша потребуется ручное введение логина и пароля для получения доступа. Если вы не помните пароль, пройдите процедуру восстановления, следуя инструкциям.
- Если вы считаете, что вводите правильные регистрационные данные, но не можете получить доступ к сайту, обратитесь к администратору ресурса. В этом случае лучше всего сделать скриншот проблемной страницы.
- Иногда блокировка происходит на стороне провайдера, что тоже приводит к отказу в доступе и появлению сообщения с кодировкой 401. Для проверки можно попробовать авторизоваться на том же ресурсе с альтернативного ip-адреса (например, используя VPN). При подтверждении блокировки трафика свяжитесь с провайдером и следуйте его инструкциям.
Некоторые крупные интернет-ресурсы с большим количеством подписчиков используют дополнительные настройки для обеспечения безопасности доступа. К примеру, ваш аккаунт может быть заблокирован при многократных попытках неудачной авторизации. Слишком частые попытки законнектиться могут быть восприняты как действия бота. В этом случае вы увидите соответствующее сообщение, но можете быть просто переадресованы на страницу с кодом 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
Спасибо за наводку! Попробую им написать наводящий…
Если есть бан — должно висеть уведомление от поддержки.