Пример по шагам
Для примера рассмотрим полный цикл получения доступа к данным, начиная от регистрации новой интеграции.
При этом мы будем рассматривать прямую работу с API авторизации, но вы можете либо воспользоваться нашей готовой библиотекой на PHP для упрощения разработки, либо готовыми библиотеками сторонних вендоров, которые можно найти по ссылке.
Мы разрабатывали авторизацию, основываясь на протоколе oAuth 2.0, поэтому вы можете найти в открытых источниках много примеров и документацию, описывающих взаимодействие и логику выполнения запросов.
Оглавление
- Регистрация приложения
- Получение Authorization code
- Обмен кода авторизации на access token и refresh token
- Получение нового access token по его истечении
- Запросы к API с передачей access token
- Хук об отключении интеграции
- Обработка ошибок
Регистрация приложения
Все начинается с того, что вам необходимо зайти в раздел “амоМаркет” того аккаунта, в котором вы будете осуществлять поддержку интеграции в будущем. Обратите внимание:
- Именно за этим аккаунтом будет закреплена Интеграция.
Это означает, что любой из администраторов этого аккаунта сможет управлять интеграцией и получит доступ к общим ключам приложения.
Подробнее о терминах можно прочесть здесь.
По сути этот аккаунт мы будем считать аккаунтом разработчика.
Если вы разрабатываете публичную интеграции, необходимо ознакомиться с требованиями. - Для создания интеграции вам необходимо обладать правами администратора аккаунта
- При подключении приватной интеграции на аккаунте который не является техническим, клиенту необходимо заполнить заявление на отказ от технической поддержки amoCRM. Техническая поддержка не сможет принять обращения по ошибкам системы для фиксации и исправлений на аккаунте где было подписано заявление. Данное ограничение не касается консультаций и вопросов по оплате. Приняв единожды данное соглашение, оно фиксируется в аккаунте amoCRM навсегда. Отозвать соглашение и вернуть аккаунт к прежнему состоянию возможности уже не будет.
После нажатия на кнопку Создать Интеграцию, в появившейся форме, вам необходимо указать Название интеграции, выбрать требуемые доступы и указать описание.
Также необходимо указать Redirect URI – url страницы получения токенов и загрузить логотип интеграции.
Кроме того, есть возможность указать url для хука об отключении интеграции – на него придет хук, когда интеграция будет отключена пользователем. Поле для хука об отключении является необязательным.
Свойства интеграции:
- Название интеграции (не более 255 символов) – отображается на странице интеграций, модальном окне для предоставления доступов, а также участвует в поиске по странице интеграций.
- Описание интеграции (не более 65000 символов) – отображается в модальном окне интеграции в аккаунте пользователя. Допускается использование html верстки.
- Ссылка для перенаправления – ссылка на ваш сайт, который будет обрабатывать работу с ключами. Важно, что домен должен быть защищен SSL сертификатом, если вы планируете использовать интеграцию более, чем в одном аккаунте.Просим обратить внимание на то, что мы не поддерживаем кириллические домены и кирилические домены, преобразованные с помощью паникода. Также мы периодически проверяем доступность домена, как обязательное условие для работы интеграции.
- Ссылка для хука об отключении интеграции – на этот адрес будет отправлен GET-запрос при отключении интеграции пользователем. В запросе будет содержаться 2 параметра account_id и client_id.
- Предоставить доступ – минимальный набор необходимых разрешений для работы интеграции. Подробнее про разрешения можно прочитать в статье.
- Иконка интеграции (400х272 jpeg/jpg/png/gif) – отображается в списке интеграций, а также в окне запроса доступа у пользователя
- Контроль дублей – галку необходимо ставить, если ваша интеграция поддерживает Контроль дублей. После установки галки, интеграция будет доступна в настройках контроля дублей.
- Множественные источники – галку необходимо ставить, если ваша интеграция сама управляет источниками через API. Если галка установлена, amoCRM не будет создавать источники по-умолчанию, интеграция сама должна будет создать все необходимые ей источники.
Кроме этих пунктов, администраторам аккаунта, в котором создана интеграция, будут доступны: ID интеграции, секретный ключ интеграции, код авторизации (после включения интеграции).
После заполнения полей вам необходимо сохранить интеграцию.
После этого новая интеграция будет создана и открыто модальное окно созданной интеграции. В открывшемся модальном окне, на вкладке ключи будут отображены необходимые ключи.
Обратите внимание, что Secret key и Integration ID привязаны к интеграции и будут показаны только в вашем аккаунте разработчика.
Напомним, что код авторизации является временным ключом, который действует только 20 минут.
C его помощью вам необходимо в течении этого времени получить refresh token и access токен.
Он является временным, т.к. может быть перехвачен, но в случае перехвата злоумышленник не сможет с ним ничего сделать, если вы не сообщите ему ключи приложения, известные только администраторам аккаунта, в котором создана интеграция.
Получить Authorization code можно тремя способами:
- Скопировать из модального окна установленной интеграции. Этот случай подойдет, если вам необходимо проинтегрировать только один аккаунт amoCRM. Подробнее можно прочитать в разделе Упрощенная авторизация.
- Если в вашей интеграции есть загруженный архив с виджетом, то при его установке вы получите Webhook на указанный в настройках интеграции Redirect URI.
- Получить код через адрес предоставления доступа интеграции. После предоставления доступа, пользовать будет перенаправлен на указанный Redirect URI.
Вы можете упростить разработку при использовании способа получения ключа через GET-параметры, используя готовую Кнопку amoCRM.
Полная логика способа получения ключа через GET-параметры заключается в следующем:
- Пользователь, у которого вы хотите запросить доступ, находится у вас на сайте и может открыть предложенную вами ссылку.
*Внимание: Очень важно, чтобы для пользователя весь процесс был максимально прозрачен и понятен. При клике на ссылку пользователь должен однозначно понимать следующее: произойдет запрос его доступов в его аккаунте amoCRM, какую интеграцию он включает.
Именно поэтому мы предлагаем использовать нашу брендированную кнопку, описание которой вы можете найти на странице Кнопка amoCRM - Генерация ссылки, по которой должен перейти пользователь. Вам необходимо отправить пользователя на URL https://www.amocrm.ru/oauth?client_id={Integration ID}&state={параметр состояния, который будет возвращен вам на Redirect URI}&mode={popup или post_message}.
Integration ID вам уже известен.
state – это сгенерированный вами строковый параметр, возможно хеш.
State нужен для того, чтобы при получении ответа от amoCRM, вы могли проверить его достоверность,
сравнив отправленный ключ и полученный в результате, чтобы удостовериться в отсутствии подмены CSRF.
Параметр mode отвечает за обработку запроса на Redirect URI. В случае popup – окно авторизации будет закрыто,
а переход на Redirect URI будет выполнен в основном окне. В случае передачи значения post_message –
перенаправление произойдет в окне, которое было открыто, после обработки кода авторизации вам нужно закрыть окно.
Также можно сообщить информацию об успешности действия в основное окно с использованием функции postMessage. - Перейдя по ссылке, пользователь увидит логотип вашей интеграции, который вы загружали при ее создании, название, а также перечень доступов, которые запрашивает приложение.
Открывать данную страницу мы советуем как модальное окно – в popup. Это позволит пользователю не терять контекста страницы, которая открыла popup.
- В случае, если пользователь не авторизован – ему будет предложено авторизоваться в amoCRM, иначе пользователю будет дан выбор из аккаунтов, где он является администратором. Для приватных интеграций, список будет ограничен 1 аккаунтом.
- После выбора аккаунта и нажатия кнопки Разрешить, интеграция будет установлена в выбранный аккаунт,
а пользователь перенаправлен в модальном или основном окне, в зависимости от параметра mode,
на указанный в настройках интеграции Redirect URI c GET-параметрами code, referer, state, from_widget, platform.
Параметр code содержит Authorization code, параметр referer – адрес аккаунта пользователя, параметр state – строку,
которую вы передавали при открытии окна, если строка не была передана, данный параметр возвращен не будет.
Параметр platform показывает, на какой платформе был установлен виджет, российской или глобальной. При установке из аккаунта на
amocrm.ru приходит значение 1, при установке из аккаунта на amocrm.com/kommo.com – значение 2.
Если мы отправляем Webhook после установки виджета, то вам дополнительно придет GET-параметр from_widget - В случае, если пользователь нажмет кнопку Отказать приложению в доступе, он будет перенаправлен на Redirect URI с GET-параметром error=access_denied, а также GET-параметром state, если он был передан.
Пример обработки авторизации, если был передан параметр post_message
При переданном GET-параметре mode со значением post_message в окно предоставление доступов – перенаправление произойдет в самом окне.
Ниже рассмотрим пример общения окна предоставления доступов и основного окна с использованием функции postMessage.
Код ниже размещен в основном окне:
var popup;
auth();
// 1. Открывает окно предоставления доступов
function auth() {
popup = window.open('https://www.amocrm.ru/oauth?client_id=XXX&state=XXX&mode=post_message', 'Предоставить доступ', 'scrollbars, status, resizable, width=750, height=580');
}
// 2. Регистрируем обработчика сообщений из popup окна
window.addEventListener('message', updateAuthInfo);
// 3. Функция обработчик, зарегистрированная выше
function updateAuthInfo(e) {
if (e.data.error !== undefined) {
console.log('Ошибка - ' + e.data.error)
} else {
console.log('Авторизация прошла')
}
// 4. Закрываем модальное окно
popup.close();
}
Код ниже будет отдан в модальное окно вашим backend сервером при переходе на Redirect URI:
<!doctype html>
<html lang="en">
<head>
<title>oAuth Postback</title>
<script>
//Передадим данные в родительское окно, набор данных определяете вы
if(window.opener){
window.opener.postMessage({'error': undefined, 'status': 'ok'}, "*");
}
</script>
</head>
</html>
После отработки кода выше, основное окно узнает результат. Рекомендуем закрывать модальное окно автоматически,
как это сделано в примере, чтобы у пользователя не возникла путаница в окнах.
Обмен кода авторизации на access token и refresh token
Получив Authorization code, вам необходимо сделать запрос на специальный метод /oauth2/access_token, описанный ниже.
В ответ вы получите пару Access и Refresh token, а также время в секундах, через которое токен истекает.
Access токен аналогичен ключу сессии. Его можно сохранить в приложении и использовать для запросов к API до истечения времени его жизни.
Токен должен быть доступен только вашему приложению, поэтому не рекомендуется сохранять его в cookies браузера,
открытых конфигурационных файлах и т. п.
Метод
POST /oauth2/access_token
Параметры запроса
Параметр | Тип данных | Описание |
---|---|---|
client_id | string | ID интеграции |
client_secret | string | Секрет интеграции |
grant_type | string | Тип авторизационных данных (для кода авторизации – authorization_code) |
code | string | Полученный код авторизации |
redirect_uri | string | Redirect URI указанный в настройках интеграции. Должен четко совпадать с тем, что указан в настройках |
Пример запроса
{
"client_id": "xxxx",
"client_secret": "xxxx",
"grant_type": "authorization_code",
"code": "xxxxxxx",
"redirect_uri": "https://test.test"
}
Заголовок типа данных при успешном результате
Content-Type: application/json
Заголовок типа данных при ошибке
Content-Type: application/json
HTTP коды ответа
Код ответа | Условие |
---|---|
200 | Запрос успешно обработан |
400 | Переданы некорректные данные. Подробности доступны в теле ответа |
Параметры ответа
Параметр | Тип данных | Описание |
---|---|---|
token_type | string | Тип токена |
expires_in | int | Через сколько истекает токен |
access_token | string | Access Token в формате JWT |
refresh_token | string | Refresh Token |
Пример ответа
{
"token_type": "Bearer",
"expires_in": 86400,
"access_token": "xxxxxx",
"refresh_token": "xxxxx"
}
Получение Access токен по коду авторизации, реализация на bash
curl https://subdomain.amocrm.ru/oauth2/access_token -d
'{"client_id":"xxx-xxx-xxx-xxx-xxx","client_secret":"xxxxxx","grant_type":"authorization_code","code":"xxxxxxxx","redirect_uri":"https://test.test/"}'
-H 'Content-Type:application/json'
-X POST
Получение Access токен по коду авторизации, реализация на PHP
<?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']; //Через сколько действие токена истекает
Получение нового access token по его истечении
Из предыдущего пункта вы заметили, что вместе с Access token был также возвращен Refresh token.
Он необходим для продолжения работы с API, по истечении срока действия Access токена, т.е. это довольно частая операция.
Refresh token имеет два существенных ограничения его жизни:
- Refresh токен действует всего 3 месяца. Если интеграция не используется в течение 3 месяцев,
не было ни одного запроса на актуализацию ключа, то интеграция потеряет доступ к данным и будем необходимо повторно
запрашивать разрешение у пользователя на доступ к его аккаунту - Refresh token можно обменять только один раз.
После отправки его в метод и получения новой пары access token/refresh token старый refresh token становится не актуальным.
И после получения нового refresh token его необходимо обязательно сохранить, иначе придется вновь перезапрашивать доступ у пользователя.
По истечении срока действия возможность получения Access токена по нему становится невозможной.
Для обмена необходимо сделать запрос на специальный метод с действительным Refresh токеном.
В ответ вы получите новый Access и Refresh токены.
Метод
POST /oauth2/access_token
Параметры запроса
Параметр | Тип данных | Описание |
---|---|---|
client_id | string | ID интеграции |
client_secret | string | Секрет интеграции |
grant_type | string | Тип авторизационных данных (для кода авторизации – refresh_token) |
refresh_token | string | Refresh токен |
redirect_uri | string | Redirect URI указанный в настройках интеграции. Должен четко совпадать с тем, что указан в настройках |
Пример запроса
{
"client_id": "xxxx",
"client_secret": "xxxx",
"grant_type": "refresh_token",
"refresh_token": "xxxxx",
"redirect_uri": "https://test.test"
}
Заголовок типа данных при успешном результате
Content-Type: application/json
Заголовок типа данных при ошибке
Content-Type: application/json
HTTP коды ответа
Код ответа | Условие |
---|---|
200 | Запрос успешно обработан |
400 | Переданы некорректные данные. Подробности доступны в теле ответа |
Параметры ответа
Параметр | Тип данных | Описание |
---|---|---|
token_type | string | Тип токена |
expires_in | int | Через сколько истекает токен |
access_token | string | Access Token в формате JWT |
refresh_token | string | Refresh Token |
Пример ответа
{
"token_type": "Bearer",
"expires_in": 86400,
"access_token": "xxxxxx",
"refresh_token": "xxxxx"
}
Получение Access токен по Refresh токену, реализация на bash
curl https://subdomain.amocrm.ru/oauth2/access_token -d
'{"client_id":"xxx-xxx-xxx-xxx-xxx","client_secret":"xxxxxx","grant_type":"refresh_token","refresh_token":"xxxxxxxx","redirect_uri":"https://test.test/"}'
-H 'Content-Type:application/json'
-X POST
Получение Access токен по коду авторизации, реализация на PHP
<?php
$subdomain = 'test'; //Поддомен нужного аккаунта
$link = 'https://' . $subdomain . '.amocrm.ru/oauth2/access_token'; //Формируем URL для запроса
/** Соберем данные для запроса */
$data = [
'client_id' => 'xxxx',
'client_secret' => 'xxxx',
'grant_type' => 'refresh_token',
'refresh_token' => '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']; //Через сколько действие токена истекает
Запросы к API с передачей access token
C помощью полученного Access токена вы можете легко делать запросы к API приложения.
Вам не нужно отправлять куки-файлы с каждым запросом, также вам нужно добавить заголовок Authorization: Bearer {access токен} во все ваши запросы к API amoCRM.
Пример запроса к методу account
<?php
$subdomain = 'test'; //Поддомен нужного аккаунта
$link = 'https://' . $subdomain . '.amocrm.ru/api/v4/account'; //Формируем URL для запроса
/** Получаем access_token из вашего хранилища */
$access_token = 'xxxx';
/** Формируем заголовки */
$headers = [
'Authorization: Bearer ' . $access_token
];
/**
* Нам необходимо инициировать запрос к серверу.
* Воспользуемся библиотекой 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, $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);
/** Теперь мы можем обработать ответ, полученный от сервера. Это пример. Вы можете обработать данные своим способом. */
$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());
}
Подобным образом можно делать запросы ко всем методам API, на которые у токена хватает прав.
Токен имеет права пользователя, который предоставил доступ.
Хук об отключении интеграции
Начиная с ноября 2021 года, вы можете указать адрес, на который будет отправлен запрос, когда интеграция будет отключена.
После получения хука вы сможете остановить интеграцию, ограничить запросы к аккаунту, в котором произошло отключение.
Мы рекомендуем указывать данную ссылку, так как это поможет вам не делать лишних запросов к API,
отслеживать когда интеграция была отключена.
Обработка ошибок
В ходе отработки всей вышеуказанной логики может возникать ряд исключений, которые необходимо обрабатывать, рассмотрим каждое из них:
- Если пользователь не дал разрешение на доступ к аккаунту, в случае использования кнопки amoCRM, будет вызвана функция,
которая передана в одном из параметров. Подробней можно прочесть в разделе Кнопка amoCRM.
Если же страница была открыта не кнопкой, то в случае отказа будет произведен редирект на Redirect URI c GET-параметром error=access_denied. - Если администратор аккаунта деактивировал установку интеграции, то выданные ей access_token будут отозваны.
При обращении к API вы получите HTTP код 401.
Для продолжения работы интеграции интегратору необходимо снова получить авторизацию для его интеграции у пользователя. - Если вы не записали актуальный refresh token, он был утерян, либо прошло более 3 месяцев,
то для возобновления работы интеграции вам опять необходимо пройти процесс авторизации приложения. - Если вами были утеряны основные ключи интеграции или вы случайно их опубликовали,
то вы можете обновить секретный ключ в модальном окне интеграции в аккаунте, где она была создана.
После обновления Secret Key интеграции вам необходимо обновить секретный ключ в конфигурациях ваших интеграциях.
Смотрите также
Библиотека
Кнопка на сайт
Время на прочтение
8 мин
Количество просмотров 18K
AmoCRM одна из самых популярных CRM, при этом ее API один из самых странных, по моему субъективному мнению. Понадобилось передавать данные формы с сайта в crm. Использовать CRM Формы вместо своих дизайнерских не хочется. Было бы здорово открыть статейку в гугле, подставить ключ и не париться особо, но на удивление не нашел ни одной статьи с актуальной инфой, где-то версия api уже не актуальна, где-то вместо использования дефолтных полей контакта, создаются кастомные. В общем решил поделиться своим решением, для тех, кому сложно/лень вникать в их API.
В этой статье я буду создавать сделку в “Неразобранном”, контакт и компанию.
Создаем файлы интеграции
Создаем папку amo, например в корне сайта.
Файлы внутри:
amo.php
access.php
config.php
get.php
cookie.txt
tokens.txt
Названия могут быть произвольными.
Получение ключей
Открываем AmoCRM, заходим в Настройки > Интеграции.
Жмем “+ Создать интеграцию” и создаем внешнюю интеграцию.
Указываем ссылку на наш amo.php файл, ставим галочку предоставления доступа и вводим произвольное название и описание:
P.S. Перед сохранением прочтите этот раздел до конца
У нас появится 3 ключа и 20 минут, чтоб сделать следующее:
Открываем config.php и вписываем их туда:
<?php
$subdomain = ''; // поддомен AmoCRM
$client_secret = ''; // Секретный ключ
$client_id = ''; // ID интеграции
$code = ''; // Код авторизации
$token_file = 'tokens.txt';
$redirect_uri = 'https://site.com/amo/amo.php';
Поддомен AmoCRM берем из url нашей CRM
В $redirect_uri
не забудьте поменять свой домен сайта
Затем идем в файл auth.php и вставим следующее:
<?php
require_once 'config.php';
$link = "https://$subdomain.amocrm.ru/oauth2/access_token";
$data = [
'client_id' => $client_id,
'client_secret' => $client_secret,
'grant_type' => 'authorization_code',
'code' => $code,
'redirect_uri' => $redirect_uri,
];
$curl = curl_init();
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);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
$code = (int)$code;
$errors = [
301 => 'Moved permanently.',
400 => 'Wrong structure of the array of transmitted data, or invalid identifiers of custom fields.',
401 => 'Not Authorized. There is no account information on the server. You need to make a request to another server on the transmitted IP.',
403 => 'The account is blocked, for repeatedly exceeding the number of requests per second.',
404 => 'Not found.',
500 => 'Internal server error.',
502 => 'Bad gateway.',
503 => 'Service unavailable.'
];
if ($code < 200 || $code > 204) die( "Error $code. " . (isset($errors[$code]) ? $errors[$code] : 'Undefined error') );
$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);
$f = fopen($token_file, 'w');
fwrite($f, $arrParamsAmo);
fclose($f);
print_r($arrParamsAmo);
Тут мы отправляем запрос в AmoCRM для получения токенов. Токены сохраняются в файл (45-57 строки), вы можете сохранять их в БД.
Запустите файл, https://site.com/amo/auth.php
Как результат в файле tokens.txt должны появится данные.
Обновление токена
Access token является временным и требует обновления.
Открываем файл access.php и добавляем следующее:
<?php
require_once 'config.php';
$dataToken = file_get_contents($token_file);
$dataToken = json_decode($dataToken, true);
if ($dataToken["endTokenTime"] - 60 < time()) {
$link = "https://$subdomain.amocrm.ru/oauth2/access_token";
$data = [
'client_id' => $client_id,
'client_secret' => $client_secret,
'grant_type' => 'refresh_token',
'refresh_token' => $dataToken["refresh_token"],
'redirect_uri' => $redirect_uri,
];
$curl = curl_init();
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);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
$code = (int)$code;
$errors = [
301 => 'Moved permanently.',
400 => 'Wrong structure of the array of transmitted data, or invalid identifiers of custom fields.',
401 => 'Not Authorized. There is no account information on the server. You need to make a request to another server on the transmitted IP.',
403 => 'The account is blocked, for repeatedly exceeding the number of requests per second.',
404 => 'Not found.',
500 => 'Internal server error.',
502 => 'Bad gateway.',
503 => 'Service unavailable.'
];
if ($code < 200 || $code > 204) die( "Error $code. " . (isset($errors[$code]) ? $errors[$code] : 'Undefined error') );
$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);
$f = fopen($token_file, 'w');
fwrite($f, $arrParamsAmo);
fclose($f);
$access_token = $response['access_token'];
} else {
$access_token = $dataToken["access_token"];
}
Если вы сохраняли токены из предыдущего запроса в БД, пропишите получение их из БД (59-61 строки). Если сохранили в файл, как было в примере, переходите к след этапу.
Переходим к интеграции
Не буду приводить пример html формы, нужно обработать форму и передать в amo.php необходимые данные. Открываем amo.php и добавляем:
<?php
require_once 'access.php';
$name = 'Имя клиента';
$phone = '+380123456789';
$email = 'email@gmail.com';
$target = 'Цель';
$company = 'Название компании';
$custom_field_id = 454021;
$custom_field_value = 'тест';
$ip = '1.2.3.4';
$domain = 'site.ua';
$price = 0;
$pipeline_id = 5059931;
$user_amo = 0;
$utm_source = '';
$utm_content = '';
$utm_medium = '';
$utm_campaign = '';
$utm_term = '';
$utm_referrer = '';
$data = [
[
"name" => $phone,
"price" => $price,
"responsible_user_id" => (int) $user_amo,
"pipeline_id" => (int) $pipeline_id,
"_embedded" => [
"metadata" => [
"category" => "forms",
"form_id" => 1,
"form_name" => "Форма на сайте",
"form_page" => $target,
"form_sent_at" => strtotime(date("Y-m-d H:i:s")),
"ip" => $ip,
"referer" => $domain
],
"contacts" => [
[
"first_name" => $name,
"custom_fields_values" => [
[
"field_code" => "EMAIL",
"values" => [
[
"enum_code" => "WORK",
"value" => $email
]
]
],
[
"field_code" => "PHONE",
"values" => [
[
"enum_code" => "WORK",
"value" => $phone
]
]
],
[
"field_id" => (int) $custom_field_id,
"values" => [
[
"value" => $custom_field_value
]
]
]
]
]
],
"companies" => [
[
"name" => $company
]
]
],
"custom_fields_values" => [
[
"field_code" => 'UTM_SOURCE',
"values" => [
[
"value" => $utm_source
]
]
],
[
"field_code" => 'UTM_CONTENT',
"values" => [
[
"value" => $utm_content
]
]
],
[
"field_code" => 'UTM_MEDIUM',
"values" => [
[
"value" => $utm_medium
]
]
],
[
"field_code" => 'UTM_CAMPAIGN',
"values" => [
[
"value" => $utm_campaign
]
]
],
[
"field_code" => 'UTM_TERM',
"values" => [
[
"value" => $utm_term
]
]
],
[
"field_code" => 'UTM_REFERRER',
"values" => [
[
"value" => $utm_referrer
]
]
],
],
]
];
$method = "/api/v4/leads/complex";
$headers = [
'Content-Type: application/json',
'Authorization: Bearer ' . $access_token,
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-API-client/1.0');
curl_setopt($curl, CURLOPT_URL, "https://$subdomain.amocrm.ru".$method);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_COOKIEFILE, 'amo/cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, 'amo/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 = [
301 => 'Moved permanently.',
400 => 'Wrong structure of the array of transmitted data, or invalid identifiers of custom fields.',
401 => 'Not Authorized. There is no account information on the server. You need to make a request to another server on the transmitted IP.',
403 => 'The account is blocked, for repeatedly exceeding the number of requests per second.',
404 => 'Not found.',
500 => 'Internal server error.',
502 => 'Bad gateway.',
503 => 'Service unavailable.'
];
if ($code < 200 || $code > 204) die( "Error $code. " . (isset($errors[$code]) ? $errors[$code] : 'Undefined error') );
$Response = json_decode($out, true);
$Response = $Response['_embedded']['items'];
$output = 'ID добавленных элементов списков:' . PHP_EOL;
foreach ($Response as $v)
if (is_array($v))
$output .= $v['id'] . PHP_EOL;
return $output;
В самом начале у нас список переменных, куда необходимо передать данные из формы, например: $name = $_POST['name'];
В $pipeline_id необходимо записать id воронки, его можно получить из url crm:
Открываем раздел “Сделки”, берем id открывшейся воронки (число в конце url), либо переключаемся на другую.
К $user_amo
вернемся чуть позже. Заполняем остальные переменные.
Массив $data заполните информацией на свое усмотрение, согласно документации.
Если вы не используете дополнительные поля, удалите:[
"field_id" => (int) $custom_field_id,
"values" => [
[
"value" => $custom_field_value
]
]
]
Получение id полей
Получение идентификаторов полей, пользователей и всего остального реализовано через GET запросы. Подробнее можно ознакомиться в документации, а для наших целей я подготовил отдельный файл, нужные эти данные. Открываем файл get.php и добавляем в него:
<?php
require_once 'config.php';
function printLink($method, $title, $subdomain) {
echo '<br>';
echo "<a href='https://$subdomain.amocrm.ru/$method' target='_blank'>$title</a>";
echo '<br>';
}
printLink('api/v4/leads/custom_fields', 'Список utm меток', $subdomain);
printLink('api/v4/users', 'Список пользователей', $subdomain);
printLink('api/v4/contacts/custom_fields', 'Список полей контакта', $subdomain);
echo '<br>';
echo "<a href='https://www.amocrm.ru/developers/content/crm_platform/custom-fields' target='_blank'>Документация</a>";
echo '<br>';
Запустите файл: https://site.com/amo/get.php
Вы увидите перечень ссылок, перейдя по которым получаете список id и других параметров полей для utm меток, пользователей, контактов. По аналогии можно просмотреть остальное.
Вернемся к переменной $user_amo
. Сюда нужно вписать id пользователя, ответственного за сделку.
Вывод
На этом все, если все сделано правильно, лиды будут приходить в неразобранное, создаваться контакт, подтягиваться в него имя, телефон, а также кастомные поля, utm метки, которые были указаны в $data
и название компании.
с 1 июля 2020 amocrm убрали апи ключ из профиля пользователя, предлагая перейти на авторизацию oauth. Старые апи ключи по прежнему работают, а также hash ключ можно получить из виджета или выполнив javascript код в консоли браузера:
AMOCRM.widgets.system.amohash
Если у вас новый аккаунт, то скорее всего AMOCRM.widget.system.amohash будет равен «». В таком случае в кастомных виджетах и интеграциях можно заменить адрес amocrm.ru на свой и установить скрипт, который будет принимать авторизацию в старом формате и отправлять запрос в amocrm с авторизацией по auth. Цена скрипта 10 000 рублей. Напишите мне, если вам нужен такой скрипт.
AmoCRM одна из самых популярных CRM, при этом ее API один из самых странных, по моему субъективному мнению. Понадобилось передавать данные формы с сайта в crm. Использовать CRM Формы вместо своих дизайнерских не хочется. Было бы здорово открыть статейку в гугле, подставить ключ и не париться особо, но на удивление не нашел ни одной статьи с актуальной инфой, где-то версия api уже не актуальна, где-то вместо использования дефолтных полей контакта, создаются кастомные. В общем решил поделиться своим решением, для тех, кому сложно/лень вникать в их API.
В этой статье я буду создавать сделку в “Неразобранном”, контакт и компанию.
Создаем файлы интеграции
Создаем папку amo, например в корне сайта.
Файлы внутри:
amo.php
access.php
config.php
get.php
cookie.txt
tokens.txt
Названия могут быть произвольными.
Получение ключей
Открываем AmoCRM, заходим в Настройки > Интеграции.
Жмем “+ Создать интеграцию” и создаем внешнюю интеграцию
Указываем ссылку на наш amo.php файл, ставим галочку предоставления доступа и вводим произвольное название и описание:
P.S. Перед сохранением прочтите этот раздел до конца
У нас появится 3 ключа и 20 минут, чтоб сделать следующее:
Открываем config.php и вписываем их туда:
<?php
$subdomain = ''; // поддомен AmoCRM
$client_secret = ''; // Секретный ключ
$client_id = ''; // ID интеграции
$code = ''; // Код авторизации
$token_file = 'tokens.txt';
$redirect_uri = 'https://site.com/amo/amo.php';
Поддомен AmoCRM берем из url нашей CRM
В $redirect_uri не забудьте поменять свой домен сайта
Затем идем в файл auth.php и вставим следующее:
<?php
require_once 'config.php';
$link = "https://$subdomain.amocrm.ru/oauth2/access_token";
$data = [
'client_id' => $client_id,
'client_secret' => $client_secret,
'grant_type' => 'authorization_code',
'code' => $code,
'redirect_uri' => $redirect_uri,
];
$curl = curl_init();
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);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
$code = (int)$code;
$errors = [
301 => 'Moved permanently.',
400 => 'Wrong structure of the array of transmitted data, or invalid identifiers of custom fields.',
401 => 'Not Authorized. There is no account information on the server. You need to make a request to another server on the transmitted IP.',
403 => 'The account is blocked, for repeatedly exceeding the number of requests per second.',
404 => 'Not found.',
500 => 'Internal server error.',
502 => 'Bad gateway.',
503 => 'Service unavailable.'
];
if ($code < 200 || $code > 204) die( "Error $code. " . (isset($errors[$code]) ? $errors[$code] : 'Undefined error') );
$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);
$f = fopen($token_file, 'w');
fwrite($f, $arrParamsAmo);
fclose($f);
print_r($arrParamsAmo);
Тут мы отправляем запрос в AmoCRM для получения токенов. Токены сохраняются в файл (45-57 строки), вы можете сохранять их в БД.
Запустите файл, https://site.com/amo/auth.php
Как результат в файле tokens.txt должны появится данные.
Обновление токена
Access token является временным и требует обновления.
Открываем файл access.php и добавляем следующее:
<?php
require_once 'config.php';
$dataToken = file_get_contents($token_file);
$dataToken = json_decode($dataToken, true);
if ($dataToken["endTokenTime"] < time()) {
$link = "https://$subdomain.amocrm.ru/oauth2/access_token";
$data = [
'client_id' => $client_id,
'client_secret' => $client_secret,
'grant_type' => 'refresh_token',
'refresh_token' => $dataToken["refresh_token"],
'redirect_uri' => $redirect_uri,
];
$curl = curl_init();
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);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
$code = (int)$code;
$errors = [
301 => 'Moved permanently.',
400 => 'Wrong structure of the array of transmitted data, or invalid identifiers of custom fields.',
401 => 'Not Authorized. There is no account information on the server. You need to make a request to another server on the transmitted IP.',
403 => 'The account is blocked, for repeatedly exceeding the number of requests per second.',
404 => 'Not found.',
500 => 'Internal server error.',
502 => 'Bad gateway.',
503 => 'Service unavailable.'
];
if ($code < 200 || $code > 204) die( "Error $code. " . (isset($errors[$code]) ? $errors[$code] : 'Undefined error') );
$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);
$f = fopen($token_file, 'w');
fwrite($f, $arrParamsAmo);
fclose($f);
$access_token = $response['access_token'];
} else {
$access_token = $dataToken["access_token"];
}
Если вы сохраняли данные предыдущего запроса в БД, пропишите получение их из БД (59-61 строки).
Переходим к интеграции
Не буду приводить пример html формы, нужно обработать форму и передать в amo.php необходимые данные. Открываем amo.php и добавляем:
<?php
require_once 'access.php';
$name = 'Имя клиента';
$phone = '+380123456789';
$email = 'email@gmail.com';
$target = 'Цель';
$company = 'Название компании';
$custom_field_id = 454021;
$custom_field_value = 'тест';
$ip = '1.2.3.4';
$domain = 'site.com';
$price = 0;
$pipeline_id = 5059931;
$user_amo = 0;
$utm_source = '';
$utm_content = '';
$utm_medium = '';
$utm_campaign = '';
$utm_term = '';
$utm_referrer = '';
$data = [
[
"name" => $phone,
"price" => $price,
"responsible_user_id" => $user_amo,
"pipeline_id" => $pipeline_id,
"_embedded" => [
"metadata" => [
"category" => "forms",
"form_id" => 1,
"form_name" => "Форма на сайте",
"form_page" => $target,
"form_sent_at" => strtotime(date("Y-m-d H:i:s")),
"ip" => $ip,
"referer" => $domain
],
"contacts" => [
[
"first_name" => $name,
"custom_fields_values" => [
[
"field_code" => "EMAIL",
"values" => [
[
"enum_code" => "WORK",
"value" => $email
]
]
],
[
"field_code" => "PHONE",
"values" => [
[
"enum_code" => "WORK",
"value" => $phone
]
]
],
[
"field_id" => $custom_field_id,
"values" => [
[
"value" => $custom_field_value
]
]
]
]
]
],
"companies" => [
[
"name" => $company
]
]
],
"custom_fields_values" => [
[
"field_code" => 'UTM_SOURCE',
"values" => [
[
"value" => $utm_source
]
]
],
[
"field_code" => 'UTM_CONTENT',
"values" => [
[
"value" => $utm_content
]
]
],
[
"field_code" => 'UTM_MEDIUM',
"values" => [
[
"value" => $utm_medium
]
]
],
[
"field_code" => 'UTM_CAMPAIGN',
"values" => [
[
"value" => $utm_campaign
]
]
],
[
"field_code" => 'UTM_TERM',
"values" => [
[
"value" => $utm_term
]
]
],
[
"field_code" => 'UTM_REFERRER',
"values" => [
[
"value" => $utm_referrer
]
]
],
],
]
];
$method = "/api/v4/leads/complex";
$headers = [
'Content-Type: application/json',
'Authorization: Bearer ' . $access_token,
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-API-client/1.0');
curl_setopt($curl, CURLOPT_URL, "https://$subdomain.amocrm.ru".$method);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_COOKIEFILE, 'amo/cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, 'amo/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 = [
301 => 'Moved permanently.',
400 => 'Wrong structure of the array of transmitted data, or invalid identifiers of custom fields.',
401 => 'Not Authorized. There is no account information on the server. You need to make a request to another server on the transmitted IP.',
403 => 'The account is blocked, for repeatedly exceeding the number of requests per second.',
404 => 'Not found.',
500 => 'Internal server error.',
502 => 'Bad gateway.',
503 => 'Service unavailable.'
];
if ($code < 200 || $code > 204) die( "Error $code. " . (isset($errors[$code]) ? $errors[$code] : 'Undefined error') );
$Response = json_decode($out, true);
$Response = $Response['_embedded']['items'];
$output = 'ID добавленных элементов списков:' . PHP_EOL;
foreach ($Response as $v)
if (is_array($v))
$output .= $v['id'] . PHP_EOL;
return $output;
В самом начале у нас список переменных, куда необходимо передать данные из формы, например: $name = $_POST['name'];
В $pipeline_id необходимо записать id воронки, его можно получить из url crm:
Открываем раздел “Сделки”, берем id открывшейся воронки (число в конце url), либо переключаемся на другую.
К $user_amo вернемся чуть позже. Заполняем остальные переменные.
Массив $data заполните информацией на свое усмотрение, согласно документации.
Получение id полей
Получение идентификаторов полей, пользователей и всего остального реализовано через GET запросы. Подробнее можно ознакомиться в документации, а для наших целей я подготовил отдельный файл, нужные эти данные. Открываем файл get.php и добавляем в него:
<?php
require_once 'config.php';
function printLink($method, $title, $subdomain) {
echo '<br>';
echo "<a href='https://$subdomain.amocrm.ru/$method' target='_blank'>$title</a>";
echo '<br>';
}
printLink('api/v4/leads/custom_fields', 'Список utm меток', $subdomain);
printLink('api/v4/users', 'Список пользователей', $subdomain);
printLink('api/v4/contacts/custom_fields', 'Список полей контакта', $subdomain);
echo '<br>';
echo "<a href='https://www.amocrm.ru/developers/content/crm_platform/custom-fields' target='_blank'>Документация</a>";
echo '<br>';
Запустите файл: https://site.com/amo/get.php
Вы увидите перечень ссылок, перейдя по которым получаете список id и других параметров полей для utm меток, пользователей, контактов. По аналогии можно просмотреть остальное.
Вернемся к переменной $user_amo. Сюда нужно вписать id пользователя, ответственного за сделку.
Вывод
На этом все, если все сделано правильно, лиды будут приходить в неразобранное, создаваться контакт, подтягиваться в него имя, телефон, а также кастомные поля, utm метки, которые были указаны в $data и название компании.
С 1 июля 2020 AmoCRM убрали API ключ из профиля пользователя, предлагая перейти на авторизацию OAuth. Старые API ключи по прежнему работают, а также hash ключ можно получить из виджета или выполнив javascript код в консоли браузера:
AMOCRM.widgets.system.amohash